Refactor item validation and calculation logic

- Moved validation functions for creating and updating line items to dedicated modules.
- Introduced new calculations module for handling financial calculations related to line items.
- Updated import paths for validation functions to reflect new structure.
This commit is contained in:
2026-03-10 12:21:55 -05:00
parent e0b91728c8
commit 2f5972bf74
6 changed files with 24 additions and 37 deletions

View File

@@ -126,7 +126,10 @@ class InvoiceService:
# Validar si la factura ya existe
invoice_exists(db, invoice_data.invoice_number, tenant_id, company_id, errors)
validate_create_import(db, invoice_data, tenant_id, company_id, errors)
if invoice_data.operation_type == "exp":
validate_create_export(db, invoice_data, tenant_id, company_id, errors)
else:
validate_create_import(db, invoice_data, tenant_id, company_id, errors)
# Si hay errores, lanzar excepción ANTES de intentar crear
errors.raise_if_errors("Error al crear la factura")

View File

@@ -2,18 +2,8 @@ from sqlalchemy.orm import Session
from api.v1.modules.a76.invoices.models import InvoiceFinancials, InvoiceHeader, InvoiceLogistics
from core.exceptions import ErrorCollector
from ....models import LineItem
from ....line_financials.models import LineFinancial
from ....line_financials.schemas import LineFinancialCreate
from ....line_quantities.models import LineQuantity
from ....line_quantities.schemas import LineQuantityCreate
from ....line_customs.models import LineCustom
from ....line_customs.schemas import LineCustomCreate
from ....line_descriptions.models import LineDescription
from ....line_descriptions.schemas import LineDescriptionCreate
from ....line_references.models import LineReference
from api.v1.modules.a24.fa.fa_item_lines.models import FaLineItem
from ....models import LineItem
from ...models import LineItem
from ...models import LineItem
from api.v1.modules.a76.classes.models import Class

View File

@@ -4,10 +4,10 @@ from api.v1.modules.a76.invoices.common.common_validators import invoice_exists_
from core.exceptions import ErrorCollector
from sqlalchemy import func
from ....common.fractions import search_fraction_preference
from ....common.common_validators import item_exists
from ....models import LineItem
from ....line_customs.models import FractionType, LineCustom
from ...common.fractions import search_fraction_preference
from ...common.common_validators import item_exists
from ...models import LineItem
from ...line_customs.models import FractionType, LineCustom
from api.v1.modules.a76.items.schemas import LineItemCreate
from api.v1.modules.a76.invoices.models import InvoiceHeader
from api.v1.modules.a76.classes.models import Class
@@ -304,6 +304,10 @@ def validate_common(
unit_of_measure = line.unit_of_measure or (
class_.unit_of_measure if class_ else None
)
#TODO: SSisGen Logic Restringer cantidades decimales para piezas, revisar si es necesario agregar validación similar para otras unidades de medida
#TODO: SSisGen Logic Seguridad
if unit_of_measure == "PZA" and line.quantity.quantity % 1 != 0:
errors.add_error(
field=f"line[{line_number}].quantity.quantity",

View File

@@ -1,21 +1,12 @@
from decimal import Decimal
from sqlalchemy import func, exists
from sqlalchemy.orm import Session
from ....common.common_validators import count_items
from ...common.common_validators import count_items
from core.exceptions import ErrorCollector
from ....models import LineItem
from ....line_financials.models import LineFinancial
from ....line_financials.schemas import LineFinancialCreate
from ....line_quantities.models import LineQuantity
from ....line_quantities.schemas import LineQuantityCreate
from ....line_customs.models import LineCustom
from ....line_customs.schemas import LineCustomCreate
from ....line_descriptions.models import LineDescription
from ....line_descriptions.schemas import LineDescriptionCreate
from ....line_references.models import LineReference
from ...models import LineItem
from api.v1.modules.a24.fa.fa_item_lines.models import FaLineItem
from ....models import LineItem
from ...models import LineItem
from api.v1.modules.a76.invoices.models import InvoiceHeader
from api.v1.modules.a76.classes.models import Class
from api.v1.modules.a76.general_catalogs.packages.models import Package
@@ -27,7 +18,7 @@ from .common import validate_common
def validate_create(
db: Session,
line: LineItem, # LineItemCreate schema (Pydantic)
line: LineItem,
tenant_id: int,
company_id: int,
errors: ErrorCollector,
@@ -44,7 +35,7 @@ def validate_create(
"""
# Access fa_data safely
fa_data = getattr(line, "fa_data", None)
fa_data: FaLineItem = getattr(line, "fa_data", None)
# Required field validations
if not line.class_id:

View File

@@ -1,9 +1,8 @@
from decimal import Decimal
from sqlalchemy.orm import Session
from api.v1.modules.a76.invoices.common.common_validators import invoice_exists
from core.exceptions import ErrorCollector
from ....models import LineItem
from ...models import LineItem
from api.v1.modules.a76.invoices.models import InvoiceHeader
from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.models import (
USTariffFraction,

View File

@@ -24,8 +24,8 @@ from api.v1.modules.a76.invoices.common.common_validators import (
invoice_updated,
)
from core.exceptions import ErrorCollector
from .imports.temporary.validators.create import validate_create
from .imports.temporary.validators.update import validate_update
from .imports.validators.create import validate_create as validate_create_import
from .imports.validators.update import validate_update as validate_update_import
from .schemas import LineItemCreate, LineItemUpdate
from .line_financials.models import LineFinancial
@@ -329,7 +329,7 @@ class ItemService:
item_data.component_part_number_id = resolved_id
# Validar el item
validate_create(
validate_create_import(
db,
item_data, # Schema Pydantic completo
tenant_id,
@@ -443,7 +443,7 @@ class ItemService:
item_data.component_part_number_id = resolved_id
# Validar el item que se va a actualizar
validate_update(
validate_update_import(
db,
item_data, # Schema de update
db_item, # LineItem existente en DB