Sélectionner une révision Git
Bifurcation depuis
Le Filament / Confédération Générale des SCOP / cgscop_timesheet
Le projet source a une visibilité limitée.
main.py 9,04 Kio
# 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, **kwargs):
"""
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
product_adhesion_id = company_id.product_adhesion_id
journal_adhesion_id = company_id.journal_adhesion_id
contribution_journal_id = company_id.contribution_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')
)
# Produit Adhésion CG + Analytique + OD
elif line.product_id == product_adhesion_id:
amount_analytic = round(1 / 2 * amount, 2)
# Compte général
lines_to_export.append(self._export_row(
line=line, amount=amount, direction=direction,
journal='VE', account='706200')
)
# Lignes analytiques
lines_to_export.append(self._export_row(
line=line, amount=amount_analytic, direction=direction,
account='706200', journal='VE', a_type='A',
analytic='010201')
)
lines_to_export.append(self._export_row(
line=line, amount=amount_analytic, direction=direction,
account='706200', journal='VE', a_type='A',
analytic='020201')
)
# OD Adhésion
lines_to_export.append(self._export_row(
line=line, amount=amount/2, direction=direction,
account=('4660' + line.partner_id.ur_id.code_ur),
journal='OD')
)
lines_to_export.append(self._export_row(
line=line, amount=amount / 2, direction='D',
account=('6581' + line.partner_id.ur_id.code_ur),
journal='OD',)
)
lines_to_export.append(self._export_row(
line=line, amount=amount / 2, direction='D',
account=('6581' + line.partner_id.ur_id.code_ur),
journal='OD', a_type='A', analytic='020201')
)
# Compte client CG Scop - Adhésion & Cotisation
elif line.account_id == default_receivable_account_id:
if line.journal_id == journal_adhesion_id:
journal = 'VE'
elif line.journal_id == contribution_journal_id:
journal = 'CO'
else:
journal = 'EF'
# 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),
journal=journal)
)
# Banque
else:
lines_to_export.append(self._export_row(
line=line, amount=amount, direction=direction,
account=line.account_id.code, journal='EF')
)
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', journal=None,
analytic=None,):
# Sanitize N° Bordereau
if line.invoice_id.bordereau_id.name:
inv_num = line.invoice_id.bordereau_id.name
elif line.full_reconcile_id.reconciled_line_ids.mapped('invoice_id'):
inv_num = line.full_reconcile_id.reconciled_line_ids.mapped('invoice_id')[0].bordereau_id.name
else:
inv_num = ''
# Libellé
description = line.partner_id.name.upper()
if line.name:
description += ' - ' + line.name.upper()
if journal:
journal_code = journal
else:
journal_code = line.journal_id.code
return [
line.move_id.name, # N° pièce
line.date, # Date pièce
line.date_maturity, # Date échéance
journal_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
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=';',)
# 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_ + '.txt'
csvhttpheaders = [
('Content-Type', 'text/csv;charset=iso-8859-1'),
('Content-Disposition', content_disposition(filename)),
]
return request.make_response(data, headers=csvhttpheaders)