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",