Oleada UX 4: Pagos/Adeudos (cobro en 1 click con recibo, plan de pagos), Monedero (movimientos narrados, ajustes auditados, MXN+USD), Inventario (alta rapida, conteo fisico con ajuste e historial, alertas accionables) + fix de folios de pago y cantidades de movimientos

This commit is contained in:
2026-09-17 20:31:52 +00:00
parent ac5896b1fc
commit 9ee3343e22
20 changed files with 2173 additions and 165 deletions

View File

@@ -54,7 +54,7 @@ class SkeenMonedero(models.Model):
'history': history,
}
def add_points(self, points, description='', reference=''):
def add_points(self, points, description='', reference='', operator=''):
"""Agregar puntos al monedero"""
self.ensure_one()
self.write({'points': self.points + points})
@@ -64,10 +64,11 @@ class SkeenMonedero(models.Model):
'points': points,
'description': description or 'Acumulación de puntos',
'reference': reference,
'operator': operator,
})
return True
def redeem_points(self, points, description='', reference=''):
def redeem_points(self, points, description='', reference='', operator=''):
"""Redimir puntos del monedero"""
self.ensure_one()
if points > self.points:
@@ -80,10 +81,11 @@ class SkeenMonedero(models.Model):
'points': -points,
'description': description or 'Redención de puntos',
'reference': reference,
'operator': operator,
})
return True
def adjust_points(self, delta, description='', reference=''):
def adjust_points(self, delta, description='', reference='', operator=''):
"""Ajuste de puntos (puede ser negativo). Hace piso en 0 para no dejar saldo negativo.
Usado por devoluciones para revertir puntos acumulados por una venta.
@@ -103,6 +105,7 @@ class SkeenMonedero(models.Model):
'points': effective_delta,
'description': description or 'Ajuste de puntos',
'reference': reference,
'operator': operator,
})
return effective_delta
@@ -126,6 +129,9 @@ class SkeenMonederoTransaction(models.Model):
points = fields.Integer(string='Puntos', required=True)
description = fields.Text(string='Descripción')
reference = fields.Char(string='Referencia')
# Usuario del frontend que capturó el movimiento (los controladores
# auth='none' no dejan uid de Odoo, así que se guarda explícito).
operator = fields.Char(string='Registrado por')
# Fecha
create_date = fields.Datetime(string='Fecha', readonly=True, default=fields.Datetime.now)