From 5d0d1f2d157cb87734eea7fd1e3aed96cf678488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paula=20Fern=C3=A1ndez?= Date: Fri, 12 Dec 2025 13:08:35 +0100 Subject: [PATCH 1/2] FIX: Permite editar cantidades en SO confirmados para recalcular el riesgo fix fix after CR fix after CR II --- sale_financial_risk/models/sale.py | 50 +++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/sale_financial_risk/models/sale.py b/sale_financial_risk/models/sale.py index 0775df8b8..e17f96fc2 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,48 @@ 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 == "sale") + old_risk_total = {} + # Almacenar el riesgo total ANTES + for order in orders_to_check: + partner = order.partner_invoice_id.commercial_partner_id + old_risk_total[order.id] = partner.risk_total + # 2.actualizar líneas y recalcular riesgo + res = super(SaleOrder, self).write(vals) + # 3. VALIDAR RIESGO DESPUÉS CAMBIOS + for order in orders_to_check: + partner = order.partner_invoice_id.commercial_partner_id + new_risk_total = partner.risk_total + # Comparar el riesgo con el valor almacenado ANTES del 'write' + risk_difference = float_compare( + new_risk_total, old_risk_total[order.id], precision_digits=2 + ) + exception_msg = order.with_context( + current_risk_difference=risk_difference + ).evaluate_risk_message(partner) + # B. AUMENTO + exception_msg = order.evaluate_risk_message(partner) + if exception_msg: + warning_message = ( + _( + "RISK EXCEEDED: A confirmed order has been modified and saved. " + "This operation increases the client's consumed risk. %s" + ) + % exception_msg + ) + self.env.cr.execute( + """ + INSERT INTO ir_logging + (create_date, create_uid, name, level, message, type, path, line, func) + VALUES + (NOW(), %s, 'sale.order', 'WARNING', %s, 'server', 'sale.py', %s, 'write') + """, + (self.env.uid, warning_message, 95), + ) + return res + class SaleOrderLine(models.Model): _inherit = "sale.order.line" From 25151b876357bbfcea29956d38423961a5461839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paula=20Fern=C3=A1ndez?= Date: Wed, 24 Dec 2025 09:37:11 +0100 Subject: [PATCH 2/2] fix para tener en cuenta pedidos confirmados no solo presupuestos --- sale_financial_risk/models/sale.py | 55 +++++++++++++----------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/sale_financial_risk/models/sale.py b/sale_financial_risk/models/sale.py index e17f96fc2..46896bc1b 100644 --- a/sale_financial_risk/models/sale.py +++ b/sale_financial_risk/models/sale.py @@ -73,44 +73,35 @@ def _get_risk_states(self): def write(self, vals): # 1. IDENTIFICAR PEDIDOS CONFIRMADOS - orders_to_check = self.filtered(lambda so: so.state == "sale") - old_risk_total = {} - # Almacenar el riesgo total ANTES - for order in orders_to_check: - partner = order.partner_invoice_id.commercial_partner_id - old_risk_total[order.id] = partner.risk_total + 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 - # Comparar el riesgo con el valor almacenado ANTES del 'write' - risk_difference = float_compare( - new_risk_total, old_risk_total[order.id], precision_digits=2 - ) - exception_msg = order.with_context( - current_risk_difference=risk_difference - ).evaluate_risk_message(partner) - # B. AUMENTO - exception_msg = order.evaluate_risk_message(partner) - if exception_msg: - warning_message = ( - _( - "RISK EXCEEDED: A confirmed order has been modified and saved. " - "This operation increases the client's consumed risk. %s" - ) - % exception_msg - ) - self.env.cr.execute( - """ - INSERT INTO ir_logging - (create_date, create_uid, name, level, message, type, path, line, func) - VALUES - (NOW(), %s, 'sale.order', 'WARNING', %s, 'server', 'sale.py', %s, 'write') - """, - (self.env.uid, warning_message, 95), - ) + 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