From 91d68cb1ef4b894bfdc510b108ff6e31ff94b085 Mon Sep 17 00:00:00 2001 From: Kevin_Ramirez Date: Tue, 30 Dec 2025 13:58:56 -0600 Subject: [PATCH] Se cambiaron los nombres de los archivos a uno mas estandarizado, se puso el ymal como estaba y se quitaron notificaciones --- .../customs_broker_concepts/dto.py | 29 +- .../customs_broker_concepts/routes.py | 18 +- .../customs_broker_concepts/service.py | 121 ++++-- .../customs-broker-concepts.ts | 34 +- .../customs_broker_concepts.ts | 75 ---- .../columns.ts | 0 .../create-edit-dialog.svelte | 0 .../data-table-actions.svelte | 0 .../data-table.svelte | 0 .../data-table-actions.svelte | 4 - .../company/data-table-actions.svelte | 3 - .../concepts/data-table-actions.svelte | 4 - .../customs_broker_concepts/columns.ts | 24 +- .../create-edite-dialoge.svelte | 67 ++- .../data-table-actions.svelte | 4 - .../doda/data-table-actions.svelte | 3 - .../columns.ts | 0 .../create-edit-dialog.svelte | 0 .../data-table-actions.svelte | 3 - .../data-table.svelte | 0 .../equivalencies/data-table-actions.svelte | 3 - .../error_catalogs/create-edit-dialog.svelte | 2 - .../error_catalogs/data-table-actions.svelte | 3 - .../identifiers/data-table-actions.svelte | 3 - .../inpc/data-table-actions.svelte | 3 - .../legends/data-table-actions.svelte | 4 - .../locations/create-edit-dialog.svelte | 2 - .../create-edit-dialog.svelte | 2 - .../prevalidators/data-table-actions.svelte | 3 - .../signatures/data-table-actions.svelte | 3 - .../create-edite-dialoge.svelte | 0 .../create-edit-dialog.svelte | 2 - .../data-table-actions.svelte | 3 - .../ace/data-table-actions.svelte | 4 - .../american/create-edit-dialog.svelte | 3 - .../american/data-table-actions.svelte | 3 - .../customs/create-edit-dialog.svelte | 3 - .../customs/data-table-actions.svelte | 3 - .../general/create-edit-dialog.svelte | 3 - .../general/data-table-actions.svelte | 3 - .../oma/create-edit-dialog.svelte | 3 - .../oma/data-table-actions.svelte | 3 - .../dashboard/customs_brokers/+page.server.ts | 2 +- .../dashboard/customs_brokers/+page.svelte | 2 +- .../customs_brokers/new/+page.svelte | 395 ------------------ .../customs_broker_concepts/+page.server.ts | 40 +- .../customs_broker_concepts/+page.svelte | 21 +- .../electronic_notices/+page.svelte | 6 +- .../exchange-rate/+page.svelte | 6 +- 49 files changed, 205 insertions(+), 717 deletions(-) delete mode 100644 frontend/src/lib/api/dashboard/a76/general_catalogs/customs_broker_concepts.ts rename frontend/src/lib/components/dashboard/{exchange-rate => exchange_rate}/columns.ts (100%) rename frontend/src/lib/components/dashboard/{exchange-rate => exchange_rate}/create-edit-dialog.svelte (100%) rename frontend/src/lib/components/dashboard/{exchange-rate => exchange_rate}/data-table-actions.svelte (100%) rename frontend/src/lib/components/dashboard/{exchange-rate => exchange_rate}/data-table.svelte (100%) rename frontend/src/lib/components/dashboard/general_catalogs/{electronic-notices => electronic_notices}/columns.ts (100%) rename frontend/src/lib/components/dashboard/general_catalogs/{electronic-notices => electronic_notices}/create-edit-dialog.svelte (100%) rename frontend/src/lib/components/dashboard/general_catalogs/{electronic-notices => electronic_notices}/data-table-actions.svelte (93%) rename frontend/src/lib/components/dashboard/general_catalogs/{electronic-notices => electronic_notices}/data-table.svelte (100%) rename frontend/src/lib/components/dashboard/general_catalogs/{unit-conversion => unit_conversion}/create-edite-dialoge.svelte (100%) delete mode 100644 frontend/src/routes/dashboard/customs_brokers/new/+page.svelte diff --git a/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/dto.py b/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/dto.py index 30416dea..3c545d44 100644 --- a/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/dto.py +++ b/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/dto.py @@ -1,27 +1,40 @@ +""" +DTOs for Customs Broker Concepts. +""" + +from datetime import datetime from typing import Optional -from decimal import Decimal + from pydantic import BaseModel, Field, ConfigDict class CustomsBrokerConceptBase(BaseModel): broker_key: str = Field(..., max_length=5, description="Customs Broker Key (CLAVEAA)") - concept: str = Field(..., max_length=15, description="Concept") - amount: Optional[Decimal] = Field(None, description="Amount") - priority: Optional[int] = Field(None, description="Priority") + concept: str = Field(..., max_length=15, description="Concept/Code") + amount: Optional[float] = Field(None, description="Amount (IMPORTE)") + priority: Optional[int] = Field(None, description="Priority (PRIORIDAD)") class CustomsBrokerConceptCreate(CustomsBrokerConceptBase): + """Schema for creating a concept""" pass class CustomsBrokerConceptUpdate(BaseModel): - broker_key: Optional[str] = Field(None, max_length=5) - concept: Optional[str] = Field(None, max_length=15) - amount: Optional[Decimal] = None - priority: Optional[int] = None + """Schema for updating a concept""" + broker_key: Optional[str] = Field(None, max_length=5, description="Customs Broker Key (CLAVEAA)") + concept: Optional[str] = Field(None, max_length=15, description="Concept/Code") + amount: Optional[float] = Field(None, description="Amount (IMPORTE)") + priority: Optional[int] = Field(None, description="Priority (PRIORIDAD)") class CustomsBrokerConceptResponse(CustomsBrokerConceptBase): + """Schema for concept response""" id: int + company_id: int + tenant_id: int + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None model_config = ConfigDict(from_attributes=True) + diff --git a/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/routes.py b/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/routes.py index c8ec83ad..cd5f5da1 100644 --- a/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/routes.py +++ b/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/routes.py @@ -1,14 +1,26 @@ +""" +Routes for managing Customs Broker Concepts. +""" + from api.v1.common.tenant_crud_routes import TenantCRUDRoutes + from .dto import CustomsBrokerConceptCreate, CustomsBrokerConceptResponse, CustomsBrokerConceptUpdate from .service import CustomsBrokerConceptService +# Create router using TenantCRUDRoutes factory router = TenantCRUDRoutes( service=CustomsBrokerConceptService, create_schema=CustomsBrokerConceptCreate, update_schema=CustomsBrokerConceptUpdate, response_schema=CustomsBrokerConceptResponse, - prefix="/customs-broker-concepts", - tags=["a76.general_catalogs.customs_broker_concepts"], + prefix="/customs-broker-concepts", + tags=["a76 / customs_broker_concepts"], resource_name="Customs Broker Concept", - enable_list=True, + id_name="concept_id", + enable_list=True, # Enable GET /customs-broker-concepts with pagination + enable_filters=True, # Enable filtering + default_page_size=50, + max_page_size=100, ).router + + diff --git a/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/service.py b/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/service.py index 643981e4..4e60f61a 100644 --- a/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/service.py +++ b/backend/api/v1/modules/a76/general_catalogs/customs_broker_concepts/service.py @@ -1,94 +1,125 @@ -from typing import List, Optional, Tuple, Dict, Any +""" +Service layer for Customs Broker Concepts. +""" + +from typing import Optional, Tuple, List, Dict, Any import logging from sqlalchemy.orm import Session -from sqlalchemy import select from sqlalchemy.exc import IntegrityError from fastapi import HTTPException -from .models import CustomsBrokerConcept -from .dto import CustomsBrokerConceptCreate, CustomsBrokerConceptUpdate +from . import dto, models logger = logging.getLogger(__name__) class CustomsBrokerConceptService: + """Service for Customs Broker Concept CRUD operations with tenant support""" + @staticmethod def get_all( db: Session, tenant_id: int, company_id: int, skip: int = 0, - limit: int = 100, + limit: int = 50, filters: Optional[Dict[str, Any]] = None, - ) -> Tuple[List[CustomsBrokerConcept], int]: - query = db.query(CustomsBrokerConcept).filter( - CustomsBrokerConcept.tenant_id == tenant_id, - CustomsBrokerConcept.company_id == company_id + ) -> Tuple[List[models.CustomsBrokerConcept], int]: + """Get all customs broker concepts for a tenant/company with pagination""" + query = db.query(models.CustomsBrokerConcept).filter( + models.CustomsBrokerConcept.tenant_id == tenant_id, + models.CustomsBrokerConcept.company_id == company_id, ) - total = query.count() - items = query.offset(skip).limit(limit).all() + # Apply filters if provided + if filters: + if filters.get("broker_key"): + query = query.filter( + models.CustomsBrokerConcept.broker_key.ilike(f"%{filters['broker_key']}%") + ) + if filters.get("concept"): + query = query.filter( + models.CustomsBrokerConcept.concept.ilike( + f"%{filters['concept']}%") + ) - return items, total + total = query.count() + concepts = query.offset(skip).limit(limit).all() + + return concepts, total @staticmethod def get_by_id( - db: Session, id: int, tenant_id: int, company_id: int - ) -> Optional[CustomsBrokerConcept]: - return db.query(CustomsBrokerConcept).filter( - CustomsBrokerConcept.id == id, - CustomsBrokerConcept.tenant_id == tenant_id, - CustomsBrokerConcept.company_id == company_id - ).first() + db: Session, concept_id: int, tenant_id: int, company_id: int + ) -> Optional[models.CustomsBrokerConcept]: + """Get customs broker concept by ID""" + return ( + db.query(models.CustomsBrokerConcept) + .filter( + models.CustomsBrokerConcept.id == concept_id, + models.CustomsBrokerConcept.tenant_id == tenant_id, + models.CustomsBrokerConcept.company_id == company_id, + ) + .first() + ) @staticmethod def create( - db: Session, data: CustomsBrokerConceptCreate, tenant_id: int, company_id: int - ) -> CustomsBrokerConcept: - db_obj = CustomsBrokerConcept( - **data.model_dump(), - tenant_id=tenant_id, - company_id=company_id + db: Session, + concept_data: dto.CustomsBrokerConceptCreate, + tenant_id: int, + company_id: int, + ) -> models.CustomsBrokerConcept: + """Create a new customs broker concept""" + new_concept = models.CustomsBrokerConcept( + **concept_data.model_dump(), tenant_id=tenant_id, company_id=company_id ) - db.add(db_obj) + db.add(new_concept) db.commit() - db.refresh(db_obj) - return db_obj + db.refresh(new_concept) + return new_concept @staticmethod def update( - db: Session, id: int, tenant_id: int, data: CustomsBrokerConceptUpdate, company_id: int - ) -> Optional[CustomsBrokerConcept]: - db_obj = CustomsBrokerConceptService.get_by_id( - db, id, tenant_id, company_id) - if not db_obj: + db: Session, + concept_id: int, + tenant_id: int, + concept_data: dto.CustomsBrokerConceptUpdate, + company_id: int, + ) -> Optional[models.CustomsBrokerConcept]: + """Update a customs broker concept""" + concept = CustomsBrokerConceptService.get_by_id( + db, concept_id, tenant_id, company_id) + if not concept: return None - update_dict = data.model_dump(exclude_unset=True) - for key, value in update_dict.items(): - setattr(db_obj, key, value) + # Update fields + update_data = concept_data.model_dump(exclude_unset=True) + for field, value in update_data.items(): + setattr(concept, field, value) db.commit() - db.refresh(db_obj) - return db_obj + db.refresh(concept) + return concept @staticmethod def delete( - db: Session, id: int, tenant_id: int, company_id: int + db: Session, concept_id: int, tenant_id: int, company_id: int ) -> bool: - db_obj = CustomsBrokerConceptService.get_by_id( - db, id, tenant_id, company_id) - if not db_obj: + """Delete a customs broker concept""" + concept = CustomsBrokerConceptService.get_by_id( + db, concept_id, tenant_id, company_id) + if not concept: return False try: - db.delete(db_obj) + db.delete(concept) db.commit() return True except IntegrityError as e: db.rollback() - logger.error(f"IntegrityError deleting customs broker concept {id}: {str(e)}") + logger.error(f"IntegrityError deleting concept {concept_id}: {str(e)}") if "foreign key constraint" in str(e).lower(): raise HTTPException( status_code=400, @@ -97,5 +128,5 @@ class CustomsBrokerConceptService: raise HTTPException(status_code=400, detail="Error al eliminar el concepto") except Exception as e: db.rollback() - logger.error(f"Error deleting customs broker concept {id}: {str(e)}") + logger.error(f"Error deleting concept {concept_id}: {str(e)}") raise HTTPException(status_code=500, detail="Error al eliminar el concepto") 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 e9cf0b07..ae54fce5 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 @@ -3,33 +3,21 @@ import type { ApiResponse } from '$lib/api'; export interface CustomsBrokerConcept { id: number; - code: string; - description?: string; - description_en?: string; - detailed_description?: string; - priority?: number; - first_total?: boolean; - type?: string; - is_printed?: boolean; - section?: number; - classification?: string; - tenant_id: string; - company_id?: string; + broker_key: string; + concept: string; + amount?: number | null; + priority?: number | null; + company_id: number; + tenant_id: number; created_at: string; - updated_at?: string; + updated_at?: string | null; } export interface CustomsBrokerConceptCreate { - code: string; - description?: string; - description_en?: string; - detailed_description?: string; - priority?: number; - first_total?: boolean; - type?: string; - is_printed?: boolean; - section?: number; - classification?: string; + broker_key: string; + concept: string; + amount?: number | null; + priority?: number | null; } export interface CustomsBrokerConceptUpdate extends Partial {} 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 deleted file mode 100644 index e9cf0b07..00000000 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/customs_broker_concepts.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { api } from '$lib/api'; -import type { ApiResponse } from '$lib/api'; - -export interface CustomsBrokerConcept { - id: number; - code: string; - description?: string; - description_en?: string; - detailed_description?: string; - priority?: number; - first_total?: boolean; - type?: string; - is_printed?: boolean; - section?: number; - classification?: string; - tenant_id: string; - company_id?: string; - created_at: string; - updated_at?: string; -} - -export interface CustomsBrokerConceptCreate { - code: string; - description?: string; - description_en?: string; - detailed_description?: string; - priority?: number; - first_total?: boolean; - type?: string; - is_printed?: boolean; - section?: number; - classification?: string; -} - -export interface CustomsBrokerConceptUpdate extends Partial {} - -export interface CustomsBrokerConceptListResponse { - items: CustomsBrokerConcept[]; - total: number; - page: number; - page_size: number; - pages: number; -} - -export async function getCustomsBrokerConcepts( - page: number = 1, - pageSize: number = 50, - companyId: number, - filters: Record = {}, -): Promise> { - const params = new URLSearchParams({ - page: page.toString(), - page_size: pageSize.toString(), - company_id: companyId.toString(), - ...filters - }); - - return await api.get(`/v1/a76/customs-broker-concepts?${params.toString()}`); -} - -export async function getCustomsBrokerConcept(id: number, companyId: number): Promise> { - return await api.get(`/v1/a76/customs-broker-concepts/${id}?company_id=${companyId}`); -} - -export async function createCustomsBrokerConcept(data: CustomsBrokerConceptCreate, companyId: number): Promise> { - return await api.post(`/v1/a76/customs-broker-concepts?company_id=${companyId}`, data); -} - -export async function updateCustomsBrokerConcept(id: number, data: CustomsBrokerConceptUpdate, companyId: number): Promise> { - return await api.put(`/v1/a76/customs-broker-concepts/${id}?company_id=${companyId}`, data); -} - -export async function deleteCustomsBrokerConcept(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/customs-broker-concepts/${id}?company_id=${companyId}`); -} diff --git a/frontend/src/lib/components/dashboard/exchange-rate/columns.ts b/frontend/src/lib/components/dashboard/exchange_rate/columns.ts similarity index 100% rename from frontend/src/lib/components/dashboard/exchange-rate/columns.ts rename to frontend/src/lib/components/dashboard/exchange_rate/columns.ts diff --git a/frontend/src/lib/components/dashboard/exchange-rate/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/exchange_rate/create-edit-dialog.svelte similarity index 100% rename from frontend/src/lib/components/dashboard/exchange-rate/create-edit-dialog.svelte rename to frontend/src/lib/components/dashboard/exchange_rate/create-edit-dialog.svelte diff --git a/frontend/src/lib/components/dashboard/exchange-rate/data-table-actions.svelte b/frontend/src/lib/components/dashboard/exchange_rate/data-table-actions.svelte similarity index 100% rename from frontend/src/lib/components/dashboard/exchange-rate/data-table-actions.svelte rename to frontend/src/lib/components/dashboard/exchange_rate/data-table-actions.svelte diff --git a/frontend/src/lib/components/dashboard/exchange-rate/data-table.svelte b/frontend/src/lib/components/dashboard/exchange_rate/data-table.svelte similarity index 100% rename from frontend/src/lib/components/dashboard/exchange-rate/data-table.svelte rename to frontend/src/lib/components/dashboard/exchange_rate/data-table.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 d13cf06c..c46d18e6 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 @@ -24,7 +24,6 @@ } if (!companyStore.activeCompany) { - alert('❌ Error: No hay una compañía seleccionada'); return; } @@ -35,20 +34,17 @@ const response = await deleteClassificationConcept(item.id, companyStore.activeCompany.id); if (response.error) { - alert(`❌ Error al eliminar:\n\n${response.error}`); return; } // Éxito if (response.status === 204 || response.status === 200 || !response.error) { - alert(`✅ Clasificación "${item.classification}" eliminada correctamente`); if (onSuccess) { onSuccess(); } } } catch (e) { const errorMsg = e instanceof Error ? e.message : 'Error desconocido al eliminar el registro'; - alert(`❌ Error al eliminar:\n\n${errorMsg}`); } finally { loading = false; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/company/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/company/data-table-actions.svelte index d180718b..0081f750 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/company/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/company/data-table-actions.svelte @@ -30,13 +30,11 @@ // Si hay error en la respuesta if (response.error) { - alert(`❌ Error al eliminar:\n\n${response.error}`); return; } // Éxito (status 204 o 200) if (response.status === 204 || response.status === 200 || !response.error) { - alert(`✅ Empresa "${item.name}" eliminada correctamente`); if (onSuccess) { onSuccess(); @@ -44,7 +42,6 @@ } } catch (e) { const errorMsg = e instanceof Error ? e.message : 'Error desconocido al eliminar el registro'; - alert(`❌ Error al eliminar:\n\n${errorMsg}`); } finally { loading = false; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/concepts/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/concepts/data-table-actions.svelte index da527c98..3a62c824 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/concepts/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/concepts/data-table-actions.svelte @@ -24,7 +24,6 @@ } if (!companyStore.activeCompany) { - alert('❌ Error: No hay una compañía seleccionada'); return; } @@ -35,20 +34,17 @@ const response = await deleteConcept(item.id, companyStore.activeCompany.id); if (response.error) { - alert(`❌ Error al eliminar:\n\n${response.error}`); return; } // Éxito if (response.status === 204 || response.status === 200 || !response.error) { - alert(`✅ Concepto "${item.code}" eliminado correctamente`); if (onSuccess) { onSuccess(); } } } catch (e) { const errorMsg = e instanceof Error ? e.message : 'Error desconocido al eliminar el registro'; - alert(`❌ Error al eliminar:\n\n${errorMsg}`); } finally { loading = false; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/columns.ts index 09fd8bf8..a373b3e8 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/columns.ts @@ -6,24 +6,24 @@ import DataTableActions from './data-table-actions.svelte'; export function createColumns(onSuccess?: () => void): ColumnDef[] { return [ { - accessorKey: 'code', - header: 'Código', - cell: ({ row }) => row.original.code || '-' + accessorKey: 'broker_key', + header: 'Clave Agente', + cell: ({ row }) => row.original.broker_key || '-' }, { - accessorKey: 'description', - header: 'Descripción', - cell: ({ row }) => row.original.description || '-' + accessorKey: 'concept', + header: 'Concepto', + cell: ({ row }) => row.original.concept || '-' }, { - accessorKey: 'type', - header: 'Tipo', - cell: ({ row }) => row.original.type || '-' + accessorKey: 'amount', + header: 'Importe', + cell: ({ row }) => row.original.amount ? `$${row.original.amount.toFixed(2)}` : '-' }, { - accessorKey: 'section', - header: 'Sección', - cell: ({ row }) => row.original.section?.toString() || '-' + accessorKey: 'priority', + header: 'Prioridad', + cell: ({ row }) => row.original.priority?.toString() || '-' }, { id: 'actions', diff --git a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/create-edite-dialoge.svelte b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/create-edite-dialoge.svelte index a6ba9c4b..f9bb9f4b 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/create-edite-dialoge.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/create-edite-dialoge.svelte @@ -6,49 +6,51 @@ import { createCustomsBrokerConcept, updateCustomsBrokerConcept, - type CustomsBrokerConcept + type CustomsBrokerConcept, + type CustomsBrokerConceptCreate } from "$lib/api/dashboard/a76/general_catalogs/customs-broker-concepts"; - import { companyStore } from "$lib/stores/company.svelte"; let { open = $bindable(false), item = null, + companyId, onSuccess }: { open: boolean; - item?: CustomsBrokerConcept | null; + item?: CustomsBrokerConcept | null; + companyId: number; onSuccess?: () => void; } = $props(); const isEdit = $derived(!!item); const title = $derived(isEdit ? "Editar Concepto AA" : "Nuevo Concepto AA"); - // 3. Estado alineado al modelo de BD - let formData = $state({ + // Estado alineado a CustomsBrokerConceptCreate + let formData = $state({ broker_key: '', concept: '', - amount: null as number | null, - priority: null as number | null + amount: undefined, + priority: undefined }); let loading = $state(false); let error = $state(null); - // 4. Cargar datos al editar + // Cargar datos al editar $effect(() => { if (item) { formData = { broker_key: item.broker_key || '', concept: item.concept || '', - amount: item.amount || null, - priority: item.priority || null + amount: item.amount, + priority: item.priority }; } else { formData = { broker_key: '', concept: '', - amount: null, - priority: null + amount: undefined, + priority: undefined }; } }); @@ -58,34 +60,30 @@ loading = true; try { - const companyId = companyStore.activeCompany?.id; if (!companyId) throw new Error('No hay una compañía seleccionada'); // Validaciones - if (!formData.broker_key.trim()) throw new Error('La Clave AA es requerida'); + if (!formData.broker_key.trim()) throw new Error('La Clave del Agente es requerida'); if (!formData.concept.trim()) throw new Error('El Concepto es requerido'); - // 5. Preparar datos con los tipos correctos (Números) - const dataToSend = { + // Limpiar y enviar datos + const dataToSend: CustomsBrokerConceptCreate = { broker_key: formData.broker_key.trim(), concept: formData.concept.trim(), amount: formData.amount ? Number(formData.amount) : undefined, priority: formData.priority ? Number(formData.priority) : undefined }; - // 6. Corregida la sintaxis de llamada a la API if (isEdit && item) { - // UPDATE: (id, data, companyId) await updateCustomsBrokerConcept(item.id, dataToSend, companyId); } else { - // CREATE: (data, companyId) await createCustomsBrokerConcept(dataToSend, companyId); } open = false; if (onSuccess) onSuccess(); - } catch (e) { - error = e instanceof Error ? e.message : 'Error al guardar'; + } catch (e: any) { + error = e.message || 'Error al guardar'; } finally { loading = false; } @@ -93,11 +91,11 @@ - + {title} - {isEdit ? 'Modifica el concepto del agente aduanal' : 'Crea un nuevo concepto'} + {isEdit ? 'Modifica los detalles del concepto' : 'Ingresa los datos para el nuevo concepto'} @@ -108,29 +106,30 @@ {/if} -
-
- +
+
+
-
+
-
+
-
+
diff --git a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/data-table-actions.svelte index 66dde523..1855e3f0 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/data-table-actions.svelte @@ -24,7 +24,6 @@ } if (!companyStore.activeCompany) { - alert('❌ Error: No hay una compañía seleccionada'); return; } @@ -35,20 +34,17 @@ const response = await deleteCustomsBrokerConcept(item.id, companyStore.activeCompany.id); if (response.error) { - alert(`❌ Error al eliminar:\n\n${response.error}`); return; } // Éxito if (response.status === 204 || response.status === 200 || !response.error) { - alert(`✅ Concepto "${item.code}" eliminado correctamente`); if (onSuccess) { onSuccess(); } } } catch (e) { const errorMsg = e instanceof Error ? e.message : 'Error desconocido al eliminar el registro'; - alert(`❌ Error al eliminar:\n\n${errorMsg}`); } finally { loading = false; } 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 6dd99cdd..5c0e2a53 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 @@ -27,7 +27,6 @@ const companyId = companyStore.activeCompany?.id; if (!companyId) { - alert('❌ Error: No hay compañía seleccionada'); return; } @@ -35,11 +34,9 @@ try { await deleteDoda(item.id, companyId); - alert('✅ Registro eliminado correctamente'); if (onSuccess) onSuccess(); } catch (err: any) { error = err.message || 'Error al eliminar el registro'; - alert(`❌ Error: ${error}`); console.error('Error deleting doda:', err); } finally { loading = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/electronic-notices/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/columns.ts similarity index 100% rename from frontend/src/lib/components/dashboard/general_catalogs/electronic-notices/columns.ts rename to frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/columns.ts diff --git a/frontend/src/lib/components/dashboard/general_catalogs/electronic-notices/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/create-edit-dialog.svelte similarity index 100% rename from frontend/src/lib/components/dashboard/general_catalogs/electronic-notices/create-edit-dialog.svelte rename to frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/create-edit-dialog.svelte diff --git a/frontend/src/lib/components/dashboard/general_catalogs/electronic-notices/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/data-table-actions.svelte similarity index 93% rename from frontend/src/lib/components/dashboard/general_catalogs/electronic-notices/data-table-actions.svelte rename to frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/data-table-actions.svelte index c647540f..a401612e 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/electronic-notices/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/data-table-actions.svelte @@ -27,7 +27,6 @@ const companyId = companyStore.activeCompany?.id; if (!companyId) { - alert('❌ Error: No hay compañía seleccionada'); return; } @@ -35,11 +34,9 @@ try { await deleteElectronicNotice(item.id, companyId); - alert('✅ Aviso electrónico eliminado correctamente'); if (onSuccess) onSuccess(); } catch (err: any) { error = err.message || 'Error al eliminar el aviso electrónico'; - alert(`❌ Error: ${error}`); console.error('Error deleting electronic notice:', err); } finally { loading = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/electronic-notices/data-table.svelte b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/data-table.svelte similarity index 100% rename from frontend/src/lib/components/dashboard/general_catalogs/electronic-notices/data-table.svelte rename to frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/data-table.svelte diff --git a/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/data-table-actions.svelte index f1f1665b..8128f9ee 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/data-table-actions.svelte @@ -27,7 +27,6 @@ const companyId = companyStore.activeCompany?.id; if (!companyId) { - alert('❌ Error: No hay compañía seleccionada'); return; } @@ -40,11 +39,9 @@ throw new Error(response.error); } - alert('✅ Equivalencia eliminada correctamente'); if (onSuccess) onSuccess(); } catch (err: any) { error = err.message || 'Error al eliminar la equivalencia'; - alert(`❌ Error: ${error}`); console.error('Error deleting equivalency:', err); } finally { loading = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/create-edit-dialog.svelte index 02e238bc..c9465876 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/create-edit-dialog.svelte @@ -83,14 +83,12 @@ if (isEdit && item) { await updateErrorCatalog(item.id, basePayload, companyId); - alert("✅ Error actualizado correctamente"); } else { const createPayload = { code: formData.code.trim(), ...basePayload }; await createErrorCatalog(createPayload, companyId); - alert("✅ Error creado correctamente"); } open = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/data-table-actions.svelte index 76605a77..cf5b202c 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/data-table-actions.svelte @@ -27,7 +27,6 @@ const companyId = companyStore.activeCompany?.id; if (!companyId) { - alert('❌ Error: No hay compañía seleccionada'); return; } @@ -35,13 +34,11 @@ try { await deleteErrorCatalog(item.id, companyId); - alert('✅ Error eliminado correctamente'); if (onSuccess) { onSuccess(); } } catch (err: any) { error = err.message || 'Error al eliminar el error'; - alert(`❌ Error: ${error}`); console.error('Error deleting:', err); } finally { loading = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/identifiers/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/identifiers/data-table-actions.svelte index aad4771e..32b56ba3 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/identifiers/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/identifiers/data-table-actions.svelte @@ -27,7 +27,6 @@ const companyId = companyStore.activeCompany?.id; if (!companyId) { - alert('❌ Error: No hay compañía seleccionada'); return; } @@ -35,11 +34,9 @@ try { await deleteIdentifier(item.id, companyId); - alert('✅ Identificador eliminado correctamente'); if (onSuccess) onSuccess(); } catch (err: any) { error = err.message || 'Error al eliminar el identificador'; - alert(`❌ Error: ${error}`); console.error('Error deleting identifier:', err); } finally { loading = false; 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 index 92b98ee3..f35c1870 100644 --- 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 @@ -27,7 +27,6 @@ const companyId = companyStore.activeCompany?.id; if (!companyId) { - alert('❌ Error: No hay compañía seleccionada'); return; } @@ -35,11 +34,9 @@ try { await deleteINPC(item.id, companyId); - alert('✅ Registro eliminado correctamente'); if (onSuccess) onSuccess(); } catch (err: any) { error = err.message || 'Error al eliminar el registro'; - alert(`❌ Error: ${error}`); console.error('Error deleting INPC:', err); } finally { loading = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/legends/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/legends/data-table-actions.svelte index b752b56a..fee21a61 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/legends/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/legends/data-table-actions.svelte @@ -25,7 +25,6 @@ } if (!companyStore.activeCompany) { - alert('❌ Error: No hay una compañía seleccionada'); return; } @@ -36,20 +35,17 @@ const response = await deleteLegend(item.id, companyStore.activeCompany.id); if (response.error) { - alert(`❌ Error al eliminar:\n\n${response.error}`); return; } // Éxito if (response.status === 204 || response.status === 200 || !response.error) { - alert(`✅ Leyenda "${item.code}" eliminada correctamente`); if (onSuccess) { onSuccess(); } } } catch (e) { const errorMsg = e instanceof Error ? e.message : 'Error desconocido al eliminar el registro'; - alert(`❌ Error al eliminar:\n\n${errorMsg}`); } finally { loading = false; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/locations/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/locations/create-edit-dialog.svelte index 6bc7e849..cbdb4555 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/locations/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/locations/create-edit-dialog.svelte @@ -60,14 +60,12 @@ if (isEdit && item) { await updateLocation(item.id, basePayload, companyId); - alert("✅ Ubicación actualizada correctamente"); } else { const createPayload = { location_code: formData.location_code.trim(), ...basePayload }; await createLocation(createPayload, companyId); - alert("✅ Ubicación creada correctamente"); } open = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/multi_currency_types/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/multi_currency_types/create-edit-dialog.svelte index b3727220..08e68f47 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/multi_currency_types/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/multi_currency_types/create-edit-dialog.svelte @@ -93,10 +93,8 @@ if (isEdit && item) { await updateMultiCurrencyType(item.id, dataToSend, companyId); - alert(`✅ Tipo de moneda múltiple actualizado correctamente`); } else { await createMultiCurrencyType(dataToSend, companyId); - alert(`✅ Tipo de moneda múltiple creado correctamente`); } open = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/data-table-actions.svelte index 1716aadc..bd364ee4 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/data-table-actions.svelte @@ -27,7 +27,6 @@ const companyId = companyStore.activeCompany?.id; if (!companyId) { - alert('❌ Error: No hay compañía seleccionada'); return; } @@ -35,11 +34,9 @@ try { await deletePrevalidator(item.id, companyId); - alert('✅ Prevalidador eliminado correctamente'); if (onSuccess) onSuccess(); } catch (err: any) { error = err.message || 'Error al eliminar el prevalidador'; - alert(`❌ Error: ${error}`); console.error('Error deleting prevalidator:', err); } finally { loading = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/signatures/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/signatures/data-table-actions.svelte index cee15e61..d86157af 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/signatures/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/signatures/data-table-actions.svelte @@ -27,7 +27,6 @@ const companyId = companyStore.activeCompany?.id; if (!companyId) { - alert('❌ Error: No hay compañía seleccionada'); return; } @@ -35,11 +34,9 @@ try { await deleteSignature(item.id, companyId); - alert('✅ Firma eliminada correctamente'); if (onSuccess) onSuccess(); } catch (err: any) { error = err.message || 'Error al eliminar la firma'; - alert(`❌ Error: ${error}`); console.error('Error deleting signature:', err); } finally { loading = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/unit-conversion/create-edite-dialoge.svelte b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversion/create-edite-dialoge.svelte similarity index 100% rename from frontend/src/lib/components/dashboard/general_catalogs/unit-conversion/create-edite-dialoge.svelte rename to frontend/src/lib/components/dashboard/general_catalogs/unit_conversion/create-edite-dialoge.svelte diff --git a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/create-edit-dialog.svelte index 793873d3..b923bb17 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/create-edit-dialog.svelte @@ -70,10 +70,8 @@ if (isEdit && conversion) { await updateUnitConversion(conversion.id, dataToSend, companyId); - alert(`✅ Conversión "${dataToSend.from_unit_code} → ${dataToSend.to_unit_code}" actualizada correctamente`); } else { await createUnitConversion(dataToSend, companyId); - alert(`✅ Conversión "${dataToSend.from_unit_code} → ${dataToSend.to_unit_code}" creada correctamente`); } open = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/data-table-actions.svelte index b5fbb374..05c6410e 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/data-table-actions.svelte @@ -23,7 +23,6 @@ } if (!companyStore.activeCompany) { - alert('❌ Error: No hay una compañía seleccionada'); return; } @@ -31,13 +30,11 @@ try { await deleteUnitConversion(conversion.id, companyStore.activeCompany.id); - alert(`✅ Conversión "${conversion.from_unit_code} → ${conversion.to_unit_code}" eliminada correctamente`); if (onSuccess) { onSuccess(); } } catch (e) { const errorMsg = e instanceof Error ? e.message : 'Error desconocido al eliminar el registro'; - alert(`❌ Error al eliminar:\n\n${errorMsg}`); } finally { loading = false; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/ace/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/ace/data-table-actions.svelte index b72a2c06..bfad9a57 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/ace/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/ace/data-table-actions.svelte @@ -23,7 +23,6 @@ } if (!companyStore.activeCompany) { - alert('❌ Error: No hay una compañía seleccionada'); return; } @@ -33,19 +32,16 @@ const response = await deleteUnitOfMeasureACE(item.id, companyStore.activeCompany.id); if (response.error) { - alert(`❌ Error al eliminar:\n\n${response.error}`); return; } if (response.status === 204 || response.status === 200 || !response.error) { - alert(`✅ Unidad ACE "${item.code}" eliminada correctamente`); if (onSuccess) { onSuccess(); } } } catch (e) { const errorMsg = e instanceof Error ? e.message : 'Error desconocido al eliminar el registro'; - alert(`❌ Error al eliminar:\n\n${errorMsg}`); } finally { loading = false; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/create-edit-dialog.svelte index b7b240c3..44348c57 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/create-edit-dialog.svelte @@ -45,7 +45,6 @@ const activeCompanyId = companyStore.activeCompany?.id; if (!activeCompanyId) { - alert('No hay una compañía activa seleccionada'); return; } @@ -59,9 +58,7 @@ : await createUnitOfMeasureAmerican(data, activeCompanyId); if (response.error) { - alert(response.error.detail || 'Error al guardar'); } else { - alert(unit ? 'Unidad actualizada' : 'Unidad creada'); open = false; onSuccess?.(); } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/data-table-actions.svelte index cb8a5ead..fc78c344 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/data-table-actions.svelte @@ -20,15 +20,12 @@ const activeCompanyId = companyStore.activeCompany?.id; if (!activeCompanyId) { - alert('No hay una compañía activa seleccionada'); return; } const response = await deleteUnitOfMeasureAmerican(unit.id, activeCompanyId); if (response.error) { - alert(response.error.detail || 'Error al eliminar'); } else if (response.status === 204 || response.status === 200) { - alert('Unidad eliminada'); onSuccess?.(); } } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/create-edit-dialog.svelte index 7c59ae9c..024a28a6 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/create-edit-dialog.svelte @@ -47,7 +47,6 @@ const activeCompanyId = companyStore.activeCompany?.id; if (!activeCompanyId) { - alert('No hay una compañía activa seleccionada'); return; } @@ -62,9 +61,7 @@ : await createUnitOfMeasureCustoms(data, activeCompanyId); if (response.error) { - alert(response.error.detail || 'Error al guardar'); } else { - alert(unit ? 'Unidad actualizada' : 'Unidad creada'); open = false; onSuccess?.(); } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/data-table-actions.svelte index cb3bf251..1c7ad0f0 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/data-table-actions.svelte @@ -20,15 +20,12 @@ const activeCompanyId = companyStore.activeCompany?.id; if (!activeCompanyId) { - alert('No hay una compañía activa seleccionada'); return; } const response = await deleteUnitOfMeasureCustoms(unit.id, activeCompanyId); if (response.error) { - alert(response.error.detail || 'Error al eliminar'); } else if (response.status === 204 || response.status === 200) { - alert('Unidad eliminada'); onSuccess?.(); } } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/create-edit-dialog.svelte index 6df9b8e5..b38ed785 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/create-edit-dialog.svelte @@ -45,7 +45,6 @@ const activeCompanyId = companyStore.activeCompany?.id; if (!activeCompanyId) { - alert('No hay una compañía activa seleccionada'); return; } @@ -59,9 +58,7 @@ : await createUnitOfMeasureGeneral(data, activeCompanyId); if (response.error) { - alert(response.error.detail || 'Error al guardar'); } else { - alert(unit ? 'Unidad actualizada' : 'Unidad creada'); open = false; onSuccess?.(); } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/data-table-actions.svelte index 9139e11b..a84164f4 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/data-table-actions.svelte @@ -20,15 +20,12 @@ const activeCompanyId = companyStore.activeCompany?.id; if (!activeCompanyId) { - alert('No hay una compañía activa seleccionada'); return; } const response = await deleteUnitOfMeasureGeneral(unit.id, activeCompanyId); if (response.error) { - alert(response.error.detail || 'Error al eliminar'); } else if (response.status === 204 || response.status === 200) { - alert('Unidad eliminada'); onSuccess?.(); } } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/create-edit-dialog.svelte index 71bf66f0..230cf586 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/create-edit-dialog.svelte @@ -45,7 +45,6 @@ const activeCompanyId = companyStore.activeCompany?.id; if (!activeCompanyId) { - alert('No hay una compañía activa seleccionada'); return; } @@ -59,9 +58,7 @@ : await createUnitOfMeasureOMA(data, activeCompanyId); if (response.error) { - alert(response.error.detail || 'Error al guardar'); } else { - alert(unit ? 'Unidad actualizada' : 'Unidad creada'); open = false; onSuccess?.(); } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/data-table-actions.svelte index 0d9a92c2..94fbaaac 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/data-table-actions.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/data-table-actions.svelte @@ -20,15 +20,12 @@ const activeCompanyId = companyStore.activeCompany?.id; if (!activeCompanyId) { - alert('No hay una compañía activa seleccionada'); return; } const response = await deleteUnitOfMeasureOMA(unit.id, activeCompanyId); if (response.error) { - alert(response.error.detail || 'Error al eliminar'); } else if (response.status === 204 || response.status === 200) { - alert('Unidad eliminada'); onSuccess?.(); } } diff --git a/frontend/src/routes/dashboard/customs_brokers/+page.server.ts b/frontend/src/routes/dashboard/customs_brokers/+page.server.ts index 59408e0e..b791c5de 100644 --- a/frontend/src/routes/dashboard/customs_brokers/+page.server.ts +++ b/frontend/src/routes/dashboard/customs_brokers/+page.server.ts @@ -14,7 +14,7 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => { companies: parentData.companies || [] }; } -/////HOLAAA + try { // Obtener company_id de múltiples fuentes (en orden de prioridad): // 1. URL query param (permite cambiar vía navegación) diff --git a/frontend/src/routes/dashboard/customs_brokers/+page.svelte b/frontend/src/routes/dashboard/customs_brokers/+page.svelte index 7a8ecdae..f90963cd 100644 --- a/frontend/src/routes/dashboard/customs_brokers/+page.svelte +++ b/frontend/src/routes/dashboard/customs_brokers/+page.svelte @@ -12,7 +12,7 @@ import { browser } from '$app/environment'; import { companyStore } from '$lib/stores/company.svelte'; import { Plus, Search, Trash2 } from 'lucide-svelte'; -//HOLAA + // Los datos iniciales vienen del servidor let { data }: { data: PageData } = $props(); diff --git a/frontend/src/routes/dashboard/customs_brokers/new/+page.svelte b/frontend/src/routes/dashboard/customs_brokers/new/+page.svelte deleted file mode 100644 index 8777c854..00000000 --- a/frontend/src/routes/dashboard/customs_brokers/new/+page.svelte +++ /dev/null @@ -1,395 +0,0 @@ - - -
- -
- -
-

Nuevo Agente Aduanal

-

- Completa los datos para crear un nuevo agente aduanal -

-
-
- - - - - Información del Agente Aduanal - - Todos los campos marcados con * son obligatorios - - - -
- {#if error} -
- {error} -
- {/if} - - -
-

Información Básica

- -
-
- - -
- -
- - -
-
- -
- - -
- -
-
- - -
- -
- - -
-
-
- - -
-

Información de Contacto

- -
-
- - -
- -
- - -
-
- -
- - -
- -
- - -
-
- - -
-

Dirección

- -
- - -
- -
-
- - -
- -
- - -
- -
- - -
-
- -
- - -
-
- - -
-

Información Fiscal

- -
-
- - -
- -
- - -
-
- -
- - -
-
- -
- - - -
-
-
-
-
diff --git a/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.server.ts b/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.server.ts index b07db9ea..56f48a8d 100644 --- a/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.server.ts +++ b/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.server.ts @@ -6,48 +6,44 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => { const { accessToken } = getAuthTokens(cookies); if (!accessToken) { - return { error: 'No authenticated', concepts: { items: [], total: 0, page: 1, page_size: 50, pages: 0 } }; + return { error: 'No authenticated', concepts: { items: [], total: 0, page: 1, page_size: 50, pages: 0 }, activeCompanyId: null }; } try { const page = Number(url.searchParams.get('page')) || 1; const pageSize = Number(url.searchParams.get('pageSize')) || 50; - const filters: Record = {}; - const code = url.searchParams.get('code'); - const description = url.searchParams.get('description'); - - if (code) filters.code = code; - if (description) filters.description = description; - - // Obtener company_id de la cookie o usar el primero disponible - const parentData = await parent(); - const cookieCompanyId = cookies.get('active_company_id'); - const companyId = cookieCompanyId - ? parseInt(cookieCompanyId) - : parentData.companies?.[0]?.id; + const companyId = url.searchParams.get('company_id') || cookies.get('active_company_id'); if (!companyId) { - return { - error: 'No se encontró una compañía seleccionada', - concepts: { items: [], total: 0, page: 1, page_size: 50, pages: 0 } - }; + return { error: 'No company selected', concepts: { items: [], total: 0, page: 1, page_size: 50, pages: 0 }, activeCompanyId: null }; } + const filters: Record = {}; + const brokerKey = url.searchParams.get('broker_key'); + const concept = url.searchParams.get('concept'); + + if (brokerKey) filters.broker_key = brokerKey; + if (concept) filters.concept = concept; + const queryParams = new URLSearchParams({ - company_id: companyId.toString(), page: page.toString(), page_size: pageSize.toString(), + company_id: companyId, ...filters }); const response = await authenticatedFetch(`v1/a76/customs-broker-concepts?${queryParams.toString()}`, { method: 'GET' }, cookies, fetch); if (!response.ok) { - return { error: 'Failed to load', concepts: { items: [], total: 0, page, page_size: pageSize, pages: 0 } }; + return { error: 'Failed to load', concepts: { items: [], total: 0, page, page_size: pageSize, pages: 0 }, activeCompanyId: companyId }; } - return { concepts: await response.json() }; + const data = await response.json(); + // Calculate pages if not provided by API + const pages = data.pages || Math.ceil(data.total / pageSize); + + return { concepts: { ...data, pages }, activeCompanyId: parseInt(companyId) }; } catch (error) { console.error('Error loading customs broker concepts:', error); - return { error: 'Error loading', concepts: { items: [], total: 0, page: 1, page_size: 50, pages: 0 } }; + return { error: 'Error loading', concepts: { items: [], total: 0, page: 1, page_size: 50, pages: 0 }, activeCompanyId: null }; } }; diff --git a/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.svelte index f68c9012..94ca0014 100644 --- a/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.svelte @@ -13,8 +13,8 @@ let dialogOpen = $state(false); // Filtros - let searchCode = $state($page.url.searchParams.get('code') || ''); - let searchDesc = $state($page.url.searchParams.get('description') || ''); + let searchBrokerKey = $state($page.url.searchParams.get('broker_key') || ''); + let searchConcept = $state($page.url.searchParams.get('concept') || ''); let timeout: ReturnType; // Solo necesitamos una declaración de handleSuccess @@ -31,11 +31,11 @@ clearTimeout(timeout); timeout = setTimeout(() => { const url = new URL($page.url); - if (searchCode) url.searchParams.set('code', searchCode); - else url.searchParams.delete('code'); + if (searchBrokerKey) url.searchParams.set('broker_key', searchBrokerKey); + else url.searchParams.delete('broker_key'); - if (searchDesc) url.searchParams.set('description', searchDesc); - else url.searchParams.delete('description'); + if (searchConcept) url.searchParams.set('concept', searchConcept); + else url.searchParams.delete('concept'); url.searchParams.set('page', '1'); goto(url, { keepFocus: true, noScroll: true }); @@ -60,15 +60,15 @@
@@ -85,6 +85,7 @@
\ No newline at end of file diff --git a/frontend/src/routes/dashboard/general_catalogs/electronic_notices/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/electronic_notices/+page.svelte index 223aa452..04b1d91a 100644 --- a/frontend/src/routes/dashboard/general_catalogs/electronic_notices/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/electronic_notices/+page.svelte @@ -2,9 +2,9 @@ import { page } from '$app/stores'; import { goto } from '$app/navigation'; import { browser } from '$app/environment'; - import DataTable from '$lib/components/dashboard/general_catalogs/electronic-notices/data-table.svelte'; - import { createColumns } from '$lib/components/dashboard/general_catalogs/electronic-notices/columns'; - import CreateEditDialog from '$lib/components/dashboard/general_catalogs/electronic-notices/create-edit-dialog.svelte'; + import DataTable from '$lib/components/dashboard/general_catalogs/electronic_notices/data-table.svelte'; + import { createColumns } from '$lib/components/dashboard/general_catalogs/electronic_notices/columns.js'; + import CreateEditDialog from '$lib/components/dashboard/general_catalogs/electronic_notices/create-edit-dialog.svelte'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; import { Plus } from 'lucide-svelte'; diff --git a/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte index 44040948..3fcf7201 100644 --- a/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte @@ -2,9 +2,9 @@ import { page } from '$app/stores'; import { goto } from '$app/navigation'; import { browser } from '$app/environment'; - import { createColumns } from '$lib/components/dashboard/exchange-rate/columns'; - import CreateEditDialog from '$lib/components/dashboard/exchange-rate/create-edit-dialog.svelte'; - import DataTable from '$lib/components/dashboard/exchange-rate/data-table.svelte'; + import { createColumns } from '$lib/components/dashboard/exchange_rate/columns'; + import CreateEditDialog from '$lib/components/dashboard/exchange_rate/create-edit-dialog.svelte'; + import DataTable from '$lib/components/dashboard/exchange_rate/data-table.svelte'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; import { Plus } from 'lucide-svelte';