fix/partida-campos-obligatorios

This commit is contained in:
2026-04-17 10:22:08 -06:00
parent fa3cbb4d0a
commit 39fdfca917
6 changed files with 159 additions and 31 deletions

View File

@@ -14,6 +14,9 @@ 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.units_of_measure.models import UnitOfMeasure
from api.v1.modules.a76.general_catalogs.packages.models import Package
from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.models import (
USTariffFraction,
)
from api.v1.modules.a24.fa.fa_item_lines.models import FaLineItem
from api.v1.modules.public.reference_data.countries.models import Country
from api.v1.modules.a76.general_catalogs.sectors.models import Sector
@@ -360,18 +363,56 @@ def validate_common(
)
if line.customs.american_fraction:
american_fraction_exists = db.query(
exists().where(
LineCustom.american_fraction == line.customs.american_fraction
def _normalize_american_fraction_code(raw_code: str) -> list[str]:
normalized_raw = (raw_code or "").strip()
if not normalized_raw:
return []
digits_only = normalized_raw.replace(".", "").replace(" ", "").replace("-", "")
candidates = [normalized_raw]
if len(digits_only) == 10:
candidates.append(
f"{digits_only[:4]}.{digits_only[4:6]}.{digits_only[6:8]}.{digits_only[8:10]}"
)
elif len(digits_only) == 8:
candidates.append(f"{digits_only[:4]}.{digits_only[4:6]}.{digits_only[6:8]}")
candidates.append(digits_only)
seen: set[str] = set()
deduped: list[str] = []
for candidate in candidates:
if not candidate or candidate in seen:
continue
seen.add(candidate)
deduped.append(candidate)
return deduped
candidates = _normalize_american_fraction_code(line.customs.american_fraction)
us_fraction: USTariffFraction | None = None
for candidate in candidates:
us_fraction = (
db.query(USTariffFraction)
.filter(
USTariffFraction.code == candidate,
USTariffFraction.tenant_id == tenant_id,
USTariffFraction.company_id == company_id,
)
.first()
)
).scalar()
if not american_fraction_exists:
if us_fraction:
break
if not us_fraction:
errors.add_error(
field=f"line[{line_number}].customs.american_fraction",
message="La fracción americana especificada no existe.",
solution=["Proporciona una fracción americana valida."],
code="AMERICAN_FRACTION_NOT_FOUND",
)
else:
line.customs.american_fraction = us_fraction.code
if line.order:
if len(line.order) > 20: