import type { DocumentState, IMasterDocumentAdapter } from '../adapter/MasterDocumentAdapter.types'; import type { MasterDocumentTemplate } from '../template/MasterDocumentTemplate.types'; import type { DocumentLineData, FieldErrorMap } from '../MasterDocument.types'; interface PartitionedErrors { conflict: { message?: string; } | null; forbidden: { message: string; } | null; /** Errores de campo restantes (sin las claves reservadas). */ fieldErrors: FieldErrorMap; } /** * Separa las claves reservadas `_conflict` y `_forbidden` del resto de errores de * campo. Permite que un `SaveResult` 409/403 dispare el flujo de conflicto / banner * en lugar de renderizarse como un error de campo genérico. */ export declare function partitionReservedErrors(errors: FieldErrorMap): PartitionedErrors; type Action = { type: 'LOAD_START'; } | { type: 'LOAD_SUCCESS'; payload: DocumentState; } | { type: 'LOAD_ERROR'; payload: string; } | { type: 'SET_HEADER_FIELD'; key: string; value: unknown; } | { type: 'SET_HEADER_ERRORS'; errors: FieldErrorMap; } | { type: 'SET_LINES'; lines: DocumentLineData[]; } | { type: 'ADD_LINE'; line: DocumentLineData; } | { type: 'UPDATE_LINE'; lineId: string; data: Record; } | { type: 'DELETE_LINE'; lineId: string; } | { type: 'DUPLICATE_LINE'; lineId: string; newLine: DocumentLineData; } | { type: 'SET_DOC_STATE'; docState: string; } | { type: 'SET_SAVING'; saving: boolean; } | { type: 'SET_ERROR'; error?: string; } | { type: 'SET_FACTBOX_DATA'; sectionKey: string; data: Record; } | { type: 'SET_SERVER_VERSION'; version: string; } | { type: 'SET_CONFLICT'; conflict: NonNullable; } | { type: 'CLEAR_CONFLICT'; } | { type: 'SET_FORBIDDEN'; forbidden: NonNullable; } | { type: 'CLEAR_FORBIDDEN'; } | { type: 'MERGE_STATE'; payload: Partial; }; /** * Trabajo que debe ocurrir DESPUÉS de que el backend confirmó una escritura y * devolvió su id, dentro de la misma interacción del usuario. * * Existe para los datos que no viajan en el payload del documento y necesitan un * id que solo existe una vez persistido — hoy, los valores de las entidades * dinámicas (EAV). Es deliberadamente un *callback* y no una llamada directa: el * reducer no sabe nada de entidades dinámicas ni debe saberlo, y quien conoce los * formularios montados es la capa que renderiza. * * Contrato: **no deben lanzar y no deben fallar la operación**. Para cuando se * invocan, el documento o la línea ya están guardados; revertir no es una opción y * propagar el error solo lograría que el usuario crea que perdió todo. */ export interface MasterDocumentPersistenceHooks { /** El encabezado quedó persistido con este id (recién creado o existente). */ onHeaderPersisted?: (documentId: string) => Promise | void; /** La línea quedó persistida con este id (recién creada o existente). */ onLinePersisted?: (lineId: string) => Promise | void; } export declare function useMasterDocumentReducer(template: MasterDocumentTemplate, adapter: IMasterDocumentAdapter, documentId?: string, initialState?: DocumentState, onSaved?: () => void, viewOnly?: boolean, onNavigateToList?: () => void, persistenceHooks?: MasterDocumentPersistenceHooks): { state: DocumentState; dispatch: import("react").ActionDispatch<[action: Action]>; handleHeaderFieldChange: (key: string, value: unknown) => void; handleSaveHeader: () => Promise; handleLineSave: (lineId: string | null, data: Record) => Promise; handleDeleteLine: (lineId: string) => Promise; handleDuplicateLine: (lineId: string) => Promise; handleTransition: (to: string) => Promise; handleAction: (actionKey: string) => Promise; handleApprove: () => Promise; handleReject: () => Promise; }; export {}; //# sourceMappingURL=useMasterDocumentReducer.d.ts.map