diff --git a/sale_financial_risk/models/sale.py b/sale_financial_risk/models/sale.py index 0775df8b8..46896bc1b 100644 --- a/sale_financial_risk/models/sale.py +++ b/sale_financial_risk/models/sale.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import _, api, fields, models -from odoo.tools import float_round +from odoo.tools import float_compare, float_round class SaleOrder(models.Model): @@ -15,6 +15,12 @@ class SaleOrder(models.Model): def evaluate_risk_message(self, partner): self.ensure_one() + # A. riesgo disminuyó o se mantuvo. Permitido sin aviso. + exception_msg = "" + risk_difference = self.env.context.get("current_risk_difference") + if risk_difference is not None and risk_difference <= 0: + return exception_msg + risk_amount = self.currency_id._convert( self.amount_total, partner.risk_currency_id, @@ -65,6 +71,39 @@ def _get_risk_states(self): risk_states.append("done") return risk_states + def write(self, vals): + # 1. IDENTIFICAR PEDIDOS CONFIRMADOS + orders_to_check = self.filtered(lambda so: so.state in self._get_risk_states()) + old_risk_totals = {order.id: order.partner_invoice_id.commercial_partner_id.risk_total for order in orders_to_check} + + + # 2.actualizar líneas y recalcular riesgo + res = super(SaleOrder, self).write(vals) + # 3. VALIDAR RIESGO DESPUÉS CAMBIOS + warnings = [] + for order in orders_to_check: + partner = order.partner_invoice_id.commercial_partner_id + new_risk_total = partner.risk_total + if float_compare(new_risk_total, old_risk_totals.get(order.id, 0.0), precision_digits=2) > 0: + exception_msg = order.with_context( + current_risk_difference=(new_risk_total - old_risk_totals.get(order.id, 0.0)) + ).evaluate_risk_message(partner) + if exception_msg: + msg = _( + "RISK EXCEEDED: A confirmed order has been modified and saved. " + "This operation increases the client's consumed risk. %s" + )% (order.name, exception_msg) + warnings.append(msg) + + if warnings: + return { + 'warning': { + 'title': _("RISK EXCEEDED"), + 'message': "\n".join(warnings), + } + } + return res + class SaleOrderLine(models.Model): _inherit = "sale.order.line"