POS vista lista, modulo Tickets para gerencia con cancelacion auditada, y saldo a favor (recargas de anticipo desde expediente y agenda, canje en POS)

This commit is contained in:
2026-09-18 04:25:33 +00:00
parent cebf8d663d
commit d75411f0d9
19 changed files with 1278 additions and 30 deletions

View File

@@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
from . import venta
from . import tipo_cambio
from . import pago
from . import venta

View File

@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
from odoo import models, fields
class SkeenPago(models.Model):
"""Extiende el pago con su venta de origen.
El campo vive aquí (y no en skeen_pagos) porque skeen_ventas ya depende de
skeen_pagos: declararlo al revés crearía un ciclo de dependencias.
"""
_inherit = 'skeen.pago'
venta_id = fields.Many2one('skeen.venta', string='Venta', index=True,
ondelete='set null')

View File

@@ -64,6 +64,25 @@ class SkeenVenta(models.Model):
cancel_points_reversed = fields.Integer(string='Puntos Revertidos', default=0, readonly=True, copy=False)
cancel_points_restored = fields.Integer(string='Puntos Restaurados', default=0, readonly=True, copy=False)
# Cobro: quién cobró y con qué método (para el módulo de Tickets).
# user_login se llena desde el usuario del frontend (los controladores
# auth='none' no dejan uid de Odoo en create_uid).
user_login = fields.Char(string='Cobró (usuario)', index=True)
payment_method = fields.Selection([
('cash', 'Efectivo'),
('card', 'Tarjeta'),
('transfer', 'Transferencia'),
('stripe', 'Stripe'),
('mercadopago', 'MercadoPago'),
('points', 'Puntos / saldo a favor'),
('mixed', 'Mixto'),
('none', 'Sin pago'),
], string='Método de pago', index=True)
# Pagos cobrados por esta venta (el campo está en skeen_ventas para no
# crear un ciclo de dependencias con skeen_pagos)
pago_ids = fields.One2many('skeen.pago', 'venta_id', string='Pagos')
# Fechas
date = fields.Date(string='Fecha', required=True, default=fields.Date.today)
create_date = fields.Datetime(string='Fecha Creación', readonly=True, default=fields.Datetime.now)