import { type LineItem } from './line-items'; /** Semáforo de un punto: pendiente (sin revisar), verde, amarillo, rojo. */ export type InspectionStatus = 'pending' | 'ok' | 'attention' | 'urgent'; /** * Qué captura el punto: `check` solo el semáforo; `tread` profundidad de dibujo * en mm (el semáforo sale del valor); `measure` un valor numérico libre con su * unidad. El nivel de combustible y el kilometraje van en el encabezado. */ export type InspectionPointKind = 'check' | 'tread' | 'measure'; export type InspectionMediaType = 'photo' | 'video'; export interface InspectionMedia { /** Clave estable de UI. */ key: string; url: string; type: InspectionMediaType; caption?: string; } export interface InspectionPoint { /** Clave estable de UI (no se envía). */ key: string; /** Id de la fila guardada, si ya existe. */ id?: string; /** Agrupa los puntos en el checklist («Llantas», «Frenos»...). */ section: string; name: string; kind: InspectionPointKind; status: InspectionStatus; /** Valor medido (`tread`/`measure`). */ value?: number | null; unit?: string; notes: string; /** Trabajo recomendado; con texto, el punto es un renglón candidato. */ recommendation: string; quantity: number; unit_price: number; media: InspectionMedia[]; /** Respuesta del cliente a la recomendación, cuando ya la dio. */ approval?: 'none' | 'pending' | 'approved' | 'declined'; } export type FuelLevel = 'empty' | 'quarter' | 'half' | 'three_quarters' | 'full'; export declare const FUEL_LEVELS: readonly FuelLevel[]; /** Encabezado de una recepción: lo que se ve al recibir el vehículo. */ export interface InspectionHeader { odometer_km?: number | null; fuel_level?: FuelLevel | ''; /** Daños previos visibles, para deslindar responsabilidad. */ damage_notes: string; } /** Umbrales de profundidad de dibujo en mm (el límite legal común es 1.6). */ export interface TreadThresholds { /** Por debajo de esto el semáforo es rojo. Default 1.6. */ urgent: number; /** Por debajo de esto (y sobre `urgent`) es amarillo. Default 3. */ attention: number; } export declare const DEFAULT_TREAD_THRESHOLDS: TreadThresholds; export declare function newInspectionKey(prefix?: string): string; export declare function makeInspectionPoint(partial?: Partial): InspectionPoint; /** Semáforo que le toca a una profundidad de dibujo. Sin valor: `pending`. */ export declare function treadStatus(mm: number | null | undefined, th?: TreadThresholds): InspectionStatus; /** El peor estado de la lista (rojo > amarillo > verde > pendiente). */ export declare function worstStatus(points: Pick[]): InspectionStatus; /** ¿El punto trae una recomendación que se puede cotizar? */ export declare function hasRecommendation(p: Pick): boolean; export interface InspectionSummary { total: number; counts: Record; worst: InspectionStatus; /** Puntos sin revisar. */ pending: number; /** Puntos con recomendación. */ recommendations: number; /** Suma cantidad × precio de las recomendaciones. */ recommendedTotal: number; } export declare function summarizeInspection(points: InspectionPoint[]): InspectionSummary; export interface InspectionValidation { ok: boolean; /** Errores por `"<índice>."` (mismo contrato que LineItemsEditor). */ errors: Record; /** Error de formulario (encabezado o conjunto). */ form?: string; } export interface InspectionRules { /** Exige revisar todos los puntos (ninguno `pending`). Default false (borrador). */ requireAllReviewed?: boolean; /** Exige kilometraje en el encabezado (recepción). Default false. */ requireOdometer?: boolean; /** Un punto amarillo/rojo debe llevar nota, recomendación o evidencia. Default false. */ requireEvidenceOnIssues?: boolean; } export declare function validateInspection(points: InspectionPoint[], header?: InspectionHeader, rules?: InspectionRules): InspectionValidation; /** * Única puerta de salida hacia el backend: números reales, sin claves de UI, * opcionales vacíos omitidos y `line_no` 1-based (mismo criterio que * `serializeLineItems`). */ export declare function serializeInspectionPoints(points: InspectionPoint[]): Record[]; /** Inversa de `serializeInspectionPoints`: filas del backend a puntos de UI. */ export declare function parseInspectionPoints(rows: unknown): InspectionPoint[]; /** * Recomendación → renglón del presupuesto: cada punto con recomendación se * vuelve un renglón `item` (descripción «Punto — recomendación»). Se puede * filtrar por respuesta del cliente (p. ej. solo las aprobadas). */ export declare function recommendationsToLines(points: InspectionPoint[], opts?: { approval?: InspectionPoint['approval'][]; }): LineItem[]; //# sourceMappingURL=inspection.d.ts.map