Skip to content
Extraits de code Groupes Projets
scop_invoice_idf_wizard.py 6,91 ko
Newer Older
  • Learn to ignore specific revisions
  • jordan's avatar
    jordan a validé
    # © 2021 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    import base64
    
    import csv
    
    jordan's avatar
    jordan a validé
    import mimetypes
    from io import StringIO
    
    
    from odoo import _, api, fields, models
    
    jordan's avatar
    jordan a validé
    from odoo.exceptions import UserError
    from odoo.tools.mimetypes import guess_mimetype
    
    
    class ScopImportIDFWizard(models.TransientModel):
    
        _name = "scop.invoice.idf.wizard"
    
    jordan's avatar
    jordan a validé
        _description = "Wizard: Importer les cotisations ou factures IDF"
    
    
    jordan's avatar
    jordan a validé
        # ------------------------------------------------------
        # Fields declaration
        # ------------------------------------------------------
    
        file = fields.Binary("Fichier CSV", required=True)
        filename = fields.Char("Filename")
    
        type = fields.Selection(
    
            string="Type",
            selection=[
                ("inv", "Facture"),
                ("cotiz", "Cotisation"),
            ],
            required=False,
        )
    
    jordan's avatar
    jordan a validé
    
    
    jordan's avatar
    jordan a validé
        # ------------------------------------------------------
        # Actions
        # ------------------------------------------------------
    
        @api.model
        def scop_invoice_idf_wizard_action(self):
            return {
    
                "type": "ir.actions.act_window",
                "name": "Import Factures",
                "views": [
                    [
                        self.env.ref("cgscop_invoice_idf.scop_invoice_idf_wizard_form").id,
                        "form",
                    ]
    
                "context": {
                    "default_type": "inv",
    
                "res_model": "scop.invoice.idf.wizard",
                "target": "new",
    
    jordan's avatar
    jordan a validé
        @api.model
    
        def scop_cotisation_idf_wizard_action(self):
    
    jordan's avatar
    jordan a validé
            return {
    
                "type": "ir.actions.act_window",
                "name": "Import Cotisations",
                "views": [
                    [
                        self.env.ref("cgscop_invoice_idf.scop_invoice_idf_wizard_form").id,
                        "form",
                    ]
    
    jordan's avatar
    jordan a validé
                ],
    
                "context": {
                    "default_type": "cotiz",
    
                "res_model": "scop.invoice.idf.wizard",
                "target": "new",
    
    jordan's avatar
    jordan a validé
            }
    
        def load_data(self):
            """
            Load CSV File and write datas into the database
            :return:
            """
            # Get Mimetype
            content_type = mimetypes.guess_type(self.filename)
            if content_type[0]:
                content_type = content_type[0]
            else:
    
                content_type = guess_mimetype(str(self.file))
    
    jordan's avatar
    jordan a validé
    
    
            if content_type != "text/csv":
                raise UserError(_("This file does not seem to be a CSV file"))
    
    jordan's avatar
    jordan a validé
    
    
            file = StringIO(base64.b64decode(self.file).decode("ISO-8859-1"))
            reader = csv.DictReader(file, delimiter=";")
    
    jordan's avatar
    jordan a validé
    
    
            company_id = self.env.company
    
    jordan's avatar
    jordan a validé
            line = 1
    
            tried_lines = 0
    
    jordan's avatar
    jordan a validé
            success = 0
    
            new_log = self.env["scop.invoice.idf.logs"].create({"logs": logs})
    
            new_lines_years = set()
    
    jordan's avatar
    jordan a validé
    
    
            if self.type == "inv":
                model = "scop.invoice.idf"
    
                model = "scop.cotisation.idf"
    
    jordan's avatar
    jordan a validé
            for row in reader:
                line += 1
    
                journal = row["Journal"]
    
    jordan's avatar
    jordan a validé
                if journal in ["VE", "BFC"]:
    
                    tried_lines += 1
    
                    compte = row["Compte"]
                    partner_id = self.env["res.partner"].search(
                        [
                            ["member_number_int", "=", int(compte[2:7])],
                            ["member_number_int", "!=", 0],
                        ]
                    )
    
    jordan's avatar
    jordan a validé
                    if len(partner_id) != 1:
    
                        logs += (
                            "<li> Ligne "
                            + str(line)
                            + ": Impossible de rattacher le compte "
                            + compte
                            + "</li>"
                        )
    
    jordan's avatar
    jordan a validé
                    else:
    
                        writing_date = row["Date écriture"]
                        libelle = row["Libellé écriture"]
    
                        existing_import_line = self.env[model].search(
                            [
    
                                ["partner_id", "=", partner_id.id],
                                ["writing_date", "=", writing_date],
                                ["journal", "=", journal],
                                ["name", "=", libelle],
                            ]
                        )
    
    jordan's avatar
    jordan a validé
                        if len(existing_import_line) > 0:
    
                            logs += "<li> Ligne " + str(line) + ": Doublon</li>"
    
    jordan's avatar
    jordan a validé
                        else:
    
                            debit = float(row['Débit euro'].replace(',','.'))
                            credit = float(row['Crédit euro'].replace(',','.'))
    
    jordan's avatar
    jordan a validé
                            if debit > 0 and credit > 0:
    
                                logs += (
                                    "<li> Ligne " + str(line) + ": Montants incorrects</li>"
                                )
    
    jordan's avatar
    jordan a validé
                            else:
    
    jordan's avatar
    jordan a validé
                                if journal == "VE" and debit > 0:
                                    line_type = "inv"
                                elif journal == "BFC" and credit > 0:
                                    line_type = "pay"
                                elif journal == "BFC" and debit > 0:
                                    line_type = "reject"
    
    jordan's avatar
    jordan a validé
                                    credit = debit * (-1)
                                    debit = 0
    
    jordan's avatar
    jordan a validé
                                else:
                                    line_type = "refund"
    
    
                                lettrage = row["Lettrage N"]
                                year = row["Année"]
                                acc_doc = row["Pièce"]
    
    jordan's avatar
    jordan a validé
    
                                values = {
    
                                    "company_id": company_id.id,
                                    "partner_id": partner_id.id,
                                    "journal": journal,
                                    "writing_date": writing_date,
                                    "acc_doc": acc_doc,
                                    "name": libelle,
                                    "year": year,
                                    "type": line_type,
                                    "lettrage": lettrage,
                                    "debit": debit,
                                    "credit": credit,
    
    jordan's avatar
    jordan a validé
                                }
                                new_line = self.env[model].create(values)
                                success += 1
                                new_lines_years.add(new_line.year)
    
    jordan's avatar
    jordan a validé
    
    
            new_log.write(
                {
                    "type": self.type,
                    "logs": logs,
                    "success": success,
                    "failure": tried_lines - success,
                }
            )
    
            # Lettrage for all line in updated years
    
            recordset_for_lettrage = self.env[model].search(
                [["year", "in", list(new_lines_years)]]
            )
    
            recordset_for_lettrage.reconcile()
    
                "type": "ir.actions.act_window",
                "views": [[False, "form"]],
                "view_mode": "form",
                "res_model": "scop.invoice.idf.logs",
                "target": "current",
                "res_id": new_log.id,