Sélectionner une révision Git
res_partner_newsletter.py
Bifurcation depuis
Le Filament / Confédération Générale des SCOP / cgscop_partner
Le projet source a une visibilité limitée.
scop_partner_staff.py 8,63 Kio
# © 2020 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
from odoo.exceptions import ValidationError
class ScopPartnerStaff(models.Model):
_name = "scop.partner.staff"
_description = "Effectifs"
_rec_name = "partner_id"
_order = "effective_date, partner_id"
# ------------------------------------------------------
# Default
# ------------------------------------------------------
@api.model
def default_get(self, fields):
res = super(ScopPartnerStaff, self).default_get(fields)
partner_id = self.env.context.get("default_partner_id", False)
if partner_id:
staff_line = self.search(
[
("partner_id", "=", partner_id),
],
order="effective_date desc, id desc",
limit=1,
)
if staff_line:
staff_list = [
"staff_count",
"staff_shareholder_count",
"staff_shareholder_total",
"staff_average",
]
for staff in staff_list:
res[staff] = staff_line[staff]
return res
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
partner_id = fields.Many2one(
comodel_name="res.partner",
string="Organisme",
domain=[("is_cooperative", "=", True)],
ondelete="restrict",
required=True,
index=True,
)
partner_city = fields.Char("Ville", related="partner_id.city")
partner_siret = fields.Char("SIRET", related="partner_id.siret")
cooperative_form_id = fields.Many2one(related="partner_id.cooperative_form_id")
naf_id = fields.Many2one(related="partner_id.naf_id")
is_partner_in_tracked_naf = fields.Boolean(
"Coop dans les NAF marqués",
compute="_compute_is_partner_in_tracked_naf",
)
user_id = fields.Many2one(
comodel_name="res.users",
string="Utilisateur",
ondelete="restrict",
required=True,
default=lambda self: self.env.uid,
)
type_entry = fields.Selection(
[
("questionnaire", "Questionnaire"),
("questionnaire_inscription", "Questionnaire Inscription"),
("membership", "Adhésion"),
("regul_ur", "Régularisation UR"),
("regul_cg", "Régularisation CG"),
("regul_diane", "Régularisation Diane"),
],
string="Type",
default="regul_ur",
required=True,
)
effective_date = fields.Date(
string="Date",
default=fields.Date.today(),
required=True,
)
staff_count = fields.Integer(
"Effectif (EF)",
)
staff_shareholder_count = fields.Integer("Nb Sociétaires Salarié")
staff_shareholder_total = fields.Integer("Total associés")
staff_average = fields.Float("Equivalent temps plein (ETP)")
staff_men = fields.Integer("Eff. salariés hommes")
staff_women = fields.Integer("Eff. salariés femmes")
staff_shareholder_men = fields.Integer("Sociétaires salariés hommes")
staff_shareholder_women = fields.Integer("Sociétaires salariés femmes")
comment = fields.Char("Commentaire")
# ------------------------------------------------------
# Compute
# ------------------------------------------------------
def _compute_is_partner_in_tracked_naf(self):
naf_90_01Z = self.env.ref("lefilament_naf.naf_90_01Z").id
naf_90_02Z = self.env.ref("lefilament_naf.naf_90_02Z").id
naf_78_20Z = self.env.ref("lefilament_naf.naf_78_20Z").id
naf_82_11Z = self.env.ref("lefilament_naf.naf_82_11Z").id
naf_78_10Z = self.env.ref("lefilament_naf.naf_78_10Z").id
for r in self:
if r.naf_id.id in (
naf_90_01Z,
naf_90_02Z,
naf_78_20Z,
naf_82_11Z,
naf_78_10Z,
):
r.is_partner_in_tracked_naf = True
else:
r.is_partner_in_tracked_naf = False
# ------------------------------------------------------
# OnChange
# ------------------------------------------------------
@api.onchange("type_entry")
def _onchange_type_entry(self):
"""
Interdit la sélection questionnaire ou questionnaire inscription
sur l'interface
"""
if self.type_entry in (
"questionnaire",
"questionnaire_inscription",
) and not self.env.user.has_group("cgscop_partner.group_cg_administrative"):
raise ValidationError(
_('Vous ne pouvez choisir que des types "Régularisation".')
)
# ------------------------------------------------------
# Contrains
# ------------------------------------------------------
@api.constrains(
"cooperative_form_id",
"type_entry",
"staff_count",
"staff_shareholder_count",
"staff_average",
)
def _check_staff(self):
"""
Règles spécifiques pour les effectifs
"""
scic = self.env.ref("cgscop_partner.form_scic").id
scop = self.env.ref("cgscop_partner.form_scop").id
def check_staff_shareholder():
# Effectif total >= effectif sociétaires
if self.staff_shareholder_count > 0:
if not self.staff_count >= self.staff_shareholder_count:
raise ValidationError(
_(
"L'effectif total doit être supérieur ou égal au "
"nombre de sociétaires salariés"
)
)
def check_staff_average():
if self.staff_average > 0:
if not self.staff_count >= self.staff_average:
raise ValidationError(
_(
"L'effectif total doit être supérieur ou égal au "
"nombre d'équivalent temps plein"
)
)
# Les règles ne s'appliquent pas pour les entrées LM / Questionnaire
if self.type_entry not in ("questionnaire", "questionnaire_inscription"):
# Règles pour les SCIC
if self.cooperative_form_id.id == scic:
check_staff_shareholder()
check_staff_average()
# Règles pour les SCOP
elif self.cooperative_form_id.id == scop:
# Effectif total non nul
if self.staff_count == 0:
raise ValidationError(
_(
"L'effectif total doit être supérieur ou égal à 0 "
"pour cette copérative de type SCOP"
)
)
check_staff_shareholder()
check_staff_average()
# Règles sprécifiques pour les NAF suivis
if self.is_partner_in_tracked_naf:
if self.staff_average == 0:
raise ValidationError(
_(
"Le nombre d'équivalent temps plein doit être "
"renseigné pour cette coopérative"
)
)
@api.constrains("effective_date")
def _check_effective_date(self):
"""
Interdit la création de deux lignes à une même date
pour un même partenaire sauf pour LM
"""
for record in self:
doublon = self.search(
[
("partner_id", "=", record.partner_id.id),
("effective_date", "=", record.effective_date),
]
)
if len(doublon) > 1 and record.type_entry not in (
"questionnaire",
"questionnaire_inscription",
):
raise ValidationError(
_("Vous ne pouvez pas créer 2 ajustements à la même date.")
)
# ------------------------------------------------------
# Buttons
# ------------------------------------------------------
def edit_staff(self):
form_id = self.env.ref("cgscop_partner.scop_partner_staff_form_view")
return {
"type": "ir.actions.act_window",
"res_model": "scop.partner.staff",
"view_mode": "form",
"views": [[form_id.id, "form"]],
"res_id": self.id,
"target": "new",
}