Casa de Cambio — Pago mixto USD/MXN en POS
Nuevo botón Pago mixto USD/MXN en el POS (visible solo con add-on Casa de Cambio activo). El diálogo precarga el saldo USD/MXN de la caja, calcula equivalencias usando la tasa snapshot del POS, permite elegir la moneda del cambio y bloquea la confirmación si el saldo es insuficiente o si falta dinero. La venta se persiste con payment_method mixed_currency y guarda un breakdown idempotente en raw_payload.mixed_payment (recibido MXN/USD, cambio MXN/USD, tasa usada, fuente). El servidor registra los movimientos de cajón vía recordSaleCurrencyMovements con apply_currency_balance_delta atómico e idempotente por sale_id, sin duplicar si se reintenta. El ticket HTML/PDF muestra una sección Pago mixto USD/MXN con total venta, USD/MXN recibido, tipo de cambio, equivalencias y cambio entregado. Refund automático bloqueado en ventas mixed_currency con mensaje claro: requieren reversa manual asistida para no descuadrar saldos multimoneda. Tenants sin el add-on no ven el botón ni cambios en el ticket.
Aspectos destacados
- Nuevo botón Pago mixto USD/MXN (gated por add-on)
- Diálogo con tasa snapshot, balances precargados y validación de cambio
- Cambio entregable en MXN o USD
- Bloqueo si el saldo del cajón no alcanza para el cambio
- Persistencia idempotente del breakdown en raw_payload.mixed_payment
- Movimientos de cajón atómicos por sale_id (sin duplicados)
- Ticket impreso y PDF con sección Pago mixto USD/MXN
- Refund de ventas mixtas bloqueado con mensaje claro (reversa manual asistida)
- Sin cambios para tenants sin el add-on