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

__init__.py

Blame
  • scop_liasse_fiscale.py 14,11 Kio
    # © 2021 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    from odoo import api, fields, models
    
    
    class ScopLiasseFiscale(models.Model):
        _inherit = "scop.liasse.fiscale"
    
        contribution_cg = fields.Float(
            string="Cotisation CG Scop",
            compute="_compute_contribution_cg",
            store=True,
        )
        contribution_base_type = fields.Selection(
            string="Type Assiette de cotisation",
            selection=[
                ("ca", "CA"),
                ("va", "VA"),
            ],
            compute="_compute_contribution_cg",
            store=True,
        )
        contribution_base_amount = fields.Integer(
            string="Montant Assiette de cotisation",
            compute="_compute_contribution_cg",
            store=True,
        )
        contribution_hdf = fields.Float(
            string="Cotisation UR HDF",
            compute="_compute_contribution_hdf",
            store=True,
        )
        contribution_med = fields.Float(
            string="Cotisation UR Méditerranée",
            compute="_compute_contribution_med",
            store=True,
        )
        contribution_com = fields.Float(
            string="Cotisation Fédération Com",
            compute="_compute_contribution_com",
            store=True,
        )
        contribution_cae = fields.Float(
            string="Cotisation Fédération CAE",
            compute="_compute_contribution_cae",
            store=True,
        )
    
        # ------------------------------------------------------
        # Compute fields
        # ------------------------------------------------------
        @api.depends(
            "av_lf", "av_cg", "L2052_FL", "dureeExercice", "partner_id.cooperative_form_id"
        )
        def _compute_contribution_cg(self):
            """
            Calcule la cotisation de la CG Scop :
            - VA = VA saisie ou VA au sens CGSCOP si pas de VA renseignée
            - 0,3% du CA ou 0,7% de la VA
            - 300 € pour CA compris entre 0 et 100 K€
            - 600 € pour CA compris entre 100 et 200 K€
            - Max = 320 K€
    
            @return float : cotisation
            """
            for liasse in self:
                # Calcul VA la plus avantageuse
                liasse.read(["av_lf", "av_cg", "L2052_FL"])
                if liasse.av_lf != 0:
                    if liasse.av_lf > liasse.av_cg:
                        va = liasse.av_cg
                    else:
                        va = liasse.av_lf
                else:
                    va = liasse.av_cg
    
                ca = liasse.L2052_FL
                if liasse.dureeExercice and liasse.dureeExercice not in (0, 12):
                    va = va * (12 / liasse.dureeExercice)
                    ca = ca * (12 / liasse.dureeExercice)
    
                # Calcul Type Assiette
                if ca <= va * 7 / 3:
                    contribution_base_type = "ca"
                    contribution_base_amount = ca
                else:
                    contribution_base_type = "va"
                    contribution_base_amount = va
    
                liasse.contribution_base_type = contribution_base_type
                liasse.contribution_base_amount = contribution_base_amount
    
                # Calcul valeurs plancher
                values = self.get_values_for_cotiz_cg(liasse.partner_id)
    
                # Calcul Cotisation CG Scop
                if contribution_base_type == "ca":
                    rate = self.get_rate_ca(liasse.partner_id)
                    contribution = ca * rate
                else:
                    rate = self.get_rate_va(liasse.partner_id)
                    contribution = va * rate
    
                if contribution < values["plancher1"]:
                    liasse.contribution_cg = values["plancher1"]
                elif contribution < values["plancher2"]:
                    liasse.contribution_cg = values["plancher2"]
                elif contribution >= values["plancher3"]:
                    if contribution_base_type == "ca":
                        contribution = (25000000 * rate) + (ca - 25000000) * (rate / 2)
                    else:
                        contribution = (10714286 * rate) + (va - 10714286) * (rate / 2)
                    if contribution <= values["plafond"]:
                        liasse.contribution_cg = contribution
                    else:
                        liasse.contribution_cg = values["plafond"]
                else:
                    liasse.contribution_cg = contribution
    
        @api.depends("wage_cg", "ur_id")
        def _compute_contribution_hdf(self):
            """
            Calcule la cotisation de l'UR HDF pour 1 partenaire :
            - 0,1 % de la masse salariale annuelle brute prévisionnelle
            ou figurant sur la liasse fiscale.
    
            @return float : cotisation
            """
            ur_hdf = self.env.ref("cgscop_partner.riga_14232")
            for liasse in self:
                plancher = liasse.get_plancher_cotiz()["ur_hdf"]
                liasse.read(["wage_cg"])
                if liasse.partner_id.ur_id == ur_hdf:
                    rate = 0.001
                    if liasse.dureeExercice and liasse.dureeExercice not in (
                        0,
                        12,
                    ):
                        wage_cg = liasse.wage_cg * (12 / liasse.dureeExercice)
                    else:
                        wage_cg = liasse.wage_cg
                    if wage_cg > 0:
                        contribution_hdf = wage_cg * rate
                    else:
                        contribution_hdf = 0
    
                    if contribution_hdf > plancher:
                        liasse.contribution_hdf = contribution_hdf
                    else:
                        liasse.contribution_hdf = plancher
    
        @api.depends("contribution_cg", "L2053_HN", "ur_id")
        def _compute_contribution_med(self):
            """
            Calcule la cotisation de l'UR Med pour 1 liasse :
            - Assiette : Assiette de la cotisation CGSCOP
            - Taux d’appel : 1/3 du taux
            - Calcul intermédiaire : Assiette * taux
                (soit 1/3 de la cotisation CGSCOP sans plancher)
            - Complément de cotisation : 1% du résultat net si positif
            - Abattement pour sociétariat :
                Taux de sociétariat =   nombre de salariés sociétaires /
                                        nombre de salariés
                Abattement 20 % si >= 50 %
                Abattement 30 % si >= 80 %
            - Calcul cotisations :
                [(Assiette*taux) + (résultat net *0.01)]* (1 ou 0.8 ou 0.7)
    
            @return float : cotisation
            """
            ur_med = self.env.ref("cgscop_partner.riga_14243")
            for liasse in self:
                if liasse.partner_id.ur_id == ur_med:
                    # Assiette CG
                    assiette_rate = 1 / 3
                    assiette = liasse.get_assiette()
    
                    # Résultat net
                    net_results_rate = 0.01
                    net_results = (
                        liasse.L2053_HN if liasse.L2053_HN > 0 else liasse.L2051_DI
                    )
    
                    # Effectifs
                    staff_id = self.get_last_staff_id(liasse.partner_id)
                    if staff_id:
                        staff_shareholder_count = staff_id.staff_shareholder_count
                        staff_count = staff_id.staff_count
                    else:
                        staff_shareholder_count = staff_count = 0
    
                    # Taux d'abattement pour sociétariat
                    if staff_count > 0:
                        societariat_rate = staff_shareholder_count / staff_count
                    else:
                        societariat_rate = 0
    
                    if 0.5 <= societariat_rate < 0.8:
                        abatt_rate = 1 - 0.2
                    elif societariat_rate >= 0.8:
                        abatt_rate = 1 - 0.3
                    else:
                        abatt_rate = 1 - 0
    
                    # Calcul Cotisation
                    contribution_med = (
                        (assiette * assiette_rate) + (net_results * net_results_rate)
                    ) * abatt_rate
                    final_contribution_med = (
                        contribution_med if contribution_med >= 0 else 0
                    )
                    liasse.contribution_med = final_contribution_med
    
        @api.depends("av_lf", "av_cg", "is_federation_com")
        def _compute_contribution_com(self):
            """
            Calcule la cotisation de la fédération de la com pour 1 partenaire
            - Assiette annuelle : VA saisie ou VA au sens CGSCOP
            - Taux : 0.0032
            - Calcul : Valeur Ajoutée * 0.0032
            - Pour les nouvelles coopératives (pas de comptes annuels) :
                108 € par salarié (effectif moyen s’il est saisi, à défaut
                effectif), soit 27 € par salarié et par trimestre.
            - Plancher annuel : 108 €
            - Plafond annuel : 18 428 €
    
            @return float : cotisation
            """
            plafond = 18428
            rate = 0.0032
            for liasse in self:
                plancher = liasse.get_plancher_cotiz()["fede_com"]
                liasse.read(["av_lf", "av_cg"])
                if liasse.partner_id.is_federation_com:
                    # Calcul VA
                    if liasse.av_lf != 0:
                        if liasse.av_lf > liasse.av_cg:
                            va = liasse.av_cg
                        else:
                            va = liasse.av_lf
                    else:
                        va = liasse.av_cg
    
                    # Calcul VA proratisée
                    if liasse.dureeExercice and liasse.dureeExercice not in (
                        0,
                        12,
                    ):
                        va = va * (12 / liasse.dureeExercice)
                    else:
                        va = va
    
                    # Calcul effectifs
                    staff_id = self.get_last_staff_id(liasse.partner_id)
                    if staff_id:
                        staff_average = staff_id.staff_average
                        staff_count = staff_id.staff_count
                    else:
                        staff_average = 0
                        staff_count = 0
    
                    # Calcul cotisation
                    if va != 0:
                        contribution_com = va * rate
                    else:
                        if staff_average > 0:
                            contribution_com = staff_average * plancher
                        else:
                            contribution_com = staff_count * plancher
                    if plancher <= contribution_com <= plafond:
                        liasse.contribution_com = contribution_com
                    elif contribution_com < plancher:
                        liasse.contribution_com = plancher
                    else:
                        liasse.contribution_com = plafond
    
        @api.depends("L2052_FY", "partner_id.cae", "is_federation_cae")
        def _compute_contribution_cae(self):
            """
            Calcule la cotisation CAE 1 partenaire :
             - 0,36 % de la masse salariale annuelle brute
             - plancher = 300
             - plafond = 8000
             @return float : cotisation
            """
            for liasse in self:
                if liasse.partner_id.cae:
                    plancher = liasse.get_plancher_cotiz()["fede_cae"]
                    plafond = 8000
                    rate = 0.0036
                    contribution_cae = 0
                    if liasse.L2052_FY:
                        contribution_cae = liasse.L2052_FY * rate
                    if contribution_cae < plancher:
                        liasse.contribution_cae = plancher
                    elif contribution_cae > plafond:
                        liasse.contribution_cae = plafond
                    else:
                        liasse.contribution_cae = contribution_cae
    
        # ------------------------------------------------------
        # Business Function
        # ------------------------------------------------------
        def get_plancher_cotiz(self):
            return {
                "fede_com": 108,
                "fede_cae": 300,
                "ur_hdf": 40,
            }
    
        def get_values_for_cotiz_cg(self, partner):
            # Calcul des Taux SCOP en fonction du type
            plancher1 = 300
            plancher2 = 600
            plancher3 = 75000
            plafond = 320000
            if partner.cooperative_form_id in (
                self.env.ref("cgscop_partner.form_coop47"),
                self.env.ref("cgscop_partner.form_lamaneur"),
            ):
                plancher1 = 2 / 3 * plancher1
                plancher2 = 2 / 3 * plancher2
                plancher3 = 2 / 3 * plancher3
                plafond = 2 / 3 * plafond
    
            return {
                "plancher1": plancher1,
                "plancher2": plancher2,
                "plancher3": plancher3,
                "plafond": plafond,
            }
    
        def get_rate_ca(self, partner):
            # Calcul des Taux SCOP en fonction du type
            if partner.cooperative_form_id in (
                self.env.ref("cgscop_partner.form_coop47"),
                self.env.ref("cgscop_partner.form_lamaneur"),
            ):
                rate_ca = 0.002
            else:
                rate_ca = 0.003
            return rate_ca
    
        def get_rate_va(self, partner):
            # Calcul des Taux SCOP en fonction du type
            if partner.cooperative_form_id in (
                self.env.ref("cgscop_partner.form_coop47"),
                self.env.ref("cgscop_partner.form_lamaneur"),
            ):
                rate_va = 0.0047
            else:
                rate_va = 0.007
            return rate_va
    
        def get_assiette(self):
            # Calcul VA
            self.read(["av_lf", "av_cg", "L2052_FL"])
            if self.av_lf > 0:
                if self.av_lf > self.av_cg:
                    va = self.av_cg
                else:
                    va = self.av_lf
            else:
                va = self.av_cg
            ca = self.L2052_FL
            if self.dureeExercice and self.dureeExercice not in (0, 12):
                va = va * (12 / self.dureeExercice)
                ca = ca * (12 / self.dureeExercice)
    
            # Calcul Type Assiette
            if ca > 0 and va > 0:
                if ca <= va * 7 / 3:
                    contribution_base_type = "ca"
                else:
                    contribution_base_type = "va"
            else:
                if va > 0:
                    contribution_base_type = "va"
                else:
                    contribution_base_type = "ca"
    
            # Calcul Cotisation CG Scop
            if contribution_base_type == "ca":
                rate = self.get_rate_ca(self.partner_id)
                contribution = ca * rate
            else:
                rate = self.get_rate_va(self.partner_id)
                contribution = va * rate
    
            return contribution
    
        def get_last_staff_id(self, partner):
            """
            Return last known staff_id line
            :param partner:
            :return:
            """
            staff_id = partner.staff_ids.sorted(key=lambda l: l.effective_date)
            return staff_id[-1] if len(staff_id) > 1 else staff_id