bloque 3: lealtad configurable (motor de puntos con multiplicadores por servicio/categoria/sucursal/dia/nivel, niveles VIP con descuento y factor, expiracion, ajuste manual con motivo y reportes) + propinas en punto de venta con reparto entre el personal, desglose en ticket y corte, y opcion en la liquidacion de comisiones; modo clasico y propinas apagadas preservan el comportamiento actual

This commit is contained in:
2026-10-12 01:37:07 +00:00
parent 1bd4cad6a0
commit 705b5a2842
28 changed files with 2748 additions and 59 deletions

View File

@@ -29,8 +29,10 @@ from odoo.http import request, Response
from odoo.addons.skeen_citas.clinic_settings import (
get_settings as get_clinic_settings,
get_reservas_online,
get_lealtad,
brand_dict,
)
from odoo.addons.skeen_monedero.lealtad import nivel_por_codigo as lealtad_nivel_por_codigo
from odoo.addons.skeen_citas.glosario import resolve as resolver_glosario
from odoo.addons.skeen_whatsapp.controllers import public_booking as _pb
@@ -797,7 +799,9 @@ class SkeenPortalPublicoController(http.Controller):
monedero = request.env['skeen.monedero'].sudo().search(
[('partner_id', '=', partner.id)], limit=1)
points = monedero.points if monedero else 0
mxn = float(points) * 1.0 # 1 punto = $1 MXN
cfg_lea = get_lealtad(request.env)
valor = float(cfg_lea.get('valor_punto') or 1.0) # clásico: 1 pt = $1
mxn = float(points) * valor
rate = 0.0
try:
rate = request.env['skeen.tipo.cambio'].sudo().get_current_rate()
@@ -815,12 +819,20 @@ class SkeenPortalPublicoController(http.Controller):
'descripcion': tx.description or '',
'referencia': tx.reference or '',
})
nivel = lealtad_nivel_por_codigo(cfg_lea, partner.lealtad_nivel_codigo)
return _json({
'status': 'success',
'points': points,
'equivalent_mxn': round(mxn, 2),
'equivalent_usd': usd,
'rate': rate or None,
'valor_punto': valor,
'nivel': ({
'codigo': nivel['codigo'],
'nombre': nivel['nombre'],
'descuento_pct': nivel.get('descuento_pct') or 0.0,
'color': nivel.get('color') or '',
} if nivel else None),
'movimientos': movimientos,
})
except Exception as exc: