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