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

calendar.py

Blame
  • Bifurcation depuis Le Filament / Confédération Générale des SCOP / cgscop_calendar
    Le projet source a une visibilité limitée.
    scop_cotisation_cg_regul.py 10,54 Kio
    # Copyright 2020 Le Filament
    # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
    
    from odoo import fields, models, api
    from odoo.exceptions import UserError, ValidationError
    
    
    class ScopCotisationRegul(models.TransientModel):
        _name = 'scop.cotisation.regul.wizard'
        _description = 'Regularisation cotisation CG'
    
        name = fields.Char()
        date_regul = fields.Date(
            string="Date de régularisation",
            default=fields.Date.today())
        bordereau_id = fields.Many2one(
            comodel_name='scop.bordereau',
            string='Bordereau',
            readonly=True,
        )
        partner_id = fields.Many2one(
            comodel_name='res.partner',
            string='Adhérent',
            readonly=True,
        )
    
        # Old liasse
        liasse_fiscale_id = fields.Many2one(
            comodel_name='scop.liasse.fiscale',
            string='Liasse Fiscale de référence',
        )
        year = fields.Integer('Année de la liasse')
        type_assiette_retenu = fields.Selection(
            string='Type assiette',
            selection=[('ca', 'CA'),
                       ('va', 'VA'), ],
        )
        montant_assiette = fields.Float(
            string='Montant assiette de cotisation',)
        amount_total_cotiz = fields.Float(
            string='Montant total de(s) cotisation(s)')
        detail = fields.Text('Détail cotisation')
        comment = fields.Char('Motif de régularisation')
    
        # New liasse
        liasse_fiscale_new_id = fields.Many2one(
            comodel_name='scop.liasse.fiscale',
            string='Liasse Fiscale',
        )
        type_id_new = fields.Selection(
            string='Type de liasse', related='liasse_fiscale_new_id.type_id')
        source_new = fields.Selection(
            string='Source de la liasse', related='liasse_fiscale_new_id.source')
        type_assiette_new = fields.Selection(
            related='liasse_fiscale_new_id.contribution_base_type')
        montant_assiette_new = fields.Integer(
            related='liasse_fiscale_new_id.contribution_base_amount')
        amount_cg = fields.Float(
            related='liasse_fiscale_new_id.contribution_cg')
        amount_ur_med = fields.Float(
            related='liasse_fiscale_new_id.contribution_med')
        amount_ur_hdf = fields.Float(
            related='liasse_fiscale_new_id.contribution_hdf')
        amount_fede_com = fields.Float(
            related='liasse_fiscale_new_id.contribution_com')
        amount_fede_cae = fields.Float(
            related='liasse_fiscale_new_id.contribution_cae')
    
        is_payment = fields.Boolean('Paiements liés')
    
        # ------------------------------------------------------
        # Constrains
        # ------------------------------------------------------
        @api.constrains('date_regul')
        def _check_date_regul(self):
            last_date = max(self.bordereau_id.invoice_ids.mapped('date_invoice'))
            if self.date_regul > fields.Date.today() or \
                    self.date_regul < last_date:
                raise ValidationError("La date de régulation doit être "
                                      "inférieure ou égale à la date du jour et "
                                      "supérieure à la dernière date de "
                                      "facturation liée au bordereau.")
    
        # ------------------------------------------------------
        # Override ORM
        # ------------------------------------------------------
        @api.model
        def default_get(self, fields):
            res = super(ScopCotisationRegul, self).default_get(fields)
            bordereau_id = self.env['scop.bordereau'].browse(
                self.env.context.get('active_id')
            )
            contribs = bordereau_id.invoice_ids.read_group(
                [('id', 'in', bordereau_id.invoice_ids.ids)],
                ['type_contribution_id', 'amount_total_signed'],
                ['type_contribution_id'])
            detail = "<table class='o_group o_inner_group'>"
            for contrib in contribs:
                detail += ('<tr><td class="o_td_label font-weight-bold">'
                           + str(contrib.get('type_contribution_id')[1])
                           + '</td><td style="width: 100%;">'
                           + str(contrib.get('amount_total_signed')) + '€</td>')
            detail += '</table>'
            payments = list(map(
                lambda i: True if i.payment_move_line_ids else False,
                bordereau_id.invoice_ids))
            if True in payments:
                is_payment = True
            else:
                is_payment = False
            res.update({
                'bordereau_id': bordereau_id.id,
                'partner_id': bordereau_id.partner_id.id,
                'liasse_fiscale_id': bordereau_id.liasse_fiscale_id.id,
                'year': bordereau_id.year_liasse,
                'type_assiette_retenu': bordereau_id.type_assiette,
                'montant_assiette': bordereau_id.montant_assiette,
                'amount_total_cotiz': bordereau_id.amount_total_cotiz,
                'detail': detail,
                'is_payment': is_payment,
            })
            return res
    
        # ------------------------------------------------------
        # Action
        # ------------------------------------------------------
        def update_contribution(self):
            if not self.comment:
                raise UserError("Vous devez renseigner un motif de "
                                "régularisation pour valider.")
    
            bordereau_id = self.bordereau_id
            partner_id = bordereau_id.partner_id
    
            # CREATE VERSION
            bordereau_id.read(['amount_total_cotiz'])
            self.env['scop.bordereau.version'].create({
                'bordereau_id': bordereau_id.id,
                'date': self.date_regul,
                'comment': self.comment,
                'version': bordereau_id.version,
                'liasse_fiscale_id_old': bordereau_id.liasse_fiscale_id.id,
                'type_assiette': bordereau_id.type_assiette,
                'montant_assiette': bordereau_id.montant_assiette,
                'amount_total_cotiz': bordereau_id.amount_total_cotiz,
            })
    
            # CREATE REGUL
            contribs = bordereau_id.invoice_ids.read_group(
                [('id', 'in', bordereau_id.invoice_ids.ids)],
                ['type_contribution_id', 'amount_total_signed'],
                ['type_contribution_id'])
    
            ur_hdf = self.env.ref('cgscop_partner.riga_14232').id
            if partner_id.ur_id.id == ur_hdf:
                amount_ur = self.amount_ur_hdf
                product_ur = self.env.user.company_id.contribution_hdf_id
                account_ur = self.env.user.company_id.receivable_account_ur_hdf_id
            else:  # ur = ur_med
                amount_ur = self.amount_ur_med
                product_ur = self.env.user.company_id.contribution_med_id
                account_ur = self.env.user.company_id.receivable_account_ur_med_id
    
            cotiz_type = {
                self.env.ref('cgscop_partner.riga_14397').id:
                    [self.amount_cg,
                     self.env.user.company_id.contribution_cg_id,
                     self.env.user.company_id.contribution_journal_id,
                     partner_id.property_account_receivable_id.id],
                self.env.ref('cgscop_partner.riga_14398').id:
                    [self.amount_fede_com,
                     self.env.user.company_id.contribution_fede_com_id,
                     self.env.user.company_id.contribution_ur_or_fede_journal_id,
                     self.env.user.company_id.receivable_account_fede_com_id],
                self.env.ref('cgscop_partner.cotiz_fede_cae').id:
                    [self.amount_fede_cae,
                     self.env.user.company_id.contribution_fede_cae_id,
                     self.env.user.company_id.contribution_ur_or_fede_journal_id,
                     self.env.user.company_id.receivable_account_fede_cae_id],
                self.env.ref('cgscop_partner.riga_14399').id:
                    [amount_ur,
                     product_ur,
                     self.env.user.company_id.contribution_ur_or_fede_journal_id,
                     account_ur],
            }
    
            quarters = [bordereau_id.base_cotisation_cg.trimester_1,
                        bordereau_id.base_cotisation_cg.trimester_2,
                        bordereau_id.base_cotisation_cg.trimester_3,
                        bordereau_id.base_cotisation_cg.trimester_4]
    
            for contrib in contribs:
                type_cotiz = contrib.get('type_contribution_id')[0]
                amount_cotiz_old = contrib.get('amount_total_signed')
                amount_cotiz = cotiz_type.get(type_cotiz)[0]
                refund_amount_total = self.env['scop.cotisation'].\
                    round_to_closest_multiple(amount_cotiz_old - amount_cotiz, 4)
                product = cotiz_type.get(type_cotiz)[1]
                type_invoice = False
    
                if refund_amount_total < 0:
                    type_invoice = 'out_invoice'
                    refund_amount_total *= -1
                elif refund_amount_total > 0:
                    type_invoice = 'out_refund'
                refund_amount = refund_amount_total / bordereau_id.nb_quarter
    
                if type_invoice:
                    for i in range(0, bordereau_id.nb_quarter):
    
                        if self.date_regul < quarters[i]:
                            date_due = quarters[i]
                        else:
                            date_due = self.date_regul
    
                        refund = self.env['account.invoice'].create({
                            'partner_id': partner_id.id,
                            'journal_id': cotiz_type.get(type_cotiz)[2].id,
                            'account_id': partner_id.property_account_receivable_id.id,
                            'type': type_invoice,
                            'date_invoice': self.date_regul,
                            'date': self.date_regul,
                            'state': 'draft',
                            'number': False,
                            'origin': bordereau_id.name,
                            'name': self.comment,
                            'bordereau_id': bordereau_id.id,
                            'is_contribution': True,
                            'year': bordereau_id.year,
                            'liasse_fiscale_id': bordereau_id.liasse_fiscale_id.id,
                            'type_contribution_id': type_cotiz,
                            'payment_mode_id': bordereau_id.payment_mode_id.id,
                            'date_due': date_due,
                            'cotiz_quarter': i+1,
                        })
                        self.env['account.invoice.line'].create({
                            'name': self.comment + " - " + str(i+1) + "/" + str(bordereau_id.nb_quarter),
                            'invoice_id': refund.id,
                            'product_id': product.id,
                            'account_id': product.property_account_income_id.id,
                            'price_unit': refund_amount
                        })
            bordereau_id.update({
                'liasse_fiscale_id': self.liasse_fiscale_new_id.id
            })
            bordereau_id.invoice_ids.update({
                'liasse_fiscale_id': self.liasse_fiscale_new_id.id
            })