import type { Fetcher } from '../../LookupField/services/api.types'; /** * Tipos del widget AdvanceApplicationsPanel (FEAT-102-5) — sub-componente de * MasterDocument. * * Espejo TypeScript de los DTOs del backend de Anticipos (FEAT-102) más los * contratos de props del widget reutilizable. Se integra en una sección FactBox * de cualquier documento MasterDocument. * * @see docs/feat-102-5-anticipo-masterdocument-integration-spec.md */ /** * Estado de una aplicación de anticipo. * Orden monótono estricto: RESERVED → CONFIRMED → REVERSED (RB-4). */ export type AdvanceApplicationStatus = 'RESERVED' | 'CONFIRMED' | 'REVERSED'; /** * Normaliza el `status` recibido del backend a la unión string del widget. * * Resuelve la discrepancia de contrato (§6.3 / R2 de la spec): el backend hoy * emite `status` como entero (0/1/2) + `statusLabel` en español, mientras que * el frontend trabaja con el enum string. Esta función acepta ambos formatos * de forma defensiva para evitar regresiones de render de badges. */ export declare function normalizeAdvanceStatus(status: number | string | null | undefined): AdvanceApplicationStatus; /** * Saldo abierto de anticipo del proveedor (`supplier_open_balances`). * Solo se listan/buscan saldos `isActive=true` y `availableAmount > 0` (RB-8). */ export interface SupplierOpenBalanceDto { id: string; supplierId: string; companyId: string; currencyId: string; originalAmount: number; availableAmount: number; sourceDocumentId?: string | null; sourceDocumentReference?: string | null; operationCenterId?: string | null; businessUnitId?: string | null; auxiliaryId?: string | null; isActive: boolean; rowVersion: number; } /** * Aplicación de anticipo contra un documento (`document_advance_applications`). * `status` ya viene normalizado a la unión string (ver {@link normalizeAdvanceApplication}). */ export interface DocumentAdvanceApplicationDto { id: string; documentId: string; openBalanceId: string; appliedAmount: number; appliedAmountAlt?: number | null; currencyId: string; status: AdvanceApplicationStatus; /** Etiqueta en español opcional provista por el backend (`statusLabel`). */ statusLabel?: string | null; /** Referencia legible del saldo origen, si el backend la incluye (para mostrar). */ sourceDocumentReference?: string | null; reservedAt: string; confirmedAt?: string | null; reversedAt?: string | null; confirmedBy?: string | null; reversedBy?: string | null; notes?: string | null; rowVersion: number; } /** * Forma cruda como puede llegar del backend: `status` int o string. * Se normaliza con {@link normalizeAdvanceApplication} antes de usarse en UI. */ export interface RawDocumentAdvanceApplicationDto extends Omit { status: number | AdvanceApplicationStatus; } /** Normaliza una aplicación cruda del backend al DTO de UI. */ export declare function normalizeAdvanceApplication(raw: RawDocumentAdvanceApplicationDto): DocumentAdvanceApplicationDto; /** Payload HTTP de reserva (lo que el consumidor expone en `POST /{id}/advances`). */ export interface CreateAdvanceApplicationRequest { openBalanceId: string; appliedAmount: number; } /** * Cliente HTTP inyectado para las operaciones REST del widget. * * El kit no depende de `axios`; el documento consumidor inyecta su instancia * ya configurada (interceptores de auth/company) envuelta en esta firma. * Espeja el patrón `IMasterDocumentAdapter.genericFetch(method, path, body)`. * * Debe rechazar con un error que exponga `status` (número HTTP) para que el * widget pueda distinguir 422/409 (toast) de 403 (Info inline). */ export type AdvancesHttpRequest = (method: 'GET' | 'POST' | 'DELETE', url: string, body?: unknown) => Promise; /** Error normalizado que el widget interpreta para el manejo de UI. */ export interface AdvancesHttpError extends Error { status?: number; } /** * Props del panel principal `AdvanceApplicationsPanel`. * * El widget es agnóstico del documento: recibe sus endpoints e IO por props, * lo que permite montarlo en cualquier MasterDocument (CA-I4 / CA-F4). */ export interface AdvanceApplicationsPanelProps { /** UUID del documento (PK de `document_headers.id`), no el número legible. */ documentId: string; /** Proveedor del documento (scope de saldos visibles, RB-7). */ supplierId: string; /** Moneda del documento (para validar `CurrencyMismatch`, BV-AA-03). */ documentCurrencyId: string; /** * `true` solo cuando el documento está en DRAFT (RB-6). Cuando es `false`, * los botones "Aplicar anticipo" y "Quitar" se eliminan del DOM (FD-04). */ isEditable: boolean; /** Endpoint POST para reservar: `/api/v1/documents/{id}/advances`. */ applyAdvanceEndpoint: string; /** * Endpoint base DELETE para quitar: `/api/v1/documents/{id}/advances`. * El widget añade `/{applicationId}`. */ removeAdvanceEndpoint: string; /** Endpoint GET de saldos disponibles: `/api/v1/documents/{id}/available-advances`. */ availableAdvancesEndpoint: string; /** * Endpoint GET de aplicaciones del documento. * Por defecto usa `applyAdvanceEndpoint` (misma ruta, verbo GET). */ applicationsEndpoint?: string; /** Cliente HTTP inyectado para las operaciones REST. */ httpRequest: AdvancesHttpRequest; /** * Fetcher del `LookupField` para la búsqueda server-side paginada de saldos * (`POST /available-advances/search`, NFR-01). El consumidor lo enlaza al * documento (la entidad debe exponer `Id` en PascalCase). */ fetcher: Fetcher; /** Nombre de entidad pasado al `fetcher`. @default 'available-advances' */ searchEntity?: string; /** * Formateador de montos. @default `formatAmount` de `useMasterDocumentFormatters` (idioma activo, 2 decimales). * (El `currencyId` es un UUID, no un código ISO, por eso no se formatea como divisa.) */ formatAmount?: (value: number) => string; /** Clases CSS adicionales para el contenedor raíz. */ className?: string; } /** Props del modal de aplicación de anticipo. */ export interface ApplyAdvanceModalProps { open: boolean; documentId: string; documentCurrencyId: string; applyAdvanceEndpoint: string; httpRequest: AdvancesHttpRequest; /** Fetcher del `LookupField` (búsqueda server-side de saldos). */ fetcher: Fetcher; searchEntity?: string; formatAmount?: (value: number) => string; onClose: () => void; } //# sourceMappingURL=types.d.ts.map