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

scop_bordereau_refund_wizard.py

Blame
  • scop_bordereau_refund_wizard.py 7,37 Kio
    # Copyright 2021 Le Filament
    # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
    
    from odoo import fields, models, api
    from odoo.exceptions import ValidationError
    
    
    class ScopBordereauRefundWizard(models.TransientModel):
        _name = 'scop.bordereau.refund.wizard'
        _description = 'Avoir sur les bordereaux'
    
        bordereau_id = fields.Many2one(
            comodel_name='scop.bordereau',
            string='Bordereau',
            readonly=True,
        )
        date_refund = fields.Date(
            string="Date de régularisation",
            default=fields.Date.today(), required=1)
        amount_refund = fields.Float('Montant', required=1)
        comment = fields.Char('Motif de l\'avoir', required=1)
        type_cotiz = fields.Selection(
            string='Type de cotisation',
            selection=lambda self: self._selection_type_cotiz(),
            required=1)
        cotiz_quarter = fields.Selection(
            string='Trimestre',
            selection=[(1, 1), (2, 2), (3, 3), (4, 4)],
            required=1, )
    
        # ------------------------------------------------------
        # Constrains
        # ------------------------------------------------------
        @api.constrains('date_refund')
        def _check_date_refund(self):
            last_date = max(self.bordereau_id.invoice_ids.mapped('date_invoice'))
            if self.date_refund > fields.Date.today() or \
                    self.date_refund < last_date:
                raise ValidationError("La date de l'avoir 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(ScopBordereauRefundWizard, self).default_get(fields)
            bordereau_id = self.env['scop.bordereau'].browse(
                self.env.context.get('active_id')
            )
            res.update({
                'bordereau_id': bordereau_id.id,
            })
            return res
    
        @api.model
        def _selection_type_cotiz(self):
            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'])
    
            ur_hdf = self.env.ref('cgscop_partner.riga_14232').id
            if bordereau_id.partner_id.ur_id.id == ur_hdf:
                product_ur = self.env.user.company_id.contribution_hdf_id
            else:  # ur = ur_med
                product_ur = self.env.user.company_id.contribution_med_id
    
            cotiz_type = {
                self.env.ref('cgscop_partner.riga_14397').id:
                    self.env.user.company_id.contribution_cg_id,
                self.env.ref('cgscop_partner.riga_14398').id:
                    self.env.user.company_id.contribution_fede_com_id,
                self.env.ref('cgscop_partner.cotiz_fede_cae').id:
                    self.env.user.company_id.contribution_fede_cae_id,
                self.env.ref('cgscop_partner.riga_14399').id:
                    product_ur,
            }
    
            type_cotiz_select_i = list()
            type_cotiz_select_list = list()
            for contrib in contribs:
                type_cotiz = contrib.get('type_contribution_id')[0]
                if type_cotiz not in type_cotiz_select_i:
                    type_cotiz_select_i.append(type_cotiz)
                    type_cotiz_select_list.append(
                        (type_cotiz, cotiz_type[type_cotiz].name))
            return type_cotiz_select_list
    
        # ------------------------------------------------------
        # Action
        # ------------------------------------------------------
        def create_refund(self):
            """
            Create refund
            """
            bordereau_id = self.bordereau_id
            partner_id = bordereau_id.partner_id
            ur_hdf = self.env.ref('cgscop_partner.riga_14232').id
    
            # CREATE VERSION
            bordereau_id.read(['amount_total_cotiz'])
            ongoing_version = bordereau_id.bordereau_version_ids.filtered(
                lambda v: v.version == bordereau_id.version and v.state == 'new'
            )
            if not ongoing_version:
                self.env['scop.bordereau.version'].create({
                    'bordereau_id': bordereau_id.id,
                    'date': self.date_refund,
                    '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 REFUND
            if partner_id.ur_id.id == 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
                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.env.user.company_id.contribution_cg_id,
                     self.env.user.company_id.contribution_journal_id,
                     partner_id.property_account_receivable_id],
                self.env.ref('cgscop_partner.riga_14398').id:
                    [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.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:
                    [product_ur,
                     self.env.user.company_id.contribution_ur_or_fede_journal_id,
                     account_ur],
            }
            product = cotiz_type.get(int(self.type_cotiz))[0]
            refund = self.env['account.invoice'].create({
                'partner_id': partner_id.id,
                'journal_id': cotiz_type.get(int(self.type_cotiz))[1].id,
                'account_id': cotiz_type.get(int(self.type_cotiz))[2].id,
                'type': 'out_refund',
                'date_invoice': self.date_refund,
                'date': self.date_refund,
                'state': 'draft',
                'number': False,
                'origin': bordereau_id.name,
                'reference': False,
                'bordereau_id': bordereau_id.id,
                'is_contribution': True,
                'year': bordereau_id.year,
                'cotiz_quarter': self.cotiz_quarter,
                'liasse_fiscale_id': bordereau_id.liasse_fiscale_id.id,
                'type_contribution_id': self.type_cotiz,
                'payment_mode_id': bordereau_id.payment_mode_id.id,
                'date_due': self.date_refund,
            })
            self.env['account.invoice.line'].create({
                'name': self.comment,
                'invoice_id': refund.id,
                'product_id': product.id,
                'account_id': product.property_account_income_id.id,
                'price_unit': self.amount_refund
            })