diff --git a/backend/api/v1/modules/a76/items/exports/validators/calculations.py b/backend/api/v1/modules/a76/items/exports/validators/calculations.py index d5703cd4..f49a195e 100644 --- a/backend/api/v1/modules/a76/items/exports/validators/calculations.py +++ b/backend/api/v1/modules/a76/items/exports/validators/calculations.py @@ -239,27 +239,42 @@ def calculate_values( if not result: return + if not line.financial or not line.quantity: + return + currency, currency_type, exchange_rate = result if currency_type in ("USD", "ME"): currency = "foreign" elif currency_type in ("MXN", "MN"): currency = "local" + # Evitar None * None / NoneType * Decimal al guardar sin cantidad o sin costo capturado + qty = ( + line.quantity.quantity + if line.quantity.quantity is not None + else Decimal("0") + ) + capture = ( + line.financial.unit_cost_capture + if line.financial.unit_cost_capture is not None + else Decimal("0") + ) + if currency == "foreign": # ME - line.financial.unit_cost_usd = line.financial.unit_cost_capture - line.financial.value_usd = line.financial.unit_cost_usd * line.quantity.quantity - line.financial.unit_cost_mxn = line.financial.unit_cost_capture * (exchange_rate or 1) - line.financial.value_mxn = line.financial.unit_cost_mxn * line.quantity.quantity - line.financial.value_mc = line.financial.unit_cost_usd * line.quantity.quantity + line.financial.unit_cost_usd = capture + line.financial.value_usd = capture * qty + line.financial.unit_cost_mxn = capture * (exchange_rate or 1) + line.financial.value_mxn = line.financial.unit_cost_mxn * qty + line.financial.value_mc = capture * qty elif currency == "local": # MN - line.financial.unit_cost_mxn = line.financial.unit_cost_capture - line.financial.value_mxn = line.financial.unit_cost_mxn * line.quantity.quantity - line.financial.unit_cost_usd = line.financial.unit_cost_capture / (exchange_rate or 1) - line.financial.value_usd = line.financial.unit_cost_usd * line.quantity.quantity - line.financial.value_mc = line.financial.unit_cost_usd * line.quantity.quantity + line.financial.unit_cost_mxn = capture + line.financial.value_mxn = line.financial.unit_cost_mxn * qty + line.financial.unit_cost_usd = capture / (exchange_rate or 1) + line.financial.value_usd = line.financial.unit_cost_usd * qty + line.financial.value_mc = line.financial.unit_cost_usd * qty elif currency == "manual": # MC - line.financial.unit_cost_usd = line.financial.unit_cost_capture / (exchange_rate or 1) - line.financial.value_usd = line.financial.unit_cost_usd * line.quantity.quantity + line.financial.unit_cost_usd = capture / (exchange_rate or 1) + line.financial.value_usd = line.financial.unit_cost_usd * qty line.financial.unit_cost_mxn = line.financial.unit_cost_usd * (exchange_rate or 1) - line.financial.value_mxn = line.financial.unit_cost_mxn * line.quantity.quantity - line.financial.value_mc = line.financial.unit_cost_capture * line.quantity.quantity + line.financial.value_mxn = line.financial.unit_cost_mxn * qty + line.financial.value_mc = capture * qty diff --git a/backend/api/v1/modules/a76/items/exports/validators/update.py b/backend/api/v1/modules/a76/items/exports/validators/update.py index 2d3e13e9..896f8240 100644 --- a/backend/api/v1/modules/a76/items/exports/validators/update.py +++ b/backend/api/v1/modules/a76/items/exports/validators/update.py @@ -98,6 +98,7 @@ def validate_update( line.financial.unit_cost_mxn = unit_cost_capture quantity = line.quantity.quantity if line.quantity.quantity is not None else existing_line.quantity.quantity + quantity = quantity if quantity is not None else Decimal("0") if line.financial.unit_cost_usd is not None: line.financial.value_usd = line.financial.unit_cost_usd * quantity diff --git a/backend/api/v1/modules/a76/items/imports/validators/calculations.py b/backend/api/v1/modules/a76/items/imports/validators/calculations.py index 8e80ba8c..be6754a0 100644 --- a/backend/api/v1/modules/a76/items/imports/validators/calculations.py +++ b/backend/api/v1/modules/a76/items/imports/validators/calculations.py @@ -138,21 +138,32 @@ def calculate_values( currency = "local" # si currency_type es otro o None, se usa currency tal cual + qty = ( + line.quantity.quantity + if line.quantity.quantity is not None + else Decimal("0") + ) + capture = ( + line.financial.unit_cost_capture + if line.financial.unit_cost_capture is not None + else Decimal("0") + ) + if currency == "foreign": - line.financial.unit_cost_usd = line.financial.unit_cost_capture - line.financial.value_usd = line.financial.unit_cost_usd * line.quantity.quantity - line.financial.unit_cost_mxn = line.financial.unit_cost_capture * (exchange_rate or 1) - line.financial.value_mxn = line.financial.unit_cost_mxn * line.quantity.quantity - line.financial.value_mc = line.financial.unit_cost_usd * line.quantity.quantity + line.financial.unit_cost_usd = capture + line.financial.value_usd = capture * qty + line.financial.unit_cost_mxn = capture * (exchange_rate or 1) + line.financial.value_mxn = line.financial.unit_cost_mxn * qty + line.financial.value_mc = capture * qty elif currency == "local": - line.financial.unit_cost_mxn = line.financial.unit_cost_capture - line.financial.value_mxn = line.financial.unit_cost_mxn * line.quantity.quantity - line.financial.unit_cost_usd = line.financial.unit_cost_capture / (exchange_rate or 1) - line.financial.value_usd = line.financial.unit_cost_usd * line.quantity.quantity - line.financial.value_mc = line.financial.unit_cost_usd * line.quantity.quantity + line.financial.unit_cost_mxn = capture + line.financial.value_mxn = line.financial.unit_cost_mxn * qty + line.financial.unit_cost_usd = capture / (exchange_rate or 1) + line.financial.value_usd = line.financial.unit_cost_usd * qty + line.financial.value_mc = line.financial.unit_cost_usd * qty elif currency == "manual": - line.financial.unit_cost_usd = line.financial.unit_cost_capture / (exchange_rate or 1) - line.financial.value_usd = line.financial.unit_cost_usd * line.quantity.quantity + line.financial.unit_cost_usd = capture / (exchange_rate or 1) + line.financial.value_usd = line.financial.unit_cost_usd * qty line.financial.unit_cost_mxn = line.financial.unit_cost_usd * (exchange_rate or 1) - line.financial.value_mxn = line.financial.unit_cost_mxn * line.quantity.quantity - line.financial.value_mc = line.financial.unit_cost_capture * line.quantity.quantity \ No newline at end of file + line.financial.value_mxn = line.financial.unit_cost_mxn * qty + line.financial.value_mc = capture * qty \ No newline at end of file diff --git a/backend/api/v1/modules/a76/items/imports/validators/update.py b/backend/api/v1/modules/a76/items/imports/validators/update.py index 3f891e0a..ba69b5b4 100644 --- a/backend/api/v1/modules/a76/items/imports/validators/update.py +++ b/backend/api/v1/modules/a76/items/imports/validators/update.py @@ -95,6 +95,7 @@ def validate_update( line.financial.unit_cost_mxn = unit_cost_capture quantity = line.quantity.quantity if line.quantity.quantity is not None else existing_line.quantity.quantity + quantity = quantity if quantity is not None else Decimal("0") if line.financial.unit_cost_usd is not None: line.financial.value_usd = line.financial.unit_cost_usd * quantity