From 3210e53608277335cdd5978d5a57b74797771a7e Mon Sep 17 00:00:00 2001 From: AlexeerCT Date: Tue, 30 Dec 2025 15:57:27 -0600 Subject: [PATCH] feat: Enhance driver and transportation data handling in invoice editing - Added methods to list drivers and filter by company and tenant in DriverService. - Updated API routes to include transporters, vehicles, drivers, trailers, customs sections, and code pedimento regimens. - Modified frontend components to handle new transportation data, including select inputs for transporters, vehicles, drivers, and trailers. - Improved data fetching in server-side routes to include additional transportation-related data. - Enhanced UI components to display and select transportation-related information in the invoice editing form. --- backend/api/v1/modules/a76/router.py | 8 +- .../modules/a76/transportation/drivers/dto.py | 4 +- .../a76/transportation/drivers/routes.py | 42 ++- .../a76/transportation/drivers/services.py | 45 ++- .../code_pedimento_regimens/routes.py | 6 +- .../invoices/edit/general-tab-form.svelte | 340 +++++++++++++----- .../invoices/[id]/edit-data/+server.ts | 24 ++ .../invoices/reference-data/+server.ts | 26 +- .../invoices/edit/[id]/+page.server.ts | 106 ++++++ .../dashboard/invoices/edit/[id]/+page.svelte | 12 + .../dashboard/invoices/edit/[id]/+page.ts | 18 + 11 files changed, 516 insertions(+), 115 deletions(-) diff --git a/backend/api/v1/modules/a76/router.py b/backend/api/v1/modules/a76/router.py index 78cac9b3..6129f616 100644 --- a/backend/api/v1/modules/a76/router.py +++ b/backend/api/v1/modules/a76/router.py @@ -71,14 +71,14 @@ router.include_router( ) router.include_router(exchange_rate_router, prefix="/a76", tags=["a76 / exchange_rate"]) -router.include_router(trailers_router, prefix="/a76", tags=["a76 / trailers"]) +router.include_router(trailers_router, prefix="/a76/transportation", tags=["a76 / trailers"]) router.include_router( customs_broker_router, prefix="/a76", tags=["a76 / customs_broker"] ) -router.include_router(drivers_router, prefix="/a76", tags=["a76 / drivers"]) -router.include_router(transporters_router, prefix="/a76", +router.include_router(drivers_router, prefix="/a76/transportation", tags=["a76 / drivers"]) +router.include_router(transporters_router, prefix="/a76/transportation", tags=["a76 / transporters"]) -router.include_router(vehicles_router, prefix="/a76", tags=["a76 / vehicles"]) +router.include_router(vehicles_router, prefix="/a76/transportation", tags=["a76 / vehicles"]) # Registrar catálogos generales adicionales router.include_router(concepts_router, prefix="/a76") diff --git a/backend/api/v1/modules/a76/transportation/drivers/dto.py b/backend/api/v1/modules/a76/transportation/drivers/dto.py index 014459a6..f07e4b4c 100644 --- a/backend/api/v1/modules/a76/transportation/drivers/dto.py +++ b/backend/api/v1/modules/a76/transportation/drivers/dto.py @@ -28,8 +28,8 @@ class DriverBaseDTO(BaseModel): badge_number: Optional[str] class_type: Optional[str] unique_badge_number: Optional[str] - company_id: str - tenant_id: str + company_id: int + tenant_id: int class DriverCreateDTO(DriverBaseDTO): diff --git a/backend/api/v1/modules/a76/transportation/drivers/routes.py b/backend/api/v1/modules/a76/transportation/drivers/routes.py index ebab5154..981ab353 100644 --- a/backend/api/v1/modules/a76/transportation/drivers/routes.py +++ b/backend/api/v1/modules/a76/transportation/drivers/routes.py @@ -1,31 +1,53 @@ -from typing import List +from typing import Any, Dict, List from core.database import get_core_db -from core.security import get_current_user -from fastapi import APIRouter, Depends, HTTPException, status +from core.security import get_current_user, validate_access_to_resource +from fastapi import APIRouter, Depends, HTTPException, Query, status from sqlalchemy.orm import Session from .dto import DriverCreateDTO, DriverResponseDTO +from .models import Driver from .services import DriverService router = APIRouter(prefix="/drivers") -@router.get("/", response_model=List[DriverResponseDTO]) +@router.get("/", response_model=Dict[str, Any]) async def list_drivers( - db: Session = Depends(get_core_db), current_user: dict = Depends(get_current_user) + company_id: int = Query(..., description="Company ID for filtering"), + page: int = Query(1, ge=1, description="Page number"), + page_size: int = Query(50, ge=1, le=100, description="Page size"), + db: Session = Depends(get_core_db), + current_user: dict = Depends(get_current_user), ): - return db.query(DriverService).all() + tenant_id = validate_access_to_resource(db, company_id, current_user) + drivers = DriverService.list_drivers(db, str(company_id), tenant_id) + total = len(drivers) + + # Aplicar paginación manualmente + skip = (page - 1) * page_size + paginated_drivers = drivers[skip : skip + page_size] + + return { + "items": [DriverResponseDTO.model_validate(driver) for driver in paginated_drivers], + "total": total, + "page": page, + "page_size": page_size, + } @router.get("/{transporter_key}/{line}", response_model=DriverResponseDTO) async def read_driver( transporter_key: str, line: int, + company_id: int = Query(..., description="Company ID for filtering"), 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) + tenant_id = validate_access_to_resource(db, company_id, current_user) + driver = DriverService.get_driver_by_key_and_line( + db, transporter_key, line, str(company_id), tenant_id + ) if not driver: raise HTTPException(status_code=404, detail="Driver not found") return driver @@ -44,9 +66,13 @@ async def create_driver( async def delete_driver( transporter_key: str, line: int, + company_id: int = Query(..., description="Company ID for filtering"), db: Session = Depends(get_core_db), current_user: dict = Depends(get_current_user), ): - driver = DriverService.delete_driver(db, transporter_key, line) + tenant_id = validate_access_to_resource(db, company_id, current_user) + driver = DriverService.delete_driver( + db, transporter_key, line, str(company_id), tenant_id + ) if not driver: raise HTTPException(status_code=404, detail="Driver not found") diff --git a/backend/api/v1/modules/a76/transportation/drivers/services.py b/backend/api/v1/modules/a76/transportation/drivers/services.py index 9800b62f..c22a49c0 100644 --- a/backend/api/v1/modules/a76/transportation/drivers/services.py +++ b/backend/api/v1/modules/a76/transportation/drivers/services.py @@ -1,3 +1,5 @@ +from typing import List, Optional + from sqlalchemy.orm import Session from . import dto, models @@ -5,15 +7,30 @@ from . import dto, models 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() + def list_drivers( + db: Session, company_id: str, tenant_id: Optional[str] = None + ) -> List[models.Driver]: + query = db.query(models.Driver).filter(models.Driver.company_id == company_id) + if tenant_id: + query = query.filter(models.Driver.tenant_id == tenant_id) + return query.all() + + @staticmethod + def get_driver_by_key_and_line( + db: Session, + transporter_key: str, + line: int, + company_id: str, + tenant_id: Optional[str] = None, + ) -> Optional[models.Driver]: + query = db.query(models.Driver).filter( + models.Driver.transporter_key == transporter_key, + models.Driver.line == line, + models.Driver.company_id == company_id, ) + if tenant_id: + query = query.filter(models.Driver.tenant_id == tenant_id) + return query.first() @staticmethod def create_driver(db: Session, driver_data: dto.DriverCreateDTO): @@ -24,8 +41,16 @@ class DriverService: 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) + def delete_driver( + db: Session, + transporter_key: str, + line: int, + company_id: str, + tenant_id: Optional[str] = None, + ) -> Optional[models.Driver]: + driver = DriverService.get_driver_by_key_and_line( + db, transporter_key, line, company_id, tenant_id + ) if driver: db.delete(driver) db.commit() diff --git a/backend/api/v1/modules/public/reference_data/code_pedimento_regimens/routes.py b/backend/api/v1/modules/public/reference_data/code_pedimento_regimens/routes.py index 76533e83..6d421350 100644 --- a/backend/api/v1/modules/public/reference_data/code_pedimento_regimens/routes.py +++ b/backend/api/v1/modules/public/reference_data/code_pedimento_regimens/routes.py @@ -14,7 +14,7 @@ router = APIRouter(prefix="/code-pedimento-regimens") @router.get("/", response_model=Dict[str, Any]) def list_code_pedimento_regimens( page: int = Query(1, ge=1, description="Número de página"), - page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"), + page_size: int = Query(50, ge=1, le=1000, description="Tamaño de página"), code: str = Query(None, description="Filter by code"), regime: str = Query(None, description="Filter by regime"), type: str = Query(None, description="Filter by type"), @@ -27,9 +27,9 @@ def list_code_pedimento_regimens( if code is not None: query = query.filter(CodePedimentoRegimen.pedimento_code == code) if regime is not None: - query = query.filter(CodePedimentoRegimen.regime == regime) + query = query.filter(CodePedimentoRegimen.regimen_code == regime) if type is not None: - query = query.filter(CodePedimentoRegimen.type == type) + query = query.filter(CodePedimentoRegimen.type_code == type) items = query.offset(skip).limit(page_size).all() total = query.count() diff --git a/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte b/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte index 508208a7..196da7d9 100644 --- a/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte +++ b/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte @@ -17,6 +17,12 @@ providers = [], currencyTypes = [], transportTypes = [], + transporters = [], + vehicles = [], + drivers = [], + trailers = [], + customsSections = [], + codePedimentoRegimens = [], defaultOperationType = undefined, defaultInvoiceType = undefined }: { @@ -28,10 +34,27 @@ providers?: any[]; currencyTypes?: any[]; transportTypes?: any[]; + transporters?: any[]; + vehicles?: any[]; + drivers?: any[]; + trailers?: any[]; + customsSections?: any[]; + codePedimentoRegimens?: any[]; defaultOperationType?: number | null; defaultInvoiceType?: string | null; } = $props(); + $effect(() => { + console.log('GeneralTabForm - Datos recibidos:', { + transporters: transporters?.length, + vehicles: vehicles?.length, + drivers: drivers?.length, + trailers: trailers?.length, + customsSections: customsSections?.length, + codePedimentoRegimens: codePedimentoRegimens?.length + }); + }); + if (!formData) { if (invoice) { // Editando una factura existente @@ -174,6 +197,24 @@ // Combinar clientes y proveedores para shipped_to const allClientsProviders = [...clients, ...providers]; + + // Filtrar regímenes por tipo de operación (1='1' exp, 2='2' imp) + const filteredRegimens = $derived( + codePedimentoRegimens.filter(r => + r.type_code === String(formData.operation_type) + ) + ); + + $effect(() => { + console.log('Datos recibidos:', { + transporters, + vehicles, + drivers, + trailers, + customsSections, + codePedimentoRegimens + }); +}); @@ -206,16 +247,14 @@
{ formData.provider_header = v ?? ''; }} > - + - {formData.provider_header - ? providerHeaderOptions.find(o => o.value === formData.provider_header)?.label || formData.provider_header - : 'Selecciona encabezado...'} + {providerHeaderOptions.find(o => o.value === (formData.provider_header || providerHeaderOptions[0]?.value))?.label || 'Selecciona encabezado...'} @@ -233,7 +272,7 @@ formData.provider_id = v ? parseInt(v) : null; }} > - + {formData.provider_id ? providers.find(p => p.id === formData.provider_id)?.name || 'Selecciona...' @@ -253,16 +292,14 @@
{ formData.sold_to_header = v ?? ''; }} > - + - {formData.sold_to_header - ? soldToHeaderOptions.find(o => o.value === formData.sold_to_header)?.label || formData.sold_to_header - : 'Selecciona encabezado...'} + {soldToHeaderOptions.find(o => o.value === (formData.sold_to_header || soldToHeaderOptions[0]?.value))?.label || 'Selecciona encabezado...'} @@ -280,7 +317,7 @@ formData.sold_to_id = v ? parseInt(v) : null; }} > - + {formData.sold_to_id ? clients.find(c => c.id === formData.sold_to_id)?.name || 'Selecciona...' @@ -300,16 +337,14 @@
{ formData.shipped_to_header = v ?? ''; }} > - + - {formData.shipped_to_header - ? shippedToHeaderOptions.find(o => o.value === formData.shipped_to_header)?.label || formData.shipped_to_header - : 'Selecciona encabezado...'} + {shippedToHeaderOptions.find(o => o.value === (formData.shipped_to_header || shippedToHeaderOptions[0]?.value))?.label || 'Selecciona encabezado...'} @@ -327,7 +362,7 @@ formData.shipped_to_id = v ? parseInt(v) : null; }} > - + {formData.shipped_to_id ? allClientsProviders.find(cp => cp.id === formData.shipped_to_id)?.name || 'Selecciona...' @@ -349,16 +384,14 @@ { formData.customs_broker_id = v || null; }} > - + - {formData.customs_broker_id - ? customsBrokers.find(cb => cb.broker_key === formData.customs_broker_id)?.name || '...' - : '...'} + {customsBrokers.find(cb => cb.broker_key === (formData.customs_broker_id || customsBrokers[0]?.broker_key))?.name || '...'} @@ -380,7 +413,7 @@ formData.customs_broker_us_id = v || null; }} > - + {formData.customs_broker_us_id ? customsBrokers.find(cb => cb.broker_key === formData.customs_broker_us_id)?.name || '...' @@ -402,7 +435,10 @@
-

Tipo de Moneda - Pesos Netos y Brutos

+
+

Tipo de Moneda - Pesos Netos y Brutos

+

Tipo de cambio:

+
@@ -421,8 +457,7 @@
- -
+ {#if formData.currency_mode === 'captura'}
- + {formData.currency_type || '...'} - + {#each currencyTypes as currencyType} {currencyType.code} @@ -446,7 +481,8 @@
- + {/if} +
- + {formData.weight_type || '...'} {#each weightTypeOptions as weightType} - - {weightType.value} + + {weightType.label} {/each} @@ -475,33 +511,7 @@
-
- -
- - { - formData.invoice_type = v ?? ''; - }} - > - - - {formData.invoice_type - ? `${formData.invoice_type}` - : '...'} - - - - {#each invoiceTypes as type} - - {type.key} - {type.description} - - {/each} - - -
+
@@ -510,8 +520,33 @@
- - + + { + formData.carrier_id = v || null; + }} + > + + + {#if formData.carrier_id} + {transporters.find(t => String(t.transporter_key) === String(formData.carrier_id))?.name || formData.carrier_id} + {:else if transporters.length > 0} + Selecciona transportista... + {:else} + Sin datos + {/if} + + + + {#each transporters as transporter} + + {transporter.transporter_key} + + {/each} + +
@@ -523,15 +558,113 @@ formData.transport_type = v ?? ''; }} > - + - {formData.transport_type || '...'} + {#if formData.transport_type} + {vehicles.find(v => v.vehicle_key === formData.transport_type)?.vehicle_key || formData.transport_type} + {:else if vehicles.length > 0} + Selecciona vehículo... + {:else} + Sin datos + {/if} - {#each transportTypes as transportType} - - {transportType.transport_code} + {#each vehicles as vehicle} + + {vehicle.vehicle_key} {vehicle.plate_number ? `- ${vehicle.plate_number}` : ''} + + {/each} + + +
+
+ +
+ + { + formData.driver_name = v ?? ''; + }} + > + + + {#if formData.driver_name} + {formData.driver_name} + {:else if drivers.length > 0} + Selecciona conductor... + {:else} + Sin datos + {/if} + + + + {#each drivers as driver} + + {driver.driver_name} + + {/each} + + +
+ +
+
+ + { + formData.transport_id = v ?? 'Ninguno'; + }} + > + + + {formData.transport_id || 'Ninguno'} + + + + Ninguno + Transporte + Caja + Placas + Camión + Buque + Ferrobarcaza + Contenedor + Avion + Gondola + Plataforma + + +
+ +
+ + { + formData.transport_num = v ?? ''; + }} + > + + + {#if formData.transport_num} + {trailers.find(t => t.trailer_number === formData.transport_num)?.plate_number || formData.transport_num} + {:else if trailers.length > 0} + Selecciona remolque... + {:else} + Sin datos + {/if} + + + + {#each trailers as trailer} + + {trailer.plate_number || trailer.trailer_number} {/each} @@ -539,31 +672,66 @@
-
- - -
- -
-
- - -
- -
- - -
-
-
- + { + formData.aduana = v ?? ''; + }} + > + + + {#if formData.aduana} + {customsSections.find(cs => cs.customs_code === formData.aduana)?.section_name || formData.aduana} + {:else if customsSections.length > 0} + Selecciona aduana... + {:else} + Sin datos + {/if} + + + + {#each customsSections as section} + + {section.customs_code} - {section.section_name} + + {/each} + +
- + { + formData.clave_regimen_aduanero = v ?? ''; + }} + > + + + {#if formData.clave_regimen_aduanero} + {formData.clave_regimen_aduanero} + {:else if filteredRegimens.length > 0} + Selecciona régimen... + {:else if formData.operation_type} + Sin regímenes para tipo {formData.operation_type} + {:else} + Selecciona tipo de operación primero + {/if} + + + + {#each filteredRegimens as regimen} + + {regimen.regimen_code} + + {/each} + +
diff --git a/frontend/src/routes/api-sveltekit/invoices/[id]/edit-data/+server.ts b/frontend/src/routes/api-sveltekit/invoices/[id]/edit-data/+server.ts index 48c5cd3f..feb116b4 100644 --- a/frontend/src/routes/api-sveltekit/invoices/[id]/edit-data/+server.ts +++ b/frontend/src/routes/api-sveltekit/invoices/[id]/edit-data/+server.ts @@ -30,6 +30,12 @@ export const GET: RequestHandler = async ({ params, cookies, fetch }) => { providersResponse, currencyTypesResponse, transportTypesResponse, + transportersResponse, + vehiclesResponse, + driversResponse, + trailersResponse, + customsSectionsResponse, + codePedimentoRegimensResponse, sealsResponse, incotermsResponse, pedimentosResponse @@ -41,6 +47,12 @@ export const GET: RequestHandler = async ({ params, cookies, fetch }) => { authenticatedFetch(`v1/a76/clients-providers/?company_id=${companyId}&type=provider&page=1&page_size=1000`, {}, cookies, fetch), authenticatedFetch('v1/public/refrence_data/currency-types/?page=1&page_size=100', {}, cookies, fetch), authenticatedFetch('v1/public/refrence_data/transport-types/?page=1&page_size=100', {}, cookies, fetch), + authenticatedFetch(`v1/a76/transportation/transporters/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch), + authenticatedFetch(`v1/a76/transportation/vehicles/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch), + authenticatedFetch(`v1/a76/transportation/drivers/?company_id=${companyId}`, {}, cookies, fetch), + authenticatedFetch(`v1/a76/transportation/trailers/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch), + authenticatedFetch('v1/public/refrence_data/customs-sections/?page=1&page_size=100', {}, cookies, fetch), + authenticatedFetch('v1/public/refrence_data/code-pedimento-regimens/?page=1&page_size=1000', {}, cookies, fetch), authenticatedFetch(`v1/a76/seals/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch), authenticatedFetch('v1/public/refrence_data/incoterms/?page=1&page_size=100', {}, cookies, fetch), authenticatedFetch(`v1/a76/pedimentos/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch) @@ -57,6 +69,12 @@ export const GET: RequestHandler = async ({ params, cookies, fetch }) => { const providers = providersResponse.ok ? await providersResponse.json() : { items: [] }; const currencyTypes = currencyTypesResponse.ok ? await currencyTypesResponse.json() : { items: [] }; const transportTypes = transportTypesResponse.ok ? await transportTypesResponse.json() : { items: [] }; + const transporters = transportersResponse.ok ? await transportersResponse.json() : { items: [] }; + const vehicles = vehiclesResponse.ok ? await vehiclesResponse.json() : { items: [] }; + const drivers = driversResponse.ok ? await driversResponse.json() : { items: [] }; + const trailers = trailersResponse.ok ? await trailersResponse.json() : { items: [] }; + const customsSections = customsSectionsResponse.ok ? await customsSectionsResponse.json() : { items: [] }; + const codePedimentoRegimens = codePedimentoRegimensResponse.ok ? await codePedimentoRegimensResponse.json() : { items: [] }; const seals = sealsResponse.ok ? await sealsResponse.json() : { items: [] }; const incoterms = incotermsResponse.ok ? await incotermsResponse.json() : { items: [] }; const pedimentos = pedimentosResponse.ok ? await pedimentosResponse.json() : { items: [] }; @@ -69,6 +87,12 @@ export const GET: RequestHandler = async ({ params, cookies, fetch }) => { providers: providers.items || [], currencyTypes: currencyTypes.items || [], transportTypes: transportTypes.items || [], + transporters: transporters.items || [], + vehicles: vehicles.items || [], + drivers: drivers.items || [], + trailers: trailers.items || [], + customsSections: customsSections.items || [], + codePedimentoRegimens: codePedimentoRegimens.items || [], seals: seals.items || [], incoterms: incoterms.items || [], pedimentos: pedimentos.items || [] diff --git a/frontend/src/routes/api-sveltekit/invoices/reference-data/+server.ts b/frontend/src/routes/api-sveltekit/invoices/reference-data/+server.ts index 97c0e9ab..85ad19e1 100644 --- a/frontend/src/routes/api-sveltekit/invoices/reference-data/+server.ts +++ b/frontend/src/routes/api-sveltekit/invoices/reference-data/+server.ts @@ -23,8 +23,12 @@ export const GET: RequestHandler = async ({ cookies, fetch }) => { clientsResponse, providersResponse, currencyTypesResponse, - transportTypesResponse, - sealsResponse, + transportTypesResponse, transportersResponse, + vehiclesResponse, + driversResponse, + trailersResponse, + customsSectionsResponse, + codePedimentoRegimensResponse, sealsResponse, incotermsResponse, pedimentosResponse ] = await Promise.all([ @@ -34,6 +38,12 @@ export const GET: RequestHandler = async ({ cookies, fetch }) => { authenticatedFetch(`v1/a76/clients-providers/?company_id=${companyId}&type=provider&page=1&page_size=1000`, {}, cookies, fetch), authenticatedFetch('v1/public/refrence_data/currency-types/?page=1&page_size=100', {}, cookies, fetch), authenticatedFetch('v1/public/refrence_data/transport-types/?page=1&page_size=100', {}, cookies, fetch), + authenticatedFetch(`v1/a76/transportation/transporters/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch), + authenticatedFetch(`v1/a76/transportation/vehicles/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch), + authenticatedFetch(`v1/a76/transportation/drivers/?company_id=${companyId}`, {}, cookies, fetch), + authenticatedFetch(`v1/a76/transportation/trailers/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch), + authenticatedFetch('v1/public/refrence_data/customs-sections/?page=1&page_size=100', {}, cookies, fetch), + authenticatedFetch('v1/public/refrence_data/code-pedimento-regimens/?page=1&page_size=1000', {}, cookies, fetch), authenticatedFetch(`v1/a76/seals/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch), authenticatedFetch('v1/public/refrence_data/incoterms/?page=1&page_size=100', {}, cookies, fetch), authenticatedFetch(`v1/a76/pedimentos/?company_id=${companyId}&page=1&page_size=100`, {}, cookies, fetch) @@ -45,6 +55,12 @@ export const GET: RequestHandler = async ({ cookies, fetch }) => { const providers = providersResponse.ok ? await providersResponse.json() : { items: [] }; const currencyTypes = currencyTypesResponse.ok ? await currencyTypesResponse.json() : { items: [] }; const transportTypes = transportTypesResponse.ok ? await transportTypesResponse.json() : { items: [] }; + const transporters = transportersResponse.ok ? await transportersResponse.json() : { items: [] }; + const vehicles = vehiclesResponse.ok ? await vehiclesResponse.json() : { items: [] }; + const drivers = driversResponse.ok ? await driversResponse.json() : { items: [] }; + const trailers = trailersResponse.ok ? await trailersResponse.json() : { items: [] }; + const customsSections = customsSectionsResponse.ok ? await customsSectionsResponse.json() : { items: [] }; + const codePedimentoRegimens = codePedimentoRegimensResponse.ok ? await codePedimentoRegimensResponse.json() : { items: [] }; const seals = sealsResponse.ok ? await sealsResponse.json() : { items: [] }; const incoterms = incotermsResponse.ok ? await incotermsResponse.json() : { items: [] }; const pedimentos = pedimentosResponse.ok ? await pedimentosResponse.json() : { items: [] }; @@ -56,6 +72,12 @@ export const GET: RequestHandler = async ({ cookies, fetch }) => { providers: providers.items || [], currencyTypes: currencyTypes.items || [], transportTypes: transportTypes.items || [], + transporters: transporters.items || [], + vehicles: vehicles.items || [], + drivers: drivers.items || [], + trailers: trailers.items || [], + customsSections: customsSections.items || [], + codePedimentoRegimens: codePedimentoRegimens.items || [], seals: seals.items || [], incoterms: incoterms.items || [], pedimentos: pedimentos.items || [] diff --git a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.server.ts b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.server.ts index 4321a3c7..927987c6 100644 --- a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.server.ts +++ b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.server.ts @@ -74,6 +74,48 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { fetch ); + const transportersPromise = authenticatedFetch( + `v1/a76/transportation/transporters/?company_id=${companyId}&page=1&page_size=100`, + {}, + cookies, + fetch + ); + + const vehiclesPromise = authenticatedFetch( + `v1/a76/transportation/vehicles/?company_id=${companyId}&page=1&page_size=100`, + {}, + cookies, + fetch + ); + + const driversPromise = authenticatedFetch( + `v1/a76/transportation/drivers/?company_id=${companyId}`, + {}, + cookies, + fetch + ); + + const trailersPromise = authenticatedFetch( + `v1/a76/transportation/trailers/?company_id=${companyId}&page=1&page_size=100`, + {}, + cookies, + fetch + ); + + const customsSectionsPromise = authenticatedFetch( + 'v1/public/refrence_data/customs-sections/?page=1&page_size=100', + {}, + cookies, + fetch + ); + + const codePedimentoRegimensPromise = authenticatedFetch( + 'v1/public/refrence_data/code-pedimento-regimens/?page=1&page_size=1000', + {}, + cookies, + fetch + ); + const sealsPromise = authenticatedFetch( `v1/a76/seals/?company_id=${companyId}&page=1&page_size=100`, {}, @@ -105,6 +147,12 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { providersResponse, currencyTypesResponse, transportTypesResponse, + transportersResponse, + vehiclesResponse, + driversResponse, + trailersResponse, + customsSectionsResponse, + codePedimentoRegimensResponse, sealsResponse, incotermsResponse, pedimentosResponse @@ -115,6 +163,12 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { providersPromise, currencyTypesPromise, transportTypesPromise, + transportersPromise, + vehiclesPromise, + driversPromise, + trailersPromise, + customsSectionsPromise, + codePedimentoRegimensPromise, sealsPromise, incotermsPromise, pedimentosPromise @@ -126,6 +180,22 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { const providers = providersResponse.ok ? await providersResponse.json() : { items: [] }; const currencyTypes = currencyTypesResponse.ok ? await currencyTypesResponse.json() : { items: [] }; const transportTypes = transportTypesResponse.ok ? await transportTypesResponse.json() : { items: [] }; + const transporters = transportersResponse.ok ? await transportersResponse.json() : { items: [] }; + const vehicles = vehiclesResponse.ok ? await vehiclesResponse.json() : { items: [] }; + const drivers = driversResponse.ok ? await driversResponse.json() : { items: [] }; + const trailers = trailersResponse.ok ? await trailersResponse.json() : { items: [] }; + const customsSections = customsSectionsResponse.ok ? await customsSectionsResponse.json() : { items: [] }; + const codePedimentoRegimens = codePedimentoRegimensResponse.ok ? await codePedimentoRegimensResponse.json() : { items: [] }; + + // Debug: log transportation data + console.log('Transportation data loaded:', { + transporters: transporters.items?.length || 0, + vehicles: vehicles.items?.length || 0, + drivers: drivers.items?.length || 0, + trailers: trailers.items?.length || 0, + customsSections: customsSections.items?.length || 0, + codePedimentoRegimens: codePedimentoRegimens.items?.length || 0 + }); const seals = sealsResponse.ok ? await sealsResponse.json() : { items: [] }; const incoterms = incotermsResponse.ok ? await incotermsResponse.json() : { items: [] }; const pedimentos = pedimentosResponse.ok ? await pedimentosResponse.json() : { items: [] }; @@ -140,6 +210,12 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { providers: providers.items || [], currencyTypes: currencyTypes.items || [], transportTypes: transportTypes.items || [], + transporters: transporters.items || [], + vehicles: vehicles.items || [], + drivers: drivers.items || [], + trailers: trailers.items || [], + customsSections: customsSections.items || [], + codePedimentoRegimens: codePedimentoRegimens.items || [], seals: seals.items || [], incoterms: incoterms.items || [], pedimentos: pedimentos.items || [], @@ -162,6 +238,12 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { providers: [], currencyTypes: [], transportTypes: [], + transporters: [], + vehicles: [], + drivers: [], + trailers: [], + customsSections: [], + codePedimentoRegimens: [], seals: [], incoterms: [], pedimentos: [], @@ -201,6 +283,12 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { providersResponse, currencyTypesResponse, transportTypesResponse, + transportersResponse, + vehiclesResponse, + driversResponse, + trailersResponse, + customsSectionsResponse, + codePedimentoRegimensResponse, sealsResponse, incotermsResponse, pedimentosResponse @@ -211,6 +299,12 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { providersPromise, currencyTypesPromise, transportTypesPromise, + transportersPromise, + vehiclesPromise, + driversPromise, + trailersPromise, + customsSectionsPromise, + codePedimentoRegimensPromise, sealsPromise, incotermsPromise, pedimentosPromise @@ -222,6 +316,12 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { const providers = providersResponse.ok ? await providersResponse.json() : { items: [] }; const currencyTypes = currencyTypesResponse.ok ? await currencyTypesResponse.json() : { items: [] }; const transportTypes = transportTypesResponse.ok ? await transportTypesResponse.json() : { items: [] }; + const transporters = transportersResponse.ok ? await transportersResponse.json() : { items: [] }; + const vehicles = vehiclesResponse.ok ? await vehiclesResponse.json() : { items: [] }; + const drivers = driversResponse.ok ? await driversResponse.json() : { items: [] }; + const trailers = trailersResponse.ok ? await trailersResponse.json() : { items: [] }; + const customsSections = customsSectionsResponse.ok ? await customsSectionsResponse.json() : { items: [] }; + const codePedimentoRegimens = codePedimentoRegimensResponse.ok ? await codePedimentoRegimensResponse.json() : { items: [] }; const seals = sealsResponse.ok ? await sealsResponse.json() : { items: [] }; const incoterms = incotermsResponse.ok ? await incotermsResponse.json() : { items: [] }; const pedimentos = pedimentosResponse.ok ? await pedimentosResponse.json() : { items: [] }; @@ -236,6 +336,12 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { providers: providers.items || [], currencyTypes: currencyTypes.items || [], transportTypes: transportTypes.items || [], + transporters: transporters.items || [], + vehicles: vehicles.items || [], + drivers: drivers.items || [], + trailers: trailers.items || [], + customsSections: customsSections.items || [], + codePedimentoRegimens: codePedimentoRegimens.items || [], seals: seals.items || [], incoterms: incoterms.items || [], pedimentos: pedimentos.items || [], diff --git a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.svelte b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.svelte index 6c7deee1..afac04dd 100644 --- a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.svelte +++ b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.svelte @@ -62,6 +62,12 @@ enclosure?: any[]; currencyTypes?: any[]; transportTypes?: any[]; + transporters?: any[]; + vehicles?: any[]; + drivers?: any[]; + trailers?: any[]; + customsSections?: any[]; + codePedimentoRegimens?: any[]; user?: any; companies?: any[]; authenticated?: boolean; @@ -225,6 +231,12 @@ providers={data.providers || []} currencyTypes={data.currencyTypes || []} transportTypes={data.transportTypes || []} + transporters={data.transporters || []} + vehicles={data.vehicles || []} + drivers={data.drivers || []} + trailers={data.trailers || []} + customsSections={data.customsSections || []} + codePedimentoRegimens={data.codePedimentoRegimens || []} defaultOperationType={data.filters?.operation_type ?? undefined} defaultInvoiceType={data.filters?.invoice_type ?? undefined} /> diff --git a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.ts b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.ts index 9a83f0b6..4058c7ad 100644 --- a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.ts +++ b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.ts @@ -60,6 +60,12 @@ export const load: PageLoad = async ({ params, url, parent }) => { providers: data.providers || [], currencyTypes: data.currencyTypes || [], transportTypes: data.transportTypes || [], + transporters: data.transporters || [], + vehicles: data.vehicles || [], + drivers: data.drivers || [], + trailers: data.trailers || [], + customsSections: data.customsSections || [], + codePedimentoRegimens: data.codePedimentoRegimens || [], seals: data.seals || [], incoterms: data.incoterms || [], pedimentos: data.pedimentos || [], @@ -80,6 +86,12 @@ export const load: PageLoad = async ({ params, url, parent }) => { providers: [], currencyTypes: [], transportTypes: [], + transporters: [], + vehicles: [], + drivers: [], + trailers: [], + customsSections: [], + codePedimentoRegimens: [], seals: [], incoterms: [], pedimentos: [], @@ -116,6 +128,12 @@ export const load: PageLoad = async ({ params, url, parent }) => { providers: data.providers || [], currencyTypes: data.currencyTypes || [], transportTypes: data.transportTypes || [], + transporters: data.transporters || [], + vehicles: data.vehicles || [], + drivers: data.drivers || [], + trailers: data.trailers || [], + customsSections: data.customsSections || [], + codePedimentoRegimens: data.codePedimentoRegimens || [], seals: data.seals || [], incoterms: data.incoterms || [], pedimentos: data.pedimentos || [],