v3.53.0 · 24 ago 2026Puntos y Ledger
El saldo de puntos de un cliente es la suma de un ledger de solo-anexado. Nada edita el saldo directamente. El sistema escribe un asiento, y el saldo se actualiza desde ese asiento.
Solo se anexa. Nunca se edita ni se borra un asiento.
PARCIAL — Ajuste manual y Reversa están trazados y verificados. Ganar (desde pedidos), canje y expiración están sin trazar.
Preguntas frecuentes
Bueno saber
Comportamientos
Ajuste manual POST /v2/ledger/adjust
Un miembro del staff agrega o quita puntos a mano. El motivo es obligatorio. Todo ajuste queda registrado en el ledger.

- Monto con signo → tipo de asiento. Positivo escribe
MANUAL_ADD, negativoMANUAL_BURN. Cero se rechaza. </> - Saldo = máx(0, antes ± monto). Un «agregar» también sube el acumulado de por vida; una «quema» no lo baja. </>
- Reglas. El motivo es obligatorio (≤500 caracteres). Una quema no puede bajar del saldo. La tarjeta debe ser del negocio y estar activa. El sistema descarta envíos repetidos idénticos. </>
- Efectos. Recalcula el tier solo al agregar. Refresca la billetera. No avisa al cliente. Emite el evento interno
CUSTOMER_CARD_UPDATED. </>
Acceso: cualquier usuario de negocio (dueño o secundario) con el sistema de tarjetas. Sin control por rol de staff.
Reversa POST /v2/ledger/entries/:uuid/reverse
Deshace un asiento concreto. Escribe un asiento opuesto y enlaza los dos. Ese enlace es la «cadena de reversa». Un ajuste crea un asiento nuevo; una reversa apunta a uno pasado.
- Dirección. Revertir un asiento de suma resta; revertir una quema o canje devuelve. Se rechaza si dejaría el saldo negativo. </>
- Cadena de reversa. Escribe un asiento
REVERSALligado al original, y marca el original como revertido. Se puede seguir la cadena. </> - Límites. No se puede revertir un asiento ya revertido ni un asiento de reversa. </>
Mapa de código — para ingeniería
POST /v2/ledger/adjust→ ledger.controller.ts · ledger.service.ts · adjust() · ledger-adjust.dto.tsPOST /v2/ledger/entries/:uuid/reverse→ ledger.service.ts · reverseEntry()Entidad y frontend→ loyalty-ledger.entity.ts · card-manual-adjust-modal.tsx · lib/api/ledger.ts · types/ledger.ts