[IMP] purchase: invoice creation more modular/extensible through the introduction of a _prepare_invoice method()
This is similar to what was previously done for Sales Orders. bzr revid: odo@openerp.com-20140430140103-hfumie3ndvlodgeh
This commit is contained in:
parent
7dedde91ef
commit
52480275c3
|
@ -494,6 +494,41 @@ class purchase_order(osv.osv):
|
||||||
'purchase_line_id': order_line.id,
|
'purchase_line_id': order_line.id,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def _prepare_invoice(self, cr, uid, order, line_ids, context=None):
|
||||||
|
"""Prepare the dict of values to create the new invoice for a
|
||||||
|
purchase order. This method may be overridden to implement custom
|
||||||
|
invoice generation (making sure to call super() to establish
|
||||||
|
a clean extension chain).
|
||||||
|
|
||||||
|
:param browse_record order: purchase.order record to invoice
|
||||||
|
:param list(int) line_ids: list of invoice line IDs that must be
|
||||||
|
attached to the invoice
|
||||||
|
:return: dict of value to create() the invoice
|
||||||
|
"""
|
||||||
|
journal_ids = self.pool['account.journal'].search(
|
||||||
|
cr, uid, [('type', '=', 'purchase'),
|
||||||
|
('company_id', '=', order.company_id.id)],
|
||||||
|
limit=1)
|
||||||
|
if not journal_ids:
|
||||||
|
raise osv.except_osv(
|
||||||
|
_('Error!'),
|
||||||
|
_('Define purchase journal for this company: "%s" (id:%d).') % \
|
||||||
|
(order.company_id.name, order.company_id.id))
|
||||||
|
return {
|
||||||
|
'name': order.partner_ref or order.name,
|
||||||
|
'reference': order.partner_ref or order.name,
|
||||||
|
'account_id': order.partner_id.property_account_payable.id,
|
||||||
|
'type': 'in_invoice',
|
||||||
|
'partner_id': order.partner_id.id,
|
||||||
|
'currency_id': order.currency_id.id,
|
||||||
|
'journal_id': len(journal_ids) and journal_ids[0] or False,
|
||||||
|
'invoice_line': [(6, 0, line_ids)],
|
||||||
|
'origin': order.name,
|
||||||
|
'fiscal_position': order.fiscal_position.id or False,
|
||||||
|
'payment_term': order.payment_term_id.id or False,
|
||||||
|
'company_id': order.company_id.id,
|
||||||
|
}
|
||||||
|
|
||||||
def action_cancel_draft(self, cr, uid, ids, context=None):
|
def action_cancel_draft(self, cr, uid, ids, context=None):
|
||||||
if not len(ids):
|
if not len(ids):
|
||||||
return False
|
return False
|
||||||
|
@ -512,7 +547,7 @@ class purchase_order(osv.osv):
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
journal_obj = self.pool.get('account.journal')
|
|
||||||
inv_obj = self.pool.get('account.invoice')
|
inv_obj = self.pool.get('account.invoice')
|
||||||
inv_line_obj = self.pool.get('account.invoice.line')
|
inv_line_obj = self.pool.get('account.invoice.line')
|
||||||
|
|
||||||
|
@ -525,12 +560,7 @@ class purchase_order(osv.osv):
|
||||||
#then re-do a browse to read the property fields for the good company.
|
#then re-do a browse to read the property fields for the good company.
|
||||||
context['force_company'] = order.company_id.id
|
context['force_company'] = order.company_id.id
|
||||||
order = self.browse(cr, uid, order.id, context=context)
|
order = self.browse(cr, uid, order.id, context=context)
|
||||||
pay_acc_id = order.partner_id.property_account_payable.id
|
|
||||||
journal_ids = journal_obj.search(cr, uid, [('type', '=', 'purchase'), ('company_id', '=', order.company_id.id)], limit=1)
|
|
||||||
if not journal_ids:
|
|
||||||
raise osv.except_osv(_('Error!'),
|
|
||||||
_('Define purchase journal for this company: "%s" (id:%d).') % (order.company_id.name, order.company_id.id))
|
|
||||||
|
|
||||||
# generate invoice line correspond to PO line and link that to created invoice (inv_id) and PO line
|
# generate invoice line correspond to PO line and link that to created invoice (inv_id) and PO line
|
||||||
inv_lines = []
|
inv_lines = []
|
||||||
for po_line in order.order_line:
|
for po_line in order.order_line:
|
||||||
|
@ -538,24 +568,10 @@ class purchase_order(osv.osv):
|
||||||
inv_line_data = self._prepare_inv_line(cr, uid, acc_id, po_line, context=context)
|
inv_line_data = self._prepare_inv_line(cr, uid, acc_id, po_line, context=context)
|
||||||
inv_line_id = inv_line_obj.create(cr, uid, inv_line_data, context=context)
|
inv_line_id = inv_line_obj.create(cr, uid, inv_line_data, context=context)
|
||||||
inv_lines.append(inv_line_id)
|
inv_lines.append(inv_line_id)
|
||||||
|
|
||||||
po_line.write({'invoice_lines': [(4, inv_line_id)]}, context=context)
|
po_line.write({'invoice_lines': [(4, inv_line_id)]}, context=context)
|
||||||
|
|
||||||
# get invoice data and create invoice
|
# get invoice data and create invoice
|
||||||
inv_data = {
|
inv_data = self._prepare_invoice(cr, uid, order, inv_lines, context=context)
|
||||||
'name': order.partner_ref or order.name,
|
|
||||||
'reference': order.partner_ref or order.name,
|
|
||||||
'account_id': pay_acc_id,
|
|
||||||
'type': 'in_invoice',
|
|
||||||
'partner_id': order.partner_id.id,
|
|
||||||
'currency_id': order.currency_id.id,
|
|
||||||
'journal_id': len(journal_ids) and journal_ids[0] or False,
|
|
||||||
'invoice_line': [(6, 0, inv_lines)],
|
|
||||||
'origin': order.name,
|
|
||||||
'fiscal_position': order.fiscal_position.id or False,
|
|
||||||
'payment_term': order.payment_term_id.id or False,
|
|
||||||
'company_id': order.company_id.id,
|
|
||||||
}
|
|
||||||
inv_id = inv_obj.create(cr, uid, inv_data, context=context)
|
inv_id = inv_obj.create(cr, uid, inv_data, context=context)
|
||||||
|
|
||||||
# compute the invoice
|
# compute the invoice
|
||||||
|
|
Loading…
Reference in New Issue