Files
plantillas-proyectos/docs/RELATIONSHIPS.md
acazares e0e38526b0 Refactor database models to include company_id and update unique constraints
- 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.
2025-11-07 18:47:41 -06:00

107 lines
3.6 KiB
Markdown

# 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:
1. **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
2. **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
3. **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`
### Class (Tabla: classes)
El modelo `Class` representa las clases de clasificación en sistemas SCAII y SCAF.
#### Relaciones:
1. **Con MaterialType (public.material_types)**
- Campo: `material_key``material_types.key`
- Relación: Many-to-One
- Propósito: Tipo de material de la clase
2. **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`
## 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:
```python
# 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:
```python
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
1. **Composite Foreign Keys**: La relación entre `Part` y `Class` usa claves foráneas compuestas que requieren `primaryjoin` personalizado.
2. **Viewonly Relationships**: Algunas relaciones están marcadas como `viewonly=True` para evitar problemas de escritura accidental.
3. **Lazy Loading**: Por defecto, las relaciones usan lazy loading. Para consultas que necesiten datos relacionados, usar `joinedload` o `selectinload`.
4. **Type Hints**: Se usan `TYPE_CHECKING` imports para evitar import circulares mientras se mantienen los type hints.
## Futuras Relaciones
Potenciales relaciones adicionales que se pueden agregar:
1. **Con Sectors** (public.sectors) - para clasificación sectorial
2. **Con Transport Types** (public.transport_types) - para modo de transporte
3. **Con Customs Sections** (public.customs_sections) - para sección aduanera
4. **Relaciones con tablas subsidiarias** como `SPartes`, `QPartes`, etc.