From 8260b6495194741b2386c6011f829803413c65b4 Mon Sep 17 00:00:00 2001 From: Kevin_Ramirez Date: Mon, 27 Apr 2026 16:00:52 -0500 Subject: [PATCH] fix: corriegiendo la compilaciond el frontend de script mal ejecutado --- .../classification_concepts/routes.py | 3 - .../a76/general_catalogs/doda/routes.py | 15 - .../fractions/us_tariff_fractions/routes.py | 7 - .../reference_data/containers/routes.py | 3 - .../classification-concepts.ts | 13 +- .../customs-broker-concepts.ts | 13 + .../dashboard/a76/general_catalogs/doda.ts | 16 +- .../general_catalogs/electronic-notices.ts | 13 +- .../a76/general_catalogs/error-catalogs.ts | 60 +-- .../a76/general_catalogs/exchange-rate.ts | 12 + .../a76/general_catalogs/identifiers.ts | 19 +- .../dashboard/a76/general_catalogs/inpc.ts | 11 + .../dashboard/a76/general_catalogs/legends.ts | 14 +- .../a76/general_catalogs/locations.ts | 11 + .../a76/general_catalogs/packages.ts | 14 +- .../general_catalogs/{seal.ts => seals.ts} | 13 +- .../a76/general_catalogs/signatures.ts | 13 +- .../a76/general_catalogs/unit-conversions.ts | 15 +- .../a76/general_catalogs/units-of-measure.ts | 47 +- .../common/infinite-data-table.svelte | 6 +- .../create-edit-dialog.svelte | 0 .../data-table-actions.svelte | 2 +- .../general_catalogs/doda/columns.ts | 16 +- .../doda/data-table-actions.svelte | 17 +- .../inpc/data-table-actions.svelte | 99 +++++ .../seals}/columns.ts | 2 +- .../seals}/create-edit-dialog.svelte | 4 +- .../seals}/data-table-actions.svelte | 4 +- .../{seal => general_catalogs/seals}/index.ts | 0 .../src/lib/components/sidebar/modules.ts | 6 +- .../general_catalogs/drivers/edit.ts | 6 + .../general_catalogs/drivers/list.ts | 8 + .../dashboard/general_catalogs/inpc/list.ts | 2 +- .../general_catalogs/packages/list.ts | 4 +- .../clients_and_providers/+page.svelte | 408 ++---------------- .../classification_concepts/+page.svelte | 71 +-- .../customs_broker_concepts/+page.svelte | 104 +++-- .../general_catalogs/doda/+page.server.ts | 26 +- .../general_catalogs/doda/+page.svelte | 151 ++++--- .../general_catalogs/drivers/+page.server.ts | 57 +++ .../general_catalogs/drivers/+page.svelte | 36 +- .../electronic_notices/+page.svelte | 28 +- .../equivalencies/+page.svelte | 159 ++++--- .../error_catalogs/+page.svelte | 22 +- .../exchange-rate/+page.svelte | 164 +++---- .../multi_currency_types/+page.svelte | 145 +++---- .../general_catalogs/packages/+page.svelte | 26 +- .../prevalidators/+page.svelte | 132 ++---- .../transporters/+page.svelte | 12 +- .../unit_conversions/+page.svelte | 83 ++-- .../units_of_measure/ace/+page.svelte | 74 +++- .../units_of_measure/american/+page.svelte | 82 ++-- .../units_of_measure/customs/+page.svelte | 30 +- .../units_of_measure/general/+page.svelte | 169 ++++---- .../units_of_measure/oma/+page.svelte | 74 +++- .../general_catalogs/vehicles/+page.svelte | 144 ++++--- .../goods/fixed-asset-classes/+page.svelte | 11 +- .../routes/dashboard/goods/parts/+page.svelte | 32 +- .../routes/dashboard/invoices/+page.server.ts | 3 - .../routes/dashboard/invoices/+page.svelte | 60 ++- .../reference_data/containers/+page.svelte | 43 +- .../reference_data/incoterms/+page.svelte | 1 - .../reference_data/sectors/+page.svelte | 91 ++-- .../reference_data/states/+page.svelte | 4 + 64 files changed, 1507 insertions(+), 1423 deletions(-) rename frontend/src/lib/api/dashboard/a76/general_catalogs/{seal.ts => seals.ts} (76%) rename frontend/src/lib/components/dashboard/general_catalogs/{classification => classification_concepts}/create-edit-dialog.svelte (100%) create mode 100644 frontend/src/lib/components/dashboard/general_catalogs/inpc/data-table-actions.svelte rename frontend/src/lib/components/dashboard/{seal => general_catalogs/seals}/columns.ts (98%) rename frontend/src/lib/components/dashboard/{seal => general_catalogs/seals}/create-edit-dialog.svelte (98%) rename frontend/src/lib/components/dashboard/{seal => general_catalogs/seals}/data-table-actions.svelte (99%) rename frontend/src/lib/components/dashboard/{seal => general_catalogs/seals}/index.ts (100%) create mode 100644 frontend/src/lib/config/shortcuts/dashboard/general_catalogs/drivers/edit.ts create mode 100644 frontend/src/lib/config/shortcuts/dashboard/general_catalogs/drivers/list.ts create mode 100644 frontend/src/routes/dashboard/general_catalogs/drivers/+page.server.ts diff --git a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/routes.py b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/routes.py index 68aa792a..2af35c49 100644 --- a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/routes.py +++ b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/routes.py @@ -11,13 +11,10 @@ router = TenantCRUDRoutes( tags=["a76.general_catalogs.classification_concepts"], resource_name="Classification Concept", enable_list=True, -<<<<<<< HEAD list_permissions=["cat_classification.view"], get_permissions=["cat_classification.view"], create_permissions=["cat_classification.create"], update_permissions=["cat_classification.edit"], delete_permissions=["cat_classification.delete"], -======= enable_filters=True, ->>>>>>> 88ab6b45df947b2091e7cd5fff7468284a0ceef6 ).router diff --git a/backend/api/v1/modules/a76/general_catalogs/doda/routes.py b/backend/api/v1/modules/a76/general_catalogs/doda/routes.py index 85bd05a5..7ed58c89 100644 --- a/backend/api/v1/modules/a76/general_catalogs/doda/routes.py +++ b/backend/api/v1/modules/a76/general_catalogs/doda/routes.py @@ -169,13 +169,7 @@ _crud_router = TenantCRUDRoutes( enable_list=True, enable_filters=True, ).router -<<<<<<< HEAD - -router = crud_router - -======= router.include_router(_crud_router) ->>>>>>> 103363c6315f9235252cc443c8e0093ba401c6c2 @router.get( @@ -199,8 +193,6 @@ async def get_doda_detail( return DodaDetailResponseDTO.model_validate(doda) -<<<<<<< HEAD -======= @router.get( "/{doda_id}/print", summary="Imprimir DODA (PDF)", @@ -282,7 +274,6 @@ async def print_doda_pdf( # ============ CONTAINERS ENDPOINTS ============ ->>>>>>> 103363c6315f9235252cc443c8e0093ba401c6c2 @router.get( "/{doda_id}/containers", response_model=List[DodaContainerResponseDTO], @@ -341,8 +332,6 @@ async def update_container( return DodaContainerResponseDTO.model_validate(container) -<<<<<<< HEAD -======= @router.delete( "/{doda_id}/containers/{container_line}", status_code=status.HTTP_204_NO_CONTENT, @@ -418,7 +407,6 @@ async def delete_container_seal( # ============ AMERICAN PEDIMENTOS ENDPOINTS ============ ->>>>>>> 103363c6315f9235252cc443c8e0093ba401c6c2 @router.get( "/{doda_id}/american-pedimentos", response_model=List[DodaAmericanPedimentoResponseDTO], @@ -454,8 +442,6 @@ async def add_american_pedimento( return DodaAmericanPedimentoResponseDTO.model_validate(pedimento) -<<<<<<< HEAD -======= # ============ AMERICAN PEDIMENTOS (DELETE) ============ @router.delete( "/{doda_id}/american-pedimentos/{pedimento_line}", @@ -473,7 +459,6 @@ async def delete_american_pedimento( # ============ PEDIMENTOS ENDPOINTS ============ ->>>>>>> 103363c6315f9235252cc443c8e0093ba401c6c2 @router.get( "/{doda_id}/pedimentos", response_model=List[DodaPedimentoResponseDTO], diff --git a/backend/api/v1/modules/a76/general_catalogs/fractions/us_tariff_fractions/routes.py b/backend/api/v1/modules/a76/general_catalogs/fractions/us_tariff_fractions/routes.py index b007d18f..e07bf0fd 100644 --- a/backend/api/v1/modules/a76/general_catalogs/fractions/us_tariff_fractions/routes.py +++ b/backend/api/v1/modules/a76/general_catalogs/fractions/us_tariff_fractions/routes.py @@ -42,13 +42,6 @@ def _sitar_row_to_us_response_payload(item: FraccionesUSAResponse) -> dict: main_router = APIRouter( prefix="/us-tariff-fractions", tags=["a76 / general catalogs / us tariff fractions"], - resource_name="US Tariff Fraction", - id_name="id", - enable_list=False, # We implement our custom list endpoint - create_permissions=["frac_american.create"], - update_permissions=["frac_american.edit"], - delete_permissions=["frac_american.delete"], - get_permissions=["frac_american.view"], ) diff --git a/backend/api/v1/modules/public/reference_data/containers/routes.py b/backend/api/v1/modules/public/reference_data/containers/routes.py index 6e38729d..6f0bbe4b 100644 --- a/backend/api/v1/modules/public/reference_data/containers/routes.py +++ b/backend/api/v1/modules/public/reference_data/containers/routes.py @@ -16,11 +16,8 @@ router = APIRouter(prefix="/containers") async def list_containers( 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"), -<<<<<<< HEAD company_id: int = Query(..., description="ID de la empresa"), -======= search: str = Query(None, description="Término de búsqueda"), ->>>>>>> 88ab6b45df947b2091e7cd5fff7468284a0ceef6 db: Session = Depends(get_core_db), current_user: dict = Depends(get_current_user), ): diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts index cb3384ef..ef6ab2b2 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts @@ -63,4 +63,15 @@ export async function updateClassificationConcept( export async function deleteClassificationConcept(id: number, companyId: number): Promise> { return await api.delete(`/v1/a76/classification-concepts/${id}?company_id=${companyId}`); -} \ No newline at end of file +} + +export const classificationApi = { + list: (companyId: number, options: Record = {}) => { + const { page = '1', page_size = '50', ...filters } = options; + return getClassificationConcepts(Number(page), Number(page_size), companyId, filters); + }, + get: (id: number, companyId: number) => getClassificationConcept(id, companyId), + create: (data: ClassificationConceptCreate, companyId: number) => createClassificationConcept(data, companyId), + update: (id: number, data: ClassificationConceptUpdate, companyId: number) => updateClassificationConcept(id, data, companyId), + delete: (id: number, companyId: number) => deleteClassificationConcept(id, companyId) +}; \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/customs-broker-concepts.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/customs-broker-concepts.ts index dce225f7..13260d0c 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/customs-broker-concepts.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/customs-broker-concepts.ts @@ -61,3 +61,16 @@ export async function updateCustomsBrokerConcept(id: number, data: CustomsBroker export async function deleteCustomsBrokerConcept(id: number, companyId: number): Promise> { return await api.delete(`/v1/a76/customs-broker-concepts/${id}?company_id=${companyId}`); } + +export const customsBrokerConceptsApi = { + list: (page = 1, pageSize = 50, companyId: number, filters: any = {}) => + getCustomsBrokerConcepts(page, pageSize, companyId, filters), + get: (id: number, companyId: number) => + getCustomsBrokerConcept(id, companyId), + create: (data: CustomsBrokerConceptCreate, companyId: number) => + createCustomsBrokerConcept(data, companyId), + update: (id: number, data: CustomsBrokerConceptUpdate, companyId: number) => + updateCustomsBrokerConcept(id, data, companyId), + delete: (id: number, companyId: number) => + deleteCustomsBrokerConcept(id, companyId) +}; diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/doda.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/doda.ts index 1be3c86c..7e381174 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/doda.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/doda.ts @@ -178,10 +178,22 @@ export async function getDodas( if (companyId) { params.append('company_id', companyId.toString()); } - const response = await api.get(`/v1/a76/doda/?${params.toString()}`); - return response.data; + return await api.get(`/v1/a76/doda/?${params.toString()}`); } +export const dodaApi = { + list: (page = 1, pageSize = 50, companyId: number, filters: any = {}) => + getDodas(page, pageSize, filters, companyId), + get: (id: number, companyId: number) => + api.get(`/v1/a76/doda/${id}/detail?company_id=${companyId}`), + create: (data: DodaCreate, companyId: number) => + api.post(`/v1/a76/doda/?company_id=${companyId}`, data), + update: (id: number, data: DodaUpdate, companyId: number) => + api.put(`/v1/a76/doda/${id}/?company_id=${companyId}`, data), + delete: (id: number, companyId: number) => + api.delete(`/v1/a76/doda/${id}/?company_id=${companyId}`) +}; + export async function getDoda(id: number, companyId?: number): Promise { const params = new URLSearchParams(); if (companyId) { diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/electronic-notices.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/electronic-notices.ts index 7a8fdc0f..744a4d8d 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/electronic-notices.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/electronic-notices.ts @@ -113,4 +113,15 @@ export async function deleteElectronicNotice(id: number, companyId: number): Pro if (response.error) { throw new Error(response.error); } -} \ No newline at end of file +} + +export const electronicNoticesApi = { + list: (companyId: number, options: Record = {}) => { + const { page = '1', page_size = '50', ...filters } = options; + return getElectronicNotices(Number(page), Number(page_size), filters, companyId) as any; + }, + get: (id: number, companyId: number) => getElectronicNotice(id, companyId), + create: (data: ElectronicNoticeCreate, companyId: number) => createElectronicNotice(data, companyId), + update: (id: number, data: ElectronicNoticeUpdate, companyId: number) => updateElectronicNotice(id, data, companyId), + delete: (id: number, companyId: number) => deleteElectronicNotice(id, companyId) +}; \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/error-catalogs.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/error-catalogs.ts index 21d02991..ec801264 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/error-catalogs.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/error-catalogs.ts @@ -1,4 +1,4 @@ -import { api } from '$lib/api'; +import { api, type ApiResponse } from '$lib/api'; // ========================================== // ERROR CLASSIFICATION @@ -67,7 +67,7 @@ export async function getErrorClassifications( page: number = 1, pageSize: number = 50, filters: Record = {} -): Promise { +): Promise> { const params = new URLSearchParams({ page: page.toString(), page_size: pageSize.toString(), @@ -75,31 +75,27 @@ export async function getErrorClassifications( ...filters }); - const response = await api.get(`/v1/a76/error-catalogs/classifications/?${params.toString()}`); - return response.data; + return await api.get(`/v1/a76/error-catalogs/classifications/?${params.toString()}`); } -export async function getErrorClassification(id: number, companyId: number): Promise { +export async function getErrorClassification(id: number, companyId: number): Promise> { const params = new URLSearchParams({ company_id: companyId.toString() }); - const response = await api.get(`/v1/a76/error-catalogs/classifications/${id}?${params.toString()}`); - return response.data; + return await api.get(`/v1/a76/error-catalogs/classifications/${id}?${params.toString()}`); } -export async function createErrorClassification(data: ErrorClassificationCreate, companyId: number): Promise { +export async function createErrorClassification(data: ErrorClassificationCreate, companyId: number): Promise> { const params = new URLSearchParams({ company_id: companyId.toString() }); - const response = await api.post(`/v1/a76/error-catalogs/classifications/?${params.toString()}`, data); - return response.data; + return await api.post(`/v1/a76/error-catalogs/classifications/?${params.toString()}`, data); } -export async function updateErrorClassification(id: number, data: ErrorClassificationUpdate, companyId: number): Promise { +export async function updateErrorClassification(id: number, data: ErrorClassificationUpdate, companyId: number): Promise> { const params = new URLSearchParams({ company_id: companyId.toString() }); - const response = await api.put(`/v1/a76/error-catalogs/classifications/${id}/?${params.toString()}`, data); - return response.data; + return await api.put(`/v1/a76/error-catalogs/classifications/${id}/?${params.toString()}`, data); } -export async function deleteErrorClassification(id: number, companyId: number): Promise { +export async function deleteErrorClassification(id: number, companyId: number): Promise> { const params = new URLSearchParams({ company_id: companyId.toString() }); - await api.delete(`/v1/a76/error-catalogs/classifications/${id}?${params.toString()}`); + return await api.delete(`/v1/a76/error-catalogs/classifications/${id}?${params.toString()}`); } // --- Catalogs --- @@ -109,7 +105,7 @@ export async function getErrorCatalogs( page: number = 1, pageSize: number = 50, filters: Record = {} -): Promise { +): Promise> { const params = new URLSearchParams({ page: page.toString(), page_size: pageSize.toString(), @@ -117,29 +113,33 @@ export async function getErrorCatalogs( ...filters }); - const response = await api.get(`/v1/a76/error-catalogs/?${params.toString()}`); - return response.data; + return await api.get(`/v1/a76/error-catalogs/?${params.toString()}`); } -export async function getErrorCatalog(id: number, companyId: number): Promise { +export async function getErrorCatalog(id: number, companyId: number): Promise> { const params = new URLSearchParams({ company_id: companyId.toString() }); - const response = await api.get(`/v1/a76/error-catalogs/${id}?${params.toString()}`); - return response.data; + return await api.get(`/v1/a76/error-catalogs/${id}?${params.toString()}`); } -export async function createErrorCatalog(data: ErrorCatalogCreate, companyId: number): Promise { +export async function createErrorCatalog(data: ErrorCatalogCreate, companyId: number): Promise> { const params = new URLSearchParams({ company_id: companyId.toString() }); - const response = await api.post(`/v1/a76/error-catalogs/?${params.toString()}`, data); - return response.data; + return await api.post(`/v1/a76/error-catalogs/?${params.toString()}`, data); } -export async function updateErrorCatalog(id: number, data: ErrorCatalogUpdate, companyId: number): Promise { +export async function updateErrorCatalog(id: number, data: ErrorCatalogUpdate, companyId: number): Promise> { const params = new URLSearchParams({ company_id: companyId.toString() }); - const response = await api.put(`/v1/a76/error-catalogs/${id}/?${params.toString()}`, data); - return response.data; + return await api.put(`/v1/a76/error-catalogs/${id}/?${params.toString()}`, data); } -export async function deleteErrorCatalog(id: number, companyId: number): Promise { +export async function deleteErrorCatalog(id: number, companyId: number): Promise> { const params = new URLSearchParams({ company_id: companyId.toString() }); - await api.delete(`/v1/a76/error-catalogs/${id}?${params.toString()}`); -} \ No newline at end of file + return await api.delete(`/v1/a76/error-catalogs/${id}?${params.toString()}`); +} + +export const errorCatalogsApi = { + list: (companyId: number, options: any = {}) => getErrorCatalogs(companyId, Number(options.page || 1), Number(options.page_size || 50), options), + get: (id: number, companyId: number) => getErrorCatalog(id, companyId), + create: (data: any, companyId: number) => createErrorCatalog(data, companyId), + update: (id: number, data: any, companyId: number) => updateErrorCatalog(id, data, companyId), + delete: (id: number, companyId: number) => deleteErrorCatalog(id, companyId) +}; \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/exchange-rate.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/exchange-rate.ts index 0ef3e8a5..62d4d7d8 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/exchange-rate.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/exchange-rate.ts @@ -92,6 +92,18 @@ export async function deleteExchangeRate( return api.delete(`/v1/a76/exchange-rate/${exchangeRateId}?${params.toString()}`); } +export const exchangeRateApi = { + list: (companyId: number, options: Record = {}) => { + const { page = 1, page_size = 50, ...filters } = options; + return getExchangeRates(companyId, { ...filters, page: Number(page), page_size: Number(page_size) }); + }, + get: (id: number, companyId: number) => getExchangeRate(id, companyId), + create: (data: ExchangeRateCreate, companyId: number) => createExchangeRate(data, companyId), + update: (id: number, data: ExchangeRateUpdate, companyId: number) => updateExchangeRate(id, data, companyId), + delete: (id: number, companyId: number) => deleteExchangeRate(id, companyId), + getDof: (date: string) => getDofExchangeRate(date) +}; + export interface DofResponse { success: boolean; message?: string; diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/identifiers.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/identifiers.ts index d2346b06..2b7ccf3e 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/identifiers.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/identifiers.ts @@ -123,4 +123,21 @@ export async function deleteIdentifierDetail( companyId: number ): Promise> { return await api.delete(`/v1/a76/identifiers/details/${id}?company_id=${companyId}`); -} \ No newline at end of file +} + +export const identifiersApi = { + list: (companyId: number, options: Record = {}) => { + const { page = '1', page_size = '50', ...filters } = options; + return getIdentifiers(Number(page), Number(page_size), companyId, filters); + }, + get: (id: number, companyId: number) => { + return api.get(`/v1/a76/identifiers/${id}?company_id=${companyId}`); + }, + create: (data: IdentifierCreate, companyId: number) => createIdentifier(data, companyId), + update: (id: number, data: IdentifierUpdate, companyId: number) => updateIdentifier(id, data, companyId), + delete: (id: number, companyId: number) => deleteIdentifier(id, companyId), + // Details + createDetail: (data: IdentifierDetailCreate, companyId: number) => createIdentifierDetail(data, companyId), + updateDetail: (id: number, data: IdentifierDetailUpdate, companyId: number) => updateIdentifierDetail(id, data, companyId), + deleteDetail: (id: number, companyId: number) => deleteIdentifierDetail(id, companyId) +}; \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/inpc.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/inpc.ts index c74a6778..b53cb816 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/inpc.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/inpc.ts @@ -66,3 +66,14 @@ export async function updateINPC( export async function deleteINPC(id: number, companyId: number): Promise> { return await api.delete(`/v1/a76/inpc/${id}?company_id=${companyId}`); } + +export const inpcApi = { + list: (companyId: number, options: Record = {}) => { + const { page = '1', page_size = '50', ...filters } = options; + return getINPCs(Number(page), Number(page_size), companyId, filters); + }, + get: (id: number, companyId: number) => getINPC(id, companyId), + create: (data: INPCCreate, companyId: number) => createINPC(data, companyId), + update: (id: number, data: INPCUpdate, companyId: number) => updateINPC(id, data, companyId), + delete: (id: number, companyId: number) => deleteINPC(id, companyId) +}; diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/legends.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/legends.ts index 1794908f..4ef1ffe8 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/legends.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/legends.ts @@ -62,4 +62,16 @@ export async function updateLegend( export async function deleteLegend(id: number, companyId: number): Promise> { return await api.delete(`/v1/a76/legends/${id}?company_id=${companyId}`); -} \ No newline at end of file +} + +// Wrapper object to match the rest of the codebase API style (e.g. `legendsApi.list(...)`) +export const legendsApi = { + list: (companyId: number, options: Record | undefined = {}) => { + const { page = '1', page_size = '50', ...filters } = options as any; + return getLegends(Number(page), Number(page_size), companyId, filters); + }, + get: (id: number, companyId: number) => getLegend(id, companyId), + create: (data: LegendCreate, companyId: number) => createLegend(data, companyId), + update: (id: number, data: LegendUpdate, companyId: number) => updateLegend(id, data, companyId), + delete: (id: number, companyId: number) => deleteLegend(id, companyId) +}; \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/locations.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/locations.ts index f45e8768..ef7eeb45 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/locations.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/locations.ts @@ -98,3 +98,14 @@ export async function deleteLocation( const q = new URLSearchParams({ company_id: String(companyId) }); await api.delete(`${BASE_URL}/${locationId}?${q}`); } + +export const locationsApi = { + list: (companyId: number, options: Record = {}) => { + const { page = 1, page_size = 50, ...filters } = options; + return getLocations(companyId, { ...filters, page: Number(page), page_size: Number(page_size) }); + }, + get: (id: number, companyId: number) => getLocation(id, companyId), + create: (data: LocationCreate, companyId: number) => createLocation(data, companyId), + update: (id: number, data: LocationUpdate, companyId: number) => updateLocation(id, data, companyId), + delete: (id: number, companyId: number) => deleteLocation(id, companyId) +}; diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/packages.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/packages.ts index 952056d4..2a1cc28b 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/packages.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/packages.ts @@ -78,4 +78,16 @@ export async function updatePackage( export async function deletePackage(id: number, companyId: number): Promise> { return await api.delete(`/v1/a76/packages/${id}?company_id=${companyId}`); -} \ No newline at end of file +} + +// Wrapper object to match the rest of the codebase API style (e.g. `packagesApi.list(...)`) +export const packagesApi = { + list: (companyId: number, options: Record | undefined = {}) => { + const { page = '1', page_size = '50', ...filters } = options as any; + return getPackages(Number(page), Number(page_size), companyId, filters); + }, + get: (id: number, companyId: number) => getPackage(id, companyId), + create: (data: PackageCreate, companyId: number) => createPackage(data, companyId), + update: (id: number, data: PackageUpdate, companyId: number) => updatePackage(id, data, companyId), + delete: (id: number, companyId: number) => deletePackage(id, companyId) +}; \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/seal.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/seals.ts similarity index 76% rename from frontend/src/lib/api/dashboard/a76/general_catalogs/seal.ts rename to frontend/src/lib/api/dashboard/a76/general_catalogs/seals.ts index b0f3676f..1abc24eb 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/seal.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/seals.ts @@ -91,5 +91,16 @@ export async function deleteSeal( companyId: number ): Promise<{ data: any; status: number }> { const response = await api.delete(`/v1/a76/seals/${id}?company_id=${companyId}`); - return response; + return response as any; } + +export const sealsApi = { + list: (companyId: number, options: Record = {}) => { + const { page = 1, page_size = 50, seal } = options; + return getSeals(companyId, { page: Number(page), page_size: Number(page_size), seal: seal as string }); + }, + get: (id: number, companyId: number) => getSeal(id, companyId), + create: (data: SealCreateRequest, companyId: number) => createSeal(data, companyId), + update: (id: number, data: SealUpdateRequest, companyId: number) => updateSeal(id, data, companyId), + delete: (id: number, companyId: number) => deleteSeal(id, companyId) +}; diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/signatures.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/signatures.ts index 9afee945..7c399fe5 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/signatures.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/signatures.ts @@ -81,4 +81,15 @@ export async function updateSignature( export async function deleteSignature(id: number, companyId: number): Promise { const response = await api.delete(`/v1/a76/signatures/${id}?company_id=${companyId}`); if (response.error) throw new Error(response.error); -} \ No newline at end of file +} + +export const signaturesApi = { + list: (companyId: number, options: Record = {}) => { + const { page = '1', page_size = '50', ...filters } = options; + return getSignatures(Number(page), Number(page_size), companyId, filters); + }, + get: (id: number, companyId: number) => getSignature(id, companyId), + create: (data: SignatureCreate, companyId: number) => createSignature(data, companyId), + update: (id: number, data: SignatureUpdate, companyId: number) => updateSignature(id, data, companyId), + delete: (id: number, companyId: number) => deleteSignature(id, companyId) +}; \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/unit-conversions.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/unit-conversions.ts index 0bfcd591..addf01a3 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/unit-conversions.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/unit-conversions.ts @@ -83,4 +83,17 @@ export async function deleteUnitConversion(id: number, companyId: number): Promi // Backend DELETE route is defined without trailing slash: /unit-conversions/{id} const response = await api.delete(`/v1/a76/unit-conversions/${id}?company_id=${companyId}`); if (response.error) throw new Error(response.error); -} \ No newline at end of file +} + +export const unitConversionsApi = { + list: (page = 1, pageSize = 50, companyId: number, filters: any = {}) => + getUnitConversions(page, pageSize, companyId, filters), + get: (id: number, companyId: number) => + getUnitConversion(id, companyId), + create: (data: UnitConversionCreate, companyId: number) => + createUnitConversion(data, companyId), + update: (id: number, data: UnitConversionUpdate, companyId: number) => + updateUnitConversion(id, data, companyId), + delete: (id: number, companyId: number) => + deleteUnitConversion(id, companyId) +}; \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/units-of-measure.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/units-of-measure.ts index 5c3d23ba..e17c594f 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/units-of-measure.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/units-of-measure.ts @@ -307,4 +307,49 @@ export async function getUnitsOfMeasure( }); // Apunta a /v1/a76/units-of-measure/ (La ruta base del router) return await api.get(`/v1/a76/units-of-measure/?${queryParams.toString()}`); -} \ No newline at end of file +} + +export const aceUnitsApi = { + list: (companyId: number, options: any = {}) => getUnitsOfMeasureACE(Number(options.page || 1), Number(options.page_size || 50), companyId, options), + get: (id: number, companyId: number) => api.get(`/v1/a76/units-of-measure/ace/${id}/?company_id=${companyId}`), + create: (data: any, companyId: number) => createUnitOfMeasureACE(data, companyId), + update: (id: number, data: any, companyId: number) => updateUnitOfMeasureACE(id, data, companyId), + delete: (id: number, companyId: number) => deleteUnitOfMeasureACE(id, companyId) +}; + +export const omaUnitsApi = { + list: (companyId: number, options: any = {}) => getUnitsOfMeasureOMA(Number(options.page || 1), Number(options.page_size || 50), companyId, options), + get: (id: number, companyId: number) => api.get(`/v1/a76/units-of-measure/oma/${id}/?company_id=${companyId}`), + create: (data: any, companyId: number) => createUnitOfMeasureOMA(data, companyId), + update: (id: number, data: any, companyId: number) => updateUnitOfMeasureOMA(id, data, companyId), + delete: (id: number, companyId: number) => deleteUnitOfMeasureOMA(id, companyId) +}; + +export const americanUnitsApi = { + list: (companyId: number, options: any = {}) => getUnitsOfMeasureAmerican(Number(options.page || 1), Number(options.page_size || 50), companyId, options), + get: (id: number, companyId: number) => api.get(`/v1/a76/units-of-measure/american/${id}/?company_id=${companyId}`), + create: (data: any, companyId: number) => createUnitOfMeasureAmerican(data, companyId), + update: (id: number, data: any, companyId: number) => updateUnitOfMeasureAmerican(id, data, companyId), + delete: (id: number, companyId: number) => deleteUnitOfMeasureAmerican(id, companyId) +}; + +export const generalUnitsApi = { + list: (companyId: number, options: any = {}) => getUnitsOfMeasureGeneral(Number(options.page || 1), Number(options.page_size || 50), companyId, options), + get: (id: number, companyId: number) => api.get(`/v1/a76/units-of-measure/general/${id}/?company_id=${companyId}`), + create: (data: any, companyId: number) => createUnitOfMeasureGeneral(data, companyId), + update: (id: number, data: any, companyId: number) => updateUnitOfMeasureGeneral(id, data, companyId), + delete: (id: number, companyId: number) => deleteUnitOfMeasureGeneral(id, companyId) +}; + +export const customsUnitsApi = { + list: (companyId: number, options: any = {}) => getUnitsOfMeasureCustoms(Number(options.page || 1), Number(options.page_size || 50), companyId, options), + get: (id: number, companyId: number) => api.get(`/v1/a76/units-of-measure/customs/${id}/?company_id=${companyId}`), + create: (data: any, companyId: number) => createUnitOfMeasureCustoms(data, companyId), + update: (id: number, data: any, companyId: number) => updateUnitOfMeasureCustoms(id, data, companyId), + delete: (id: number, companyId: number) => deleteUnitOfMeasureCustoms(id, companyId) +}; + +export const unitsOfMeasureApi = { + list: (companyId: number, options: any = {}) => getUnitsOfMeasure(Number(options.page || 1), Number(options.page_size || 50), companyId, options), + get: (id: number, companyId: number) => api.get(`/v1/a76/units-of-measure/${id}/?company_id=${companyId}`), +}; \ No newline at end of file diff --git a/frontend/src/lib/components/dashboard/common/infinite-data-table.svelte b/frontend/src/lib/components/dashboard/common/infinite-data-table.svelte index 598dffe3..de66cf38 100644 --- a/frontend/src/lib/components/dashboard/common/infinite-data-table.svelte +++ b/frontend/src/lib/components/dashboard/common/infinite-data-table.svelte @@ -38,7 +38,11 @@ }, columns, getCoreRowModel: getCoreRowModel(), - getRowId: (row: any) => (getRowId ? getRowId(row).toString() : (row.id || row.transporter_key || row.driver_id || row.trailer_number || row.vehicle_key || '').toString()), + getRowId: (row: any, index: number) => { + if (getRowId) return getRowId(row).toString(); + const id = row.id ?? row.transporter_key ?? row.driver_id ?? row.trailer_number ?? row.vehicle_key; + return id != null ? id.toString() : index.toString(); + }, state: { get rowSelection() { const selection: Record = {}; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/classification/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/create-edit-dialog.svelte similarity index 100% rename from frontend/src/lib/components/dashboard/general_catalogs/classification/create-edit-dialog.svelte rename to frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/create-edit-dialog.svelte diff --git a/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/data-table-actions.svelte index 6703f649..7bfb3113 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/data-table-actions.svelte @@ -4,7 +4,7 @@ import { deleteClassificationConcept, type ClassificationConcept } from "$lib/api/dashboard/a76/general_catalogs/classification-concepts"; import { companyStore } from "$lib/stores/company.svelte"; import { EllipsisVertical, Pencil, LoaderCircle, Trash2 } from 'lucide-svelte'; - import CreateEditDialog from "$lib/components/dashboard/general_catalogs/classification/create-edit-dialog.svelte"; + import CreateEditDialog from "./create-edit-dialog.svelte"; let { item, diff --git a/frontend/src/lib/components/dashboard/general_catalogs/doda/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/doda/columns.ts index 524faca3..2f886934 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/doda/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/doda/columns.ts @@ -2,12 +2,9 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { Doda } from '$lib/api/dashboard/a76/general_catalogs/doda'; import { renderComponent, renderSnippet } from '$lib/components/ui/data-table'; import { createRawSnippet } from 'svelte'; -<<<<<<< HEAD import DataTableActions from './data-table-actions.svelte'; -======= import { getLocale } from '$lib/paraglide/runtime'; import { dodaFormT, type DodaFormKey } from '$lib/i18n/doda-form-strings'; ->>>>>>> 103363c6315f9235252cc443c8e0093ba401c6c2 /** * doda_date se almacena como Integer con formato YYYYMMDD (ej. 20180409). @@ -34,12 +31,6 @@ function formatDodaDate(val?: number | string | null): string { } } -<<<<<<< HEAD -export function createColumns( - onSuccess?: () => void, - { canEdit = true, canDelete = true }: { canEdit?: boolean; canDelete?: boolean } = {} -): ColumnDef[] { -======= const STATUS_CLASSES: Record = { GENERADO: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300', 'EN PROCESO':'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300', @@ -48,9 +39,12 @@ const STATUS_CLASSES: Record = { ELIMINADO: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300', }; -export function createColumns(loc: 'en' | 'es'): ColumnDef[] { +export function createColumns( + loc: 'en' | 'es', + onSuccess?: () => void, + { canEdit = true, canDelete = true }: { canEdit?: boolean; canDelete?: boolean } = {} +): ColumnDef[] { const t = (k: DodaFormKey) => dodaFormT(loc, k); ->>>>>>> 103363c6315f9235252cc443c8e0093ba401c6c2 return [ { accessorKey: 'id', diff --git a/frontend/src/lib/components/dashboard/general_catalogs/doda/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/doda/data-table-actions.svelte index 1564e641..629b8d81 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/doda/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/doda/data-table-actions.svelte @@ -59,9 +59,8 @@ Acciones -<<<<<<< HEAD {#if canEdit} - goto(`/dashboard/general_catalogs/doda/edit/${item.id}`)}> + goto(`/dashboard/general_catalogs/doda?doda_id=${item.id}`)}> Editar @@ -76,20 +75,6 @@ Eliminar {/if} -======= - goto(`/dashboard/general_catalogs/doda?doda_id=${item.id}`)}> - - Editar - - - {#if loading} - - {:else} - - {/if} - Eliminar - ->>>>>>> 103363c6315f9235252cc443c8e0093ba401c6c2 diff --git a/frontend/src/lib/components/dashboard/general_catalogs/inpc/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/inpc/data-table-actions.svelte new file mode 100644 index 00000000..e36261d7 --- /dev/null +++ b/frontend/src/lib/components/dashboard/general_catalogs/inpc/data-table-actions.svelte @@ -0,0 +1,99 @@ + + + + + {#snippet child({ props })} + + {/snippet} + + + Acciones + {#if canEdit} + dialogOpen = true}> + + Editar + + {/if} + {#if canDelete} + {#if canEdit} + + {/if} + + {#if loading} + + {:else} + + {/if} + Eliminar + + {/if} + {#if !canEdit && !canDelete} + Sin permisos + {/if} + + + + diff --git a/frontend/src/lib/components/dashboard/seal/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/seals/columns.ts similarity index 98% rename from frontend/src/lib/components/dashboard/seal/columns.ts rename to frontend/src/lib/components/dashboard/general_catalogs/seals/columns.ts index 394166e7..d19ff1c0 100644 --- a/frontend/src/lib/components/dashboard/seal/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/seals/columns.ts @@ -1,5 +1,5 @@ import type { ColumnDef } from '@tanstack/table-core'; -import type { Seal } from '$lib/api/dashboard/a76/general_catalogs/seal'; +import type { Seal } from '$lib/api/dashboard/a76/general_catalogs/seals'; import { renderComponent } from '$lib/components/ui/data-table'; import DataTableActions from './data-table-actions.svelte'; diff --git a/frontend/src/lib/components/dashboard/seal/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/seals/create-edit-dialog.svelte similarity index 98% rename from frontend/src/lib/components/dashboard/seal/create-edit-dialog.svelte rename to frontend/src/lib/components/dashboard/general_catalogs/seals/create-edit-dialog.svelte index 38690d0d..8296cd7e 100644 --- a/frontend/src/lib/components/dashboard/seal/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/seals/create-edit-dialog.svelte @@ -4,8 +4,8 @@ import { Input } from '$lib/components/ui/input'; import { Label } from '$lib/components/ui/label'; import { LoaderCircle } from 'lucide-svelte'; - import type { Seal } from '$lib/api/dashboard/a76/general_catalogs/seal'; - import { createSeal, updateSeal } from '$lib/api/dashboard/a76/general_catalogs/seal'; + import type { Seal } from '$lib/api/dashboard/a76/general_catalogs/seals'; + import { createSeal, updateSeal } from '$lib/api/dashboard/a76/general_catalogs/seals'; import { companyStore } from '$lib/stores/company.svelte'; import { obtenerAtajosFormularioSellos } from '$lib/config/shortcuts/dashboard/general_catalogs/seal/edit'; diff --git a/frontend/src/lib/components/dashboard/seal/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/seals/data-table-actions.svelte similarity index 99% rename from frontend/src/lib/components/dashboard/seal/data-table-actions.svelte rename to frontend/src/lib/components/dashboard/general_catalogs/seals/data-table-actions.svelte index 14b482d9..00a1955e 100644 --- a/frontend/src/lib/components/dashboard/seal/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/seals/data-table-actions.svelte @@ -2,8 +2,8 @@ import { Button } from '$lib/components/ui/button'; import * as DropdownMenu from '$lib/components/ui/dropdown-menu'; import { EllipsisVertical, Pencil, Trash2, LoaderCircle } from 'lucide-svelte'; - import type { Seal } from '$lib/api/dashboard/a76/general_catalogs/seal'; - import { deleteSeal } from '$lib/api/dashboard/a76/general_catalogs/seal'; + import type { Seal } from '$lib/api/dashboard/a76/general_catalogs/seals'; + import { deleteSeal } from '$lib/api/dashboard/a76/general_catalogs/seals'; import { companyStore } from '$lib/stores/company.svelte'; import CreateEditDialog from './create-edit-dialog.svelte'; diff --git a/frontend/src/lib/components/dashboard/seal/index.ts b/frontend/src/lib/components/dashboard/general_catalogs/seals/index.ts similarity index 100% rename from frontend/src/lib/components/dashboard/seal/index.ts rename to frontend/src/lib/components/dashboard/general_catalogs/seals/index.ts diff --git a/frontend/src/lib/components/sidebar/modules.ts b/frontend/src/lib/components/sidebar/modules.ts index 2bfb3f13..d1b6d33f 100644 --- a/frontend/src/lib/components/sidebar/modules.ts +++ b/frontend/src/lib/components/sidebar/modules.ts @@ -451,12 +451,8 @@ export function getSidebarData(): SidebarData { items: [ { title: m["sidebar.export_invoices.exportation"](), -<<<<<<< HEAD - url: "/dashboard/invoices?operation_type=exp", - permission: "invoice.exp.view" -======= url: "/dashboard/invoices?operation_type=exp&invoice_type=EXDEF", ->>>>>>> 88ab6b45df947b2091e7cd5fff7468284a0ceef6 + permission: "invoice.exp.view" }, { title: m["sidebar.export_invoices.repair"](), diff --git a/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/drivers/edit.ts b/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/drivers/edit.ts new file mode 100644 index 00000000..d643e861 --- /dev/null +++ b/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/drivers/edit.ts @@ -0,0 +1,6 @@ +import { obtenerAtajosDialogoCatalogo } from '../common/factory'; + +export const obtenerAtajosEdicionChofer = (acciones: { + manejarGuardar: () => void; + manejarCerrar: () => void; +}) => obtenerAtajosDialogoCatalogo(acciones); diff --git a/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/drivers/list.ts b/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/drivers/list.ts new file mode 100644 index 00000000..dda3e6c4 --- /dev/null +++ b/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/drivers/list.ts @@ -0,0 +1,8 @@ +import { obtenerAtajosCatalogoSimple } from '../common/factory'; + +export const obtenerAtajosListaChoferes = (acciones: { + manejarNuevo: () => void; + manejarActualizar: () => void; + manejarEditar?: () => void; + manejarEliminar?: () => void; +}) => obtenerAtajosCatalogoSimple(acciones); diff --git a/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/inpc/list.ts b/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/inpc/list.ts index 478d9fe3..84856fae 100644 --- a/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/inpc/list.ts +++ b/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/inpc/list.ts @@ -1,4 +1,4 @@ import { obtenerAtajosCatalogoSimple } from '$lib/config/shortcuts/dashboard/general_catalogs/common/factory'; import type { ShortcutDef } from '$lib/stores/shortcut-store'; -export const obtenerAtajosListaInpc = (acciones: any): ShortcutDef[] => obtenerAtajosCatalogoSimple(acciones); +export const obtenerAtajosListaINPC = (acciones: any): ShortcutDef[] => obtenerAtajosCatalogoSimple(acciones); diff --git a/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/packages/list.ts b/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/packages/list.ts index a4406d24..e374060e 100644 --- a/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/packages/list.ts +++ b/frontend/src/lib/config/shortcuts/dashboard/general_catalogs/packages/list.ts @@ -4,6 +4,6 @@ import type { ShortcutDef } from '$lib/stores/shortcut-store'; export const obtenerAtajosListaBultos = (acciones: { manejarNuevo: () => void; manejarActualizar: () => void; - manejarEditar: () => void; - manejarEliminar: () => void; + manejarEditar?: () => void; + manejarEliminar?: () => void; }): ShortcutDef[] => obtenerAtajosCatalogoSimple(acciones); diff --git a/frontend/src/routes/dashboard/clients_and_providers/+page.svelte b/frontend/src/routes/dashboard/clients_and_providers/+page.svelte index 8f71723b..433149e2 100644 --- a/frontend/src/routes/dashboard/clients_and_providers/+page.svelte +++ b/frontend/src/routes/dashboard/clients_and_providers/+page.svelte @@ -16,14 +16,10 @@ import { toast } from 'svelte-sonner'; import { companyStore } from '$lib/stores/company.svelte'; import type { ApiError } from '$lib/utils/error-handler'; -<<<<<<< HEAD import { authStore, userHasPermission } from '$lib/auth'; import ErrorState from '$lib/components/dashboard/common/error-state.svelte'; - -======= import DataTable from '$lib/components/dashboard/clients_and_providers/data-table.svelte'; import { createColumns } from '$lib/components/dashboard/clients_and_providers/columns'; ->>>>>>> 88ab6b45df947b2091e7cd5fff7468284a0ceef6 // Los datos iniciales vienen del servidor let { data }: { data: any } = $props(); @@ -89,15 +85,10 @@ try { const filters: any = {}; if (searchType !== 'both') filters.type = searchType; -<<<<<<< HEAD - if (searchName) filters.name = searchName; - if (searchRfc) filters.rfc = searchRfc; -======= const trimmedName = searchName.trim(); const trimmedRfc = searchRfc.trim(); if (trimmedName) filters.name = trimmedName; if (trimmedRfc) filters.rfc = trimmedRfc; ->>>>>>> 88ab6b45df947b2091e7cd5fff7468284a0ceef6 const response = await clientsProvidersApi.list(companyId, pageToLoad, pageSize, filters); @@ -151,6 +142,10 @@ if (selectedItem) goto(`/dashboard/clients_and_providers/edit/${selectedItem.id}`); } + function handleSearch() { + loadItems(1); + } + import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaSocios } from '$lib/config/shortcuts/dashboard/clients_and_providers/list'; @@ -200,7 +195,6 @@ }); -<<<<<<< HEAD
{#if !canView} Borrar -======= -
- -
-

CLIENTES Y PROVEEDORES

-

- Gestiona el catálogo de clientes y proveedores de tu empresa -

-
- - - {#if error} - - - Error - - {typeof error === 'string' ? error : error.detail} - - - - {/if} - -
- -
- -
-
-
-

Filtros

- Busque por nombre, RFC/TAX-ID o tipo -
-
-
- - -
-
- - -
-
- - - - {searchType === 'both' - ? 'Todos' - : searchType === 'client' - ? 'Clientes' - : 'Proveedores'} - - - Todos - Clientes - Proveedores - - -
-
-
-
- - -
-
-

Listado

-
- - {totalItems} registros - - -
-
- -
- loadItems(1))} - loading={isLoading} - {hasMore} - {loadMore} - onRowClick={(row) => selectItem(row as ClientProvider)} - selectedId={selectedItem?.id} - /> -
-
-
- - -
-
-

- Detalles del Registro -

-

- {selectedItem?.name || '---'} -

-
- {taxIdOrRfcLabel(selectedItem)}: - {selectedItem?.rfc || ''} -
-
- -
- {#if selectedItem} -
-
- -

{selectedItem.client_or_provider}

-
- - {#if selectedItem.address} -
- -
-

- {selectedItem.address.streets || ''} - {selectedItem.address.exterior_number || ''} - {selectedItem.address.interior_number - ? 'Int ' + selectedItem.address.interior_number - : ''} -

-

{selectedItem.address.neighborhood || ''}

-

{selectedItem.address.city || ''}, {selectedItem.address.state || ''}

-

- {selectedItem.address.postal_code || ''}, {selectedItem.address.country || ''} -

-
-
- -
- - {#if selectedItem.address.email} -
- - {selectedItem.address.email} -
- {/if} - {#if selectedItem.address.phone} -
- - {selectedItem.address.phone} -
- {/if} -
- {:else} -
-

Sin dirección registrada

-
- {/if} - - {#if selectedItem.programs} -
- -
-
- Programa - {selectedItem.programs.program || '-'} -
-
- Número - {selectedItem.programs.program_number || '-'} -
-
-
- {/if} -
- {:else} -
- -

Selecciona un registro

-
->>>>>>> 88ab6b45df947b2091e7cd5fff7468284a0ceef6 {/if}
@@ -536,104 +319,25 @@
-
- - - - - - - - - - - - {#if isLoading} - - {:else if items.length === 0} - - {:else} - {#each items as item (item.id)} - selectItem(item)} - > - - - - - - - {/each} - {/if} - -
#RFC / TAX-IDNombreTipoEstatus
Cargando...
No se encontraron registros
{item.id}{item.rfc}{item.name} - {#if item.client_or_provider === 'client'} - Cliente - {:else if item.client_or_provider === 'provider'} - Proveedor - {:else} - Ambos - {/if} - - - {item.is_active ? 'Activo' : 'Inactivo'} - -
-
- -
- - - Página {currentPage} de {Math.ceil(totalItems / pageSize)} - - +
+ loadItems(1))} + loading={isLoading} + {hasMore} + {loadMore} + onRowClick={(row) => selectItem(row as ClientProvider)} + selectedId={selectedItem?.id} + />
-
+

Detalles del Registro

@@ -647,19 +351,13 @@ {taxIdOrRfcLabel(selectedItem)}: {selectedItem?.rfc || ''}
- - {#if selectedItem} - - {/if}
-
+
{#if selectedItem}
-
{/if} - +
\ No newline at end of file diff --git a/frontend/src/routes/dashboard/general_catalogs/doda/+page.server.ts b/frontend/src/routes/dashboard/general_catalogs/doda/+page.server.ts index 2b36895e..8d3a8b86 100644 --- a/frontend/src/routes/dashboard/general_catalogs/doda/+page.server.ts +++ b/frontend/src/routes/dashboard/general_catalogs/doda/+page.server.ts @@ -52,7 +52,6 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => { const response = await authenticatedFetch(`v1/a76/doda?${queryParams.toString()}`, { method: 'GET' }, cookies, fetch); if (!response.ok) { -<<<<<<< HEAD let errorMsg = 'Failed to load'; try { const errorData = await response.json(); @@ -63,33 +62,20 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => { return { error: errorMsg, status: response.status, - dodas: { items: [], total: 0, page, page_size: pageSize, pages: 0 } - }; - } - - return { dodas: await response.json(), status: 200 }; - } catch (error: any) { - console.error('Error loading DODAs:', error); - return { - error: error.message || 'Error loading', - status: error.status || 500, - dodas: { items: [], total: 0, page: 1, page_size: 50, pages: 0 } -======= - return { - error: 'Failed to load', dodas: { items: [], total: 0, page, page_size: pageSize, pages: 0 }, defaultLastUser }; } - return { dodas: await response.json(), defaultLastUser }; - } catch (error) { + const dodasData = await response.json(); + return { dodas: dodasData, status: 200, defaultLastUser }; + } catch (error: any) { console.error('Error loading DODAs:', error); - return { - error: 'Error loading', + return { + error: error.message || 'Error loading', + status: error.status || 500, dodas: { items: [], total: 0, page: 1, page_size: 50, pages: 0 }, defaultLastUser ->>>>>>> 103363c6315f9235252cc443c8e0093ba401c6c2 }; } }; diff --git a/frontend/src/routes/dashboard/general_catalogs/doda/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/doda/+page.svelte index ef86f87b..4d463710 100644 --- a/frontend/src/routes/dashboard/general_catalogs/doda/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/doda/+page.svelte @@ -3,15 +3,15 @@ import { page } from '$app/stores'; import { goto } from '$app/navigation'; import { browser } from '$app/environment'; import { createColumns } from '$lib/components/dashboard/general_catalogs/doda/columns'; -import CreateEditDialog from '$lib/components/dashboard/general_catalogs/doda/create-edit-dialog.svelte'; +import DodaFormModal from '$lib/components/dashboard/general_catalogs/doda/doda-form-modal.svelte'; import InfiniteDataTable from '$lib/components/dashboard/common/infinite-data-table.svelte'; import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; import { Pencil, Plus, Trash2, RefreshCw } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; -import { obtenerAtajosListaDODA } from '$lib/config/shortcuts/dashboard/general_catalogs/doda/list'; -import { getDODAs, deleteDODA, type DODA } from '$lib/api/dashboard/a76/general_catalogs/doda'; +import { obtenerAtajosListaDoda } from '$lib/config/shortcuts/dashboard/general_catalogs/doda/list'; +import { dodaApi, type Doda } from '$lib/api/dashboard/a76/general_catalogs/doda'; import { companyStore } from '$lib/stores/company.svelte'; import { currentUser, userHasPermission } from '$lib/auth'; import ErrorState from '$lib/components/dashboard/common/error-state.svelte'; @@ -19,7 +19,7 @@ import ErrorState from '$lib/components/dashboard/common/error-state.svelte'; let { data } = $props(); let dialogOpen = $state(false); -let editingItem = $state(null); +let editingItem = $state(null); let error = $state(data.error || null); let status = $state(data.status || 200); @@ -33,15 +33,15 @@ const isError = $derived(!canView || status >= 400 || error); // Atajos useShortcuts( -'Lista DODA', -obtenerAtajosListaDODA({ -manejarNuevo: () => { -if (!canCreate) return; -editingItem = null; -dialogOpen = true; -}, -manejarActualizar: () => reloadData() -}) + 'Lista DODA', + obtenerAtajosListaDoda({ + manejarNuevo: () => { + if (!canCreate) return; + editingItem = null; + dialogOpen = true; + }, + manejarActualizar: () => reloadData() + }) ); // Filtros @@ -49,10 +49,10 @@ let searchKey = $state($page.url.searchParams.get('folio') || ''); let searchDesc = $state($page.url.searchParams.get('description') || ''); let timeout: ReturnType; -let allItems = $state(data.items?.items || data.items || []); -let currentPage = $state(data.items?.page || 1); -let pageSize = $state(data.items?.page_size || 50); -let totalItems = $state(data.items?.total || 0); +let allItems = $state(data.dodas?.items || []); +let currentPage = $state(data.dodas?.page || 1); +let pageSize = $state(data.dodas?.page_size || 50); +let totalItems = $state(data.dodas?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); let selectedIds = $state<(string | number)[]>([]); @@ -63,12 +63,12 @@ selectedIds.length === 1 ); $effect(() => { -if (data.items) { -allItems = data.items.items || data.items || []; -currentPage = data.items.page || 1; -totalItems = data.items.total || 0; -pageSize = data.items.page_size || pageSize; -} + if (data.dodas) { + allItems = data.dodas.items || []; + currentPage = data.dodas.page || 1; + totalItems = data.dodas.total || 0; + pageSize = data.dodas.page_size || pageSize; + } }); async function handleSearch() { @@ -79,11 +79,11 @@ if (!companyStore.activeCompany) return; loading = true; error = null; try { -const response = await getDODAs(1, pageSize, companyStore.activeCompany.id, { -folio: searchKey || undefined, -description: searchDesc || undefined -}); -const payload = (response as any).items ? response : (response as any).data; + const response = await dodaApi.list(1, pageSize, companyStore.activeCompany.id, { + folio: searchKey || undefined, + description: searchDesc || undefined + }); +const payload = response.data; if (payload?.items) { allItems = payload.items; currentPage = payload.page || 1; @@ -108,11 +108,11 @@ async function loadMore() { if (loading || !hasMore || !companyStore.activeCompany) return; loading = true; try { -const response = await getDODAs(currentPage + 1, pageSize, companyStore.activeCompany.id, { -folio: searchKey || undefined, -description: searchDesc || undefined -}); -const payload = (response as any).items ? response : (response as any).data; + const response = await dodaApi.list(currentPage + 1, pageSize, companyStore.activeCompany.id, { + folio: searchKey || undefined, + description: searchDesc || undefined + }); +const payload = response.data; if (payload?.items) { allItems = [...allItems, ...payload.items]; currentPage = payload.page || (currentPage + 1); @@ -130,11 +130,11 @@ if (!companyStore.activeCompany) return; loading = true; error = null; try { -const response = await getDODAs(1, pageSize, companyStore.activeCompany.id, { -folio: searchKey || undefined, -description: searchDesc || undefined -}); -const payload = (response as any).items ? response : (response as any).data; + const response = await dodaApi.list(1, pageSize, companyStore.activeCompany.id, { + folio: searchKey || undefined, + description: searchDesc || undefined + }); +const payload = response.data; if (payload?.items) { allItems = payload.items; currentPage = payload.page || 1; @@ -154,7 +154,46 @@ selectedIds = []; reloadData(); } -const columns = $derived(createColumns(handleSuccess, { canEdit, canDelete })); + function handleNew() { + if (!canCreate) return; + const url = new URL($page.url); + url.searchParams.set('doda_id', 'new'); + goto(url.toString(), { replaceState: true }); + } + + function handleEdit() { + if (!selectedItem || !canEdit) return; + const url = new URL($page.url); + url.searchParams.set('doda_id', selectedItem.id.toString()); + goto(url.toString(), { replaceState: true }); + } + + async function handleDelete() { + if (!selectedItem || !canDelete || !companyStore.activeCompany) return; + if (confirm('¿Eliminar este registro?')) { + try { + await dodaApi.delete(selectedItem.id, companyStore.activeCompany.id); + selectedIds = []; + reloadData(); + } catch (err) { + error = 'Error al eliminar'; + } + } + } + + function handleRowClick(row: Doda) { + selectedIds = selectedIds.includes(row.id) ? [] : [row.id]; + } + + function handleRowDoubleClick(row: Doda) { + if (canEdit) { + const url = new URL($page.url); + url.searchParams.set('doda_id', row.id.toString()); + goto(url.toString(), { replaceState: true }); + } + } + + const columns = $derived(createColumns('es', handleSuccess, { canEdit, canDelete }));
@@ -168,7 +207,7 @@ const columns = $derived(createColumns(handleSuccess, { canEdit, canDelete })); Actualizar {#if !isError && canCreate} - {/if} @@ -197,8 +236,8 @@ onRetry={reloadData} (selectedIds = ids)} -onRowClick={(row) => selectedIds = selectedIds.includes(row.id) ? [] : [row.id]} -onRowDoubleClick={(row) => { if(canEdit) { editingItem = row; dialogOpen = true; } }} +onRowClick={handleRowClick} +onRowDoubleClick={handleRowDoubleClick} />
@@ -213,19 +252,12 @@ Mostrando {allItems.length} de {totalItems} registros
{#if canEdit} - {/if} {#if canDelete} - {/if} @@ -234,5 +266,20 @@ reloadData();
{/if} - +{#if $page.url.searchParams.get('doda_id')} + { +const url = new URL($page.url); +url.searchParams.delete('doda_id'); +goto(url.toString(), { replaceState: true }); +reloadData(); +}} +onCreatedNavigateTo={(newId) => { +const url = new URL($page.url); +url.searchParams.set('doda_id', String(newId)); +goto(url.toString(), { replaceState: true }); +}} +/> +{/if}
\ No newline at end of file diff --git a/frontend/src/routes/dashboard/general_catalogs/drivers/+page.server.ts b/frontend/src/routes/dashboard/general_catalogs/drivers/+page.server.ts new file mode 100644 index 00000000..b60b43ba --- /dev/null +++ b/frontend/src/routes/dashboard/general_catalogs/drivers/+page.server.ts @@ -0,0 +1,57 @@ +import type { PageServerLoad } from './$types'; +import { getAuthTokens, authenticatedFetch } from '$lib/server/api'; + +export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => { + const parentData = await parent(); + const { accessToken } = getAuthTokens(cookies); + + if (!accessToken) { + return { + error: 'No authenticated', + items: { items: [], total: 0, page: 1, page_size: 50, pages: 0 } + }; + } + + try { + const page = Number(url.searchParams.get('page')) || 1; + const pageSize = Number(url.searchParams.get('pageSize')) || 50; + + const cookieCompanyId = cookies.get('active_company_id'); + const companyId = cookieCompanyId ? parseInt(cookieCompanyId) : parentData.companies?.[0]?.id; + + if (!companyId) { + return { + error: 'No company selected', + items: { items: [], total: 0, page, page_size: pageSize, pages: 0 } + }; + } + + const queryParams = new URLSearchParams({ + page: page.toString(), + page_size: pageSize.toString(), + company_id: companyId.toString() + }); + + const response = await authenticatedFetch(`v1/a76/drivers?${queryParams.toString()}`, { method: 'GET' }, cookies, fetch); + + if (!response.ok) { + return { + error: 'Failed to load drivers', + status: response.status, + items: { items: [], total: 0, page, page_size: pageSize, pages: 0 } + }; + } + + const data = await response.json(); + return { + items: data, + status: 200 + }; + } catch (error: any) { + return { + error: error.message || 'Error loading drivers', + status: 500, + items: { items: [], total: 0, page: 1, page_size: 50, pages: 0 } + }; + } +}; diff --git a/frontend/src/routes/dashboard/general_catalogs/drivers/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/drivers/+page.svelte index f5caebe1..dc909c1c 100644 --- a/frontend/src/routes/dashboard/general_catalogs/drivers/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/drivers/+page.svelte @@ -11,7 +11,7 @@ import { Input } from '$lib/components/ui/input'; import { Pencil, Plus, Trash2, RefreshCw } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaChoferes } from '$lib/config/shortcuts/dashboard/general_catalogs/drivers/list'; -import { getDrivers, deleteDriver, type Driver } from '$lib/api/dashboard/a76/general_catalogs/drivers'; +import { driversApi, type Driver } from '$lib/api/dashboard/a76/drivers'; import { companyStore } from '$lib/stores/company.svelte'; import { currentUser, userHasPermission } from '$lib/auth'; import ErrorState from '$lib/components/dashboard/common/error-state.svelte'; @@ -58,7 +58,7 @@ let hasMore = $derived(allItems.length < totalItems); let selectedIds = $state<(string | number)[]>([]); const selectedItem = $derived( selectedIds.length === 1 -? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null +? allItems.find((item) => `${item.transporter_key}-${item.line}` === String(selectedIds[0])) ?? null : null ); @@ -79,11 +79,13 @@ if (!companyStore.activeCompany) return; loading = true; error = null; try { -const response = await getDrivers(1, pageSize, companyStore.activeCompany.id, { +const response = await driversApi.list(companyStore.activeCompany.id, { driver_key: searchKey || undefined, -description: searchDesc || undefined +description: searchDesc || undefined, +page: 1, +page_size: pageSize }); -const payload = (response as any).items ? response : (response as any).data; +const payload = response.data; if (payload?.items) { allItems = payload.items; currentPage = payload.page || 1; @@ -108,11 +110,13 @@ async function loadMore() { if (loading || !hasMore || !companyStore.activeCompany) return; loading = true; try { -const response = await getDrivers(currentPage + 1, pageSize, companyStore.activeCompany.id, { +const response = await driversApi.list(companyStore.activeCompany.id, { driver_key: searchKey || undefined, -description: searchDesc || undefined +description: searchDesc || undefined, +page: currentPage + 1, +page_size: pageSize }); -const payload = (response as any).items ? response : (response as any).data; +const payload = response.data; if (payload?.items) { allItems = [...allItems, ...payload.items]; currentPage = payload.page || (currentPage + 1); @@ -130,11 +134,13 @@ if (!companyStore.activeCompany) return; loading = true; error = null; try { -const response = await getDrivers(1, pageSize, companyStore.activeCompany.id, { +const response = await driversApi.list(companyStore.activeCompany.id, { driver_key: searchKey || undefined, -description: searchDesc || undefined +description: searchDesc || undefined, +page: 1, +page_size: pageSize }); -const payload = (response as any).items ? response : (response as any).data; +const payload = response.data; if (payload?.items) { allItems = payload.items; currentPage = payload.page || 1; @@ -197,8 +203,12 @@ onRetry={reloadData} (selectedIds = ids)} -onRowClick={(row) => selectedIds = selectedIds.includes(row.id) ? [] : [row.id]} +onRowClick={(row) => { + const rowId = `${row.transporter_key}-${row.line}`; + selectedIds = selectedIds.includes(rowId) ? [] : [rowId]; +}} onRowDoubleClick={(row) => { if(canEdit) { editingItem = row; dialogOpen = true; } }} +getRowId={(row) => `${row.transporter_key}-${row.line}`} />
@@ -221,7 +231,7 @@ Mostrando {allItems.length} de {totalItems} registros
->>>>>>> 88ab6b45df947b2091e7cd5fff7468284a0ceef6 +
{#if isError} @@ -299,7 +293,17 @@
- + (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + />
@@ -309,47 +313,40 @@ {/if} -<<<<<<< HEAD -======= - -
Listado de Equivalencias
-
(selectedIds = ids)} onRowClick={handleRowClick} onRowDoubleClick={handleRowDoubleClick} />
-
+
-
Mostrando {allItems.length} de {totalItems} registros
- -
- - @@ -290,65 +275,44 @@ {/if} -<<<<<<< HEAD - -======= - -
Listado de Tipos de Cambio
- -
- (selectedIds = ids)} - onRowClick={handleRowClick} - onRowDoubleClick={handleRowDoubleClick} - /> -
-
-
+
-
Mostrando {allItems.length} de {totalItems} registros
- -
- -
-<<<<<<< HEAD {#if !isError && canCreate} - {/if} -======= - ->>>>>>> 88ab6b45df947b2091e7cd5fff7468284a0ceef6
@@ -336,7 +310,17 @@
- + (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + />
@@ -344,67 +328,42 @@
Mostrando {allItems.length} de {totalItems} registros
- {/if} -<<<<<<< HEAD - -======= - -
Listado de Monedas
- -
- (selectedIds = ids)} - onRowClick={handleRowClick} - onRowDoubleClick={handleRowDoubleClick} - /> -
-
-
+
-
Mostrando {allItems.length} de {totalItems} registros
- -
- -