Merge branch 'main' into development

This commit is contained in:
2026-03-17 22:48:18 -05:00
52 changed files with 3959 additions and 100 deletions

View File

@@ -95,7 +95,7 @@ def calculate_values(
Traduce el CALCULOS ROUTINE de Clarion:
- Busca la factura de importación por fa_data.search_invoice (TEM → DEF como fallback)
- Copia clase, unidad de medida, fracción (si fa_data.download), país, tipo fracción,
- Copia clase, unidad de medida, fracción (si fa_data.discharge), país, tipo fracción,
bultos y descripción inglés desde la línea de importación encontrada
- Calcula valores en moneda (USD/MXN/MC) según la moneda de la factura
"""
@@ -168,8 +168,8 @@ def calculate_values(
line.class_id = import_line.class_id
line.unit_of_measure = import_line.unit_of_measure
# Fracción: copiar solo si fa_data.download == True (≡ ColumnaV != '')
if fa_data and fa_data.download and import_line.customs:
# Fracción: copiar solo si fa_data.discharge == True (≡ ColumnaV != '')
if fa_data and fa_data.discharge and import_line.customs:
line.customs.fraction = import_line.customs.fraction
if import_line.customs:

View File

@@ -222,7 +222,7 @@ def validate_common(
)
elif (
# Col. H: valida unidad de medida sólo cuando hay descarga
fa_data.download is True
fa_data.discharge is True
and line.unit_of_measure
and import_line.unit_of_measure
and line.unit_of_measure != import_line.unit_of_measure

View File

@@ -83,11 +83,11 @@ def validate_create(
errors.add_required_error(field=f"line[{line_number}].fa_data.movement_type_import")
# Col. F: ¿Descarga la línea? (DescargaPartida) — obligatorio
if fa_data.download is None:
errors.add_required_error(field=f"line[{line_number}].fa_data.download")
if fa_data.discharge is None:
errors.add_required_error(field=f"line[{line_number}].fa_data.discharge")
# Col. D / E: Factura y Línea de Impo — obligatorios sólo si hay descarga
if fa_data.download is True:
if fa_data.discharge is True:
if not fa_data.search_invoice:
errors.add_required_error(field=f"line[{line_number}].fa_data.search_invoice")
if not fa_data.search_line:

View File

@@ -207,8 +207,8 @@ def validate_update(
fa_data.movement_type_import = existing_fa_data.movement_type_import
# Col. F: ¿Descarga la línea? (Descarga)
if fa_data.download is None:
fa_data.download = existing_fa_data.download
if fa_data.discharge is None:
fa_data.discharge = existing_fa_data.discharge
# Col. D: Factura de Importación — obligatoria sólo si hay descarga
if not fa_data.search_invoice:

View File

@@ -1,5 +1,5 @@
from typing import Optional
from sqlalchemy import ForeignKey, Integer, String
from sqlalchemy import Boolean, ForeignKey, Integer, String
from sqlalchemy.orm import Mapped, mapped_column
from api.v1.common.base_models import TenantScopedMixin, TimestampMixin
from core.database import Base
@@ -16,9 +16,9 @@ class Serie(Base, TenantScopedMixin, TimestampMixin):
serial_numbers: Mapped[Optional[str]] = mapped_column(String(50)) # SERIEEXPO
model: Mapped[Optional[str]] = mapped_column(String(50)) # MODELOEXPO
sub_model: Mapped[Optional[str]] = mapped_column(String(50)) # SUBMODELOEXPO
brand: Mapped[Optional[str]] = mapped_column(String(50)) # MARCA
expo_brad: Mapped[Optional[str]] = mapped_column(String(50)) # MARCAEXPO
brand: Mapped[Optional[str]] = mapped_column(String(50)) # MARCAEXPO
number_id: Mapped[Optional[str]] = mapped_column(String(25)) # NUMIDEXPO
discharge: Mapped[Optional[bool]] = mapped_column(Boolean) # MARCA
serie_row: Mapped[Optional[int]] = mapped_column(Integer) # LINEASERIEIMPO <-- IN CASE OF EXPO

View File

@@ -166,7 +166,7 @@ class ItemService:
# FA data uses line.id as primary key
if line_data.fa_data:
fa_dict = line_data.fa_data.model_dump(
exclude_unset=True, exclude={"line_item_id"}
exclude_unset=True, exclude={"line_item_id", "includes_subitems"}
)
fa_dict.update(
{"id": line.id, "tenant_id": tenant_id, "company_id": company_id}