Skip to content
Extraits de code Groupes Projets
Valider 7f92320b rédigé par Benjamin - Le Filament's avatar Benjamin - Le Filament
Parcourir les fichiers

[add] CG export comptable

parent 88f6599a
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import controllers
from . import models
from . import wizard
{
"name": "CG SCOP - Cotisations CG",
"summary": "CG SCOP - Cotisations CG Scop",
"version": "12.0.1.1.0",
"development_status": "Production/Stable",
"version": "12.1.1.0",
"author": "Le Filament",
"license": "AGPL-3",
"application": False,
"installable": True,
"depends": [
"account",
"l10n_fr",
"lefilament_export_journal_tool",
"cgscop_cotisation",
],
"data": [
......@@ -24,6 +25,7 @@
"views/res_config_settings.xml",
"views/scop_bordereau_cg.xml",
"views/scop_cotisation_cg.xml",
"wizard/export_journal_wizard_view.xml",
"wizard/scop_cotisation_cg_wizard.xml",
"wizard/scop_bordereau_update_confirm_view.xml",
"wizard/scop_bordereau_validate_confirm_view.xml",
......
# © 2021 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import main
# Copyright 2021 Le Filament (<http://www.le-filament.com>)
# License AGPL-3 or later (http://www.gnu.org/licenses/agpl.html).
import re
import csv
from datetime import date, datetime
from io import BytesIO, StringIO
from odoo import http
from odoo.http import request
from odoo.addons.web.controllers.main import serialize_exception
from odoo.addons.web.controllers.main import content_disposition
from odoo.tools.misc import xlwt
class ExportJournalCg(http.Controller):
# ------------------------------------------------------
# Routes
# ------------------------------------------------------
@http.route('/web/export_journal_cg/', type='http', auth="user")
@serialize_exception
def export_journal_cg(
self, type, date_start, date_end, company_id):
"""
Sélectionne les account.move.line correspondants aux journaux
et à la plage de date définis
Crée le lignes de valeurs
:param date_start: date
:param date_end: date
:return: file
"""
# Get accounts variables
company_id = request.env['res.company'].browse(int(company_id))
default_receivable_account_id = request.env.ref('l10n_fr.1_fr_pcg_recv')
contribution_cg_id = company_id.contribution_cg_id
contribution_ur_or_fede_journal_id = company_id.contribution_ur_or_fede_journal_id
# Selection des dates + pas d'export du journal UR / FEDE
domain = [
('date', '>=', date_start),
('date', '<=', date_end),
('partner_id', '!=', False),
('journal_id', '!=', contribution_ur_or_fede_journal_id.id)
]
if type == 'empty':
domain += [('date_export', '=', False)]
export_line_ids = request.env['account.move.line'].search(domain)
lines_to_export = []
for line in export_line_ids:
amount = self._move_amount(line)
direction = self._move_direction(line)
# Produit cotisation CG + Analytique
if line.product_id == contribution_cg_id:
amount_analytic = round(1/3 * amount, 2)
# Compte général
lines_to_export.append(self._export_row(
line=line, amount=amount, direction=direction,
account=('7060' + line.partner_id.ur_id.code_ur))
)
# Lignes analytiques
lines_to_export.append(self._export_row(
line=line, amount=amount_analytic, direction=direction,
account=('7060' + line.partner_id.ur_id.code_ur), a_type='A',
analytic='010201')
)
lines_to_export.append(self._export_row(
line=line, amount=amount_analytic, direction=direction,
account=('7060' + line.partner_id.ur_id.code_ur), a_type='A',
analytic='020201')
)
lines_to_export.append(self._export_row(
line=line, amount=round(amount - 2 * amount_analytic, 2), direction=direction,
account=('7060' + line.partner_id.ur_id.code_ur), a_type='A',
analytic='030201')
)
# Compte client CG Scop
elif line.account_id == default_receivable_account_id:
# Compte général
lines_to_export.append(self._export_row(
line=line, amount=amount, direction=direction,
account=('4112' + line.partner_id.ur_id.code_ur),
adh_account=self._get_partner_number(line.partner_id))
)
# Banque
else:
lines_to_export.append(self._export_row(
line=line, amount=amount, direction=direction,
account=line.account_id.code)
)
line.write({
'date_export': datetime.now()
})
filename_ = ('Export CG Scop - '
+ date_start
+ '_' + date_end)
return self.export_cg_csv(lines_to_export, filename_)
# ------------------------------------------------------
# Common function
# ------------------------------------------------------
def _export_row(
self, line, amount, direction, account=None,
adh_account=None, a_type='G', analytic=None):
# Sanitize N° Bordereau
inv_num = line.invoice_id.bordereau_id.name if line.invoice_id.bordereau_id.name else ''
# Libellé
description = line.partner_id.name.upper()
if line.name:
description += ' - ' + line.name.upper()
return [
line.move_id.name, # N° pièce
line.date, # Date
line.journal_id.code, # Journal
a_type, # Type d'écriture (général/analytique)
account, # Compte comptable
adh_account, # Num adh
description, # Libellé
direction, # Sens
amount, # Montant
inv_num, # N° Bordereau
line.date_maturity, # Date d'échéance
analytic, # Code analytique
]
def _move_direction(self, line):
if line.credit > 0.0:
return 'C'
else:
return 'D'
def _move_amount(self, line):
if line.credit > 0:
return line.credit
else:
return line.debit
def _get_partner_number(self, partner):
number = partner.member_number + '00'
prefix = 8 - len(number)
return (prefix * '0') + number
def export_cg_csv(self, lines_to_export, filename_):
fp = StringIO()
export_file = csv.writer(
fp,
delimiter=';',
quoting=csv.QUOTE_ALL)
# Add header line
for line in lines_to_export:
# Format date value
line_values = [
value if not isinstance(value, date) else value.strftime(
"%d/%m/%Y") for value in line]
export_file.writerow(line_values)
fp.seek(0)
data = fp.read()
fp.close()
filename = filename_ + '.csv'
csvhttpheaders = [
('Content-Type', 'text/csv;charset=utf8'),
('Content-Disposition', content_disposition(filename)),
]
return request.make_response(data, headers=csvhttpheaders)
\ No newline at end of file
......@@ -2,6 +2,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import account_invoice_refund
from . import export_journal_wizard
from . import scop_bordereau_update_confirm
from . import scop_bordereau_validate_confirm
from . import scop_cotisation_cg_regul
......
# Copyright 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import models, fields, api, http
from odoo.exceptions import UserError
class ExportJournalWizard(models.TransientModel):
_name = "export.journal.cg.wizard"
_description = "Wizard export journal CG Scop"
@api.model
def _get_default_company(self):
return self.env.user.company_id
@api.model
def _get_default_export(self):
export = self.env['export.journal.type'].search([
('company_id', '=', self.env.user.company_id.id)], limit=1)
return export
date_start = fields.Date('Date de début', required=True)
date_end = fields.Date(
string='Date de fin',
required=True,
default=fields.Date.today())
#export_format = fields.Selection(
# [('csv', 'CSV'), ('xls', 'Excel')],
# string='Format', default="csv")
company_id = fields.Many2one(
comodel_name='res.company',
default=_get_default_company
)
export_type = fields.Selection(
[('empty', 'Ecritures non exportées'), ('all', 'Toutes les écritures')],
string='Ecritures à exporter', default="empty")
def get_cg_export(self):
"""
Appelle l'url de traitement et de téléchargement
:return: ir.actions.act_url
"""
return {
'type': 'ir.actions.act_url',
'url':
'/web/export_journal_cg?format=csv&type=%s'
% (self.export_type,) +
'&date_start=%s&date_end=%s&company_id=%d'
% (self.date_start, self.date_end, self.company_id.id),
'target': 'new',
}
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="data_export_cg_view_form" model="ir.ui.view">
<field name="name">export.journal.cg.wizard.form</field>
<field name="model">export.journal.cg.wizard</field>
<field name="arch" type="xml">
<form string="Export des données">
<group>
<group>
<field name="company_id" invisible="True"/>
<field name="export_type" widget="radio" />
</group>
</group>
<p class="text-muted">Les dates de début et de fin sont incluses dans l'export des écritures</p>
<group>
<group>
<field name="date_start"/>
</group>
<group>
<field name="date_end"/>
</group>
</group>
<footer>
<button class="btn btn-sm btn-primary" name="get_cg_export" string="Télécharger" type="object"/>
<button class="btn btn-sm btn-default" special="cancel" string="Fermer"/>
</footer>
</form>
</field>
</record>
<record id="data_export_cg_action" model="ir.actions.act_window">
<field name="name">Export Journal CG Scop</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">export.journal.cg.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="data_export_cg_view_form"/>
<field name="target">new</field>
</record>
<menuitem action="data_export_cg_action" id="menu_data_export_cg" name="Export Journal CG Scop" parent="account.menu_finance_entries" sequence="0" />
</odoo>
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter