Sélectionner une révision Git
scop_bordereau_refund_wizard.py
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
})