feature/validaciones-clarion

This commit is contained in:
hreyes
2026-03-04 11:28:39 -07:00
parent 196b70924e
commit a081a61aa1
8 changed files with 252 additions and 25 deletions

View File

@@ -82,3 +82,27 @@ def check_in_set(
if val not in allowed:
return {"line": line_num, "col": col, "msg": msg}
return None
def check_decimal_max(
row: Dict[str, Any],
col: str,
line_num: int,
max_val: float,
msg: Optional[str] = None,
) -> Optional[Dict[str, Any]]:
"""Solo valida si hay valor; error si no es numérico o si es mayor que max_val (Clarion Col H)."""
val = row.get(col)
if val is None or val == "":
return None
try:
v = float(val)
if v > max_val:
return {
"line": line_num,
"col": col,
"msg": msg or f"El valor no puede ser mayor a {max_val}.",
}
except (ValueError, TypeError):
return {"line": line_num, "col": col, "msg": "Debe ser un número."}
return None

View File

@@ -1,5 +1,6 @@
"""
Carga de conjuntos FK para validación/mapeo de import CSV de clases de materiales.
Clarion: Tipo Activo Fijo, U.M., Fracción Mex (GFracGenSifra + histórico), Fracción Ame (GFracAme), Código Producto CP (si existe).
"""
from typing import Set, Tuple
@@ -9,19 +10,30 @@ from core.database import CoreSessionLocal
def load_classes_fk_sets(
tenant_id: int,
company_id: int,
) -> Tuple[Set[str], Set[str]]:
) -> Tuple[Set[str], Set[str], Set[str], Set[str], Set[str]]:
"""
Carga valid_material_keys (MaterialType.key) y valid_uom_codes (UnitOfMeasure.code).
Devuelve (valid_material_keys, valid_uom_codes).
Carga todos los conjuntos necesarios para validación CSV de clases (paridad Clarion).
Devuelve (valid_material_keys, valid_uom_codes, valid_fraction_mex_8, valid_fraction_ame, valid_product_codes_cp).
- valid_fraction_mex_8: códigos de 8 caracteres válidos (TariffFraction + HistoricalTariffFraction).
- valid_fraction_ame: códigos de fracción americana (USTariffFraction por tenant/company).
- valid_product_codes_cp: códigos de producto/servicio CP (vacío si no existe catálogo).
"""
valid_material_keys: Set[str] = set()
valid_uom_codes: Set[str] = set()
valid_fraction_mex_8: Set[str] = set()
valid_fraction_ame: Set[str] = set()
valid_product_codes_cp: Set[str] = set()
try:
with CoreSessionLocal() as session:
from api.v1.modules.public.reference_data.material_types.models import MaterialType
from api.v1.modules.a76.general_catalogs.units_of_measure.models import UnitOfMeasure
from api.v1.modules.a76.general_catalogs.fractions.tariff_fractions.models import TariffFraction
from api.v1.modules.a76.general_catalogs.fractions.historical_tariff_fractions.models import HistoricalTariffFraction
from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.models import USTariffFraction
for m in session.query(MaterialType.key).all():
valid_material_keys.add(m[0])
if m[0]:
valid_material_keys.add(m[0])
for u in (
session.query(UnitOfMeasure.code)
.filter(
@@ -30,8 +42,45 @@ def load_classes_fk_sets(
)
.all()
):
valid_uom_codes.add(u[0])
if u[0]:
valid_uom_codes.add(u[0])
for row in session.query(TariffFraction.code).all():
if row[0]:
code = row[0].strip()
valid_fraction_mex_8.add(code[:8])
for row in (
session.query(HistoricalTariffFraction.historical_fraction)
.filter(
HistoricalTariffFraction.tenant_id == tenant_id,
HistoricalTariffFraction.company_id == company_id,
HistoricalTariffFraction.historical_fraction.isnot(None),
)
.distinct()
.all()
):
if row[0] and row[0].strip():
valid_fraction_mex_8.add(row[0].strip()[:8])
for row in (
session.query(USTariffFraction.code)
.filter(
USTariffFraction.tenant_id == tenant_id,
USTariffFraction.company_id == company_id,
)
.all()
):
if row[0]:
valid_fraction_ame.add(row[0].strip())
except Exception as e:
import logging
logging.getLogger(__name__).warning("Classes import: could not load FK sets: %s", e)
return valid_material_keys, valid_uom_codes
return (
valid_material_keys,
valid_uom_codes,
valid_fraction_mex_8,
valid_fraction_ame,
valid_product_codes_cp,
)