Sélectionner une révision Git
-
Théo - Le Filament a rédigéThéo - Le Filament a rédigé
scop_bordereau_refund_wizard.py 9,25 Kio
# Copyright 2021 Le Filament
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
from odoo.exceptions import UserError, 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,
)
cotiz_reminder = fields.Html("Rappel des cotisations", readonly=1)
amount_refund = fields.Float("Montant (par trimestre)", 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,
)
quarter_ids = fields.Many2many(
relation="scop_bordereau_refund_wizard_quarter_rel",
comodel_name="scop.bordereau.refund.wizard.quarter",
string="Trimestres",
)
# ------------------------------------------------------
# Constrains
# ------------------------------------------------------
@api.constrains("date_refund")
def _check_date_refund(self):
last_date = max(self.bordereau_id.invoice_ids.mapped("invoice_date"))
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,
"cotiz_reminder": bordereau_id.details,
}
)
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.company.contribution_hdf_id
else: # ur = ur_med
product_ur = self.env.company.contribution_med_id
cotiz_type = {
self.env.ref(
"cgscop_partner.riga_14397"
).id: self.env.company.contribution_cg_id,
self.env.ref(
"cgscop_partner.riga_14398"
).id: self.env.company.contribution_fede_com_id,
self.env.ref(
"cgscop_partner.cotiz_fede_cae"
).id: self.env.company.contribution_fede_cae_id,
self.env.ref("cgscop_partner.riga_14399").id: product_ur,
self.env.ref(
"cgscop_partner.cotiz_fede_indus"
).id: self.env.company.contribution_fede_indus_id,
}
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
"""
if len(self.quarter_ids) == 0:
raise UserError(_("Vous devez sélectionner au moins un trimestre."))
if self.amount_refund <= 0:
raise UserError(_("Le montant de l'avoir doit être supérieur à 0."))
if not self.type_cotiz:
raise UserError(_("Vous devez sélectionner un type de cotisation."))
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.company.contribution_hdf_id
journal_ur = self.env.user.company_id.journal_ur_hdf_id
else: # ur = ur_med
product_ur = self.env.company.contribution_med_id
journal_ur = self.env.user.company_id.journal_ur_med_id
cotiz_type = {
self.env.ref("cgscop_partner.riga_14397").id: [
self.env.company.contribution_cg_id,
self.env.company.contribution_journal_id,
partner_id.property_account_receivable_id,
],
self.env.ref("cgscop_partner.riga_14398").id: [
self.env.company.contribution_fede_com_id,
self.env.user.company_id.journal_fede_com_id,
partner_id.property_account_receivable_id,
],
self.env.ref("cgscop_partner.cotiz_fede_cae").id: [
self.env.company.contribution_fede_cae_id,
self.env.user.company_id.journal_fede_cae_id,
partner_id.property_account_receivable_id,
],
self.env.ref("cgscop_partner.riga_14399").id: [
product_ur,
journal_ur,
partner_id.property_account_receivable_id,
],
self.env.ref("cgscop_partner.cotiz_fede_indus").id: [
self.env.company.contribution_fede_indus_id,
self.env.user.company_id.journal_fede_indus_id,
partner_id.property_account_receivable_id,
],
}
product = cotiz_type.get(int(self.type_cotiz))[0]
for quarter_id in self.quarter_ids:
date_due = self.bordereau_id.invoice_ids.filtered(
lambda i: i.cotiz_quarter == str(quarter_id.quarter)
and i.move_type == "out_invoice"
)[0].invoice_date_due
self.env["account.move"].create(
{
"partner_id": partner_id.id,
"journal_id": cotiz_type.get(int(self.type_cotiz))[1].id,
"move_type": "out_refund",
"invoice_date": self.date_refund,
"date": self.date_refund,
"state": "draft",
"ref": self.comment,
"bordereau_id": bordereau_id.id,
"is_contribution": True,
"year": bordereau_id.year,
"cotiz_quarter": str(quarter_id.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,
"invoice_date_due": date_due,
"invoice_line_ids": [
(
0,
None,
{
"product_id": product.id,
"account_id": product.property_account_income_id.id,
"name": self.comment,
"price_unit": self.amount_refund,
"price_subtotal": self.amount_refund,
},
),
],
}
)
class ScopBordereauRefundWizardQuarer(models.Model):
_name = "scop.bordereau.refund.wizard.quarter"
_description = "Trimestres pour échéance de cotisation"
name = fields.Char("Nom", compute="_compute_name")
quarter = fields.Integer("Trimestre", required=1)
def _compute_name(self):
for r in self:
r.name = str(r.quarter)