2.6 KiB
2.6 KiB
Implementer evidence — CLUB-003
Resumen
Implementé la integración del Club en el TPV: resolución de socio por código, acumulación de cashback en ledger idempotente y campos de respuesta en venta POS.
Qué se añadió
1) Endpoint de resolución de socio
GET /club/resolve?memberCode=MDV-XXXXXXXXenproject/src/modules/club/api/club.routes.ts- Método
resolveByCodeenClubService - Método
findMemberByCodeenPgClubRepository(solo socios activos)
2) Integración de cashback en venta POS
PosSaleInputahora aceptaclubMemberId?: string(domain type)PosSaleResultahora devuelveclubEarnedCentsyclubMemberCodeCreatePosSaleUseCase:- Al completar una venta (orderState === 'COMPLETED'), si hay
clubMemberId:- Consulta
club_enabledyclub_cashback_bpsdestore_settings - Calcula
cashbackCents = round(totalCents * cashbackBps / 10_000) - Inserta transacción de ledger idempotente con
idempotency_key = club-earn-${orderId}dentro de la misma transacción DB que la venta - Si la insercción falla, continúa sin bloquear la venta (fail-safe)
- Consulta
- Al completar una venta (orderState === 'COMPLETED'), si hay
loadResultrecupera elclubEarnedCentsdel ledger al recargar una venta por idempotency keyreceive-rest-payment.tsdevuelveclubEarnedCents: 0(pagos adicionales no re-acumulan cashback)
3) API del TPV
- El body de
POST /pos/salesaceptaclubMemberIdcon validación UUID - La respuesta de venta incluye
clubEarnedCentsyclubMemberCode
4) Tipos frontend
PosSaleResponseenapps/pos/src/types/checkout.tsincluyeclubEarnedCentsyclubMemberCode
Decisiones técnicas
- El cashback se acumula solo cuando la venta pasa a COMPLETED, no en ventas PENDING.
- Si la escritura de ledger falla, la venta sigue adelante (fail-safe).
- El idempotency key del ledger incluye el
orderId(club-earn-${orderId}), garantizando una única acumulación por venta. - El
loadResultrecupera el cashback del ledger para mantener consistencia en respuestas por idempotency.
Validación ejecutada
cd project && npm run typecheck✅cd project && npm run build✅cd project/apps/pos && npm run build✅./scripts/verify.sh✅cd project && npx vitest run src/modules/pos/tests/payment-allocation.test.ts✅cd project && npx vitest run src/modules/club/tests/✅git diff --check✅
Riesgos / siguiente paso
- CLUB-004 debe implementar el flujo de devolución TPV que revierte el cashback acumulado cuando se reintegran artículos.
- El frontend TPV (interfaz de búsqueda de socio Club) queda pendiente de implementar en la UI del terminal; los campos del endpoint ya están listos.