Corte de caja asistido (esperado vs contado, diferencias, PDF) y fotos antes/despues con comparacion en expediente
This commit is contained in:
@@ -261,9 +261,18 @@ class SkeenCorteCaja(models.Model):
|
||||
total_other = fields.Float(string='Otros', compute='_compute_totals', store=True)
|
||||
total_sales = fields.Float(string='Total Ventas', compute='_compute_totals', store=True)
|
||||
|
||||
# Cierre
|
||||
# Cierre guiado: efectivo contado por el cajero y conteo informativo
|
||||
# de los demás métodos.
|
||||
counted_cash = fields.Float(string='Efectivo Contado', default=0.0)
|
||||
counted_card = fields.Float(string='Tarjeta Contada', default=0.0)
|
||||
counted_transfer = fields.Float(string='Transferencia Contada', default=0.0)
|
||||
counted_other = fields.Float(string='Otros Contados', default=0.0)
|
||||
closing_cash = fields.Float(string='Efectivo Cierre', default=0.0)
|
||||
difference = fields.Float(string='Diferencia', compute='_compute_difference', store=True)
|
||||
diff_cash = fields.Float(string='Diferencia Efectivo', compute='_compute_difference', store=True)
|
||||
diff_card = fields.Float(string='Diferencia Tarjeta', compute='_compute_difference', store=True)
|
||||
diff_transfer = fields.Float(string='Diferencia Transferencia', compute='_compute_difference', store=True)
|
||||
diff_other = fields.Float(string='Diferencia Otros', compute='_compute_difference', store=True)
|
||||
|
||||
# Estado
|
||||
state = fields.Selection([
|
||||
@@ -276,32 +285,44 @@ class SkeenCorteCaja(models.Model):
|
||||
@api.depends('date')
|
||||
def _compute_totals(self):
|
||||
for corte in self:
|
||||
ventas = self.env['skeen.venta'].search([
|
||||
('date', '=', corte.date),
|
||||
('state', 'in', ('confirmed', 'paid', 'partial')),
|
||||
])
|
||||
# Sumar también pagos por método
|
||||
pagos = self.env['skeen.pago'].search([
|
||||
('payment_date', '>=', corte.date.strftime('%Y-%m-%d 00:00:00')),
|
||||
('payment_date', '<=', corte.date.strftime('%Y-%m-%d 23:59:59')),
|
||||
('state', '=', 'completed'),
|
||||
])
|
||||
cash = sum(p.amount for p in pagos if p.payment_method == 'cash')
|
||||
card = sum(p.amount for p in pagos if p.payment_method in ('card', 'stripe', 'mercadopago'))
|
||||
transfer = sum(p.amount for p in pagos if p.payment_method == 'transfer')
|
||||
other = sum(p.amount for p in pagos if p.payment_method not in ('cash', 'card', 'stripe', 'mercadopago', 'transfer'))
|
||||
corte.update(corte._totals_from_payments())
|
||||
|
||||
corte.total_cash = cash
|
||||
corte.total_card = card
|
||||
corte.total_transfer = transfer
|
||||
corte.total_other = other
|
||||
corte.total_sales = cash + card + transfer + other
|
||||
def _totals_from_payments(self):
|
||||
"""Sumatorias por método de pago para la fecha del corte."""
|
||||
self.ensure_one()
|
||||
pagos = self.env['skeen.pago'].search([
|
||||
('payment_date', '>=', self.date.strftime('%Y-%m-%d 00:00:00')),
|
||||
('payment_date', '<=', self.date.strftime('%Y-%m-%d 23:59:59')),
|
||||
('state', '=', 'completed'),
|
||||
])
|
||||
cash = sum(p.amount for p in pagos if p.payment_method == 'cash')
|
||||
card = sum(p.amount for p in pagos if p.payment_method in ('card', 'stripe', 'mercadopago'))
|
||||
transfer = sum(p.amount for p in pagos if p.payment_method == 'transfer')
|
||||
other = sum(p.amount for p in pagos if p.payment_method not in ('cash', 'card', 'stripe', 'mercadopago', 'transfer'))
|
||||
return {
|
||||
'total_cash': cash,
|
||||
'total_card': card,
|
||||
'total_transfer': transfer,
|
||||
'total_other': other,
|
||||
'total_sales': cash + card + transfer + other,
|
||||
}
|
||||
|
||||
@api.depends('opening_cash', 'total_cash', 'closing_cash')
|
||||
def refresh_totals(self):
|
||||
"""Recalcula y persiste los totales del día (pagos pueden llegar después
|
||||
de abrir la caja)."""
|
||||
for corte in self:
|
||||
corte.write(corte._totals_from_payments())
|
||||
|
||||
@api.depends('opening_cash', 'total_cash', 'total_card', 'total_transfer', 'total_other',
|
||||
'closing_cash', 'counted_cash', 'counted_card', 'counted_transfer', 'counted_other')
|
||||
def _compute_difference(self):
|
||||
for corte in self:
|
||||
expected = corte.opening_cash + corte.total_cash
|
||||
corte.difference = corte.closing_cash - expected
|
||||
corte.diff_cash = corte.counted_cash - expected
|
||||
corte.diff_card = corte.counted_card - corte.total_card
|
||||
corte.diff_transfer = corte.counted_transfer - corte.total_transfer
|
||||
corte.diff_other = corte.counted_other - corte.total_other
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
|
||||
Reference in New Issue
Block a user