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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user