fix/AS-prosec-revertir-boolean (#482)

prosec revertir boolean y uso de catalogo

Reviewed-on: ADUANASOFT/anexo76#482
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
This commit is contained in:
2026-06-02 21:06:23 +00:00
committed by acazares
parent 96b3beed4f
commit 26c5a97c04
7 changed files with 147 additions and 78 deletions

View File

@@ -26,9 +26,9 @@ class CompanyCreateDTO(BaseModel):
program_number: Optional[str] = Field(
None, max_length=40, description="Program number"
)
prosec: Optional[int] = Field(None, description="PROSEC")
prosec: Optional[bool] = Field(False, description="Empresa con programa PROSEC")
prosec_authorization: Optional[str] = Field(
None, max_length=20, description="PROSEC authorization"
None, max_length=20, description="Clave del sector PROSEC"
)
# Identifiers
@@ -250,6 +250,22 @@ class CompanyCreateDTO(BaseModel):
raise ValueError("Date must be in DD/MM/YYYY format") from exc
raise ValueError("Date must be in DD/MM/YYYY format")
@field_validator("prosec", mode="before")
@classmethod
def coerce_prosec_to_bool(cls, value):
"""Coacciona prosec a booleano. Tolera valores heredados cuando la columna
era entero (ID de sector): null/0/vacío → False, cualquier otro → True.
Misma regla que el downgrade de la migración previa."""
if value in (None, ""):
return False
if isinstance(value, bool):
return value
if isinstance(value, (int, float)):
return value != 0
if isinstance(value, str):
return value.strip().lower() not in {"0", "false", "no", "off", ""}
return bool(value)
@field_validator("annex30_modality", mode="before")
@classmethod
def validate_annex30_modality(cls, value):
@@ -278,7 +294,7 @@ class CompanyResponseDTO(BaseModel):
# Program information
program: Optional[str] = None
program_number: Optional[str] = None
prosec: Optional[int] = None
prosec: bool = False
prosec_authorization: Optional[str] = None
# Identifiers
@@ -317,6 +333,21 @@ class CompanyResponseDTO(BaseModel):
created_at: datetime
updated_at: Optional[datetime] = None
@field_validator("prosec", mode="before")
@classmethod
def coerce_prosec_to_bool(cls, value):
"""Tolera datos heredados cuando la columna prosec era entero (ID de sector):
null/0/vacío → False, cualquier otro → True."""
if value in (None, ""):
return False
if isinstance(value, bool):
return value
if isinstance(value, (int, float)):
return value != 0
if isinstance(value, str):
return value.strip().lower() not in {"0", "false", "no", "off", ""}
return bool(value)
# --- Flattened Fields for Response ---
# Sectores
sector1: Optional[str] = None

View File

@@ -39,7 +39,11 @@ class Company(Base, TimestampMixin):
# Programa
program: Mapped[Optional[str]] = mapped_column(String(7))
program_number: Mapped[Optional[str]] = mapped_column(String(40))
prosec: Mapped[Optional[int]] = mapped_column(Integer, nullable=True, default=None)
# prosec: indica si la empresa cuenta con programa PROSEC (sí/no)
prosec: Mapped[bool] = mapped_column(
Boolean, nullable=False, default=False, server_default="false"
)
# prosec_authorization: clave del sector PROSEC (catálogo de sectores)
prosec_authorization: Mapped[Optional[str]] = mapped_column(String(20))
# Sectores