diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 18ab1a779a3..ccea4e1c1a8 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -701,6 +701,8 @@ class account_move_line(osv.osv): def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): if context is None: context = {} + if context and context.get('account_type', False): + args.append(('account_id.type', '=', context.get('account_type', False))) if context and context.get('next_partner_only', False): if not context.get('partner_id', False): partner = self.get_next_partner_only(cr, uid, offset, context) diff --git a/addons/account/account_move_reconciliation.py b/addons/account/account_move_reconciliation.py index a6675825ce8..232a0ae9aa7 100644 --- a/addons/account/account_move_reconciliation.py +++ b/addons/account/account_move_reconciliation.py @@ -23,18 +23,11 @@ import time import tools from osv import fields,osv -#4 remove get_unreconcile_entry method mange it with domain - class account_move_line(osv.osv): _inherit = "account.move.line" def get_unreconcile_entry(self, cr, uid, ids, context=None): - records = self.read(cr, uid, ids, ['reconcile_id']) - res = [] - for record in records: - if not record.get('reconcile_id'): - res.append(record['id']) - return res + return self.search(cr, uid, [('id', 'in', ids), ('reconcile_id', '=', False)], context=context) account_move_line(); @@ -43,59 +36,101 @@ class account_move_reconciliation(osv.osv): _name = "account.move.reconciliation" _description = "All partner info related account move line" _auto = False + + def _get_to_reconcile(self, cr, uid, context=None): + query= '' + if context and context.get('account_type', False) == 'payable': + query = 'AND p.supplier = True' + + cr.execute(""" + SELECT p_id FROM (SELECT l.partner_id as p_id, SUM(l.debit) AS debit, SUM(l.credit) AS credit + FROM account_move_line AS l LEFT JOIN account_account a ON (l.account_id = a.id) + LEFT JOIN res_partner p ON (p.id = l.partner_id) + WHERE a.reconcile = 't' + AND l.reconcile_id IS NULL + AND (%s > to_char(p.last_reconciliation_date, 'YYYY-MM-DD') OR p.last_reconciliation_date IS NULL ) + AND l.state <> 'draft' """ +query + """ + GROUP BY l.partner_id) AS tmp + WHERE debit >= 0 + AND credit >= 0 + """,(time.strftime('%Y-%m-%d'),) + ) + return len(map(lambda x: x[0], cr.fetchall())) - 1 + + def _get_today_reconciled(self, cr, uid, context=None): + query= '' + if context and context.get('account_type', False) == 'payable': + query = 'AND p.supplier = True' + + cr.execute( + """SELECT l.partner_id + FROM account_move_line AS l LEFT JOIN res_partner p ON (p.id = l.partner_id) + WHERE l.reconcile_id IS NULL + AND %s = to_char(p.last_reconciliation_date, 'YYYY-MM-DD') + AND l.state <> 'draft' """ +query + """ + GROUP BY l.partner_id """,(time.strftime('%Y-%m-%d'),) + ) + return len(map(lambda x: x[0], cr.fetchall())) + 1 def _rec_progress(self, cr, uid, ids, prop, unknow_none, context=None): - active_ids = context.get('active_ids', []) - res = 0 - if active_ids: - total_records = self.search(cr, uid, [('id','in',active_ids)]) - total_unreconcile = 0 - for record in self.read(cr, uid, total_records, ['unreconcile_count'], context=context): - if record['unreconcile_count'] > 0: - total_unreconcile += 1 - res = float(len(total_records) - total_unreconcile)/len(total_records) * 100 - res_all = {} + res = {} + to_reconcile = self._get_to_reconcile(cr, uid, context) + today_reconcile = self._get_today_reconciled(cr, uid, context) + if to_reconcile < 0: + reconciliation_progress = 100 + else: + reconciliation_progress = (100 / (float( to_reconcile + today_reconcile) or 1.0)) * today_reconcile for id in ids: - res_all[id] = res - return res_all + res[id] = reconciliation_progress + return res +# + def get_partners(self, cr, uid, context=None): + query= '' + if context and context.get('account_type', False) == 'payable': + query = 'AND p.supplier = True' + cr.execute( + """ + SELECT p.id + FROM res_partner p + RIGHT JOIN ( + SELECT l.partner_id AS partner_id, SUM(l.debit) AS debit, SUM(l.credit) AS credit + FROM account_move_line l + LEFT JOIN account_account a ON (a.id = l.account_id) + LEFT JOIN res_partner p ON (l.partner_id = p.id) + WHERE a.reconcile IS TRUE + AND l.reconcile_id IS NULL + AND (p.last_reconciliation_date IS NULL OR l.date > p.last_reconciliation_date) + AND l.state <> 'draft' """ +query + """ + GROUP BY l.partner_id + ) AS s ON (p.id = s.partner_id) + ORDER BY p.last_reconciliation_date""") + return cr.fetchall() def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): - obj_move_line = self.pool.get('account.move.line') ids = super(account_move_reconciliation, self).search(cr, uid, args, offset, limit, order, context, count) - res_ids = [] - for id in ids: - last_reconciliation_date = self.browse(cr, uid, id, context=context).last_reconciliation_date - if not last_reconciliation_date: - res_ids.append(id) - else: - move_ids = obj_move_line.search(cr, uid, [('partner_id','=', id),('date','>', last_reconciliation_date)]) - if move_ids: - res_ids.append(id) - return res_ids + res = self.get_partners(cr, uid, context=context) + return map(lambda x: x[0], res) def skip_partner(self, cr, uid, ids, context): - res_partner = self.pool.get('res.partner') - for partner in self.browse(cr, uid, ids, context=context): - res_partner.write(cr, uid, [partner.id] ,{'last_reconciliation_date':time.strftime("%Y-%m-%d")}) - + self.pool.get('res.partner').write(cr, uid, ids ,{'last_reconciliation_date':time.strftime("%Y-%m-%d")}, context) _columns = { 'partner_id':fields.many2one('res.partner', 'Partner'), 'last_reconciliation_date':fields.related('partner_id', 'last_reconciliation_date' ,type='datetime', relation='res.partner', string='Last Reconciliation'), 'latest_date' :fields.date('Latest Entry'), 'reconciliation_progress': fields.function(_rec_progress, string='Progress (%)', type='float'), - 'unreconcile_count':fields.integer('Unreconcile Count'), } + def init(self, cr): tools.drop_view_if_exists(cr, 'account_move_reconciliation') cr.execute(""" CREATE or REPLACE VIEW account_move_reconciliation as ( SELECT move_line.partner_id as id, move_line.partner_id, - MAX(move_line.date) as latest_date, - (select count(unreconcile.id) from account_move_line as unreconcile where unreconcile.reconcile_id is null and unreconcile.partner_id = move_line.partner_id) as unreconcile_count + MAX(move_line.date) as latest_date FROM account_move_line as move_line where move_line.state <> 'draft' GROUP by move_line.partner_id ) """) account_move_reconciliation() + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/account/account_move_reconciliation.xml b/addons/account/account_move_reconciliation.xml index 5e26b9c0bec..256492bfa48 100644 --- a/addons/account/account_move_reconciliation.xml +++ b/addons/account/account_move_reconciliation.xml @@ -17,7 +17,7 @@
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 3c27d3cfec1..2093b548044 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -1544,8 +1544,7 @@ form tree,form - [('partner_id.customer','=',True)] - + @@ -1554,8 +1553,7 @@ form tree,form - [('partner_id.supplier','=',True)] - + ). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## from osv import fields, osv import tools @@ -12,12 +32,11 @@ class account_move_reconciliation(osv.osv): def init(self, cr): tools.drop_view_if_exists(cr, 'account_move_reconciliation') cr.execute(""" - CREATE or REPLACE VIEW account_move_reconciliation as ( + CREATE or REPLACE VIEW account_move_reconciliation as ( SELECT move_line.partner_id as id, move_line.partner_id, - MAX(move_line.date) as latest_date, MAX(move_line.followup_date) as followup_date, MAX(move_line.followup_line_id) as max_followup_id, - (select count(unreconcile.id) from account_move_line as unreconcile where unreconcile.reconcile_id is null and unreconcile.partner_id = move_line.partner_id) as unreconcile_count + MAX(move_line.date) as latest_date FROM account_move_line as move_line where move_line.state <> 'draft' GROUP by move_line.partner_id )