2009-10-14 11:15:34 +00:00
# -*- coding: utf-8 -*-
##############################################################################
2007-07-17 08:28:19 +00:00
#
2008-09-25 08:33:16 +00:00
# Copyright (c) 2005-2006 CamptoCamp
2007-07-17 08:28:19 +00:00
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
2010-07-09 06:40:01 +00:00
#
##############################################################################
2007-07-17 08:28:19 +00:00
import time
2010-07-09 06:40:01 +00:00
2007-07-17 08:28:19 +00:00
from report import report_sxw
2008-09-25 08:33:16 +00:00
import rml_parse
2008-05-19 12:42:45 +00:00
import pooler
2007-07-17 08:28:19 +00:00
2008-09-25 08:33:16 +00:00
class general_ledger ( rml_parse . rml_parse ) :
2009-06-09 23:24:24 +00:00
_name = ' report.account.general.ledger '
def set_context ( self , objects , data , ids , report_type = None ) :
self . borne_date = self . get_min_date ( data [ ' form ' ] )
new_ids = [ ]
if ( data [ ' model ' ] == ' account.account ' ) :
2010-05-21 13:14:19 +00:00
new_ids = ' active_ids ' in data [ ' form ' ] [ ' context ' ] and data [ ' form ' ] [ ' context ' ] [ ' active_ids ' ] or [ ]
2009-06-09 23:24:24 +00:00
else :
2010-06-24 10:11:45 +00:00
new_ids . append ( data [ ' form ' ] [ ' chart_account_id ' ] )
objects = self . pool . get ( ' account.account ' ) . browse ( self . cr , self . uid , new_ids )
2009-06-09 23:24:24 +00:00
super ( general_ledger , self ) . set_context ( objects , data , new_ids , report_type )
2010-07-09 06:40:01 +00:00
def __init__ ( self , cr , uid , name , context = None ) :
if context is None :
context = { }
2009-10-09 11:49:00 +00:00
super ( general_ledger , self ) . __init__ ( cr , uid , name , context = context )
2009-06-09 23:24:24 +00:00
self . date_borne = { }
self . query = " "
self . child_ids = " "
self . tot_currency = 0.0
self . period_sql = " "
self . sold_accounts = { }
self . localcontext . update ( {
' time ' : time ,
' lines ' : self . lines ,
' sum_debit_account ' : self . _sum_debit_account ,
' sum_credit_account ' : self . _sum_credit_account ,
' sum_solde_account ' : self . _sum_solde_account ,
' sum_debit ' : self . _sum_debit ,
' sum_credit ' : self . _sum_credit ,
' sum_solde ' : self . _sum_solde ,
' get_children_accounts ' : self . get_children_accounts ,
2010-06-29 13:48:46 +00:00
' sum_currency_amount_account ' : self . _sum_currency_amount_account ,
' get_fiscalyear ' : self . get_fiscalyear ,
' get_account ' : self . get_account ,
' get_start_period ' : self . get_start_period ,
' get_end_period ' : self . get_end_period ,
2009-06-09 23:24:24 +00:00
} )
self . context = context
2010-06-16 11:51:39 +00:00
def get_min_date ( self , form ) :
2009-06-09 23:24:24 +00:00
## Get max born from account_fiscal year
#
sql = """ select min(fy.date_start) as start_date,max(fy.date_stop) as stop_date from account_fiscalyear
As fy where fy . state < > ' close '
"""
self . cr . execute ( sql )
res = self . cr . dictfetchall ( )
borne_min = res [ 0 ] [ ' start_date ' ]
borne_max = res [ 0 ] [ ' stop_date ' ]
2010-06-24 10:11:45 +00:00
if form [ ' filter ' ] == ' filter_period ' :
2009-06-09 23:24:24 +00:00
## This function will return the most aged date
2010-05-20 14:43:10 +00:00
periods = form [ ' periods ' ]
#periods = form['periods'][0][2]
2009-06-09 23:24:24 +00:00
if not periods :
2010-05-20 09:20:05 +00:00
sql = """
2010-06-10 13:34:19 +00:00
Select min ( p . date_start ) as start_date , max ( p . date_stop ) as stop_date from account_period as p where p . fiscalyear_id = % s
2010-05-20 09:20:05 +00:00
"""
2010-06-10 13:34:19 +00:00
sqlargs = ( form [ ' fiscalyear ' ] , )
2009-06-09 23:24:24 +00:00
else :
2010-05-20 09:20:05 +00:00
sql = """
2010-06-10 13:34:19 +00:00
Select min ( p . date_start ) as start_date , max ( p . date_stop ) as stop_date from account_period as p where p . id in % s
2010-05-20 09:20:05 +00:00
"""
2010-06-10 13:34:19 +00:00
sqlargs = ( tuple ( periods ) , )
self . cr . execute ( sql , sqlargs )
2009-06-09 23:24:24 +00:00
res = self . cr . dictfetchall ( )
borne_min = res [ 0 ] [ ' start_date ' ]
borne_max = res [ 0 ] [ ' stop_date ' ]
2010-06-24 10:11:45 +00:00
elif form [ ' filter ' ] == ' filter_date ' :
2009-06-09 23:24:24 +00:00
borne_min = form [ ' date_from ' ]
borne_max = form [ ' date_to ' ]
2010-06-24 10:11:45 +00:00
elif form [ ' filter ' ] == ' filter_no ' :
2009-06-09 23:24:24 +00:00
sql = """
SELECT min ( date ) as start_date , max ( date ) as stop_date FROM account_move_line """
self . cr . execute ( sql )
res = self . cr . dictfetchall ( )
borne_min = res [ 0 ] [ ' start_date ' ]
borne_max = res [ 0 ] [ ' stop_date ' ]
self . date_borne = {
' min_date ' : borne_min ,
' max_date ' : borne_max ,
}
return self . date_borne
def get_children_accounts ( self , account , form ) :
self . child_ids = self . pool . get ( ' account.account ' ) . search ( self . cr , self . uid ,
[ ( ' parent_id ' , ' child_of ' , self . ids ) ] )
2010-06-24 10:11:45 +00:00
2009-06-09 23:24:24 +00:00
res = [ ]
ctx = self . context . copy ( )
2010-07-09 06:40:01 +00:00
self . query = form [ ' query_line ' ]
2009-06-09 23:24:24 +00:00
if account and account . child_consol_ids : # add ids of consolidated childs also of selected account
ctx [ ' consolidate_childs ' ] = True
ctx [ ' account_id ' ] = account . id
ids_acc = self . pool . get ( ' account.account ' ) . search ( self . cr , self . uid , [ ( ' parent_id ' , ' child_of ' , [ account . id ] ) ] , context = ctx )
2010-06-24 10:11:45 +00:00
for child_account in self . pool . get ( ' account.account ' ) . browse ( self . cr , self . uid , ids_acc ) :
2009-06-09 23:24:24 +00:00
sold_account = self . _sum_solde_account ( child_account , form )
self . sold_accounts [ child_account . id ] = sold_account
if form [ ' display_account ' ] == ' bal_mouvement ' :
if child_account . type != ' view ' \
2010-06-24 10:11:45 +00:00
and len ( self . pool . get ( ' account.move.line ' ) . search ( self . cr , self . uid , [ ( ' account_id ' , ' = ' , child_account . id ) ] , context = ctx ) ) < > 0 :
2009-06-09 23:24:24 +00:00
res . append ( child_account )
elif form [ ' display_account ' ] == ' bal_solde ' :
if child_account . type != ' view ' \
2010-06-24 10:11:45 +00:00
and len ( self . pool . get ( ' account.move.line ' ) . search ( self . cr , self . uid , [ ( ' account_id ' , ' = ' , child_account . id ) ] , context = ctx ) ) < > 0 :
2009-06-09 23:24:24 +00:00
if ( sold_account < > 0.0 ) :
res . append ( child_account )
else :
if child_account . type != ' view ' \
and len ( self . pool . get ( ' account.move.line ' ) . search ( self . cr , self . uid ,
[ ( ' account_id ' , ' >= ' , child_account . id ) ] ,
context = ctx ) ) < > 0 :
res . append ( child_account )
##
if not len ( res ) :
return [ account ]
else :
## We will now compute solde initiaux
2010-06-24 10:11:45 +00:00
if not form [ ' soldeinit ' ] :
return res
2009-06-09 23:24:24 +00:00
for move in res :
2010-06-10 13:34:19 +00:00
SOLDEINIT = " SELECT SUM(l.debit) AS sum_debit, " \
" SUM(l.credit) AS sum_credit " \
" FROM account_move_line l " \
" WHERE l.account_id = %s " \
" AND l.date < %s AND l.date > %s "
2010-06-16 11:51:39 +00:00
self . cr . execute ( SOLDEINIT , ( move . id , self . borne_date [ ' max_date ' ] , self . borne_date [ ' min_date ' ] ) )
2009-06-09 23:24:24 +00:00
resultat = self . cr . dictfetchall ( )
if resultat [ 0 ] :
if resultat [ 0 ] [ ' sum_debit ' ] == None :
sum_debit = 0
else :
sum_debit = resultat [ 0 ] [ ' sum_debit ' ]
if resultat [ 0 ] [ ' sum_credit ' ] == None :
sum_credit = 0
else :
sum_credit = resultat [ 0 ] [ ' sum_credit ' ]
move . init_credit = sum_credit
move . init_debit = sum_debit
else :
move . init_credit = 0
move . init_debit = 0
return res
def lines ( self , account , form ) :
2010-05-20 14:43:10 +00:00
""" Return all the account_move_line of account with their account code counterparts """
2010-06-24 10:11:45 +00:00
# First compute all counterpart strings for every move_id where this account appear.
# Currently, the counterpart info is used only in landscape mode
2010-05-20 14:43:10 +00:00
sql = """
SELECT m1 . move_id ,
array_to_string ( ARRAY ( SELECT DISTINCT a . code FROM account_move_line m2 LEFT JOIN account_account a ON ( m2 . account_id = a . id ) WHERE m2 . move_id = m1 . move_id AND m2 . account_id < > % % s ) , ' , ' ) AS counterpart
2010-06-24 10:11:45 +00:00
FROM ( SELECT move_id FROM account_move_line l WHERE % s AND l . account_id = % % s GROUP BY move_id ) m1
2010-05-20 14:43:10 +00:00
""" % s elf.query
2010-06-24 10:11:45 +00:00
self . cr . execute ( sql , ( account . id , account . id ) )
2010-05-20 14:43:10 +00:00
counterpart_res = self . cr . dictfetchall ( )
counterpart_accounts = { }
for i in counterpart_res :
counterpart_accounts [ i [ ' move_id ' ] ] = i [ ' counterpart ' ]
del counterpart_res
# Then select all account_move_line of this account
2010-06-24 10:11:45 +00:00
if form [ ' sortby ' ] == ' sort_journal_partner ' :
sql_sort = ' j.code, p.name '
2009-06-09 23:24:24 +00:00
else :
2010-06-24 10:11:45 +00:00
sql_sort = ' l.date '
2009-06-09 23:24:24 +00:00
sql = """
2010-05-20 14:43:10 +00:00
SELECT l . id , l . date , j . code , l . amount_currency , l . ref , l . name , COALESCE ( l . debit , 0 ) AS debit , COALESCE ( l . credit , 0 ) AS credit , l . period_id , l . partner_id ,
m . name AS move_name , m . id AS move_id ,
c . code AS currency_code ,
i . id AS invoice_id , i . type AS invoice_type , i . number AS invoice_number ,
p . name AS partner_name
FROM account_move_line l
LEFT JOIN account_move m on ( l . move_id = m . id )
LEFT JOIN res_currency c on ( l . currency_id = c . id )
LEFT JOIN res_partner p on ( l . partner_id = p . id )
LEFT JOIN account_invoice i on ( m . id = i . move_id )
JOIN account_journal j on ( l . journal_id = j . id )
2010-06-24 10:11:45 +00:00
WHERE % s AND l . account_id = % % s ORDER by % s
2010-05-20 14:43:10 +00:00
""" % (self.query, sql_sort)
2010-06-24 10:11:45 +00:00
self . cr . execute ( sql , ( account . id , ) )
2009-06-09 23:24:24 +00:00
res = self . cr . dictfetchall ( )
2010-05-20 14:43:10 +00:00
account_sum = 0.0
2009-06-09 23:24:24 +00:00
account_move_line_obj = pooler . get_pool ( self . cr . dbname ) . get ( ' account.move.line ' )
2010-05-20 14:43:10 +00:00
inv_types = { ' out_invoice ' : ' CI ' , ' in_invoice ' : ' SI ' , ' out_refund ' : ' OR ' , ' in_refund ' : ' SR ' , }
2009-06-09 23:24:24 +00:00
for l in res :
2010-05-20 14:43:10 +00:00
l [ ' move ' ] = l [ ' move_name ' ]
if l [ ' invoice_id ' ] :
2010-06-16 11:51:39 +00:00
l [ ' ref ' ] = ' %s : %s ' % ( inv_types [ l [ ' invoice_type ' ] ] , l [ ' invoice_number ' ] )
2010-05-20 14:43:10 +00:00
l [ ' partner ' ] = l [ ' partner_name ' ] or ' '
account_sum = l [ ' debit ' ] - l [ ' credit ' ]
l [ ' progress ' ] = account_sum
l [ ' line_corresp ' ] = counterpart_accounts [ l [ ' move_id ' ] ]
2009-06-09 23:24:24 +00:00
# Modification du amount Currency
2010-05-20 14:43:10 +00:00
if l [ ' credit ' ] > 0 :
2009-06-09 23:24:24 +00:00
if l [ ' amount_currency ' ] != None :
l [ ' amount_currency ' ] = abs ( l [ ' amount_currency ' ] ) * - 1
if l [ ' amount_currency ' ] != None :
self . tot_currency = self . tot_currency + l [ ' amount_currency ' ]
return res
def _sum_debit_account ( self , account , form ) :
self . cr . execute ( " SELECT sum(debit) " \
" FROM account_move_line l " \
2010-05-20 09:20:05 +00:00
" WHERE l.account_id = %s AND %s " % ( account . id , self . query ) )
2009-06-09 23:24:24 +00:00
## Add solde init to the result
#
sum_debit = self . cr . fetchone ( ) [ 0 ] or 0.0
2009-06-16 13:46:21 +00:00
if form . get ( ' soldeinit ' , False ) :
2009-06-09 23:24:24 +00:00
sum_debit + = account . init_debit
#
##
return sum_debit
def _sum_credit_account ( self , account , form ) :
self . cr . execute ( " SELECT sum(credit) " \
" FROM account_move_line l " \
2010-06-16 11:51:39 +00:00
" WHERE l.account_id = %s AND %s " % ( account . id , self . query ) )
2009-06-09 23:24:24 +00:00
## Add solde init to the result
#
sum_credit = self . cr . fetchone ( ) [ 0 ] or 0.0
2009-06-16 13:46:21 +00:00
if form . get ( ' soldeinit ' , False ) :
2009-06-09 23:24:24 +00:00
sum_credit + = account . init_credit
return sum_credit
def _sum_solde_account ( self , account , form ) :
self . cr . execute ( " SELECT (sum(debit) - sum(credit)) as tot_solde " \
" FROM account_move_line l " \
2010-06-16 11:51:39 +00:00
" WHERE l.account_id = %s AND %s " % ( account . id , self . query ) )
2009-06-09 23:24:24 +00:00
sum_solde = self . cr . fetchone ( ) [ 0 ] or 0.0
2009-06-16 13:46:21 +00:00
if form . get ( ' soldeinit ' , False ) :
2009-06-09 23:24:24 +00:00
sum_solde + = account . init_debit - account . init_credit
return sum_solde
def _sum_debit ( self , form ) :
if not self . ids :
return 0.0
self . cr . execute ( " SELECT sum(debit) " \
" FROM account_move_line l " \
2010-06-16 11:51:39 +00:00
" WHERE l.account_id IN %s AND " + self . query ,
2010-06-10 13:34:19 +00:00
( tuple ( self . child_ids ) , ) )
2009-06-09 23:24:24 +00:00
sum_debit = self . cr . fetchone ( ) [ 0 ] or 0.0
return sum_debit
def _sum_credit ( self , form ) :
if not self . ids :
return 0.0
self . cr . execute ( " SELECT sum(credit) " \
" FROM account_move_line l " \
2010-06-16 11:51:39 +00:00
" WHERE l.account_id IN %s AND " + self . query ,
2010-06-10 13:34:19 +00:00
( tuple ( self . child_ids ) , ) )
2009-06-09 23:24:24 +00:00
## Add solde init to the result
#
sum_credit = self . cr . fetchone ( ) [ 0 ] or 0.0
return sum_credit
def _sum_solde ( self , form ) :
if not self . ids :
return 0.0
self . cr . execute ( " SELECT (sum(debit) - sum(credit)) as tot_solde " \
" FROM account_move_line l " \
2010-06-16 11:51:39 +00:00
" WHERE l.account_id IN %s AND " + self . query ,
2010-06-10 13:34:19 +00:00
( tuple ( self . child_ids ) , ) )
2009-06-09 23:24:24 +00:00
sum_solde = self . cr . fetchone ( ) [ 0 ] or 0.0
return sum_solde
def _set_get_account_currency_code ( self , account_id ) :
self . cr . execute ( " SELECT c.code as code " \
" FROM res_currency c,account_account as ac " \
2010-05-20 09:20:05 +00:00
" WHERE ac.id = %s AND ac.currency_id = c.id " % ( account_id ) )
2009-06-09 23:24:24 +00:00
result = self . cr . fetchone ( )
if result :
self . account_currency = result [ 0 ]
else :
self . account_currency = False
def _sum_currency_amount_account ( self , account , form ) :
self . _set_get_account_currency_code ( account . id )
self . cr . execute ( " SELECT sum(aml.amount_currency) FROM account_move_line as aml,res_currency as rc WHERE aml.currency_id = rc.id AND aml.account_id= %s " , ( account . id , ) )
total = self . cr . fetchone ( )
if self . account_currency :
return_field = str ( total [ 0 ] ) + self . account_currency
return return_field
else :
currency_total = self . tot_currency = 0.0
return currency_total
2010-07-09 06:40:01 +00:00
2010-06-29 13:48:46 +00:00
def get_fiscalyear ( self , form ) :
return pooler . get_pool ( self . cr . dbname ) . get ( ' account.fiscalyear ' ) . browse ( self . cr , self . uid , form [ ' fiscalyear_id ' ] ) . name
2010-07-09 06:40:01 +00:00
2010-06-29 13:48:46 +00:00
def get_account ( self , form ) :
return pooler . get_pool ( self . cr . dbname ) . get ( ' account.account ' ) . browse ( self . cr , self . uid , form [ ' chart_account_id ' ] ) . name
2010-07-09 06:40:01 +00:00
2010-06-29 13:48:46 +00:00
def get_start_period ( self , form ) :
2010-07-09 06:40:01 +00:00
if form [ ' filter ' ] == ' filter_period ' :
2010-07-06 16:50:14 +00:00
if form [ ' period_from ' ] :
return pooler . get_pool ( self . cr . dbname ) . get ( ' account.period ' ) . browse ( self . cr , self . uid , form [ ' period_from ' ] ) . name
return ' '
2010-07-09 06:40:01 +00:00
2010-06-29 13:48:46 +00:00
def get_end_period ( self , form ) :
2010-07-06 16:50:14 +00:00
if form [ ' filter ' ] == ' filter_period ' :
if form [ ' period_to ' ] :
return pooler . get_pool ( self . cr . dbname ) . get ( ' account.period ' ) . browse ( self . cr , self . uid , form [ ' period_to ' ] ) . name
return ' '
2008-11-15 10:27:44 +00:00
2008-09-25 08:33:16 +00:00
report_sxw . report_sxw ( ' report.account.general.ledger ' , ' account.account ' , ' addons/account/report/general_ledger.rml ' , parser = general_ledger , header = False )
2010-05-20 09:05:34 +00:00
report_sxw . report_sxw ( ' report.account.general.ledger_landscape ' , ' account.account ' , ' addons/account/report/general_ledger_landscape.rml ' , parser = general_ledger , header = False )
2009-03-06 22:18:24 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: