feature/validaciones-clarion-classes-cav

This commit is contained in:
hreyes
2026-03-04 10:11:23 -07:00
parent e83205caf9
commit ccafe8d16c
7 changed files with 218 additions and 39 deletions

View File

@@ -17,8 +17,8 @@ from ..common import csv_reader as common_csv
from ..common import meta as common_meta
from ..common import responses as common_responses
from .template_config import row_from_template
from .validators import validate_row_class
from .common.mappers import row_to_class_data
from .validators import validate_row_class, validate_row_class_partial
from .common.mappers import row_to_class_data, row_to_class_data_merge_existing
from .common.fk_loader import load_classes_fk_sets
logger = logging.getLogger(__name__)
@@ -53,8 +53,25 @@ def scan_file(self, job_id: str, config: str = None):
except ValueError as e:
return {"status": "failed", "error": str(e)}
meta = common_meta.load_meta(file_path)
actualizar = meta.get("actualizar", False)
siempre_toda = meta.get("siempre_toda", False)
valid_material_keys, valid_uom_codes = load_classes_fk_sets(tenant_id, company_id)
from api.v1.modules.a76.classes.models import Class
existing_class_codes = set()
try:
with CoreSessionLocal() as session:
for c in session.query(Class.class_code).filter(
Class.tenant_id == tenant_id,
Class.company_id == company_id,
).all():
if c[0]:
existing_class_codes.add(c[0].strip().upper())
except Exception as e:
logger.warning("Classes import: could not load existing class codes: %s", e)
error_count = 0
processed_rows = 0
errors_detail: List[Dict[str, Any]] = []
@@ -74,6 +91,9 @@ def scan_file(self, job_id: str, config: str = None):
i,
valid_material_keys=valid_material_keys,
valid_uom_codes=valid_uom_codes,
actualizar=actualizar,
siempre_toda=siempre_toda,
existing_class_codes=existing_class_codes,
)
if err:
error_count += 1
@@ -119,6 +139,10 @@ def insert_valid_rows(self, job_id: str):
except ValueError as e:
return {"status": "failed", "error": str(e)}
meta = common_meta.load_meta(file_path)
actualizar = meta.get("actualizar", False)
siempre_toda = meta.get("siempre_toda", False)
from api.v1.modules.a76.classes.models import Class
valid_material_keys, valid_uom_codes = load_classes_fk_sets(tenant_id, company_id)
@@ -131,25 +155,39 @@ def insert_valid_rows(self, job_id: str):
try:
with CoreSessionLocal() as session:
existing_by_code = {
c.class_code: c
for c in session.query(Class).filter(
Class.tenant_id == tenant_id,
Class.company_id == company_id,
).all()
}
existing_by_code = {}
for c in session.query(Class).filter(
Class.tenant_id == tenant_id,
Class.company_id == company_id,
).all():
key = (c.class_code or "").strip().upper()
if key:
existing_by_code[key] = c
for i, row in common_csv.iter_csv_rows(file_path):
if i in error_lines:
continue
row_norm = row_from_template(row, common_normalize.normalize_header)
err = validate_row_class(
row_norm,
i,
valid_material_keys=valid_material_keys,
valid_uom_codes=valid_uom_codes,
)
class_code_raw = (row_norm.get("CLASE") or "").strip().upper()[:8]
use_partial = actualizar and class_code_raw and class_code_raw in existing_by_code and not siempre_toda
if use_partial:
err = validate_row_class_partial(
row_norm, i,
valid_material_keys=valid_material_keys,
valid_uom_codes=valid_uom_codes,
)
else:
err = validate_row_class(
row_norm,
i,
valid_material_keys=valid_material_keys,
valid_uom_codes=valid_uom_codes,
actualizar=actualizar,
siempre_toda=siempre_toda,
existing_class_codes=set(existing_by_code.keys()),
)
if err:
skipped_invalid += 1
skipped_details.append({
@@ -158,7 +196,25 @@ def insert_valid_rows(self, job_id: str):
})
continue
data = row_to_class_data(row_norm, valid_material_keys, valid_uom_codes)
if use_partial:
existing = existing_by_code.get(class_code_raw)
existing_data = {
"description_es": existing.description_es,
"description_en": existing.description_en,
"material_key": existing.material_key,
"unit_of_measure": existing.unit_of_measure,
"fraction": existing.fraction,
"us_fraction": existing.us_fraction,
"sub_key": existing.sub_key,
"physical_review": existing.physical_review,
"iva_exempt_fraction": existing.iva_exempt_fraction,
}
data = row_to_class_data_merge_existing(
row_norm, existing_data, valid_material_keys, valid_uom_codes,
)
else:
data = row_to_class_data(row_norm, valid_material_keys, valid_uom_codes)
class_code = data.get("class_code")
if not class_code:
skipped_invalid += 1