From 6be637b4cf361f918ffc4028a72b3dc9715a959c Mon Sep 17 00:00:00 2001 From: dmolinari Date: Fri, 17 Apr 2026 14:16:14 -0300 Subject: [PATCH] revert(web): eliminar feature de reserva de numero en UI ADM-008 Eliminar secuencias.api.ts, useReservarNumero.ts, SecuenciasPanel.tsx, TipoComprobante enum y tipos ReservarNumeroResponse/ProximoNumeroResponse. Quitar SecuenciasPanel del PuntoDeVentaDetailPage. --- .../puntos-de-venta/api/secuencias.api.ts | 22 ----- .../components/SecuenciasPanel.tsx | 96 ------------------- .../hooks/useReservarNumero.ts | 30 ------ .../pages/PuntoDeVentaDetailPage.tsx | 7 -- src/web/src/features/puntos-de-venta/types.ts | 22 +---- 5 files changed, 3 insertions(+), 174 deletions(-) delete mode 100644 src/web/src/features/puntos-de-venta/api/secuencias.api.ts delete mode 100644 src/web/src/features/puntos-de-venta/components/SecuenciasPanel.tsx delete mode 100644 src/web/src/features/puntos-de-venta/hooks/useReservarNumero.ts diff --git a/src/web/src/features/puntos-de-venta/api/secuencias.api.ts b/src/web/src/features/puntos-de-venta/api/secuencias.api.ts deleted file mode 100644 index 0368a6c..0000000 --- a/src/web/src/features/puntos-de-venta/api/secuencias.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { axiosClient } from '@/api/axiosClient' -import type { TipoComprobante, ReservarNumeroResponse, ProximoNumeroResponse } from '../types' - -export async function reservarNumero( - puntoDeVentaId: number, - tipoComprobante: TipoComprobante, -): Promise { - const response = await axiosClient.post( - `/api/v1/admin/puntos-de-venta/${puntoDeVentaId}/secuencias/${tipoComprobante}/reservar`, - ) - return response.data -} - -export async function getProximoNumero( - puntoDeVentaId: number, - tipoComprobante: TipoComprobante, -): Promise { - const response = await axiosClient.get( - `/api/v1/admin/puntos-de-venta/${puntoDeVentaId}/secuencias/${tipoComprobante}/proximo`, - ) - return response.data -} diff --git a/src/web/src/features/puntos-de-venta/components/SecuenciasPanel.tsx b/src/web/src/features/puntos-de-venta/components/SecuenciasPanel.tsx deleted file mode 100644 index 9dfa2b0..0000000 --- a/src/web/src/features/puntos-de-venta/components/SecuenciasPanel.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { toast } from 'sonner' -import { Button } from '@/components/ui/button' -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' -import { TipoComprobante } from '../types' -import { useReservarNumero, useProximoNumero } from '../hooks/useReservarNumero' - -const TIPOS: Array<{ value: TipoComprobante; label: string }> = [ - { value: TipoComprobante.FacturaA, label: 'Factura A' }, - { value: TipoComprobante.FacturaB, label: 'Factura B' }, - { value: TipoComprobante.FacturaC, label: 'Factura C' }, - { value: TipoComprobante.NotaCreditoA, label: 'Nota Crédito A' }, - { value: TipoComprobante.NotaCreditoB, label: 'Nota Crédito B' }, - { value: TipoComprobante.NotaCreditoC, label: 'Nota Crédito C' }, -] - -interface Props { - puntoDeVentaId: number - disabled: boolean -} - -export function SecuenciasPanel({ puntoDeVentaId, disabled }: Props) { - return ( -
-
-

Reserva de números de comprobante

-

- Cada reserva incrementa el correlativo y devuelve el número asignado. -

-
- - - - Tipo - Próximo número - Acción - - - - {TIPOS.map((tipo) => ( - - ))} - -
-
- ) -} - -interface RowProps { - puntoDeVentaId: number - tipoValue: TipoComprobante - tipoLabel: string - disabled: boolean -} - -function SecuenciaRow({ puntoDeVentaId, tipoValue, tipoLabel, disabled }: RowProps) { - const proximo = useProximoNumero(puntoDeVentaId, tipoValue) - const reservar = useReservarNumero(puntoDeVentaId) - - const handleReservar = () => { - reservar.mutate(tipoValue, { - onSuccess: (data) => { - toast.success(`${tipoLabel}: número ${data.numeroReservado} reservado`) - }, - onError: (err: unknown) => { - const apiError = err as { response?: { data?: { error?: string } } } - const code = apiError.response?.data?.error ?? 'error' - toast.error(`No se pudo reservar: ${code}`) - }, - }) - } - - return ( - - {tipoLabel} - - {proximo.isLoading ? '…' : proximo.data?.proximoNumero ?? '—'} - - - - - - ) -} diff --git a/src/web/src/features/puntos-de-venta/hooks/useReservarNumero.ts b/src/web/src/features/puntos-de-venta/hooks/useReservarNumero.ts deleted file mode 100644 index dad0444..0000000 --- a/src/web/src/features/puntos-de-venta/hooks/useReservarNumero.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { reservarNumero, getProximoNumero } from '../api/secuencias.api' -import type { TipoComprobante } from '../types' - -// ─── Reservar ──────────────────────────────────────────────────────────────── - -export function useReservarNumero(puntoDeVentaId: number) { - const queryClient = useQueryClient() - return useMutation({ - mutationFn: (tipoComprobante: TipoComprobante) => - reservarNumero(puntoDeVentaId, tipoComprobante), - onSuccess: (_data, tipoComprobante) => { - // Invalidate the proximo query for this pdv+tipo so it refetches - queryClient.invalidateQueries({ - queryKey: ['puntos-de-venta', 'proximo', puntoDeVentaId, tipoComprobante], - }) - }, - }) -} - -// ─── Próximo número (read-only) ────────────────────────────────────────────── - -export function useProximoNumero(puntoDeVentaId: number, tipoComprobante: TipoComprobante) { - return useQuery({ - queryKey: ['puntos-de-venta', 'proximo', puntoDeVentaId, tipoComprobante], - queryFn: () => getProximoNumero(puntoDeVentaId, tipoComprobante), - enabled: !!puntoDeVentaId, - staleTime: 5_000, - }) -} diff --git a/src/web/src/features/puntos-de-venta/pages/PuntoDeVentaDetailPage.tsx b/src/web/src/features/puntos-de-venta/pages/PuntoDeVentaDetailPage.tsx index 9d2f95a..f948c47 100644 --- a/src/web/src/features/puntos-de-venta/pages/PuntoDeVentaDetailPage.tsx +++ b/src/web/src/features/puntos-de-venta/pages/PuntoDeVentaDetailPage.tsx @@ -7,7 +7,6 @@ import { useMedio } from '../../medios/hooks/useMedio' import { DeactivatePuntoDeVentaModal } from '../components/DeactivatePuntoDeVentaModal' import { MedioInactivoBanner } from '../components/MedioInactivoBanner' import { PdvInactivoBanner } from '../components/PdvInactivoBanner' -import { SecuenciasPanel } from '../components/SecuenciasPanel' function formatDate(iso: string | null): string { if (!iso) return '—' @@ -105,12 +104,6 @@ export function PuntoDeVentaDetailPage() { - - - ) } diff --git a/src/web/src/features/puntos-de-venta/types.ts b/src/web/src/features/puntos-de-venta/types.ts index 83858f0..b4fb6f2 100644 --- a/src/web/src/features/puntos-de-venta/types.ts +++ b/src/web/src/features/puntos-de-venta/types.ts @@ -1,13 +1,7 @@ // ADM-008 — shared types for puntos-de-venta feature - -export enum TipoComprobante { - FacturaA = 1, - FacturaB = 2, - FacturaC = 3, - NotaCreditoA = 4, - NotaCreditoB = 5, - NotaCreditoC = 6, -} +// NOTE: numeración AFIP (NumeroFactura, CAI) es asignada externamente por IMAC/Infogestión. +// Un worker futuro (INT-001) polleará la vista de Infogestión para asociar +// NumeroOrdenInterno ↔ NumeroFacturaAFIP + CAI. No se generan números aquí. export interface PuntoDeVentaListItem { id: number @@ -53,16 +47,6 @@ export interface PuntosDeVentaQuery { activo?: boolean } -export interface ReservarNumeroResponse { - tipoComprobante: TipoComprobante - numeroReservado: number -} - -export interface ProximoNumeroResponse { - tipoComprobante: TipoComprobante - proximoNumero: number -} - export interface PagedResult { items: T[] page: number