Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • acf38ae9487868924e6be08ec70088480ec6e219
  • 14.0 par défaut
  • 12.0 protégée
  • 13.0
4 résultats

main.py

Blame
  • main.py 10,40 Kio
    # Copyright 2021 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3 or later (http://www.gnu.org/licenses/agpl.html).
    
    import csv
    from datetime import date, datetime
    from io import StringIO
    
    import unidecode
    
    from odoo import http
    from odoo.http import request
    
    from odoo.addons.web.controllers.main import content_disposition, serialize_exception
    
    
    class ExportJournalCg(http.Controller):
        # ------------------------------------------------------
        # Routes
        # ------------------------------------------------------
        @http.route("/web/export_journal_cg/", type="http", auth="user")
        @serialize_exception
        def export_journal_cg(
            self,
            company_id,
            date_start=False,
            date_end=False,
            date_creation_start=False,
            date_creation_end=False,
            partner_ids=False,
            export_type="empty",
            **kwargs
        ):
            """
            Sélectionne les account.move.line correspondants aux journaux
            et à la plage de date définis
            Crée le lignes de valeurs
            :param company_id: int
            :param date_start: date
            :param date_end: date
            :param date_end: date
            :param date_creation_start: date
            :param date_creation_end: date
            :param partner_ids: list
            :param export_type: string
            :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
    
            # Journaux des UR et Fédé
            # TODO: vérifier l'export des comptes de banque en sortie pour UR et Fédé
            journal_fede_com_id = company_id.journal_fede_com_id
            journal_fede_cae_id = company_id.journal_fede_cae_id
            journal_ur_hdf_id = company_id.journal_ur_hdf_id
            journal_ur_med_id = company_id.journal_ur_med_id
            journal_ids = [
                journal_fede_com_id.id,
                journal_fede_cae_id.id,
                journal_ur_hdf_id.id,
                journal_ur_med_id.id,
            ]
    
            product_adhesion_id = company_id.product_adhesion_id
            journal_adhesion_id = company_id.journal_adhesion_id
    
            # Selection des dates + pas d'export du journal UR / FEDE
            domain = [
                ("partner_id", "!=", False),
                ("company_id", "=", company_id.id),
                ("parent_state", "=", "posted"),
            ]
            if date_start and date_end:
                domain += [
                    ("date", ">=", date_start),
                    ("date", "<=", date_end),
                ]
            if date_creation_start and date_creation_end:
                domain += [
                    ("create_date", ">=", date_creation_start),
                    ("create_date", "<=", date_creation_end),
                ]
            if export_type == "empty":
                domain += [("date_export", "=", False)]
    
            # adds partner in domain
            if partner_ids:
                domain += [("partner_id", "in", list(map(int, partner_ids.split(","))))]
    
            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="010000",
                        )
                    )
                # Produit Adhésion CG + Analytique + OD
                elif line.product_id == product_adhesion_id:
                    # Compte général
                    lines_to_export.append(
                        self._export_row(
                            line=line,
                            amount=amount,
                            direction=direction,
                            journal="VE",
                            account="756200",
                        )
                    )
                    # Lignes analytiques
                    lines_to_export.append(
                        self._export_row(
                            line=line,
                            amount=amount,
                            direction=direction,
                            account="756200",
                            journal="VE",
                            a_type="A",
                            analytic="010000",
                        )
                    )
                    # 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",
                        )
                    )
                    od_direction = "D" if direction == "C" else "C"
                    lines_to_export.append(
                        self._export_row(
                            line=line,
                            amount=amount / 2,
                            direction=od_direction,
                            account=("6581" + line.partner_id.ur_id.code_ur),
                            journal="OD",
                        )
                    )
                    lines_to_export.append(
                        self._export_row(
                            line=line,
                            amount=amount / 2,
                            direction=od_direction,
                            account=("6581" + line.partner_id.ur_id.code_ur),
                            journal="OD",
                            a_type="A",
                            analytic="010000",
                        )
                    )
                # Compte client CG Scop - Adhésion & Cotisation journaux de vente
                else:
                    if line.journal_id == journal_adhesion_id:
                        journal = "VE"
                    elif line.journal_id.type == "sale":
                        journal = line.journal_id.code
                    else:
                        journal = "EF"
                    if line.account_id == default_receivable_account_id:
                        account = ("4112" + line.partner_id.ur_id.code_ur)
                        adh_account = self._get_partner_number(line.partner_id)
                    else:
                        account = line.account_id.code
                        adh_account = ""
                    # Compte général
                    lines_to_export.append(
                        self._export_row(
                            line=line,
                            amount=amount,
                            direction=direction,
                            account=account,
                            adh_account=adh_account,
                            journal=journal,
                        )
                    )
    
                line.write({"date_export": datetime.now()})
    
            filename_ = "Export CG Scop - " + datetime.strftime(
                datetime.now(), "%Y-%m-%d_%Hh%M"
            )
    
            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
            reconciled_inv_ids = line.full_reconcile_id.reconciled_line_ids.mapped(
                "move_id").filtered(lambda i: i.is_contribution)
            if line.move_id.bordereau_id.name:
                inv_num = line.move_id.bordereau_id.name
            elif reconciled_inv_ids:
                inv_num = reconciled_inv_ids[0].bordereau_id.name
            else:
                inv_num = ""
            # Libellé
            description = line.partner_id.name.upper()
            if line.name:
                description += " - " + line.name.upper()
    
            description = unidecode.unidecode(description)
    
            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):
            if partner.member_number:
                number = partner.member_number + "00"
                prefix = 8 - len(number)
                return (prefix * "0") + number
            else:
                return ""
    
        def export_cg_csv(self, lines_to_export, filename_):
            fp = StringIO()
            export_file = csv.writer(
                fp,
                delimiter=";",
                dialect="excel",
            )
            # 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/plain;charset=iso-8859-1"),
                ("Content-Disposition", content_disposition(filename)),
            ]
            return request.make_response(data, headers=csvhttpheaders)