trytondo-sale_pos_extras/sale.py

107 lines
3.9 KiB
Python

# This file is part of sale_pos module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from trytond.pool import Pool, PoolMeta
from trytond.exceptions import UserError
from trytond.model import fields
from trytond.transaction import Transaction
from trytond.model import ModelView
from trytond.wizard import Button, StateReport
class Sale(metaclass=PoolMeta):
__name__ = 'sale.sale'
@classmethod
@ModelView.button
def to_done(cls,sales):
'''Lleva las ventas desde el estado borrador(draft) hasta el estado finalizado(done).
En estre proceso crea la factura y los movimientos de stock de forma automática,
además de aprobarlos y contabilizarlos.'''
Invoice = Pool().get('account.invoice')
Shipment = Pool().get('stock.shipment.out')
if sales:
for sale in sales:
if len(sale.lines)<1:
cls.raise_user_error('La venta{s} no está en estado borrador o no contiene lineas'.foramt(s=sale))
return
else:
cls.raise_user_error('Error en las venatas seleccionadas')
return
cls.quote(sales)
cls.confirm(sales)
cls.process(sales)
Transaction().commit()#se graba la informacion para poder acceder a las facturas y los shipments
sales = cls.browse([x.id for x in sales])#se vuelve a leer para cargar informacion de la base de datos, verificar si es necesario.
sales = [x for x in sales if (x.state == 'processing' and len(x.lines) >0 ) ]#solo las ventas en borrador
if len(sales) <= 0:
cls.raise_user_error('Falló la finalización automática de la(s) venta(s)')
return
for sale in sales:
invoices = sale.invoices
if invoices:
for invoice in invoices:
if not invoice.invoice_date:
invoice.invoice_date = sale.sale_date
Invoice.save([invoice])
Invoice.validate_invoice(invoices)
Invoice.post(invoices)
shipments = sale.shipments
if shipments:
for shipment in shipments:
shipment.effective_date = sale.sale_date
Shipment.save([shipment])
Shipment.assign_wizard(shipments)
Shipment.pack(shipments)
Shipment.done(shipments)
class SaleLine(metaclass=PoolMeta):
__name__ = 'sale.line'
@classmethod
def __setup__(cls):
super(SaleLine, cls).__setup__()
# Allow edit product, quantity and unit in lines without parent sale
for fname in ('product', 'quantity', 'unit','unit_price'):
field = getattr(cls, fname)
if field.states.get('readonly'):
del field.states['readonly']
class WizardSalePayment(metaclass=PoolMeta):
__name__ = 'sale.payment'
print_ = StateReport('sale_pos.sale_ticket')
def default_start(self, fields):
Sale = Pool().get('sale.sale')
sale = Sale(Transaction().context['active_id'])
result = super(WizardSalePayment, self).default_start(fields)
result['self_pick_up'] = sale.self_pick_up
return result
def transition_pay_(self):
pool = Pool()
Sale = pool.get('sale.sale')
active_id = Transaction().context.get('active_id', False)
sale = Sale(active_id)
result = super(WizardSalePayment, self).transition_pay_()
Sale.print_ticket([sale])
if len(sale.lines)>0:
Sale.to_done([sale])
if result == 'end':
return 'print_'
return result
def transition_print_(self):
return 'end'
def do_print_(self, action):
data = {}
data['id'] = Transaction().context['active_ids'].pop()
data['ids'] = [data['id']]
return action, data