✨ New Features: - Company module: Single company management with comprehensive business info - Client & Provider module: Manages clients/providers with address/program relationships - GParts module: Parts/components management for SCAII, SCAF, and WINSAAI systems - GClass module: Class classifications for SCAII and SCAF with tariff information 🔗 Database Relationships: - GPart ↔ GClass: Composite key relationship (client_key, part_class ↔ class_code) - GPart → Country: Foreign key to public.countries (country_of_origin) - GPart → CurrencyType: Foreign key to public.currency_types (currency_key) - GClass → MaterialType: Foreign key to public.material_types (material_key) 📊 API Endpoints Added: Company Module (/company): - POST / - Create company - GET / - Get single company Client & Provider Module (/clients-providers): - POST / - Create client/provider - GET / - List all with pagination - GET /clients - List only clients - GET /providers - List only providers - GET /search/rfc/{rfc} - Search by RFC - GET /{client_id} - Get by ID - PUT /{client_id} - Update client/provider - DELETE /{client_id} - Delete client/provider - PATCH /{client_id}/toggle-status - Toggle status - GET /{client_id}/address - Get address info - GET /{client_id}/programs - Get programs info - GET /{client_id}/basic - Get basic info GParts Module (/parts): - POST / - Create part - GET / - List all with pagination and filters - GET /client/{client_key} - Get parts by client - GET /search/fraction/{fraction} - Search by tariff fraction - GET /search/supplier/{supplier} - Search by supplier - GET /search/country/{country_code} - Search by country - GET /statistics - Get parts statistics - GET /{client_key}/{part_number} - Get specific part - PUT /{client_key}/{part_number} - Update part - DELETE /{client_key}/{part_number} - Delete part - PATCH /{client_key}/{part_number}/toggle-status - Toggle status - GET /{client_key}/{part_number}/basic - Get basic info - GET /{client_key}/{part_number}/regulatory - Get regulatory info GClass Module (/classes): - POST / - Create class - GET / - List all with pagination and filters - GET /client/{client_key} - Get classes by client - GET /search/fraction/{fraction} - Search by tariff fraction - GET /search/material/{material_key} - Search by material - GET /search/unit-measure/{unit_of_measure} - Search by unit of measure - GET /search/physical-review/{physical_review} - Search by physical review status - GET /statistics - Get class statistics - GET /{client_key}/{class_code} - Get specific class - PUT /{client_key}/{class_code} - Update class - DELETE /{client_key}/{class_code} - Delete class - GET /{client_key}/{class_code}/basic - Get basic info - GET /{client_key}/{class_code}/tariff - Get tariff information 🏗️ Architecture: - Modular design with models, DTOs, services, and routes for each entity - English field names with composite primary keys where applicable - Comprehensive CRUD operations with specialized search endpoints - SQLAlchemy relationships with proper foreign key constraints - Type-safe DTOs with Pydantic validation 📝 Documentation: - RELATIONSHIPS.md: Complete documentation of database relationships - Detailed type hints and comprehensive service methods - Consistent patterns across all modules for maintainability
158 lines
7.5 KiB
Python
158 lines
7.5 KiB
Python
"""
|
|
DTOs (Data Transfer Objects) para módulo de empresa
|
|
Reemplaza schemas.py siguiendo enfoque DDD y estilo NestJS
|
|
"""
|
|
from pydantic import BaseModel, Field
|
|
from typing import Optional
|
|
from datetime import datetime
|
|
|
|
|
|
class CompanyCreateDTO(BaseModel):
|
|
"""DTO para crear una empresa"""
|
|
id: str = Field(default='EMP', max_length=3, description="Company ID")
|
|
consecutive: bool = Field(default=True, description="Unique record control")
|
|
name: Optional[str] = Field(None, max_length=255, description="Company name")
|
|
rfc: Optional[str] = Field(None, max_length=30, description="Company RFC")
|
|
main_activity: Optional[str] = Field(None, max_length=255, description="Main activity")
|
|
|
|
# Program information
|
|
program: Optional[str] = Field(None, max_length=10, description="Program")
|
|
program_number: Optional[str] = Field(None, max_length=40, description="Program number")
|
|
prosec: Optional[int] = Field(None, description="PROSEC")
|
|
prosec_authorization: Optional[str] = Field(None, max_length=20, description="PROSEC authorization")
|
|
|
|
# Identifiers
|
|
manufacturer_id: Optional[str] = Field(None, max_length=25, description="Manufacturer ID")
|
|
broker_company: Optional[str] = Field(None, max_length=10, description="Broker company")
|
|
|
|
# Responsible person
|
|
responsible: Optional[str] = Field(None, max_length=80, description="Responsible person")
|
|
responsible_name: Optional[str] = Field(None, max_length=20, description="Responsible first name")
|
|
responsible_last_name: Optional[str] = Field(None, max_length=20, description="Responsible last name")
|
|
responsible_mother_last_name: Optional[str] = Field(None, max_length=20, description="Responsible mother's last name")
|
|
responsible_rfc: Optional[str] = Field(None, max_length=30, description="Responsible RFC")
|
|
position: Optional[str] = Field(None, max_length=30, description="Responsible position")
|
|
|
|
# Configuration
|
|
logo: Optional[str] = Field(None, max_length=255, description="Company logo")
|
|
has_express_line: Optional[bool] = Field(None, description="Has express line")
|
|
order_format_type: Optional[str] = Field(None, max_length=19, description="Order format type")
|
|
previous_code: Optional[int] = Field(None, description="Previous code")
|
|
is_service_company: Optional[bool] = Field(None, description="Is service company")
|
|
|
|
# Client and subassembly
|
|
client_name: Optional[str] = Field(None, max_length=300, description="Client name")
|
|
subassembly_mode: Optional[str] = Field(None, max_length=7, description="Subassembly mode")
|
|
|
|
# Additional information
|
|
curp: Optional[str] = Field(None, max_length=19, description="CURP")
|
|
inter_db_name: Optional[str] = Field(None, max_length=100, description="Inter DB name")
|
|
ctpat_svi: Optional[str] = Field(None, max_length=100, description="CTPAT SVI")
|
|
trusted_exporter_number: Optional[str] = Field(None, max_length=50, description="Trusted exporter number")
|
|
prevalidator_key: Optional[str] = Field(None, max_length=20, description="Prevalidator key")
|
|
seventh_amendment: Optional[bool] = Field(None, description="Seventh amendment")
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class CompanyUpdateDTO(BaseModel):
|
|
"""DTO para actualizar una empresa"""
|
|
name: Optional[str] = Field(None, max_length=255, description="Company name")
|
|
rfc: Optional[str] = Field(None, max_length=30, description="Company RFC")
|
|
main_activity: Optional[str] = Field(None, max_length=255, description="Main activity")
|
|
|
|
# Program information
|
|
program: Optional[str] = Field(None, max_length=10, description="Program")
|
|
program_number: Optional[str] = Field(None, max_length=40, description="Program number")
|
|
prosec: Optional[int] = Field(None, description="PROSEC")
|
|
prosec_authorization: Optional[str] = Field(None, max_length=20, description="PROSEC authorization")
|
|
|
|
# Identifiers
|
|
manufacturer_id: Optional[str] = Field(None, max_length=25, description="Manufacturer ID")
|
|
broker_company: Optional[str] = Field(None, max_length=10, description="Broker company")
|
|
|
|
# Responsible person
|
|
responsible: Optional[str] = Field(None, max_length=80, description="Responsible person")
|
|
responsible_name: Optional[str] = Field(None, max_length=20, description="Responsible first name")
|
|
responsible_last_name: Optional[str] = Field(None, max_length=20, description="Responsible last name")
|
|
responsible_mother_last_name: Optional[str] = Field(None, max_length=20, description="Responsible mother's last name")
|
|
responsible_rfc: Optional[str] = Field(None, max_length=30, description="Responsible RFC")
|
|
position: Optional[str] = Field(None, max_length=30, description="Responsible position")
|
|
|
|
# Configuration
|
|
logo: Optional[str] = Field(None, max_length=255, description="Company logo")
|
|
has_express_line: Optional[bool] = Field(None, description="Has express line")
|
|
order_format_type: Optional[str] = Field(None, max_length=19, description="Order format type")
|
|
previous_code: Optional[int] = Field(None, description="Previous code")
|
|
is_service_company: Optional[bool] = Field(None, description="Is service company")
|
|
|
|
# Client and subassembly
|
|
client_name: Optional[str] = Field(None, max_length=300, description="Client name")
|
|
subassembly_mode: Optional[str] = Field(None, max_length=7, description="Subassembly mode")
|
|
|
|
# Additional information
|
|
curp: Optional[str] = Field(None, max_length=19, description="CURP")
|
|
inter_db_name: Optional[str] = Field(None, max_length=100, description="Inter DB name")
|
|
ctpat_svi: Optional[str] = Field(None, max_length=100, description="CTPAT SVI")
|
|
trusted_exporter_number: Optional[str] = Field(None, max_length=50, description="Trusted exporter number")
|
|
prevalidator_key: Optional[str] = Field(None, max_length=20, description="Prevalidator key")
|
|
seventh_amendment: Optional[bool] = Field(None, description="Seventh amendment")
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class CompanyResponseDTO(BaseModel):
|
|
"""DTO para respuesta de empresa"""
|
|
id: str
|
|
consecutive: bool
|
|
name: Optional[str] = None
|
|
rfc: Optional[str] = None
|
|
main_activity: Optional[str] = None
|
|
|
|
# Program information
|
|
program: Optional[str] = None
|
|
program_number: Optional[str] = None
|
|
prosec: Optional[int] = None
|
|
prosec_authorization: Optional[str] = None
|
|
|
|
# Identifiers
|
|
manufacturer_id: Optional[str] = None
|
|
broker_company: Optional[str] = None
|
|
|
|
# Responsible person
|
|
responsible: Optional[str] = None
|
|
responsible_name: Optional[str] = None
|
|
responsible_last_name: Optional[str] = None
|
|
responsible_mother_last_name: Optional[str] = None
|
|
responsible_rfc: Optional[str] = None
|
|
position: Optional[str] = None
|
|
|
|
# Configuration
|
|
logo: Optional[str] = None
|
|
has_express_line: Optional[bool] = None
|
|
order_format_type: Optional[str] = None
|
|
previous_code: Optional[int] = None
|
|
is_service_company: Optional[bool] = None
|
|
|
|
# Client and subassembly
|
|
client_name: Optional[str] = None
|
|
subassembly_mode: Optional[str] = None
|
|
|
|
# Additional information
|
|
curp: Optional[str] = None
|
|
inter_db_name: Optional[str] = None
|
|
ctpat_svi: Optional[str] = None
|
|
trusted_exporter_number: Optional[str] = None
|
|
prevalidator_key: Optional[str] = None
|
|
seventh_amendment: Optional[bool] = None
|
|
|
|
# Timestamps
|
|
created_at: datetime
|
|
updated_at: Optional[datetime] = None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|