- Updated SealService to support tenant and company filtering with pagination and enhanced CRUD methods. - Refactored TrailerService to include tenant and company support, added filtering capabilities, and improved CRUD methods. - Introduced TenantCRUDRoutes for Trailer and Transporter routes to streamline API endpoint creation and management. - Enhanced TransporterService with tenant and company filtering, pagination, and improved CRUD operations. - Added Customs Broker module with DTOs, models, services, and routes for managing customs broker data. - Implemented CRUD operations for Customs Broker, including personnel and VU management. - Improved data validation and descriptions in DTOs for better API documentation.
184 lines
5.2 KiB
Python
184 lines
5.2 KiB
Python
"""
|
|
Rutas para gestión de empresa
|
|
"""
|
|
|
|
from typing import List
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
|
|
from core.database import get_core_db
|
|
from core.security import get_current_user, validate_access_to_resource
|
|
from ....common.tenant_crud_routes import TenantCRUDRoutes
|
|
from .dto import CompanyCreateDTO, CompanyResponseDTO, CompanyUpdateDTO
|
|
from .models import Company
|
|
from .service import CompanyService
|
|
|
|
# Base CRUD routes using TenantCRUDRoutes
|
|
base_router = TenantCRUDRoutes(
|
|
service=CompanyService,
|
|
create_schema=CompanyCreateDTO,
|
|
update_schema=CompanyUpdateDTO,
|
|
response_schema=CompanyResponseDTO,
|
|
prefix="/company",
|
|
tags=[],
|
|
id_name="id",
|
|
enable_list=True,
|
|
enable_filters=True,
|
|
).router
|
|
|
|
# Main router that includes base CRUD
|
|
router = APIRouter()
|
|
router.include_router(base_router)
|
|
|
|
|
|
# Custom endpoints
|
|
@router.get(
|
|
"/my-companies",
|
|
response_model=List[CompanyResponseDTO],
|
|
summary="Get all companies for current tenant",
|
|
)
|
|
async def get_my_companies(
|
|
db: Session = Depends(get_core_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Get all companies that belong to the current user's tenant"""
|
|
tenant_id = current_user.get("tenant_id")
|
|
if not tenant_id:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Tenant ID not found in user data",
|
|
)
|
|
|
|
service = CompanyService(db)
|
|
companies = service.get_companies_by_tenant(tenant_id)
|
|
|
|
return [CompanyResponseDTO.model_validate(company) for company in companies]
|
|
|
|
|
|
@router.get(
|
|
"/status/exists",
|
|
response_model=dict,
|
|
summary="Check if company exists for tenant",
|
|
)
|
|
async def check_company_exists(
|
|
db: Session = Depends(get_core_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Check if a company exists for the current tenant"""
|
|
tenant_id = current_user.get("tenant_id")
|
|
if not tenant_id:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Tenant ID not found in user data",
|
|
)
|
|
|
|
service = CompanyService(db)
|
|
exists = service.exists_company(tenant_id)
|
|
|
|
return {"exists": exists}
|
|
|
|
|
|
@router.get(
|
|
"/info/basic/{company_id}",
|
|
response_model=dict,
|
|
summary="Get basic company info",
|
|
)
|
|
async def get_basic_info(
|
|
company_id: int,
|
|
db: Session = Depends(get_core_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Get basic information about a company"""
|
|
tenant_id = current_user.get("tenant_id")
|
|
company_id_from_user = current_user.get("company_id")
|
|
|
|
# Validate access
|
|
validate_access_to_resource(
|
|
db, tenant_id, company_id_from_user, Company, company_id, "id"
|
|
)
|
|
|
|
company = CompanyService.get_by_id(db, company_id, tenant_id, company_id_from_user)
|
|
if not company:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="Company not found",
|
|
)
|
|
|
|
return {
|
|
"id": company.id,
|
|
"name": company.name,
|
|
"rfc": company.rfc,
|
|
"program": company.program,
|
|
}
|
|
|
|
|
|
@router.get(
|
|
"/info/responsible/{company_id}",
|
|
response_model=dict,
|
|
summary="Get responsible person info",
|
|
)
|
|
async def get_responsible_info(
|
|
company_id: int,
|
|
db: Session = Depends(get_core_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Get responsible person information for a company"""
|
|
tenant_id = current_user.get("tenant_id")
|
|
company_id_from_user = current_user.get("company_id")
|
|
|
|
# Validate access
|
|
validate_access_to_resource(
|
|
db, tenant_id, company_id_from_user, Company, company_id, "id"
|
|
)
|
|
|
|
company = CompanyService.get_by_id(db, company_id, tenant_id, company_id_from_user)
|
|
if not company:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="Company not found",
|
|
)
|
|
|
|
return {
|
|
"responsible": company.responsible,
|
|
"responsible_name": company.responsible_name,
|
|
"responsible_last_name": company.responsible_last_name,
|
|
"responsible_mother_last_name": company.responsible_mother_last_name,
|
|
"responsible_rfc": company.responsible_rfc,
|
|
"position": company.position,
|
|
}
|
|
|
|
|
|
@router.get(
|
|
"/info/program/{company_id}",
|
|
response_model=dict,
|
|
summary="Get program information",
|
|
)
|
|
async def get_program_info(
|
|
company_id: int,
|
|
db: Session = Depends(get_core_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Get program information for a company"""
|
|
tenant_id = current_user.get("tenant_id")
|
|
company_id_from_user = current_user.get("company_id")
|
|
|
|
# Validate access
|
|
validate_access_to_resource(
|
|
db, tenant_id, company_id_from_user, Company, company_id, "id"
|
|
)
|
|
|
|
company = CompanyService.get_by_id(db, company_id, tenant_id, company_id_from_user)
|
|
if not company:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="Company not found",
|
|
)
|
|
|
|
return {
|
|
"program": company.program,
|
|
"program_number": company.program_number,
|
|
"prosec": company.prosec,
|
|
"prosec_authorization": company.prosec_authorization,
|
|
}
|