Skip to content
Extraits de code Groupes Projets
scop_partner_staff.py 6,49 ko
Newer Older
  • Learn to ignore specific revisions
  • # © 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"
    
    jordan's avatar
    jordan a validé
        _description = "Effectifs"
    
        _rec_name = 'partner_id'
        _order = 'effective_date, partner_id'
    
        partner_id = fields.Many2one(
            comodel_name='res.partner',
            string='Organisme',
    
            domain=[('is_cooperative', '=', 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')],
    
        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')
    
        # ------------------------------------------------------
        # 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',
            }