Sélectionner une révision Git
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