From 7b67622bb3cc4ea95aeb44e29ada512c4dbdff18 Mon Sep 17 00:00:00 2001
From: ced <>
Date: Mon, 26 Nov 2007 15:46:28 +0000
Subject: [PATCH] Add invoice on account move line
bzr revid: ced-ca6510089ba536e235c17e0d641412d99143168c
---
addons/account/account_move_line.py | 71 +++++++++++++++++++++++++++++
addons/account/account_view.xml | 3 +-
2 files changed, 73 insertions(+), 1 deletion(-)
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index 1bf889a65be..75a85854e1f 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -179,6 +179,74 @@ class account_move_line(osv.osv):
res[id] = cr.fetchone()[0]
return res
+ def _invoice(self, cursor, user, ids, name, arg, context=None):
+ invoice_obj = self.pool.get('account.invoice')
+ res = {}
+ for line_id in ids:
+ res[line_id] = False
+ cursor.execute('SELECT l.id, i.id ' \
+ 'FROM account_move_line l, account_invoice i ' \
+ 'WHERE l.move_id = i.move_id ' \
+ 'AND l.id in (' + ','.join([str(x) for x in ids]) + ')')
+ invoice_ids = []
+ for line_id, invoice_id in cursor.fetchall():
+ res[line_id] = invoice_id
+ invoice_ids.append(invoice_id)
+ invoice_names = {False: ''}
+ for invoice_id, name in invoice_obj.name_get(cursor, user,
+ invoice_ids, context=context):
+ invoice_names[invoice_id] = name
+ for line_id in res.keys():
+ invoice_id = res[line_id]
+ res[line_id] = (invoice_id, invoice_names[invoice_id])
+ return res
+
+ def _invoice_search(self, cursor, user, obj, name, args):
+ if not len(args):
+ return []
+ invoice_obj = self.pool.get('account.invoice')
+
+ i = 0
+ while i < len(args):
+ fargs = args[i][0].split('.', 1)
+ if len(fargs) > 1:
+ args[i] = (frags[0], 'in', invoice_obj.search(cursor, user,
+ [(fargs[1], args[i][1], args[i][2])]))
+ i += 1
+ continue
+ if isinstance(args[i][2], basestring):
+ res_ids = invoice_obj.name_search(cursor, user, args[i][2], [],
+ args[i][1])
+ args[i] = (args[i][0], 'in', [x[0] for x in res_ids])
+ i += 1
+ qu1, qu2 = [], []
+ for x in args:
+ if x[1] != 'in':
+ if (x[2] is False) and (x[1] == '='):
+ qu1.append('(i.id IS NULL)')
+ elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='):
+ qu1.append('(i.id IS NOT NULL)')
+ else:
+ qu1.append('(i.id %s %s)' % (x[1], '%d'))
+ qu2.append(x[2])
+ elif x[1] == 'in':
+ if len(x[2]) > 0:
+ qu1.append('(i.id in (%s))' % (','.join(['%d'] * len(x[2]))))
+ qu2 += x[2]
+ else:
+ qu1.append(' (False)')
+ if len(qu1):
+ qu1 = ' AND' + ' AND'.join(qu1)
+ else:
+ qu1 = ''
+ cursor.execute('SELECT l.id ' \
+ 'FROM account_move_line l, account_invoice i ' \
+ 'WHERE l.move_id = i.move_id ' + qu1, qu2)
+ res = cursor.fetchall()
+ if not len(res):
+ return [('id', '=', '0')]
+ return [('id', 'in', [x[0] for x in res])]
+
_columns = {
'name': fields.char('Name', size=64, required=True),
'quantity': fields.float('Quantity', digits=(16,2), help="The optionnal quantity expressed by this line, eg: number of product sold. The quantity is not a legal requirement but is very usefull for some reports."),
@@ -209,7 +277,10 @@ class account_move_line(osv.osv):
'state': fields.selection([('draft','Draft'), ('valid','Valid')], 'State', readonly=True),
'tax_code_id': fields.many2one('account.tax.code', 'Tax Account'),
'tax_amount': fields.float('Tax/Base Amount', digits=(16,2), select=True),
+ 'invoice': fields.function(_invoice, method=True, string='Invoice',
+ type='many2one', relation='account.invoice', fnct_search=_invoice_search),
}
+
def _get_date(self, cr, uid, context):
period_obj = self.pool.get('account.period')
dt = time.strftime('%Y-%m-%d')
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 3b3270d1aad..57dbaffccc5 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -686,6 +686,7 @@
+
@@ -713,7 +714,7 @@
-
+