diff --git a/backend/api/v1/modules/a76/clients_and_providers/routes.py b/backend/api/v1/modules/a76/clients_and_providers/routes.py index e1db85d7..b1857de0 100644 --- a/backend/api/v1/modules/a76/clients_and_providers/routes.py +++ b/backend/api/v1/modules/a76/clients_and_providers/routes.py @@ -46,7 +46,14 @@ async def get_clients_and_providers( ) if type is not None: - query = query.filter(ClientProvider.client_or_provider == type) + # Include 'both' type when filtering by client or provider + from sqlalchemy import or_ + query = query.filter( + or_( + ClientProvider.client_or_provider == type, + ClientProvider.client_or_provider == ClientOrProviderEnum.BOTH + ) + ) if active is not None: query = query.filter(ClientProvider.is_active == active) diff --git a/backend/api/v1/modules/a76/clients_and_providers/service.py b/backend/api/v1/modules/a76/clients_and_providers/service.py index 5a329673..6bf28427 100644 --- a/backend/api/v1/modules/a76/clients_and_providers/service.py +++ b/backend/api/v1/modules/a76/clients_and_providers/service.py @@ -56,8 +56,12 @@ class ClientProviderService: ) ) if filters.get("client_or_provider"): + from .models import ClientOrProviderEnum query = query.filter( - ClientProvider.client_or_provider == filters["client_or_provider"] + or_( + ClientProvider.client_or_provider == filters["client_or_provider"], + ClientProvider.client_or_provider == ClientOrProviderEnum.BOTH + ) ) if filters.get("status"): enabled = 1 if filters["status"] == "enabled" else 0 @@ -345,8 +349,12 @@ class ClientProviderService: ) if client_or_provider: + from .models import ClientOrProviderEnum query = query.filter( - ClientProvider.client_or_provider == client_or_provider + or_( + ClientProvider.client_or_provider == client_or_provider, + ClientProvider.client_or_provider == ClientOrProviderEnum.BOTH + ) ) if enabled_only: diff --git a/frontend/messages/en.json b/frontend/messages/en.json index 541dac72..793c38e9 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -91,6 +91,11 @@ }, "clients_and_providers": "Clients and Providers", "customs_brokers": "Customs Brokers", + "client_provider_type": { + "client_indicator": "C", + "provider_indicator": "P", + "both_indicator": "B" + }, "nav_user": { "profile": "Profile", "settings": "Settings", diff --git a/frontend/messages/es.json b/frontend/messages/es.json index 9e2a85c5..4c845f07 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -91,6 +91,11 @@ }, "clients_and_providers": "Clientes y Proveedores", "customs_brokers": "Agentes Aduanales", + "client_provider_type": { + "client_indicator": "C", + "provider_indicator": "P", + "both_indicator": "A" + }, "nav_user": { "profile": "Perfil", "settings": "Configuración" diff --git a/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte b/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte index c7875be8..b312246a 100644 --- a/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte +++ b/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte @@ -7,6 +7,11 @@ import type { InvoiceType } from '$lib/api/dashboard/refrence_data/invoice_types'; import type { CustomsBroker } from '$lib/api/dashboard/a76/customs-brokers'; import type { ClientProvider } from '$lib/api/dashboard/a76/clients-providers'; + import { + "sidebar.client_provider_type.client_indicator" as clientIndicator, + "sidebar.client_provider_type.provider_indicator" as providerIndicator, + "sidebar.client_provider_type.both_indicator" as bothIndicator + } from '$lib/paraglide/messages.js'; let { invoice, @@ -176,8 +181,24 @@ ] ); - // Combinar clientes y proveedores para shipped_to - const allClientsProviders = [...clients, ...providers]; + // Combinar clientes y proveedores para shipped_to, evitando duplicados de tipo "both" + const allClientsProviders = $derived.by(() => { + const uniqueMap = new Map(); + + // Agregar todos los clientes + clients.forEach(c => { + uniqueMap.set(c.id, { ...c, type: c.client_or_provider }); + }); + + // Agregar proveedores solo si no existen (evita duplicados de "both") + providers.forEach(p => { + if (!uniqueMap.has(p.id)) { + uniqueMap.set(p.id, { ...p, type: p.client_or_provider }); + } + }); + + return Array.from(uniqueMap.values()); + }); // Filtrar regímenes por tipo de operación (1='E' exp, 2='I' imp) y obtener valores únicos const filteredRegimens = $derived.by(() => { @@ -363,7 +384,7 @@ {#each allClientsProviders as cp} - {cp.name} ({cp.type === 'client' ? 'C' : 'P'}) + {cp.name} ({cp.type === 'client' ? clientIndicator() : cp.type === 'provider' ? providerIndicator() : bothIndicator()}) {/each} diff --git a/frontend/src/lib/components/dashboard/pedimentos/columns.ts b/frontend/src/lib/components/dashboard/pedimentos/columns.ts index 2bdfbe51..4c81aa92 100644 --- a/frontend/src/lib/components/dashboard/pedimentos/columns.ts +++ b/frontend/src/lib/components/dashboard/pedimentos/columns.ts @@ -1,6 +1,7 @@ import type { ColumnDef } from "@tanstack/table-core"; import { renderComponent, renderSnippet } from "$lib/components/ui/data-table/index.js"; import { createRawSnippet } from "svelte"; +// @ts-ignore - Svelte component import import DataTableActions from "./data-table-actions.svelte"; import type { Pedimento } from "$lib/api/dashboard/a76/pedimentos"; @@ -201,34 +202,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] { return renderSnippet(dateSnippet, { date: formatDate(row.original.pedimento_dates?.payment_date) }); } }, - { - accessorKey: "pedimento_config_update_rectification.pediment_rectifed_18", - header: "Pedimento 18", - cell: ({ row }) => { - const ped18Snippet = createRawSnippet<[{ value?: string | null }]>((getValue) => { - const { value } = getValue(); - return { - render: () => - `
${value || '-'}
` - }; - }); - return renderSnippet(ped18Snippet, { value: row.original.pedimento_config_update_rectification?.pediment_rectifed_18 }); - } - }, - { - accessorKey: "pedimento_config_update_rectification.r1", - header: "Pedimento R1", - cell: ({ row }) => { - const r1Snippet = createRawSnippet<[{ value?: string | null }]>((getValue) => { - const { value } = getValue(); - return { - render: () => - `
${value || '-'}
` - }; - }); - return renderSnippet(r1Snippet, { value: row.original.pedimento_config_update_rectification?.r1 }); - } - }, { accessorKey: "pedimento_validation.electronic_signature", header: "Acuse Electrónico",