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

@@ -174,6 +174,7 @@ class SkeenComisionesController(http.Controller):
'periodo_fin': l.periodo_fin.strftime('%Y-%m-%d') if l.periodo_fin else None,
'periodo': l.periodo or '',
'total_calculado': l.total_calculado,
'total_propinas': l.total_propinas,
'total_ajustes': l.total_ajustes,
'total': l.total,
'estado': l.estado,
@@ -596,9 +597,12 @@ class SkeenComisionesController(http.Controller):
emp_ids = [int(data['empleado_id'])]
calc = motor.calcular(start, end, empleado_ids=emp_ids)
from odoo.addons.skeen_comisiones.models.liquidacion import propinas_de_empleado
creadas, omitidas = [], []
for emp in calc['empleados']:
if emp['lineas_count'] == 0 and abs(emp['total']) < 1e-9:
propina = propinas_de_empleado(request.env, emp['empleado_id'], start, end)
if emp['lineas_count'] == 0 and abs(emp['total']) < 1e-9 and propina <= 0:
continue
existente = Liq.search([
('empleado_id', '=', emp['empleado_id']),
@@ -610,12 +614,15 @@ class SkeenComisionesController(http.Controller):
'folio': existente.name,
'motivo': 'ya existe liquidación del periodo'})
continue
detalle = dict(emp)
detalle['propinas'] = propina
liq = Liq.create({
'empleado_id': emp['empleado_id'],
'periodo_inicio': start,
'periodo_fin': end,
'total_calculado': emp['total'],
'detalle': json.dumps(emp, ensure_ascii=False),
'total_propinas': propina,
'detalle': json.dumps(detalle, ensure_ascii=False),
'creado_por_login': _login(),
'notas': (data.get('notas') or '').strip(),
})