trytondo-sale_one_click/sale.py

98 lines
3.5 KiB
Python

# -*- coding: utf-8 -*-
from trytond.wizard import Wizard, StateAction, StateView, StateTransition, \
Button
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
import logging
from trytond.model import Workflow, ModelView, ModelSQL
from trytond.modules.account.tax import TaxableMixin
from trytond.pyson import Eval
from .exceptions import ErroresGenerales
from trytond.i18n import gettext
logger = logging.getLogger(__name__)
__all__ = ['OneClickForSale','Sale']
class Sale(metaclass=PoolMeta):
'Sale'
__name__ = 'sale.sale'
@classmethod
def __setup__(cls):
super(Sale, cls).__setup__()
cls._buttons.update({
'draft_to_done': {
'invisible': ~Eval('state').in_(['draft']),
'readonly': ~Eval('lines', []),
},
})
@classmethod
@ModelView.button
def draft_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 sale.state != 'draft' or len(sale.lines)<1:
raise ErroresGenerales(gettext('one_click_for_sale.msg_noborrador_sinlineas').format(s=sale.number))
return
else:
raise ErroresGenerales(gettext('one_click_for_sale.msg_error_ventanas'))
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:
raise ErroresGenerales(gettext('one_click_for_sale.msg_fallo_finalizacion'))
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 OneClickForSale(Wizard):
'''Venta en un click.
Procesa una venta en estado de borrador llevandola al estado "procesada",
creando las Facturas y Movimientos de Stock además contabiliza las facturas
y finaliza los movimientos de stock y los envios.
'''
__name__ = 'sale.one_click_for_sale'
start = StateTransition()
def transition_start(self):
Sale = Pool().get('sale.sale')
sales = Sale.browse(Transaction().context['active_ids'])
Sale.draft_to_done(sales)
return 'end'