Sélectionner une révision Git
scop_partner_staff.py 7,45 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 models, fields, api
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)
print('hello!')
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='set null',
required=True,
default=lambda self: self.env.uid)
type_entry = fields.Selection([
('questionnaire', 'Questionnaire'),
('questionnaire_inscription', 'Questionnaire Inscription'),
('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)", required=True, )
staff_shareholder_count = fields.Integer("Nb Sociétaires Salarié")
staff_shareholder_total = fields.Integer("Total associés")
staff_average = fields.Integer("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")
questionnaire_id = fields.Many2one(
comodel_name='scop.questionnaire',
string='Questionnaire',
ondelete='cascade')
comment = fields.Char('Commentaire')
# ------------------------------------------------------
# Compute
# ------------------------------------------------------
@api.multi
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.one
@api.constrains('staff_count', 'staff_shareholder_count', 'staff_average')
def _check_staff(self):
"""
Interdit de créer une ligne à 0 sauf lorsque
cette ligne vient de la liste ministère
ou si ligne associés / ETP pour les SCIC
ou si ligne ETP pour les 'tracked naf'
"""
if self.type_entry \
not in ('questionnaire', 'questionnaire_inscription'):
if self.cooperative_form_id.id == self.env.ref(
'cgscop_partner.form_scic').id:
if self.staff_count == 0:
raise ValidationError(
"La colonne Effectif (EF) doit être renseignée"
" et supérieurs à 0.")
elif self.is_partner_in_tracked_naf:
if self.staff_count == 0 or self.staff_shareholder_count == 0:
raise ValidationError(
"Les colonnes Effectif (EF) et Nb Sociétaires Salarié"
" doivent être renseignés et supérieurs à 0.")
else:
if self.staff_shareholder_count == 0 \
or self.cooperative_form_id == 0 \
or self.staff_average == 0:
raise ValidationError(
"Tous les effectifs doivent"
" être renseignés et supérieurs à 0.")
@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',
}