2014-12-02 12:55:49 +01:00
|
|
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
|
|
|
# this repository contains the full copyright notices and license terms.
|
2012-09-24 22:18:10 +02:00
|
|
|
from trytond.model import ModelSQL, fields
|
2010-08-16 19:29:08 +02:00
|
|
|
from trytond.transaction import Transaction
|
2012-09-24 22:18:10 +02:00
|
|
|
from trytond.pool import Pool, PoolMeta
|
|
|
|
|
|
2016-12-21 09:16:52 +01:00
|
|
|
__all__ = ['Purchase', 'PurchaseIgnoredInvoiceLine',
|
2012-10-15 22:58:25 +02:00
|
|
|
'HandleInvoiceException']
|
2011-07-03 13:19:10 +02:00
|
|
|
|
2008-12-08 14:04:30 +01:00
|
|
|
|
2018-06-26 19:11:51 +02:00
|
|
|
class Purchase(metaclass=PoolMeta):
|
2012-09-24 22:18:10 +02:00
|
|
|
__name__ = 'purchase.purchase'
|
2014-03-17 23:23:46 +01:00
|
|
|
invoice_lines = fields.Function(fields.One2Many('account.invoice.line',
|
|
|
|
|
None, 'Invoice Lines'), 'get_invoice_lines',
|
|
|
|
|
searcher='search_invoice_lines')
|
2009-03-05 14:53:19 +01:00
|
|
|
invoice_lines_ignored = fields.Many2Many(
|
|
|
|
|
'purchase.purchase-ignored-account.invoice.line',
|
|
|
|
|
'purchase', 'invoice', 'Invoice Lines Ignored', readonly=True)
|
2008-12-08 14:04:30 +01:00
|
|
|
|
2014-03-17 23:23:46 +01:00
|
|
|
def get_invoice_lines(self, name):
|
|
|
|
|
return list({il.id for l in self.lines for il in l.invoice_lines})
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def search_invoice_lines(cls, name, clause):
|
2017-09-27 18:37:31 +02:00
|
|
|
return [('lines.' + clause[0],) + tuple(clause[1:])]
|
2014-03-17 23:23:46 +01:00
|
|
|
|
2016-03-20 22:59:23 +01:00
|
|
|
def create_invoice(self):
|
2012-09-24 22:18:10 +02:00
|
|
|
pool = Pool()
|
|
|
|
|
Invoice = pool.get('account.invoice')
|
|
|
|
|
InvoiceLine = pool.get('account.invoice.line')
|
2008-12-08 14:04:30 +01:00
|
|
|
|
2016-03-20 22:59:23 +01:00
|
|
|
invoice = super(Purchase, self).create_invoice()
|
2008-12-08 14:04:30 +01:00
|
|
|
|
2012-09-24 22:18:10 +02:00
|
|
|
if invoice:
|
2013-03-24 23:25:45 +01:00
|
|
|
lines_to_delete = [l for l in invoice.lines if l.type != 'line']
|
|
|
|
|
lines = [l for l in invoice.lines if l.type == 'line']
|
2014-09-17 21:45:47 +02:00
|
|
|
InvoiceLine.write(lines, {
|
|
|
|
|
'invoice': None,
|
|
|
|
|
'invoice_type': invoice.type,
|
|
|
|
|
'party': invoice.party.id,
|
|
|
|
|
'currency': invoice.currency.id,
|
|
|
|
|
'company': invoice.company.id,
|
|
|
|
|
})
|
|
|
|
|
InvoiceLine.delete(lines_to_delete)
|
|
|
|
|
Invoice.cancel([invoice])
|
|
|
|
|
Invoice.delete([invoice])
|
2012-03-25 00:18:11 +01:00
|
|
|
return None
|
2012-09-24 22:18:10 +02:00
|
|
|
return invoice
|
2008-12-08 14:04:30 +01:00
|
|
|
|
2012-09-24 22:18:10 +02:00
|
|
|
def get_invoice_state(self):
|
|
|
|
|
state = super(Purchase, self).get_invoice_state()
|
|
|
|
|
skips = set(x.id for x in self.invoice_lines_ignored)
|
2012-10-11 17:55:42 +02:00
|
|
|
invoice_lines = [l for l in self.invoice_lines if l.id not in skips]
|
2012-03-25 00:18:11 +01:00
|
|
|
if invoice_lines:
|
|
|
|
|
if any(l.invoice and l.invoice.state == 'cancel'
|
|
|
|
|
for l in invoice_lines):
|
|
|
|
|
return 'exception'
|
|
|
|
|
elif (state == 'paid'
|
|
|
|
|
and all(l.invoice for l in invoice_lines)
|
|
|
|
|
and all(l.invoice.state == 'paid' for l in invoice_lines)):
|
|
|
|
|
return 'paid'
|
2014-03-04 23:12:33 +01:00
|
|
|
else:
|
|
|
|
|
return 'waiting'
|
2012-03-25 00:18:11 +01:00
|
|
|
return state
|
2008-12-08 14:04:30 +01:00
|
|
|
|
2012-09-24 22:18:10 +02:00
|
|
|
@classmethod
|
|
|
|
|
def copy(cls, purchases, default=None):
|
2008-12-08 14:04:30 +01:00
|
|
|
if default is None:
|
|
|
|
|
default = {}
|
|
|
|
|
default = default.copy()
|
2012-03-27 10:43:56 +02:00
|
|
|
default['invoice_lines_ignored'] = None
|
2012-09-24 22:18:10 +02:00
|
|
|
return super(Purchase, cls).copy(purchases, default=default)
|
2008-12-08 14:04:30 +01:00
|
|
|
|
2009-03-05 14:53:19 +01:00
|
|
|
|
|
|
|
|
class PurchaseIgnoredInvoiceLine(ModelSQL):
|
|
|
|
|
'Purchase - Ignored Invoice Line'
|
2012-09-24 22:18:10 +02:00
|
|
|
__name__ = 'purchase.purchase-ignored-account.invoice.line'
|
2009-03-05 14:53:19 +01:00
|
|
|
_table = 'purchase_invoice_line_ignored_rel'
|
|
|
|
|
purchase = fields.Many2One('purchase.purchase', 'Purchase',
|
2012-03-05 10:53:06 +01:00
|
|
|
ondelete='CASCADE', select=True, required=True)
|
2009-03-05 14:53:19 +01:00
|
|
|
invoice = fields.Many2One('account.invoice.line', 'Invoice Line',
|
2012-03-05 10:53:06 +01:00
|
|
|
ondelete='RESTRICT', select=True, required=True)
|
2012-10-15 22:58:25 +02:00
|
|
|
|
|
|
|
|
|
2018-06-26 19:11:51 +02:00
|
|
|
class HandleInvoiceException(metaclass=PoolMeta):
|
2012-10-15 22:58:25 +02:00
|
|
|
__name__ = 'purchase.handle.invoice.exception'
|
|
|
|
|
|
|
|
|
|
def transition_handle(self):
|
|
|
|
|
Purchase = Pool().get('purchase.purchase')
|
|
|
|
|
|
|
|
|
|
state = super(HandleInvoiceException, self).transition_handle()
|
|
|
|
|
|
|
|
|
|
purchase = Purchase(Transaction().context['active_id'])
|
|
|
|
|
invoice_lines = []
|
|
|
|
|
for invoice_line in purchase.invoice_lines:
|
|
|
|
|
if (invoice_line.invoice
|
|
|
|
|
and invoice_line.invoice.state == 'cancel'):
|
|
|
|
|
invoice_lines.append(invoice_line.id)
|
|
|
|
|
if invoice_lines:
|
|
|
|
|
Purchase.write([purchase], {
|
|
|
|
|
'invoice_lines_ignored': [('add', invoice_lines)],
|
|
|
|
|
})
|
2018-07-27 09:28:30 +02:00
|
|
|
Purchase.__queue__.process([purchase])
|
2012-10-15 22:58:25 +02:00
|
|
|
return state
|