Hotfix de reembolsos POS y consistencia de caja
Correcciones críticas de caja (V-3.2.0230): - /POS: el diálogo RefundDialog no estaba montado en pos.tsx, el botón no abría nada. Corregido — ahora abre el diálogo, refresca cash_total y getCashStatus al confirmar. - pos_order_refunds: nueva columna `source` (pos_refund, sales_cancel, sales_cancel_reconciliation, admin_cash_refund) e índice único por sale_id para impedir reembolsos duplicados a nivel DB. - Nueva RPC `reconcileCashRefunds` (owner/super_admin): idempotente, escanea ventas POS efectivo cancelled/refunded sin REFUND_CASH, crea el movimiento y ajusta la cash_session correspondiente. Soporta dryRun para preview. - Nueva RPC `adminForceCashRefund` (owner/super_admin): permite reembolso de efectivo fuera de la ventana de 60 min con motivo obligatorio y audit log. - Botón "Reconciliar cancelaciones" en /cash-control para correr el dry-run + confirmación + ajuste real. - cancelSaleAndReleaseItems y refundSale ahora marcan source explícito en pos_order_refunds. - getCashStatus ya descontaba refund_cash; verificado que cortes PDF y alertas usan el cálculo neto.
Aspectos destacados
- Botón Reembolsar en /POS arreglado
- Reconciliación idempotente de cancelaciones históricas
- Ajuste administrativo fuera de ventana de 60 min
- Índice único pos_order_refunds.sale_id contra duplicados
- Auditoría por origen (pos_refund / sales_cancel / reconciliation / admin)