Recursive algorithm to compute achievements on an analytic account budget (report)
bzr revid: rde-3885b003fd87372fc4109d666c6268fb7b8623eb
This commit is contained in:
parent
e5ace0986a
commit
84d554464d
|
@ -49,7 +49,10 @@ class account_analytic_budget_report(report_sxw.rml_parse):
|
||||||
for d in post_obj.dotation_ids:
|
for d in post_obj.dotation_ids:
|
||||||
i = interval(d.period_id.date_start, d.period_id.date_stop)
|
i = interval(d.period_id.date_start, d.period_id.date_stop)
|
||||||
total_days = reduce(lambda x,d: x+interval(d.period_id.date_start, d.period_id.date_stop), post_obj.dotation_ids, 0)
|
total_days = reduce(lambda x,d: x+interval(d.period_id.date_start, d.period_id.date_stop), post_obj.dotation_ids, 0)
|
||||||
|
#OLD <==>
|
||||||
achievements = reduce(lambda x,l: x+l['achievements'], self.lines(post_obj, date1, date2), 0.0)
|
achievements = reduce(lambda x,l: x+l['achievements'], self.lines(post_obj, date1, date2), 0.0)
|
||||||
|
##node_achievements = reduce(operator.add, [
|
||||||
|
|
||||||
return [{'prev': prev, 'prev_period': prev * period_days / total_days, 'achievements': achievements}]
|
return [{'prev': prev, 'prev_period': prev * period_days / total_days, 'achievements': achievements}]
|
||||||
|
|
||||||
def budget_total(self, post_objs, date1, date2):
|
def budget_total(self, post_objs, date1, date2):
|
||||||
|
@ -59,37 +62,31 @@ class account_analytic_budget_report(report_sxw.rml_parse):
|
||||||
for k in r:
|
for k in r:
|
||||||
res[k] += r[k]
|
res[k] += r[k]
|
||||||
return [res]
|
return [res]
|
||||||
|
|
||||||
|
|
||||||
#NEW
|
#NEW recursive method
|
||||||
# def lines_rec(self, a, post_obj, date1, date2):
|
def lines(self, post_obj, date1, date2):
|
||||||
# self.cr.execute("SELECT COALESCE(SUM(debit-credit), 0) FROM account_move_line WHERE account_id=%d AND date>=%s AND date<=%s and state<>'draft'", (a.id, date1, date2))
|
def compute_achievements(a):
|
||||||
# achievements = float(self.cr.fetchone()[0]) * (post_obj.sens=='produit' and -1 or 1)
|
self.cr.execute("SELECT COALESCE(SUM(debit-credit), 0) FROM account_move_line WHERE account_id=%d AND date>=%s AND date<=%s and state<>'draft'", (a.id, date1, date2))
|
||||||
# res= {'name': a.name, 'code': a.code, 'achievements': achievements}
|
node_achievements = float(self.cr.fetchone()[0]) * (post_obj.sens=='produit' and -1 or 1)
|
||||||
|
childs_achievements = reduce(operator.add, [compute_achievements(c) for c in a.child_ids])
|
||||||
|
return node_achievements + childs_achievements
|
||||||
|
|
||||||
|
res = []
|
||||||
|
for a in post_obj.account_ids:
|
||||||
|
achievements = account_achievements(a, date1, date2)
|
||||||
|
res.append({'name': a.name, 'code': a.code, 'achievements': compute_achievements(a)})
|
||||||
|
|
||||||
# for c in a.child_ids:
|
return res
|
||||||
# res.extend(lines_rec(child, post_obj, date1, date2))
|
|
||||||
|
|
||||||
# return res
|
# OLD, nonrecursive method !
|
||||||
|
# def lines(self, post_obj, date1, date2):
|
||||||
|
# res = []
|
||||||
|
|
||||||
#OLD
|
|
||||||
# for a in post_obj.account_ids:
|
# for a in post_obj.account_ids:
|
||||||
# self.cr.execute("SELECT COALESCE(SUM(debit-credit), 0) FROM account_move_line WHERE account_id=%d AND date>=%s AND date<=%s and state<>'draft'", (a.id, date1, date2))
|
# self.cr.execute("SELECT COALESCE(SUM(debit-credit), 0) FROM account_move_line WHERE account_id=%d AND date>=%s AND date<=%s and state<>'draft'", (a.id, date1, date2))
|
||||||
# achievements = float(self.cr.fetchone()[0]) * (post_obj.sens=='produit' and -1 or 1)
|
# achievements = float(self.cr.fetchone()[0]) * (post_obj.sens=='produit' and -1 or 1)
|
||||||
# res.append({'name': a.name, 'code': a.code, 'achievements': achievements})
|
# res.append({'name': a.name, 'code': a.code, 'achievements': achievements})
|
||||||
# for c in a.child_ids: # FIXME : JUST AN IDEA doesn't work
|
|
||||||
# res.extend(lines_rec(post_obj, date1, date2))
|
|
||||||
|
|
||||||
def lines(self, post_obj, date1, date2):
|
|
||||||
res = []
|
|
||||||
for a in post_obj.account_ids:
|
|
||||||
self.cr.execute("SELECT COALESCE(SUM(debit-credit), 0) FROM account_move_line WHERE account_id=%d AND date>=%s AND date<=%s and state<>'draft'", (a.id, date1, date2))
|
|
||||||
achievements = float(self.cr.fetchone()[0]) * (post_obj.sens=='produit' and -1 or 1)
|
|
||||||
res.append({'name': a.name, 'code': a.code, 'achievements': achievements})
|
|
||||||
|
|
||||||
return res
|
# return res
|
||||||
|
|
||||||
report_sxw.report_sxw('report.account.analytic.budget.print', 'account.analytic.budget.post', 'addons/account/project/report/account_analytic_budget_report.rml',parser=account_analytic_budget_report)
|
report_sxw.report_sxw('report.account.analytic.budget.print', 'account.analytic.budget.post', 'addons/account/project/report/account_analytic_budget_report.rml',parser=account_analytic_budget_report)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
Les comptes analytiques sont organisés en une structure de N-arbre.
|
|
||||||
- Pour un compte C qui n'a pas de fils, on calcule l'achievement de C (voir requête SQL).
|
|
||||||
- Pour un compte C' qui a n fils, on calcule l'achievement des n fils de C' (requêtes SQL propres à ces fils). On additionne l'achievement de chaque fils à l'achievement de C.
|
|
||||||
|
|
||||||
Donc, il faut arriver à - écrire une routine qui calcule l'achievement d'un compte donné
|
|
||||||
- fusionner les achievements des divers comptes
|
|
Loading…
Reference in New Issue