import { type DocumentLinesMode, type PriceSource } from './document-lines'; import { type LineItem, type LineItemsPolicy, type LineItemsValidation } from './line-items'; import { type ProductQuery, type ProductResult } from './product-search'; export type LineItemsColumn = 'discount' | 'tax' | 'technician' | 'lot' | 'dot' | 'unit'; export interface DocumentLinesGridProps { value: LineItem[]; /** Se emite con cada cambio; las líneas siempre traen `key`. */ onChange: (lines: LineItem[]) => void; /** Columnas opcionales visibles. Default: `['discount']`. */ columns?: LineItemsColumn[]; policy?: LineItemsPolicy; /** Errores externos del servidor `"<índice>."` (de `mapApiError().fields`). */ serverErrors?: Record; /** Se emite tras cada cambio con el resultado de validar (para bloquear «Guardar»). */ onValidate?: (v: LineItemsValidation) => void; /** Slot legado: abre el ProductPicker. Con `search`, el buscador va en la fila. */ onRequestProduct?: () => void; /** * Búsqueda en la fila (mismo contrato que ProductPicker). Al elegir, el renglón * se llena aquí; un segundo clic del mismo producto suma cantidad. */ search?: (query: Exclude, signal: AbortSignal) => Promise; /** `sale` usa el precio de lista; `cost` el costo de catálogo (compras). Default `sale`. */ priceSource?: PriceSource; /** `from_source` oculta alta/borrado y permite cantidad 0 hasta `max_quantity`. */ mode?: DocumentLinesMode; /** Cómo se captura el descuento. Default `percent` (el comportamiento anterior). */ discountMode?: 'percent' | 'amount' | 'both'; /** − / cantidad / +. Default: activo cuando hay `search`. */ quantityStepper?: boolean; /** Un segundo clic incrementa la cantidad del mismo producto. Default true. */ mergeSameProduct?: boolean; warehouseId?: string; /** Permite secciones y notas (Odoo-style). Default true. */ allowSections?: boolean; readOnly?: boolean; /** Permiso requerido para editar (default: sin gate). Sin él → solo lectura. */ editPermission?: string; /** Moneda ISO (default: la de la org). */ currency?: string; /** * Pinta el bloque de totales bajo la tabla. Default true; un contenedor que * ya muestra sus propios totales (DocumentEditor) lo apaga. */ showTotals?: boolean; /** * Alta del producto desde la celda («+» y «Crear producto «texto»»). Resuelve * con el producto guardado (o nada si se canceló): el renglón se llena con * el mismo mapeo que al elegir uno existente. */ onCreateProduct?: (query: string) => Promise; /** * Edición del producto del renglón (lápiz en la celda). Resuelve con el * producto ya guardado: el renglón se actualiza salvo los campos que el * usuario sobrescribió (ver `refreshLineFromProduct`). */ onEditProduct?: (line: LineItem) => Promise; /** Nombre del modelo de catálogo para «Crear …» / «Editar …» (default «producto»). */ productLabel?: string; /** * Etiqueta visible de la unidad (`unit` → «pza»). Si devuelve vacío, la * unidad no se muestra bajo el SKU (nunca la clave cruda). Sin esta prop se * muestra el valor tal cual. */ unitLabel?: (unit: string) => string | undefined; } /** @deprecated Usa `DocumentLinesGridProps`. Es el mismo contrato. */ export type LineItemsEditorProps = DocumentLinesGridProps; export declare function DocumentLinesGrid({ value, onChange, columns, policy, serverErrors, onValidate, onRequestProduct, search, priceSource, mode, discountMode, quantityStepper, mergeSameProduct, warehouseId, allowSections, readOnly, editPermission, currency, showTotals, onCreateProduct, onEditProduct, productLabel, unitLabel, }: DocumentLinesGridProps): import("react").JSX.Element; /** Mismo componente. El nombre anterior sigue exportado. */ export declare const LineItemsEditor: typeof DocumentLinesGrid; //# sourceMappingURL=line-items-editor.d.ts.map