Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • eef03aa606e53dd64da20f0e627d8f73bccec545
  • main par défaut protégée
2 résultats

config.toml

Blame
  • scop_bordereau_refund_wizard.py 9,25 Kio
    # Copyright 2021 Le Filament
    # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
    
    from odoo import _, api, fields, models
    from odoo.exceptions import UserError, ValidationError
    
    
    class ScopBordereauRefundWizard(models.TransientModel):
        _name = "scop.bordereau.refund.wizard"
        _description = "Avoir sur les bordereaux"
    
        bordereau_id = fields.Many2one(
            comodel_name="scop.bordereau",
            string="Bordereau",
            readonly=True,
        )
        date_refund = fields.Date(
            string="Date de régularisation",
            default=fields.Date.today(),
            required=1,
        )
        cotiz_reminder = fields.Html("Rappel des cotisations", readonly=1)
        amount_refund = fields.Float("Montant (par trimestre)", required=1)
        comment = fields.Char("Motif de l'avoir", required=1)
        type_cotiz = fields.Selection(
            string="Type de cotisation",
            selection=lambda self: self._selection_type_cotiz(),
            required=1,
        )
        quarter_ids = fields.Many2many(
            relation="scop_bordereau_refund_wizard_quarter_rel",
            comodel_name="scop.bordereau.refund.wizard.quarter",
            string="Trimestres",
        )
    
        # ------------------------------------------------------
        # Constrains
        # ------------------------------------------------------
        @api.constrains("date_refund")
        def _check_date_refund(self):
            last_date = max(self.bordereau_id.invoice_ids.mapped("invoice_date"))
            if self.date_refund > fields.Date.today() or self.date_refund < last_date:
                raise ValidationError(
                    _(
                        "La date de l'avoir doit être "
                        "inférieure ou égale à la date du jour et "
                        "supérieure à la dernière date de "
                        "facturation liée au bordereau."
                    )
                )
    
        # ------------------------------------------------------
        # Override ORM
        # ------------------------------------------------------
        @api.model
        def default_get(self, fields):
            res = super(ScopBordereauRefundWizard, self).default_get(fields)
            bordereau_id = self.env["scop.bordereau"].browse(
                self.env.context.get("active_id")
            )
            res.update(
                {
                    "bordereau_id": bordereau_id.id,
                    "cotiz_reminder": bordereau_id.details,
                }
            )
            return res
    
        @api.model
        def _selection_type_cotiz(self):
            bordereau_id = self.env["scop.bordereau"].browse(
                self.env.context.get("active_id")
            )
    
            contribs = bordereau_id.invoice_ids.read_group(
                [("id", "in", bordereau_id.invoice_ids.ids)],
                ["type_contribution_id", "amount_total_signed"],
                ["type_contribution_id"],
            )
            
            ur_hdf = self.env.ref("cgscop_partner.riga_14232").id
            if bordereau_id.partner_id.ur_id.id == ur_hdf:
                product_ur = self.env.company.contribution_hdf_id
            else:  # ur = ur_med
                product_ur = self.env.company.contribution_med_id
    
            cotiz_type = {
                self.env.ref(
                    "cgscop_partner.riga_14397"
                ).id: self.env.company.contribution_cg_id,
                self.env.ref(
                    "cgscop_partner.riga_14398"
                ).id: self.env.company.contribution_fede_com_id,
                self.env.ref(
                    "cgscop_partner.cotiz_fede_cae"
                ).id: self.env.company.contribution_fede_cae_id,
                self.env.ref("cgscop_partner.riga_14399").id: product_ur,
                self.env.ref(
                    "cgscop_partner.cotiz_fede_indus"
                ).id: self.env.company.contribution_fede_indus_id,
            }
    
            type_cotiz_select_i = list()
            type_cotiz_select_list = list()
            for contrib in contribs:
                type_cotiz = contrib.get("type_contribution_id")[0]
                if type_cotiz not in type_cotiz_select_i:
                    type_cotiz_select_i.append(type_cotiz)
                    type_cotiz_select_list.append((type_cotiz, cotiz_type[type_cotiz].name))
            return type_cotiz_select_list
    
        # ------------------------------------------------------
        # Action
        # ------------------------------------------------------
        def create_refund(self):
            """
            Create refund
            """
            if len(self.quarter_ids) == 0:
                raise UserError(_("Vous devez sélectionner au moins un trimestre."))
            if self.amount_refund <= 0:
                raise UserError(_("Le montant de l'avoir doit être supérieur à 0."))
            if not self.type_cotiz:
                raise UserError(_("Vous devez sélectionner un type de cotisation."))
            bordereau_id = self.bordereau_id
            partner_id = bordereau_id.partner_id
            ur_hdf = self.env.ref("cgscop_partner.riga_14232").id
    
            # CREATE VERSION
            bordereau_id.read(["amount_total_cotiz"])
            ongoing_version = bordereau_id.bordereau_version_ids.filtered(
                lambda v: v.version == bordereau_id.version and v.state == "new"
            )
            if not ongoing_version:
                self.env["scop.bordereau.version"].create(
                    {
                        "bordereau_id": bordereau_id.id,
                        "date": self.date_refund,
                        "comment": self.comment,
                        "version": bordereau_id.version,
                        "liasse_fiscale_id_old": bordereau_id.liasse_fiscale_id.id,
                        "type_assiette": bordereau_id.type_assiette,
                        "montant_assiette": bordereau_id.montant_assiette,
                        "amount_total_cotiz": bordereau_id.amount_total_cotiz,
                    }
                )
    
            # CREATE REFUND
            if partner_id.ur_id.id == ur_hdf:
                product_ur = self.env.company.contribution_hdf_id
                journal_ur = self.env.user.company_id.journal_ur_hdf_id
            else:  # ur = ur_med
                product_ur = self.env.company.contribution_med_id
                journal_ur = self.env.user.company_id.journal_ur_med_id
    
            cotiz_type = {
                self.env.ref("cgscop_partner.riga_14397").id: [
                    self.env.company.contribution_cg_id,
                    self.env.company.contribution_journal_id,
                    partner_id.property_account_receivable_id,
                ],
                self.env.ref("cgscop_partner.riga_14398").id: [
                    self.env.company.contribution_fede_com_id,
                    self.env.user.company_id.journal_fede_com_id,
                    partner_id.property_account_receivable_id,
                ],
                self.env.ref("cgscop_partner.cotiz_fede_cae").id: [
                    self.env.company.contribution_fede_cae_id,
                    self.env.user.company_id.journal_fede_cae_id,
                    partner_id.property_account_receivable_id,
                ],
                self.env.ref("cgscop_partner.riga_14399").id: [
                    product_ur,
                    journal_ur,
                    partner_id.property_account_receivable_id,
                ],
                self.env.ref("cgscop_partner.cotiz_fede_indus").id: [
                    self.env.company.contribution_fede_indus_id,
                    self.env.user.company_id.journal_fede_indus_id,
                    partner_id.property_account_receivable_id,
                ],
            }
            product = cotiz_type.get(int(self.type_cotiz))[0]
    
            for quarter_id in self.quarter_ids:
                date_due = self.bordereau_id.invoice_ids.filtered(
                    lambda i: i.cotiz_quarter == str(quarter_id.quarter)
                    and i.move_type == "out_invoice"
                )[0].invoice_date_due
                self.env["account.move"].create(
                    {
                        "partner_id": partner_id.id,
                        "journal_id": cotiz_type.get(int(self.type_cotiz))[1].id,
                        "move_type": "out_refund",
                        "invoice_date": self.date_refund,
                        "date": self.date_refund,
                        "state": "draft",
                        "ref": self.comment,
                        "bordereau_id": bordereau_id.id,
                        "is_contribution": True,
                        "year": bordereau_id.year,
                        "cotiz_quarter": str(quarter_id.quarter),
                        "liasse_fiscale_id": bordereau_id.liasse_fiscale_id.id,
                        "type_contribution_id": self.type_cotiz,
                        "payment_mode_id": bordereau_id.payment_mode_id.id,
                        "invoice_date_due": date_due,
                        "invoice_line_ids": [
                            (
                                0,
                                None,
                                {
                                    "product_id": product.id,
                                    "account_id": product.property_account_income_id.id,
                                    "name": self.comment,
                                    "price_unit": self.amount_refund,
                                    "price_subtotal": self.amount_refund,
                                },
                            ),
                        ],
                    }
                )
    
    
    class ScopBordereauRefundWizardQuarer(models.Model):
        _name = "scop.bordereau.refund.wizard.quarter"
        _description = "Trimestres pour échéance de cotisation"
    
        name = fields.Char("Nom", compute="_compute_name")
        quarter = fields.Integer("Trimestre", required=1)
    
        def _compute_name(self):
            for r in self:
                r.name = str(r.quarter)