- Updated PermissionRuleOct model to include company_id and modified unique constraint. - Updated Seal model to include company_id and modified unique constraint. - Added TYPE_CHECKING imports in reference data models for better type hinting. - Created new models for QClasses and SClasses in the a24 module. - Enhanced init_first_time.sh script for comprehensive system initialization, including Keycloak and PostgreSQL setup. - Updated documentation to reflect changes in API endpoints and database relationships.
3.6 KiB
Relaciones entre Modelos A76
Resumen de Relaciones Establecidas
Part (Tabla: parts)
El modelo Part representa las partes/componentes en los sistemas SCAII, SCAF y WINSAAI.
Relaciones:
-
Con Country (public.countries)
- Campo:
country_of_origin→countries.m3_key - Relación: Many-to-One
- Propósito: País de origen de la parte
- Campo:
-
Con CurrencyType (public.currency_types)
- Campo:
currency_key→currency_types.code - Relación: Many-to-One
- Propósito: Tipo de moneda para el costo unitario
- Campo:
-
Con Class (classes)
- Campos:
(client_id, part_class)→(client_id, class_code) - Relación: Many-to-One (usando primaryjoin complejo)
- Propósito: Clasificación de la parte
- Atributo:
part_class_info
- Campos:
Class (Tabla: classes)
El modelo Class representa las clases de clasificación en sistemas SCAII y SCAF.
Relaciones:
-
Con MaterialType (public.material_types)
- Campo:
material_key→material_types.key - Relación: Many-to-One
- Propósito: Tipo de material de la clase
- Campo:
-
Con Part (parts)
- Campos:
(client_id, class_code)→(client_id, part_class) - Relación: One-to-Many (inversa de la relación en Part)
- Propósito: Partes que pertenecen a esta clase
- Atributo:
parts
- Campos:
Esquema de Relaciones
Part
├── country (Country) # País de origen
├── currency (CurrencyType) # Tipo de moneda
└── part_class_info (Class) # Información de clasificación
└── material_type (MaterialType) # Tipo de material
Class
├── material_type (MaterialType) # Tipo de material
└── parts (List[Part]) # Partes que usan esta clase
Uso de las Relaciones
En consultas:
# Obtener una parte con su información completa
part = session.query(Part).options(
joinedload(Part.country),
joinedload(Part.currency),
joinedload(Part.part_class_info).joinedload(Class.material_type)
).filter(
Part.client_id == 1,
Part.part_number == "PART001"
).first()
# Acceder a los datos relacionados
print(f"País: {part.country.description_es}")
print(f"Moneda: {part.currency.currency_name}")
print(f"Clase: {part.part_class_info.description_spanish}")
print(f"Material: {part.part_class_info.material_type.description}")
En DTOs:
Los DTOs pueden incluir información relacionada:
class PartDetailResponseDTO(BaseModel):
client_id: int
part_number: str
description_spanish: Optional[str]
country_name: Optional[str] = None
currency_name: Optional[str] = None
class_description: Optional[str] = None
material_type: Optional[str] = None
Consideraciones Técnicas
-
Composite Foreign Keys: La relación entre
PartyClassusa claves foráneas compuestas que requierenprimaryjoinpersonalizado. -
Viewonly Relationships: Algunas relaciones están marcadas como
viewonly=Truepara evitar problemas de escritura accidental. -
Lazy Loading: Por defecto, las relaciones usan lazy loading. Para consultas que necesiten datos relacionados, usar
joinedloadoselectinload. -
Type Hints: Se usan
TYPE_CHECKINGimports para evitar import circulares mientras se mantienen los type hints.
Futuras Relaciones
Potenciales relaciones adicionales que se pueden agregar:
- Con Sectors (public.sectors) - para clasificación sectorial
- Con Transport Types (public.transport_types) - para modo de transporte
- Con Customs Sections (public.customs_sections) - para sección aduanera
- Relaciones con tablas subsidiarias como
SPartes,QPartes, etc.