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.
This commit is contained in:
2025-11-07 18:47:41 -06:00
parent e1274abf2a
commit e0e38526b0
41 changed files with 1185 additions and 418 deletions

View File

@@ -30,7 +30,7 @@
## 🔗 Relaciones de Base de Datos
### Relaciones Principales
- **Part ↔ Class**: Relación de clave compuesta (client_key, part_class ↔ class_code)
- **Part ↔ Class**: Relación de clave compuesta (client_id, part_class ↔ class_code)
- **Part → Country**: Clave foránea a public.countries (country_of_origin)
- **Part → CurrencyType**: Clave foránea a public.currency_types (currency_key)
- **Class → MaterialType**: Clave foránea a public.material_types (material_key)
@@ -75,34 +75,34 @@ Part (Partes)
|--------|----------|-------------|
| POST | `/` | Crear parte |
| GET | `/` | Listar todas con paginación y filtros |
| GET | `/client/{client_key}` | Obtener partes por cliente |
| GET | `/client/{client_id}` | Obtener partes por cliente |
| GET | `/search/fraction/{fraction}` | Buscar por fracción arancelaria |
| GET | `/search/supplier/{supplier}` | Buscar por proveedor |
| GET | `/search/country/{country_code}` | Buscar por país |
| GET | `/statistics` | Obtener estadísticas de partes |
| GET | `/{client_key}/{part_number}` | Obtener parte específica |
| PUT | `/{client_key}/{part_number}` | Actualizar parte |
| DELETE | `/{client_key}/{part_number}` | Eliminar parte |
| PATCH | `/{client_key}/{part_number}/toggle-status` | Cambiar estatus |
| GET | `/{client_key}/{part_number}/basic` | Obtener información básica |
| GET | `/{client_key}/{part_number}/regulatory` | Obtener información regulatoria |
| GET | `/{client_id}/{part_number}` | Obtener parte específica |
| PUT | `/{client_id}/{part_number}` | Actualizar parte |
| DELETE | `/{client_id}/{part_number}` | Eliminar parte |
| PATCH | `/{client_id}/{part_number}/toggle-status` | Cambiar estatus |
| GET | `/{client_id}/{part_number}/basic` | Obtener información básica |
| GET | `/{client_id}/{part_number}/regulatory` | Obtener información regulatoria |
### Módulo Clases (`/classes`)
| Método | Endpoint | Descripción |
|--------|----------|-------------|
| POST | `/` | Crear clase |
| GET | `/` | Listar todas con paginación y filtros |
| GET | `/client/{client_key}` | Obtener clases por cliente |
| GET | `/client/{client_id}` | Obtener clases por cliente |
| GET | `/search/fraction/{fraction}` | Buscar por fracción arancelaria |
| GET | `/search/material/{material_key}` | Buscar por material |
| GET | `/search/unit-measure/{unit_of_measure}` | Buscar por unidad de medida |
| GET | `/search/physical-review/{physical_review}` | Buscar por revisión física |
| GET | `/statistics` | Obtener estadísticas de clases |
| GET | `/{client_key}/{class_code}` | Obtener clase específica |
| PUT | `/{client_key}/{class_code}` | Actualizar clase |
| DELETE | `/{client_key}/{class_code}` | Eliminar clase |
| GET | `/{client_key}/{class_code}/basic` | Obtener información básica |
| GET | `/{client_key}/{class_code}/tariff` | Obtener información arancelaria |
| GET | `/{client_id}/{class_code}` | Obtener clase específica |
| PUT | `/{client_id}/{class_code}` | Actualizar clase |
| DELETE | `/{client_id}/{class_code}` | Eliminar clase |
| GET | `/{client_id}/{class_code}/basic` | Obtener información básica |
| GET | `/{client_id}/{class_code}/tariff` | Obtener información arancelaria |
---

View File

@@ -18,7 +18,7 @@ El modelo `Part` representa las partes/componentes en los sistemas SCAII, SCAF y
- Propósito: Tipo de moneda para el costo unitario
3. **Con Class (classes)**
- Campos: `(client_key, part_class)``(client_key, class_code)`
- 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`
@@ -34,7 +34,7 @@ El modelo `Class` representa las clases de clasificación en sistemas SCAII y SC
- Propósito: Tipo de material de la clase
2. **Con Part (parts)**
- Campos: `(client_key, class_code)``(client_key, part_class)`
- 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`
@@ -63,7 +63,7 @@ part = session.query(Part).options(
joinedload(Part.currency),
joinedload(Part.part_class_info).joinedload(Class.material_type)
).filter(
Part.client_key == 1,
Part.client_id == 1,
Part.part_number == "PART001"
).first()
@@ -78,7 +78,7 @@ print(f"Material: {part.part_class_info.material_type.description}")
Los DTOs pueden incluir información relacionada:
```python
class PartDetailResponseDTO(BaseModel):
client_key: int
client_id: int
part_number: str
description_spanish: Optional[str]
country_name: Optional[str] = None