2009-10-13 05:58:37 +00:00
# -*- coding: utf-8 -*-
2008-08-24 14:45:43 +00:00
##############################################################################
2009-10-14 11:15:34 +00:00
#
# OpenERP, Open Source Management Solution
2010-01-12 09:18:39 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
2008-08-24 14:45:43 +00:00
#
2008-11-03 19:18:56 +00:00
# This program is free software: you can redistribute it and/or modify
2009-10-14 11:15:34 +00:00
# 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.
2008-08-24 14:45:43 +00:00
#
2008-11-03 19:18:56 +00:00
# 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
2009-10-14 11:15:34 +00:00
# GNU Affero General Public License for more details.
2008-08-24 14:45:43 +00:00
#
2009-10-14 11:15:34 +00:00
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2008-08-24 14:45:43 +00:00
#
##############################################################################
import time
2010-07-02 14:09:05 +00:00
2008-08-24 14:45:43 +00:00
from report import report_sxw
class crossovered_analytic ( report_sxw . rml_parse ) :
def __init__ ( self , cr , uid , name , context ) :
2010-07-02 14:09:05 +00:00
super ( crossovered_analytic , self ) . __init__ ( cr , uid , name , context = context )
2008-08-24 14:45:43 +00:00
self . localcontext . update ( {
' time ' : time ,
' lines ' : self . _lines ,
' ref_lines ' : self . _ref_lines ,
' find_children ' : self . find_children ,
} )
2010-07-02 14:09:05 +00:00
self . base_amount = 0.00
2008-08-24 14:45:43 +00:00
def find_children ( self , ref_ids ) :
to_return_ids = [ ]
final_list = [ ]
parent_list = [ ]
set_list = [ ]
for id in ref_ids :
# to avoid duplicate entries
if id not in to_return_ids :
to_return_ids . append ( self . pool . get ( ' account.analytic.account ' ) . search ( self . cr , self . uid , [ ( ' parent_id ' , ' child_of ' , [ id ] ) ] ) )
data_accnt = self . pool . get ( ' account.analytic.account ' ) . browse ( self . cr , self . uid , to_return_ids [ 0 ] )
for data in data_accnt :
if data . parent_id and data . parent_id . id == ref_ids [ 0 ] :
parent_list . append ( data . id )
final_list . append ( ref_ids [ 0 ] )
set_list = self . set_account ( parent_list )
final_list . extend ( set_list )
return final_list #to_return_ids[0]
def set_account ( self , cats ) :
lst = [ ]
category = self . pool . get ( ' account.analytic.account ' ) . read ( self . cr , self . uid , cats )
for cat in category :
lst . append ( cat [ ' id ' ] )
if cat [ ' child_ids ' ] :
lst . extend ( self . set_account ( cat [ ' child_ids ' ] ) )
return lst
def _ref_lines ( self , form ) :
result = [ ]
res = { }
acc_id = [ ]
final = [ ]
acc_pool = self . pool . get ( ' account.analytic.account ' )
line_pool = self . pool . get ( ' account.analytic.line ' )
self . dict_acc_ref = { }
if form [ ' journal_ids ' ] [ 0 ] [ 2 ] :
journal = " in ( " + ' , ' . join ( map ( lambda x : str ( x ) , form [ ' journal_ids ' ] [ 0 ] [ 2 ] ) ) + " ) "
else :
journal = ' is not null '
query_general = " select id from account_analytic_line where (journal_id " + journal + " ) AND date>= ' " + str ( form [ ' date1 ' ] ) + " ' " " AND date<= ' " + str ( form [ ' date2 ' ] ) + " ' "
self . cr . execute ( query_general )
l_ids = self . cr . fetchall ( )
line_ids = [ x [ 0 ] for x in l_ids ]
obj_line = line_pool . browse ( self . cr , self . uid , line_ids )
#this structure will be usefull for easily knowing the account_analytic_line that are related to the reference account. At this purpose, we save the move_id of analytic lines.
self . dict_acc_ref [ form [ ' ref ' ] ] = [ ]
children_list = self . pool . get ( ' account.analytic.account ' ) . search ( self . cr , self . uid , [ ( ' parent_id ' , ' child_of ' , [ form [ ' ref ' ] ] ) ] )
for obj in obj_line :
if obj . account_id . id in children_list :
if obj . move_id and obj . move_id . id not in self . dict_acc_ref [ form [ ' ref ' ] ] :
self . dict_acc_ref [ form [ ' ref ' ] ] . append ( obj . move_id . id )
res [ ' ref_name ' ] = acc_pool . name_get ( self . cr , self . uid , [ form [ ' ref ' ] ] ) [ 0 ] [ 1 ]
res [ ' ref_code ' ] = acc_pool . browse ( self . cr , self . uid , form [ ' ref ' ] ) . code
self . final_list = children_list
selected_ids = line_pool . search ( self . cr , self . uid , [ ( ' account_id ' , ' in ' , self . final_list ) ] )
query = " SELECT sum(aal.amount) AS amt, sum(aal.unit_amount) AS qty FROM account_analytic_line AS aal, account_analytic_account AS aaa \
WHERE aal . account_id = aaa . id AND aal . id IN ( " + ' , ' .join(map(str,selected_ids))+ " ) AND ( aal . journal_id " + journal + " ) AND aal . date > = ' " + str(form[ ' date1 ' ]) + " ' " " AND aal . date < = ' " + str(form[ ' date2 ' ]) + " ' "
self . cr . execute ( query )
info = self . cr . dictfetchall ( )
res [ ' ref_qty ' ] = info [ 0 ] [ ' qty ' ]
res [ ' ref_amt ' ] = info [ 0 ] [ ' amt ' ]
self . base_amount = info [ 0 ] [ ' amt ' ]
result . append ( res )
return result
def _lines ( self , form , ids = { } ) :
if not ids :
ids = self . ids
if form [ ' journal_ids ' ] [ 0 ] [ 2 ] :
journal = " in ( " + ' , ' . join ( map ( lambda x : str ( x ) , form [ ' journal_ids ' ] [ 0 ] [ 2 ] ) ) + " ) "
else :
journal = ' is not null '
acc_pool = self . pool . get ( ' account.analytic.account ' )
line_pool = self . pool . get ( ' account.analytic.line ' )
acc_id = [ ]
final = [ ]
child_ids = [ ]
self . list_ids = [ ]
self . final_list = self . find_children ( ids )
for acc_id in self . final_list :
selected_ids = line_pool . search ( self . cr , self . uid , [ ( ' account_id ' , ' = ' , acc_id ) , ( ' move_id ' , ' in ' , self . dict_acc_ref [ form [ ' ref ' ] ] ) ] )
if selected_ids :
query = " SELECT aaa.code as code , sum(aal.amount) AS amt, sum(aal.unit_amount) AS qty,aaa.name as acc_name,aal.account_id as id FROM account_analytic_line AS aal, account_analytic_account AS aaa \
WHERE aal . account_id = aaa . id AND aal . id IN ( " + ' , ' .join(map(str,selected_ids))+ " ) AND ( aal . journal_id " + journal + " ) AND aal . date > = ' " + str(form[ ' date1 ' ]) + " ' " " AND aal . date < = ' " + str(form[ ' date2 ' ]) + " ' " " GROUP BY aal . account_id , aaa . name , aaa . code ORDER BY aal . account_id "
self . cr . execute ( query )
res = self . cr . dictfetchall ( )
if res :
for element in res :
if self . base_amount < > 0.00 :
element [ ' perc ' ] = ( element [ ' amt ' ] / self . base_amount ) * 100.00
else :
element [ ' perc ' ] = 0.00
else :
result = { }
res = [ ]
result [ ' id ' ] = acc_id
data_account = acc_pool . browse ( self . cr , self . uid , acc_id )
result [ ' acc_name ' ] = data_account . name
result [ ' code ' ] = data_account . code
result [ ' amt ' ] = result [ ' qty ' ] = result [ ' perc ' ] = 0.00
if not form [ ' empty_line ' ] :
res . append ( result )
else :
2010-07-02 14:09:05 +00:00
result = { }
res = [ ]
result [ ' id ' ] = acc_id
2008-08-24 14:45:43 +00:00
data_account = acc_pool . browse ( self . cr , self . uid , acc_id )
2010-07-02 14:09:05 +00:00
result [ ' acc_name ' ] = data_account . name
2008-08-24 14:45:43 +00:00
result [ ' code ' ] = data_account . code
2010-07-02 14:09:05 +00:00
result [ ' amt ' ] = result [ ' qty ' ] = result [ ' perc ' ] = 0.00
2008-08-24 14:45:43 +00:00
if not form [ ' empty_line ' ] :
res . append ( result )
for item in res :
2010-07-02 14:09:05 +00:00
obj_acc = acc_pool . name_get ( self . cr , self . uid , [ item [ ' id ' ] ] )
item [ ' acc_name ' ] = obj_acc [ 0 ] [ 1 ]
2008-08-24 14:45:43 +00:00
final . append ( item )
return final
2010-07-02 14:09:05 +00:00
report_sxw . report_sxw ( ' report.account.analytic.account.crossovered.analytic ' , ' account.analytic.account ' , ' addons/account_analytic_plans/report/crossovered_analytic.rml ' , parser = crossovered_analytic , header = False )
2008-08-24 14:45:43 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: