Resumen del trabajo de hoy: Se agregaron y actualizaron módulos, rutas, servicios y DTOs para las entidades trabajadas hoy, incluyendo Aduanal, Drivers, Trailers, TransportModes, TransportTypes, Transporters, Vehicles, entre otros. Se verificó la presencia de los campos tenant_id y company_id en los modelos relevantes.

This commit is contained in:
2025-11-08 08:35:02 -06:00
parent ace261fc57
commit 6fab5a3dd4
33 changed files with 1024 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
from pydantic import BaseModel
from typing import Optional
class DriverBaseDTO(BaseModel):
transporter_key: str
line: int
driver_name: Optional[str]
license_number: Optional[str]
express_line_id: Optional[str]
ace_id: Optional[str]
birth_date: Optional[int]
gender: Optional[str]
birth_country: Optional[str]
hazardous_material_auth: Optional[str]
hazardous_material_state: Optional[str]
first_name: Optional[str]
last_name: Optional[str]
id_key1: Optional[str]
id_number1: Optional[str]
id_state1: Optional[str]
id_country1: Optional[str]
id_key2: Optional[str]
id_number2: Optional[str]
id_state2: Optional[str]
id_country2: Optional[str]
badge_number: Optional[str]
class_type: Optional[str]
unique_badge_number: Optional[str]
company_id: str
tenant_id: str
class DriverCreateDTO(DriverBaseDTO):
pass
class DriverResponseDTO(DriverBaseDTO):
class Config:
orm_mode = True

View File

@@ -0,0 +1,33 @@
from sqlalchemy import Column, String, Integer, ForeignKey
from core.database import Base
class Driver(Base):
__tablename__ = "driver"
__table_args__ = {"schema": "a76"}
transporter_key = Column(String(5), ForeignKey("a76.transporter.transporter_key", ondelete="CASCADE"), primary_key=True, nullable=False)
line = Column(Integer, primary_key=True, nullable=False)
driver_name = Column(String(80), nullable=True)
license_number = Column(String(29), nullable=True)
express_line_id = Column(String(17), nullable=True)
ace_id = Column(String(20), nullable=True)
birth_date = Column(Integer, nullable=True)
gender = Column(String(1), nullable=True)
birth_country = Column(String(3), nullable=True)
hazardous_material_auth = Column(String(2), nullable=True)
hazardous_material_state = Column(String(30), nullable=True)
first_name = Column(String(20), nullable=True)
last_name = Column(String(20), nullable=True)
id_key1 = Column(String(40), nullable=True)
id_number1 = Column(String(20), nullable=True)
id_state1 = Column(String(30), nullable=True)
id_country1 = Column(String(3), nullable=True)
id_key2 = Column(String(40), nullable=True)
id_number2 = Column(String(20), nullable=True)
id_state2 = Column(String(30), nullable=True)
id_country2 = Column(String(3), nullable=True)
badge_number = Column(String(20), nullable=True)
class_type = Column(String(1), nullable=True)
unique_badge_number = Column(String(100), nullable=True)
company_id = Column(String, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(String, ForeignKey("a76.tenants.id"), nullable=False)

View File

@@ -0,0 +1,48 @@
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from typing import List
from core.database import get_core_db
from core.security import get_current_user
from .dto import DriverCreateDTO, DriverResponseDTO
from .services import DriverService
router = APIRouter(prefix="/drivers", tags=["Drivers"])
@router.get("/", response_model=List[DriverResponseDTO])
async def list_drivers(
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
return db.query(DriverService).all()
@router.get("/{transporter_key}/{line}", response_model=DriverResponseDTO)
async def read_driver(
transporter_key: str,
line: int,
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
driver = DriverService.get_driver_by_key_and_line(db, transporter_key, line)
if not driver:
raise HTTPException(status_code=404, detail="Driver not found")
return driver
@router.post("/", response_model=DriverResponseDTO, status_code=status.HTTP_201_CREATED)
async def create_driver(
driver_data: DriverCreateDTO,
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
return DriverService.create_driver(db, driver_data)
@router.delete("/{transporter_key}/{line}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_driver(
transporter_key: str,
line: int,
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
driver = DriverService.delete_driver(db, transporter_key, line)
if not driver:
raise HTTPException(status_code=404, detail="Driver not found")

View File

@@ -0,0 +1,26 @@
from sqlalchemy.orm import Session
from . import models, dto
class DriverService:
@staticmethod
def get_driver_by_key_and_line(db: Session, transporter_key: str, line: int):
return db.query(models.Driver).filter(
models.Driver.transporter_key == transporter_key,
models.Driver.line == line
).first()
@staticmethod
def create_driver(db: Session, driver_data: dto.DriverCreateDTO):
new_driver = models.Driver(**driver_data.dict())
db.add(new_driver)
db.commit()
db.refresh(new_driver)
return new_driver
@staticmethod
def delete_driver(db: Session, transporter_key: str, line: int):
driver = DriverService.get_driver_by_key_and_line(db, transporter_key, line)
if driver:
db.delete(driver)
db.commit()
return driver