/** * Tipos del widget InstallmentsPanel (FEAT-105-7) — sub-componente de * MasterDocument. * * Espejo TypeScript del DTO de cuotas del backend (`DocumentInstallmentDto`, * 105-6) más los contratos de props del widget reutilizable. Se integra en una * sección FactBox de cualquier documento MasterDocument (precedente: * AdvanceApplicationsPanel / SerialPanel). * * @see feat-105-7-cuotas-masterdocument-spec.md */ /** * Snapshot auto-generado de la cuota (`auto_generated_snapshot`). Llega como * objeto JSON ya deserializado. El tooltip del badge "Manual" lee `amount`. */ export interface InstallmentAutoSnapshot { /** Monto auto-generado original de la cuota (antes del ajuste manual). */ amount?: number; [key: string]: unknown; } /** * Cuota del plan de pagos (TF2) — espejo de `DocumentInstallmentDto` (camelCase). * Tabla genérica `core.document_installments`, keyed por `documentId = FC.Id`. */ export interface InstallmentDto { /** PK de la cuota. */ id: string; /** FK al documento (FC). */ documentId: string; /** Número de cuota 1-based. */ installmentNumber: number; /** Fecha de vencimiento (`YYYY-MM-DD`). */ dueDate: string; /** Monto de la cuota (moneda del documento). */ amount: number; /** Moneda (UUID, no código ISO). */ currencyId?: string | null; /** Cuota liquidada. */ isSettled: boolean; /** Monto en moneda alterna. */ amountAlt?: number | null; /** Fecha límite de pronto pago (única para todas las cuotas). */ promptPaymentDate?: string | null; /** Descuento de pronto pago de la cuota. */ promptPaymentDiscount?: number | null; /** Descuento de pronto pago en moneda alterna. */ promptPaymentDiscountAlt?: number | null; /** `true` si la cuota fue editada manualmente. */ isManual: boolean; /** Snapshot con los inputs auto-generados originales (incluye `amount`). */ autoGeneratedSnapshot?: InstallmentAutoSnapshot | null; /** Versión de fila para concurrencia optimista. */ rowVersion: number; /** Auditoría. */ createdAt?: string; updatedAt?: string; } /** * Forma cruda como puede llegar del backend. `autoGeneratedSnapshot` puede venir * como objeto o como string JSON; se normaliza con {@link normalizeInstallment}. */ export interface RawInstallmentDto extends Omit { autoGeneratedSnapshot?: InstallmentAutoSnapshot | string | null; } /** Normaliza una cuota cruda del backend al DTO de UI. */ export declare function normalizeInstallment(raw: RawInstallmentDto): InstallmentDto; /** Ordena las cuotas por `installmentNumber` ascendente (orden canónico de UI). */ export declare function sortInstallments(installments: InstallmentDto[]): InstallmentDto[]; /** * Payload del PUT de edición de una cuota (`UpdateSupplierInvoiceInstallmentDto`). * `id`/`installmentId` van en la ruta, nunca en el body. */ export interface ModifyInstallmentPayload { /** Versión de fila requerida (concurrencia optimista). */ rowVersion: number; /** Nuevo monto (>= 0). */ amount?: number; /** Nueva fecha de vencimiento (`YYYY-MM-DD`). */ dueDate?: string; /** Nueva fecha de pronto pago (`YYYY-MM-DD`). */ promptPaymentDate?: string; /** Nuevo descuento de pronto pago (>= 0). */ promptPaymentDiscount?: 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 `AdvancesHttpRequest` / `IMasterDocumentAdapter.genericFetch`. * * Debe rechazar con un error que exponga `status` (número HTTP) para que el * widget distinga 409 (conflicto) / 422 (validación) de 403 (sin permiso). */ export type InstallmentsHttpRequest = (method: 'GET' | 'PUT' | 'POST', url: string, body?: unknown) => Promise; /** Error normalizado que el widget interpreta para el manejo de UI. */ export interface InstallmentsHttpError extends Error { status?: number; } /** * Props del panel principal `InstallmentsPanel`. * * El widget es agnóstico del documento: recibe sus endpoints e IO por props, * lo que permite montarlo en cualquier MasterDocument. */ export interface InstallmentsPanelProps { /** UUID del documento (PK de `document_headers.id`), no el número legible. */ documentId: string; /** * `true` solo cuando el documento es editable (DRAFT). Cuando es `false`, la * grilla es read-only y el botón "Regenerar" se elimina del DOM. */ isEditable: boolean; /** * `true` si el usuario tiene el permiso `alter_installments`. Sin él la grilla * es read-only (sin edición in-line ni botón "Regenerar"), incluso en DRAFT. */ canAlter: boolean; /** * Endpoint GET para cargar el plan de cuotas (BRECHA G1 — la app decide la * ruta concreta, p.ej. `/{id}/factbox/installments`). Si se omite, la grilla * solo se puebla con la respuesta de editar/regenerar. */ installmentsEndpoint?: string; /** * Endpoint base PUT de edición: `/{id}/installments`. El widget añade * `/{installmentId}`. */ modifyInstallmentEndpoint: string; /** Endpoint POST de regeneración: `/{id}/installments/regenerate`. */ regenerateEndpoint: string; /** Cliente HTTP inyectado para las operaciones REST. */ httpRequest: InstallmentsHttpRequest; /** * Datos iniciales del plan (opcional). Útil cuando la carga proviene de la * sección FactBox (`dataSource: 'adapter'`) en vez de un GET dedicado. */ initialInstallments?: InstallmentDto[]; /** * Formateador de montos. @default `formatAmount` de `useMasterDocumentFormatters` (idioma activo, 2 decimales). */ formatAmount?: (value: number) => string; /** * Formateador de fechas (`YYYY-MM-DD`). @default `formatDate` de `useMasterDocumentFormatters` (idioma activo, `dateStyle:'medium'`). */ formatDate?: (value: string) => string; /** Clases CSS adicionales para el contenedor raíz. */ className?: string; } //# sourceMappingURL=types.d.ts.map