diff --git a/backend/api/v1/modules/a76/items/common/common_validators.py b/backend/api/v1/modules/a76/items/common/common_validators.py index 652e79fc..06e0b449 100644 --- a/backend/api/v1/modules/a76/items/common/common_validators.py +++ b/backend/api/v1/modules/a76/items/common/common_validators.py @@ -3,36 +3,31 @@ from core.exceptions import ErrorCollector from ..line_items import models from sqlalchemy.orm import Session -def item_exists( - db: Session, - item_line: int, - tenant_id: int, - company_id: int -): + +def item_exists(db: Session, item_line: int, tenant_id: int, company_id: int): item_exists = ( - db.query(models.LineItem.id) + db.query(models.LineItem) .filter( models.LineItem.line_number == item_line, models.LineItem.tenant_id == tenant_id, models.LineItem.company_id == company_id, ) + .first() + ) + + return item_exists + + +def count_items(db: Session, invoice_id: int, tenant_id: int, company_id: int): + count = ( + db.query(func.count()) + .select_from(models.Item) + .filter( + models.Item.invoice_id == invoice_id, + models.Item.tenant_id == tenant_id, + models.Item.company_id == company_id, + ) .scalar() ) - if item_exists: - return item_exists - return None - -def count_items( - db: Session, - invoice_id: int, - tenant_id: int, - company_id: int -): - count = db.query(func.count()).select_from(models.Item).filter( - models.Item.invoice_id == invoice_id, - models.Item.tenant_id == tenant_id, - models.Item.company_id == company_id, - ).scalar() - - return count \ No newline at end of file + return count diff --git a/backend/api/v1/modules/a76/items/imports/temporary/validators/common.py b/backend/api/v1/modules/a76/items/imports/temporary/validators/common.py index 47fd73d5..d10c95fd 100644 --- a/backend/api/v1/modules/a76/items/imports/temporary/validators/common.py +++ b/backend/api/v1/modules/a76/items/imports/temporary/validators/common.py @@ -42,9 +42,7 @@ def validate_common( invoice: InvoiceHeader = invoice_exists_by_id( db, invoice_id, tenant_id, company_id, errors ) - line_item: LineItem = item_exists( - db, line.line_number, tenant_id, company_id - ) + line_item: LineItem = item_exists(db, line.line_number, tenant_id, company_id) fecha_factura = invoice.invoice_date if invoice else None fraction = None @@ -181,13 +179,15 @@ def validate_common( fraction = line.customs.fraction if line.customs.fraction else fraction country = line.customs.origin_country - if line_item: + if line_item and line_item.customs: country = ( - line_item.customs.fraction if line_item.customs.origin_country else country + line_item.customs.origin_country + if line_item.customs.origin_country + else country ) fraction_type = line.customs.fraction_type.upper() - if line_item: + if line_item and line_item.customs: fraction_type = ( line_item.customs.fraction_type if line_item.customs.fraction_type @@ -195,7 +195,7 @@ def validate_common( ) sector = line.customs.sector - if line_item: + if line_item and line_item.customs: sector = line_item.customs.sector if line_item.customs.sector else sector country_m3 = db.query(Country.m3_key).filter(Country.m3_key == country).scalar() diff --git a/backend/api/v1/modules/a76/items/imports/temporary/validators/create.py b/backend/api/v1/modules/a76/items/imports/temporary/validators/create.py index 8f1a0206..146a4278 100644 --- a/backend/api/v1/modules/a76/items/imports/temporary/validators/create.py +++ b/backend/api/v1/modules/a76/items/imports/temporary/validators/create.py @@ -206,8 +206,8 @@ def validate_create( net_weight_input = line.quantity.net_weight or Decimal("0") # Determinar si la unidad de medida es de peso - unit_is_kgs = line.unit_of_measure and line.unit_of_measure.upper() == "KGS" - unit_is_lbs = line.unit_of_measure and line.unit_of_measure.upper() == "LB" + unit_is_kgs = line.unit_of_measure and line.unit_of_measure == "24" #KGS + unit_is_lbs = line.unit_of_measure and line.unit_of_measure == "25" #LBS # Calcular peso neto en kilogramos (estándar interno) if unit_is_kgs: @@ -237,11 +237,11 @@ def validate_create( package_weight_unit = Decimal("0") # Obtener peso unitario del bulto si existe - if line.quantity.package_key: + if line.quantity.package_id: package: Package = ( db.query(Package) .filter( - Package.key == line.quantity.package_key, + Package.id == line.quantity.package_id, Package.tenant_id == tenant_id, Package.company_id == company_id, ) @@ -278,22 +278,22 @@ def validate_create( # ========================================== # ASIGNAR DESCRIPCIÓN DE BULTOS # ========================================== - if package_quantity and package_quantity > 0 and line.quantity.package_key: + if package_quantity and package_quantity > 0 and line.quantity.package_id: package: Package = ( db.query(Package) .filter( - Package.key == line.quantity.package_key, + Package.id == line.quantity.package_id, Package.tenant_id == tenant_id, Package.company_id == company_id, ) .first() ) if package: - line.quantity.package_description = package.description_es + line.description.package_description = package.description_es else: line.quantity.package_quantity = 0 - line.quantity.package_key = None - line.quantity.package_description = None + line.quantity.package_id = None + line.description.package_description = None # ========================================== # ASIGNAR FRACCIÓN AMERICANA POR DEFECTO diff --git a/backend/api/v1/modules/a76/items/line_descriptions/models.py b/backend/api/v1/modules/a76/items/line_descriptions/models.py index 39e09560..d8c7ecbf 100644 --- a/backend/api/v1/modules/a76/items/line_descriptions/models.py +++ b/backend/api/v1/modules/a76/items/line_descriptions/models.py @@ -24,7 +24,8 @@ class LineDescription(Base): description_english: Mapped[Optional[str]] = mapped_column(String(4999)) # DESCRIPCIONI extra_description: Mapped[Optional[str]] = mapped_column(Text) # DESCRIPCIONEEXTRA part_description: Mapped[Optional[str]] = mapped_column(String(500)) # DESCRIPCIONPARTE - class_description: Mapped[Optional[str]] = mapped_column(String(500)) # DESCRIPCIONCLASE + class_description: Mapped[Optional[str]] = mapped_column(String(500)) # DESCRIPCIONCLASE + package_description: Mapped[Optional[str]] = mapped_column(String(500)) # DESCRIPCIONBULTO # Product attributes brand: Mapped[Optional[str]] = mapped_column(String(50)) # MARCA diff --git a/backend/api/v1/modules/a76/items/line_descriptions/schemas.py b/backend/api/v1/modules/a76/items/line_descriptions/schemas.py index 56965c36..8a65d68e 100644 --- a/backend/api/v1/modules/a76/items/line_descriptions/schemas.py +++ b/backend/api/v1/modules/a76/items/line_descriptions/schemas.py @@ -13,6 +13,7 @@ class LineDescriptionBase(BaseModel): extra_description: Optional[str] = Field(None, description="Extra description (DESCRIPCIONEEXTRA)") part_description: Optional[str] = Field(None, max_length=500, description="Part description (DESCRIPCIONPARTE)") class_description: Optional[str] = Field(None, max_length=500, description="Class description (DESCRIPCIONCLASE)") + package_description: Optional[str] = Field(None, max_length=500, description="Package description (DESCRIPCIONBULTO)") # Product attributes brand: Optional[str] = Field(None, max_length=50, description="Brand (MARCA)") diff --git a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/summary-section.svelte b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/summary-section.svelte index 27b66319..0320095a 100644 --- a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/summary-section.svelte +++ b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/summary-section.svelte @@ -2,6 +2,12 @@ import type { LineFinancials, LineQuantities } from '$lib/api/dashboard/a76/items'; let { financials = $bindable(), quantities = $bindable() }: { financials: LineFinancials; quantities: LineQuantities } = $props(); + + // Helper function to safely format numbers + function formatNumber(value: any, decimals: number = 8): string { + const num = Number(value); + return isNaN(num) ? '0.00000000' : num.toFixed(decimals); + }