Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 49c1a54e6b51d76df82a3eedec163fa27b87d5d5
  • 16.0 par défaut protégée
  • 16.0-perimeter-upd
  • 16.0-refactor-perimeter
  • 16.0-stephane-full-dyn
5 résultats

acc_operation.py

Blame
  • 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)