diff --git a/apps/api/src/services/cfdi.service.ts b/apps/api/src/services/cfdi.service.ts index 9d98605..207c9b0 100644 --- a/apps/api/src/services/cfdi.service.ts +++ b/apps/api/src/services/cfdi.service.ts @@ -181,6 +181,7 @@ export async function getConceptosList( uuidLike?: string; claveProdServ?: string; descripcionConcepto?: string; + noIdentificacion?: string; orderBy?: 'fecha' | 'importe'; orderDir?: 'asc' | 'desc'; }, @@ -261,6 +262,10 @@ export async function getConceptosList( whereClause += ` AND cc.descripcion ILIKE $${paramIndex++}`; params.push(`%${filters.descripcionConcepto}%`); } + if (filters.noIdentificacion) { + whereClause += ` AND cc.no_identificacion ILIKE $${paramIndex++}`; + params.push(`%${filters.noIdentificacion}%`); + } // Ordenamiento configurable. Default: fecha DESC, id ASC (estable). const orderDir = filters.orderDir === 'asc' ? 'ASC' : 'DESC'; diff --git a/apps/web/app/(dashboard)/cfdi/page.tsx b/apps/web/app/(dashboard)/cfdi/page.tsx index 9ec4eea..620fc92 100644 --- a/apps/web/app/(dashboard)/cfdi/page.tsx +++ b/apps/web/app/(dashboard)/cfdi/page.tsx @@ -325,10 +325,11 @@ export default function CfdiPage() { uuidLike: string; claveProdServ: string; descripcionConcepto: string; + noIdentificacion: string; orderBy?: 'fecha' | 'importe'; orderDir?: 'asc' | 'desc'; - }>({ uuidLike: '', claveProdServ: '', descripcionConcepto: '' }); - const [conceptosOpenFilter, setConceptosOpenFilter] = useState<'uuid' | 'clave' | 'descripcion' | null>(null); + }>({ uuidLike: '', claveProdServ: '', descripcionConcepto: '', noIdentificacion: '' }); + const [conceptosOpenFilter, setConceptosOpenFilter] = useState<'uuid' | 'clave' | 'descripcion' | 'noIdentificacion' | null>(null); const conceptosQuery = useQuery({ queryKey: ['cfdi-conceptos', filters, selectedContribuyenteId, conceptosFilters], @@ -338,6 +339,7 @@ export default function CfdiPage() { uuidLike: conceptosFilters.uuidLike || undefined, claveProdServ: conceptosFilters.claveProdServ || undefined, descripcionConcepto: conceptosFilters.descripcionConcepto || undefined, + noIdentificacion: conceptosFilters.noIdentificacion || undefined, orderBy: conceptosFilters.orderBy, orderDir: conceptosFilters.orderDir, }), @@ -481,6 +483,7 @@ export default function CfdiPage() { uuidLike: conceptosFilters.uuidLike || undefined, claveProdServ: conceptosFilters.claveProdServ || undefined, descripcionConcepto: conceptosFilters.descripcionConcepto || undefined, + noIdentificacion: conceptosFilters.noIdentificacion || undefined, orderBy: conceptosFilters.orderBy, orderDir: conceptosFilters.orderDir, page: 1, @@ -1647,6 +1650,28 @@ export default function CfdiPage() { + +
+ No. Identificación + setConceptosOpenFilter(open ? 'noIdentificacion' : null)}> + + + + +
+

Filtrar por No. Identificación

+ setConceptosFilters({ ...conceptosFilters, noIdentificacion: e.target.value })} /> +
+ + {conceptosFilters.noIdentificacion && } +
+
+
+
+
+ RFC Emisor RFC Receptor Cantidad @@ -1676,6 +1701,7 @@ export default function CfdiPage() { {row.uuid?.substring(0, 8) || '-'} {row.clave_prod_serv || '-'} {row.descripcion} + {row.no_identificacion || '-'} {row.rfcEmisor} {row.rfcReceptor} {Number(row.cantidad ?? 0).toLocaleString('es-MX', { minimumFractionDigits: 2 })} diff --git a/apps/web/lib/api/cfdi.ts b/apps/web/lib/api/cfdi.ts index 40699c8..fe276c7 100644 --- a/apps/web/lib/api/cfdi.ts +++ b/apps/web/lib/api/cfdi.ts @@ -37,6 +37,7 @@ export interface ConceptosFilters extends CfdiFilters { uuidLike?: string; claveProdServ?: string; descripcionConcepto?: string; + noIdentificacion?: string; orderBy?: 'fecha' | 'importe'; orderDir?: 'asc' | 'desc'; } @@ -58,6 +59,7 @@ export async function getConceptosList(filters: ConceptosFilters): Promise(`/cfdi/conceptos?${params}`);