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

__manifest__.py

Blame
  • 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',
            }