2009-10-13 05:58:37 +00:00
# -*- coding: utf-8 -*-
2007-01-04 09:45:50 +00:00
##############################################################################
2009-11-25 09:31:44 +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>).
2007-01-04 09:45:50 +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.
2007-01-04 09:45:50 +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.
2007-01-04 09:45:50 +00:00
#
2009-10-14 11:15:34 +00:00
# You should have received a copy of the GNU Affero General Public License
2009-11-25 09:31:44 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2007-01-04 09:45:50 +00:00
#
##############################################################################
2009-10-14 11:15:34 +00:00
2007-01-04 09:45:50 +00:00
import time
2010-08-14 05:37:43 +00:00
2007-01-04 09:45:50 +00:00
import netsvc
from osv import fields , osv
from tools . misc import currency
2008-07-08 08:13:12 +00:00
from tools . translate import _
2010-07-15 13:07:11 +00:00
import decimal_precision as dp
2007-01-04 09:45:50 +00:00
class account_bank_statement ( osv . osv ) :
2010-04-15 13:17:09 +00:00
def button_import_invoice ( self , cr , uid , ids , context = None ) :
mod_obj = self . pool . get ( ' ir.model.data ' )
if context is None :
context = { }
2010-06-16 11:51:39 +00:00
model_data_ids = mod_obj . search ( cr , uid , [ ( ' model ' , ' = ' , ' ir.ui.view ' ) , ( ' name ' , ' = ' , ' view_account_statement_from_invoice ' ) ] , context = context )
2010-04-15 13:17:09 +00:00
resource_id = mod_obj . read ( cr , uid , model_data_ids , fields = [ ' res_id ' ] , context = context ) [ 0 ] [ ' res_id ' ]
context . update ( { ' statement_id ' : ids [ 0 ] } )
return {
' name ' : _ ( ' Import Invoice ' ) ,
' context ' : context ,
' view_type ' : ' form ' ,
' view_mode ' : ' tree,form ' ,
' res_model ' : ' account.statement.from.invoice ' ,
' views ' : [ ( resource_id , ' form ' ) ] ,
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
' nodestroy ' : True
2010-06-23 19:44:06 +00:00
}
2010-04-15 13:17:09 +00:00
2008-07-22 15:11:28 +00:00
def _default_journal_id ( self , cr , uid , context = { } ) :
2010-07-30 11:12:06 +00:00
journal_pool = self . pool . get ( ' account.journal ' )
journal_type = context . get ( ' journal_type ' , False )
journal_id = False
2010-08-14 05:37:43 +00:00
2010-07-30 11:12:06 +00:00
if journal_type :
ids = journal_pool . search ( cr , uid , [ ( ' type ' , ' = ' , journal_type ) ] )
if ids :
journal_id = ids [ 0 ]
2010-08-14 05:37:43 +00:00
return journal_id
2008-07-22 15:11:28 +00:00
def _default_balance_start ( self , cr , uid , context = { } ) :
2008-12-10 14:29:55 +00:00
cr . execute ( ' select id from account_bank_statement where journal_id= %s order by date desc limit 1 ' , ( 1 , ) )
2008-07-22 15:11:28 +00:00
res = cr . fetchone ( )
if res :
return self . browse ( cr , uid , [ res [ 0 ] ] , context ) [ 0 ] . balance_end
return 0.0
def _end_balance ( self , cursor , user , ids , name , attr , context = None ) :
res_currency_obj = self . pool . get ( ' res.currency ' )
res_users_obj = self . pool . get ( ' res.users ' )
res = { }
company_currency_id = res_users_obj . browse ( cursor , user , user ,
context = context ) . company_id . currency_id . id
statements = self . browse ( cursor , user , ids , context = context )
for statement in statements :
res [ statement . id ] = statement . balance_start
currency_id = statement . currency . id
for line in statement . move_line_ids :
if line . debit > 0 :
if line . account_id . id == \
statement . journal_id . default_debit_account_id . id :
res [ statement . id ] + = res_currency_obj . compute ( cursor ,
user , company_currency_id , currency_id ,
line . debit , context = context )
else :
if line . account_id . id == \
statement . journal_id . default_credit_account_id . id :
2008-12-07 13:06:32 +00:00
res [ statement . id ] - = res_currency_obj . compute ( cursor ,
2008-07-22 15:11:28 +00:00
user , company_currency_id , currency_id ,
line . credit , context = context )
if statement . state == ' draft ' :
for line in statement . line_ids :
res [ statement . id ] + = line . amount
for r in res :
res [ r ] = round ( res [ r ] , 2 )
return res
def _get_period ( self , cr , uid , context = { } ) :
periods = self . pool . get ( ' account.period ' ) . find ( cr , uid )
if periods :
return periods [ 0 ]
else :
return False
def _currency ( self , cursor , user , ids , name , args , context = None ) :
res = { }
res_currency_obj = self . pool . get ( ' res.currency ' )
res_users_obj = self . pool . get ( ' res.users ' )
default_currency = res_users_obj . browse ( cursor , user ,
user , context = context ) . company_id . currency_id
for statement in self . browse ( cursor , user , ids , context = context ) :
currency = statement . journal_id . currency
if not currency :
currency = default_currency
res [ statement . id ] = currency . id
currency_names = { }
for currency_id , currency_name in res_currency_obj . name_get ( cursor ,
user , [ x for x in res . values ( ) ] , context = context ) :
currency_names [ currency_id ] = currency_name
for statement_id in res . keys ( ) :
currency_id = res [ statement_id ]
res [ statement_id ] = ( currency_id , currency_names [ currency_id ] )
return res
2010-08-14 05:37:43 +00:00
2008-07-22 15:11:28 +00:00
_order = " date desc "
_name = " account.bank.statement "
_description = " Bank Statement "
_columns = {
2010-08-16 07:03:58 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , required = True , help = ' if you give the Name other then /, its created Accounting Entries Move will be with same name as statement name. This allows the statement entries to have the same references than the statement itself ' , states = { ' confirm ' : [ ( ' readonly ' , True ) ] } ) ,
2010-08-11 13:50:57 +00:00
' date ' : fields . date ( ' Date ' , required = True , states = { ' confirm ' : [ ( ' readonly ' , True ) ] } ) ,
2008-07-22 15:11:28 +00:00
' journal_id ' : fields . many2one ( ' account.journal ' , ' Journal ' , required = True ,
2010-07-30 11:12:06 +00:00
states = { ' confirm ' : [ ( ' readonly ' , True ) ] } , domain = [ ( ' type ' , ' = ' , ' bank ' ) ] ) ,
2008-07-22 15:11:28 +00:00
' period_id ' : fields . many2one ( ' account.period ' , ' Period ' , required = True ,
states = { ' confirm ' : [ ( ' readonly ' , True ) ] } ) ,
2010-07-15 13:07:11 +00:00
' balance_start ' : fields . float ( ' Starting Balance ' , digits_compute = dp . get_precision ( ' Account ' ) ,
2008-07-22 15:11:28 +00:00
states = { ' confirm ' : [ ( ' readonly ' , True ) ] } ) ,
2010-07-15 13:07:11 +00:00
' balance_end_real ' : fields . float ( ' Ending Balance ' , digits_compute = dp . get_precision ( ' Account ' ) ,
2008-07-22 15:11:28 +00:00
states = { ' confirm ' : [ ( ' readonly ' , True ) ] } ) ,
' balance_end ' : fields . function ( _end_balance , method = True , string = ' Balance ' ) ,
' line_ids ' : fields . one2many ( ' account.bank.statement.line ' ,
' statement_id ' , ' Statement lines ' ,
states = { ' confirm ' : [ ( ' readonly ' , True ) ] } ) ,
' move_line_ids ' : fields . one2many ( ' account.move.line ' , ' statement_id ' ,
' Entry lines ' , states = { ' confirm ' : [ ( ' readonly ' , True ) ] } ) ,
2009-09-24 10:46:21 +00:00
' state ' : fields . selection ( [ ( ' draft ' , ' Draft ' ) , ( ' confirm ' , ' Confirmed ' ) ] ,
2008-07-22 15:11:28 +00:00
' State ' , required = True ,
2009-11-23 13:52:38 +00:00
states = { ' confirm ' : [ ( ' readonly ' , True ) ] } , readonly = " 1 " ,
2009-11-25 10:03:47 +00:00
help = ' When new statement is created the state will be \' Draft \' . \
\n * And after getting confirmation from the bank it will be in \' Confirmed \' state. ' ) ,
2008-07-22 15:11:28 +00:00
' currency ' : fields . function ( _currency , method = True , string = ' Currency ' ,
type = ' many2one ' , relation = ' res.currency ' ) ,
}
2008-08-22 11:53:40 +00:00
2008-07-22 15:11:28 +00:00
_defaults = {
2010-08-02 18:53:55 +00:00
' name ' : lambda * a : " / " ,
2008-07-22 15:11:28 +00:00
' date ' : lambda * a : time . strftime ( ' % Y- % m- %d ' ) ,
' state ' : lambda * a : ' draft ' ,
' balance_start ' : _default_balance_start ,
' journal_id ' : _default_journal_id ,
' period_id ' : _get_period ,
}
2010-07-26 14:41:32 +00:00
def onchange_date ( self , cr , user , ids , date , context = { } ) :
"""
Returns a dict that contains new values and context
@param cr : A database cursor
@param user : ID of the user currently logged in
@param date : latest value from user input for field date
@param args : other arguments
@param context : context arguments , like lang , time zone
@return : Returns a dict which contains new values , and context
"""
res = { }
period_pool = self . pool . get ( ' account.period ' )
pids = period_pool . search ( cr , user , [ ( ' date_start ' , ' <= ' , date ) , ( ' date_stop ' , ' >= ' , date ) ] )
if pids :
res . update ( {
' period_id ' : pids [ 0 ]
} )
context . update ( {
' period_id ' : pids [ 0 ]
} )
2010-08-14 05:37:43 +00:00
2010-07-26 14:41:32 +00:00
return {
' value ' : res ,
' context ' : context ,
}
2010-08-11 14:09:35 +00:00
def button_dummy ( self , cr , uid , ids , context = { } ) :
self . write ( cr , uid , ids , { } , context )
return True
2010-08-14 05:37:43 +00:00
2010-08-16 07:03:58 +00:00
def button_confirm_bank ( self , cr , uid , ids , context = None ) :
2008-07-22 15:11:28 +00:00
done = [ ]
res_currency_obj = self . pool . get ( ' res.currency ' )
res_users_obj = self . pool . get ( ' res.users ' )
account_move_obj = self . pool . get ( ' account.move ' )
account_move_line_obj = self . pool . get ( ' account.move.line ' )
2010-08-16 07:03:58 +00:00
account_bank_statement_line_obj = self . pool . get ( ' account.bank.statement.line ' )
obj_seq = self . pool . get ( ' ir.sequence ' )
2008-07-22 15:11:28 +00:00
2010-08-16 07:03:58 +00:00
if context is None :
context = { }
2008-07-22 15:11:28 +00:00
company_currency_id = res_users_obj . browse ( cr , uid , uid ,
context = context ) . company_id . currency_id . id
for st in self . browse ( cr , uid , ids , context ) :
if not st . state == ' draft ' :
continue
2009-09-24 10:46:21 +00:00
if not ( abs ( ( st . balance_end or 0.0 ) - st . balance_end_real ) < 0.0001 ) :
2008-07-22 15:11:28 +00:00
raise osv . except_osv ( _ ( ' Error ! ' ) ,
2008-09-24 08:46:41 +00:00
_ ( ' The statement balance is incorrect ! \n ' ) +
_ ( ' The expected balance ( %.2f ) is different than the computed one. ( %.2f ) ' ) % ( st . balance_end_real , st . balance_end ) )
2008-07-22 15:11:28 +00:00
if ( not st . journal_id . default_credit_account_id ) \
or ( not st . journal_id . default_debit_account_id ) :
2010-01-05 10:39:47 +00:00
raise osv . except_osv ( _ ( ' Configuration Error ! ' ) ,
2008-07-22 15:11:28 +00:00
_ ( ' Please verify that an account is defined in the journal. ' ) )
2010-08-27 04:50:49 +00:00
if not st . name == ' / ' :
next_number = st . name
else :
next_number = obj_seq . get ( cr , uid , ' account.bank.statement ' )
2008-07-22 15:11:28 +00:00
for line in st . move_line_ids :
if line . state < > ' valid ' :
raise osv . except_osv ( _ ( ' Error ! ' ) ,
2008-09-24 08:46:41 +00:00
_ ( ' The account entries lines are not in valid state. ' ) )
2009-11-02 11:53:09 +00:00
# for bank.statement.lines
# In line we get reconcile_id on bank.ste.rec.
# in bank stat.rec we get line_new_ids on bank.stat.rec.line
2008-07-22 15:11:28 +00:00
for move in st . line_ids :
2010-08-27 04:50:49 +00:00
context . update ( { ' date ' : move . date } )
2008-07-22 15:11:28 +00:00
move_id = account_move_obj . create ( cr , uid , {
' journal_id ' : st . journal_id . id ,
' period_id ' : st . period_id . id ,
2010-01-06 06:07:03 +00:00
' date ' : move . date ,
2008-07-22 15:11:28 +00:00
} , context = context )
account_bank_statement_line_obj . write ( cr , uid , [ move . id ] , {
2010-08-27 04:50:49 +00:00
' move_ids ' : [ ( 4 , move_id , False ) ]
2008-07-22 15:11:28 +00:00
} )
if not move . amount :
continue
torec = [ ]
2008-10-23 17:47:45 +00:00
if move . amount > = 0 :
account_id = st . journal_id . default_credit_account_id . id
else :
account_id = st . journal_id . default_debit_account_id . id
acc_cur = ( ( move . amount < = 0 ) and st . journal_id . default_debit_account_id ) or move . account_id
2008-07-22 15:11:28 +00:00
amount = res_currency_obj . compute ( cr , uid , st . currency . id ,
2008-10-23 17:47:45 +00:00
company_currency_id , move . amount , context = context ,
account = acc_cur )
2008-07-22 15:11:28 +00:00
if move . reconcile_id and move . reconcile_id . line_new_ids :
for newline in move . reconcile_id . line_new_ids :
amount + = newline . amount
val = {
' name ' : move . name ,
' date ' : move . date ,
' ref ' : move . ref ,
' move_id ' : move_id ,
' partner_id ' : ( ( move . partner_id ) and move . partner_id . id ) or False ,
' account_id ' : ( move . account_id ) and move . account_id . id ,
' credit ' : ( ( amount > 0 ) and amount ) or 0.0 ,
' debit ' : ( ( amount < 0 ) and - amount ) or 0.0 ,
' statement_id ' : st . id ,
' journal_id ' : st . journal_id . id ,
' period_id ' : st . period_id . id ,
' currency_id ' : st . currency . id ,
}
2009-11-25 09:31:44 +00:00
2008-07-22 15:11:28 +00:00
amount = res_currency_obj . compute ( cr , uid , st . currency . id ,
2008-10-23 17:47:45 +00:00
company_currency_id , move . amount , context = context ,
account = acc_cur )
2009-09-07 16:40:12 +00:00
if st . currency . id < > company_currency_id :
amount_cur = res_currency_obj . compute ( cr , uid , company_currency_id ,
st . currency . id , amount , context = context ,
account = acc_cur )
val [ ' amount_currency ' ] = - amount_cur
2008-07-22 15:11:28 +00:00
2009-04-10 15:11:41 +00:00
if move . account_id and move . account_id . currency_id and move . account_id . currency_id . id < > company_currency_id :
2008-07-22 15:11:28 +00:00
val [ ' currency_id ' ] = move . account_id . currency_id . id
if company_currency_id == move . account_id . currency_id . id :
amount_cur = move . amount
else :
amount_cur = res_currency_obj . compute ( cr , uid , company_currency_id ,
2008-10-23 17:47:45 +00:00
move . account_id . currency_id . id , amount , context = context ,
account = acc_cur )
2008-07-22 15:11:28 +00:00
val [ ' amount_currency ' ] = amount_cur
torec . append ( account_move_line_obj . create ( cr , uid , val , context = context ) )
if move . reconcile_id and move . reconcile_id . line_new_ids :
for newline in move . reconcile_id . line_new_ids :
account_move_line_obj . create ( cr , uid , {
' name ' : newline . name or move . name ,
' date ' : move . date ,
' ref ' : move . ref ,
' move_id ' : move_id ,
' partner_id ' : ( ( move . partner_id ) and move . partner_id . id ) or False ,
' account_id ' : ( newline . account_id ) and newline . account_id . id ,
' debit ' : newline . amount > 0 and newline . amount or 0.0 ,
' credit ' : newline . amount < 0 and - newline . amount or 0.0 ,
' statement_id ' : st . id ,
' journal_id ' : st . journal_id . id ,
' period_id ' : st . period_id . id ,
2009-11-25 09:31:44 +00:00
' analytic_account_id ' : newline . analytic_id and newline . analytic_id . id or False ,
2009-11-06 07:51:43 +00:00
2008-07-22 15:11:28 +00:00
} , context = context )
# Fill the secondary amount/currency
# if currency is not the same than the company
amount_currency = False
currency_id = False
if st . currency . id < > company_currency_id :
amount_currency = move . amount
currency_id = st . currency . id
account_move_line_obj . create ( cr , uid , {
' name ' : move . name ,
' date ' : move . date ,
' ref ' : move . ref ,
' move_id ' : move_id ,
' partner_id ' : ( ( move . partner_id ) and move . partner_id . id ) or False ,
' account_id ' : account_id ,
' credit ' : ( ( amount < 0 ) and - amount ) or 0.0 ,
' debit ' : ( ( amount > 0 ) and amount ) or 0.0 ,
' statement_id ' : st . id ,
' journal_id ' : st . journal_id . id ,
' period_id ' : st . period_id . id ,
' amount_currency ' : amount_currency ,
' currency_id ' : currency_id ,
} , context = context )
for line in account_move_line_obj . browse ( cr , uid , [ x . id for x in
account_move_obj . browse ( cr , uid , move_id ,
context = context ) . line_id ] ,
context = context ) :
if line . state < > ' valid ' :
raise osv . except_osv ( _ ( ' Error ! ' ) ,
2010-08-24 13:06:22 +00:00
_ ( ' Journal Item " %s " is not valid ' ) % line . name )
2008-07-22 15:11:28 +00:00
if move . reconcile_id and move . reconcile_id . line_ids :
2010-06-28 06:10:26 +00:00
## Search if move has already a partial reconciliation
previous_partial = False
for line_reconcile_move in move . reconcile_id . line_ids :
if line_reconcile_move . reconcile_partial_id :
previous_partial = True
break
##
2008-07-22 15:11:28 +00:00
torec + = map ( lambda x : x . id , move . reconcile_id . line_ids )
2009-01-16 09:44:05 +00:00
#try:
if abs ( move . reconcile_amount - move . amount ) < 0.0001 :
2010-01-25 08:52:56 +00:00
writeoff_acc_id = False
#There should only be one write-off account!
for entry in move . reconcile_id . line_new_ids :
writeoff_acc_id = entry . account_id . id
break
2010-06-28 06:10:26 +00:00
## If we have already a partial reconciliation
## We need to make a partial reconciliation
## To add this amount to previous paid amount
if previous_partial :
account_move_line_obj . reconcile_partial ( cr , uid , torec , ' statement ' , context )
## If it's the first reconciliation, we do a full reconciliation as regular
else :
account_move_line_obj . reconcile ( cr , uid , torec , ' statement ' , writeoff_acc_id = writeoff_acc_id , writeoff_period_id = st . period_id . id , writeoff_journal_id = st . journal_id . id , context = context )
2009-01-16 09:44:05 +00:00
else :
account_move_line_obj . reconcile_partial ( cr , uid , torec , ' statement ' , context )
2010-08-27 04:50:49 +00:00
move_name = next_number + ' / ' + str ( move . sequence )
account_move_obj . write ( cr , uid , [ move_id ] , { ' name ' : move_name , ' state ' : ' posted ' } ) # Bank statements will not consider boolean on journal entry_posted
2008-07-22 15:11:28 +00:00
2010-07-22 07:30:45 +00:00
self . log ( cr , uid , st . id , ' Statement %s is confirmed and entries are created. ' % st . name )
2008-07-22 15:11:28 +00:00
done . append ( st . id )
2010-08-16 07:03:58 +00:00
self . write ( cr , uid , [ st . id ] , { ' name ' : next_number } , context = context )
2010-08-02 18:53:55 +00:00
2008-07-22 15:11:28 +00:00
self . write ( cr , uid , done , { ' state ' : ' confirm ' } , context = context )
return True
def button_cancel ( self , cr , uid , ids , context = { } ) :
done = [ ]
for st in self . browse ( cr , uid , ids , context ) :
if st . state == ' draft ' :
continue
ids = [ ]
for line in st . line_ids :
ids + = [ x . id for x in line . move_ids ]
self . pool . get ( ' account.move ' ) . unlink ( cr , uid , ids , context )
done . append ( st . id )
self . write ( cr , uid , done , { ' state ' : ' draft ' } , context = context )
return True
def onchange_journal_id ( self , cursor , user , statement_id , journal_id , context = None ) :
account_journal_obj = self . pool . get ( ' account.journal ' )
res_users_obj = self . pool . get ( ' res.users ' )
cursor . execute ( ' SELECT balance_end_real \
FROM account_bank_statement \
2010-08-26 09:12:23 +00:00
WHERE journal_id = % s AND NOT state = % s \
ORDER BY date DESC , id DESC LIMIT 1 ' , (journal_id, ' draft ' ))
2008-07-22 15:11:28 +00:00
res = cursor . fetchone ( )
balance_start = res and res [ 0 ] or 0.0
2010-08-26 09:50:19 +00:00
return { ' value ' : { ' balance_start ' : balance_start } }
2007-09-05 14:02:52 +00:00
2010-02-04 11:47:04 +00:00
def unlink ( self , cr , uid , ids , context = None ) :
stat = self . read ( cr , uid , ids , [ ' state ' ] )
unlink_ids = [ ]
for t in stat :
if t [ ' state ' ] in ( ' draft ' ) :
unlink_ids . append ( t [ ' id ' ] )
else :
raise osv . except_osv ( _ ( ' Invalid action ! ' ) , _ ( ' Cannot delete bank statement which are already confirmed ! ' ) )
osv . osv . unlink ( self , cr , uid , unlink_ids , context = context )
return True
2010-04-15 13:17:09 +00:00
2010-04-16 09:34:02 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
if default is None :
default = { }
if context is None :
2010-04-16 14:37:24 +00:00
context = { }
2010-04-16 09:34:02 +00:00
default = default . copy ( )
default [ ' move_line_ids ' ] = [ ]
return super ( account_bank_statement , self ) . copy ( cr , uid , id , default , context )
2010-04-16 14:37:24 +00:00
2007-01-04 09:45:50 +00:00
account_bank_statement ( )
2007-04-19 19:58:31 +00:00
class account_bank_statement_reconcile ( osv . osv ) :
2008-07-22 15:11:28 +00:00
_name = " account.bank.statement.reconcile "
2010-05-19 18:32:32 +00:00
_description = " Statement Reconcile "
2008-07-22 15:11:28 +00:00
def _total_entry ( self , cursor , user , ids , name , attr , context = None ) :
result = { }
for o in self . browse ( cursor , user , ids , context = context ) :
result [ o . id ] = 0.0
for line in o . line_ids :
result [ o . id ] + = line . debit - line . credit
return result
def _total_new ( self , cursor , user , ids , name , attr , context = None ) :
result = { }
for o in self . browse ( cursor , user , ids , context = context ) :
result [ o . id ] = 0.0
for line in o . line_new_ids :
result [ o . id ] + = line . amount
return result
def _total_balance ( self , cursor , user , ids , name , attr , context = None ) :
result = { }
for o in self . browse ( cursor , user , ids , context = context ) :
result [ o . id ] = o . total_new - o . total_entry + o . total_amount
return result
def _total_amount ( self , cursor , user , ids , name , attr , context = None ) :
res = { }
res_currency_obj = self . pool . get ( ' res.currency ' )
res_users_obj = self . pool . get ( ' res.users ' )
company_currency_id = res_users_obj . browse ( cursor , user , user ,
context = context ) . company_id . currency_id . id
currency_id = context . get ( ' currency_id ' , company_currency_id )
2008-10-23 17:47:45 +00:00
acc_cur = None
if context . get ( ' journal_id ' , False ) and context . get ( ' account_id ' , False ) :
st = self . pool . get ( ' account.journal ' ) . browse ( cursor , user , context [ ' journal_id ' ] )
acc = self . pool . get ( ' account.account ' ) . browse ( cursor , user , context [ ' account_id ' ] )
acc_cur = ( ( context . get ( ' amount ' , 0.0 ) < = 0 ) and st . default_debit_account_id ) or acc
2008-07-22 15:11:28 +00:00
for reconcile_id in ids :
res [ reconcile_id ] = res_currency_obj . compute ( cursor , user ,
currency_id , company_currency_id ,
2008-10-23 17:47:45 +00:00
context . get ( ' amount ' , 0.0 ) , context = context , account = acc_cur )
2008-07-22 15:11:28 +00:00
return res
def _default_amount ( self , cursor , user , context = None ) :
if context is None :
context = { }
res_currency_obj = self . pool . get ( ' res.currency ' )
res_users_obj = self . pool . get ( ' res.users ' )
company_currency_id = res_users_obj . browse ( cursor , user , user ,
context = context ) . company_id . currency_id . id
currency_id = context . get ( ' currency_id ' , company_currency_id )
2008-10-23 17:47:45 +00:00
acc_cur = None
if context . get ( ' journal_id ' , False ) and context . get ( ' account_id ' , False ) :
st = self . pool . get ( ' account.journal ' ) . browse ( cursor , user , context [ ' journal_id ' ] )
acc = self . pool . get ( ' account.account ' ) . browse ( cursor , user , context [ ' account_id ' ] )
acc_cur = ( ( context . get ( ' amount ' , 0.0 ) < = 0 ) and st . default_debit_account_id ) or acc
2008-07-22 15:11:28 +00:00
return res_currency_obj . compute ( cursor , user ,
currency_id , company_currency_id ,
2008-10-23 17:47:45 +00:00
context . get ( ' amount ' , 0.0 ) , context = context , account = acc_cur )
2008-07-22 15:11:28 +00:00
def _total_currency ( self , cursor , user , ids , name , attrs , context = None ) :
res = { }
res_users_obj = self . pool . get ( ' res.users ' )
company_currency_id = res_users_obj . browse ( cursor , user , user ,
context = context ) . company_id . currency_id . id
for reconcile_id in ids :
res [ reconcile_id ] = company_currency_id
return res
def _default_currency ( self , cursor , user , context = None ) :
res_users_obj = self . pool . get ( ' res.users ' )
return res_users_obj . browse ( cursor , user , user ,
context = context ) . company_id . currency_id . id
def _total_second_amount ( self , cursor , user , ids , name , attr ,
context = None ) :
res = { }
for reconcile_id in ids :
res [ reconcile_id ] = context . get ( ' amount ' , 0.0 )
return res
def _total_second_currency ( self , cursor , user , ids , name , attr , context = None ) :
res = { }
for reconcile_id in ids :
res [ reconcile_id ] = context . get ( ' currency_id ' , False )
return res
def name_get ( self , cursor , user , ids , context = None ) :
res = [ ]
for o in self . browse ( cursor , user , ids , context = context ) :
2009-09-07 16:40:12 +00:00
result = 0.0
res_currency = ' '
for line in o . line_ids :
if line . amount_currency and line . currency_id :
result + = line . amount_currency
res_currency = line . currency_id . code
else :
result + = line . debit - line . credit
if res_currency :
res_currency = ' ' + res_currency
res . append ( ( o . id , ' [ %.2f ' % ( result - o . total_new , ) + res_currency + ' ] ' ) )
2008-07-22 15:11:28 +00:00
return res
_columns = {
' name ' : fields . char ( ' Date ' , size = 64 , required = True ) ,
' partner_id ' : fields . many2one ( ' res.partner ' , ' Partner ' , readonly = True ) ,
' line_new_ids ' : fields . one2many ( ' account.bank.statement.reconcile.line ' ,
' line_id ' , ' Write-Off ' ) ,
' total_entry ' : fields . function ( _total_entry , method = True ,
string = ' Total entries ' ) ,
' total_new ' : fields . function ( _total_new , method = True ,
string = ' Total write-off ' ) ,
' total_second_amount ' : fields . function ( _total_second_amount ,
method = True , string = ' Payment amount ' ,
help = ' The amount in the currency of the journal ' ) ,
' total_second_currency ' : fields . function ( _total_second_currency , method = True ,
string = ' Currency ' , type = ' many2one ' , relation = ' res.currency ' ,
help = ' The currency of the journal ' ) ,
' total_amount ' : fields . function ( _total_amount , method = True ,
string = ' Payment amount ' ) ,
' total_currency ' : fields . function ( _total_currency , method = True ,
string = ' Currency ' , type = ' many2one ' , relation = ' res.currency ' ) ,
' total_balance ' : fields . function ( _total_balance , method = True ,
string = ' Balance ' ) ,
#line_ids define in account.py
' statement_line ' : fields . one2many ( ' account.bank.statement.line ' ,
' reconcile_id ' , ' Bank Statement Line ' ) ,
}
_defaults = {
' name ' : lambda * a : time . strftime ( ' % Y- % m- %d ' ) ,
' partner_id ' : lambda obj , cursor , user , context = None : \
context . get ( ' partner ' , False ) ,
' total_amount ' : _default_amount ,
' total_currency ' : _default_currency ,
' total_second_amount ' : lambda obj , cursor , user , context = None : \
context . get ( ' amount ' , 0.0 ) ,
' total_second_currency ' : lambda obj , cursor , user , context = None : \
context . get ( ' currency_id ' , False ) ,
' total_balance ' : _default_amount ,
}
2007-04-19 19:58:31 +00:00
account_bank_statement_reconcile ( )
class account_bank_statement_reconcile_line ( osv . osv ) :
2008-07-22 15:11:28 +00:00
_name = " account.bank.statement.reconcile.line "
_description = " Statement reconcile line "
_columns = {
2009-11-02 11:53:09 +00:00
' name ' : fields . char ( ' Description ' , size = 64 , required = True ) ,
2008-07-22 15:11:28 +00:00
' account_id ' : fields . many2one ( ' account.account ' , ' Account ' , required = True ) ,
' line_id ' : fields . many2one ( ' account.bank.statement.reconcile ' , ' Reconcile ' ) ,
' amount ' : fields . float ( ' Amount ' , required = True ) ,
2010-08-19 12:05:01 +00:00
' analytic_id ' : fields . many2one ( ' account.analytic.account ' , " Analytic Account " , domain = [ ( ' parent_id ' , ' != ' , False ) ] )
2008-07-22 15:11:28 +00:00
}
2009-11-02 11:53:09 +00:00
_defaults = {
2010-08-19 12:05:01 +00:00
' name ' : ' Write-Off ' ,
2008-07-22 15:11:28 +00:00
}
2007-04-19 19:58:31 +00:00
account_bank_statement_reconcile_line ( )
2007-01-04 09:45:50 +00:00
class account_bank_statement_line ( osv . osv ) :
2007-09-05 14:02:52 +00:00
2010-08-14 05:37:43 +00:00
def onchange_partner_id ( self , cursor , user , line_id , partner_id , type , currency_id , context = None ) :
2010-05-11 08:51:06 +00:00
res = { ' value ' : { } }
2010-08-14 05:37:43 +00:00
obj_partner = self . pool . get ( ' res.partner ' )
if context is None :
context = { }
2008-07-22 15:11:28 +00:00
if not partner_id :
2010-05-11 08:51:06 +00:00
return res
2010-08-14 05:37:43 +00:00
2010-05-11 08:51:06 +00:00
line = self . browse ( cursor , user , line_id )
if not line or ( line and not line [ 0 ] . account_id ) :
2010-08-14 05:37:43 +00:00
part = obj_partner . browse ( cursor , user , partner_id , context = context )
2010-05-11 08:51:06 +00:00
if type == ' supplier ' :
account_id = part . property_account_payable . id
else :
2010-05-19 12:49:23 +00:00
account_id = part . property_account_receivable . id
2010-05-11 08:51:06 +00:00
res [ ' value ' ] [ ' account_id ' ] = account_id
2010-08-27 11:13:30 +00:00
if not line or ( line and not line [ 0 ] . amount ) :
res_users_obj = self . pool . get ( ' res.users ' )
res_currency_obj = self . pool . get ( ' res.currency ' )
company_currency_id = res_users_obj . browse ( cursor , user , user ,
context = context ) . company_id . currency_id . id
if not currency_id :
currency_id = company_currency_id
cursor . execute ( ' SELECT sum(debit-credit) \
FROM account_move_line \
WHERE ( reconcile_id is null ) \
AND partner_id = % s \
AND account_id = % s ' , (partner_id, account_id))
pgres = cursor . fetchone ( )
balance = pgres and pgres [ 0 ] or 0.0
balance = res_currency_obj . compute ( cursor , user , company_currency_id ,
currency_id , balance , context = context )
res [ ' value ' ] [ ' amount ' ] = balance
2010-05-11 08:51:06 +00:00
return res
2008-07-22 15:11:28 +00:00
def _reconcile_amount ( self , cursor , user , ids , name , args , context = None ) :
if not ids :
return { }
res_currency_obj = self . pool . get ( ' res.currency ' )
res_users_obj = self . pool . get ( ' res.users ' )
res = { }
company_currency_id = res_users_obj . browse ( cursor , user , user ,
context = context ) . company_id . currency_id . id
for line in self . browse ( cursor , user , ids , context = context ) :
if line . reconcile_id :
res [ line . id ] = res_currency_obj . compute ( cursor , user ,
company_currency_id , line . statement_id . currency . id ,
line . reconcile_id . total_entry , context = context )
else :
res [ line . id ] = 0.0
return res
2010-08-16 05:23:06 +00:00
_order = " statement_id desc, sequence "
2008-07-22 15:11:28 +00:00
_name = " account.bank.statement.line "
_description = " Bank Statement Line "
_columns = {
' name ' : fields . char ( ' Name ' , size = 64 , required = True ) ,
' date ' : fields . date ( ' Date ' , required = True ) ,
' amount ' : fields . float ( ' Amount ' ) ,
' type ' : fields . selection ( [
( ' supplier ' , ' Supplier ' ) ,
( ' customer ' , ' Customer ' ) ,
( ' general ' , ' General ' )
] , ' Type ' , required = True ) ,
' partner_id ' : fields . many2one ( ' res.partner ' , ' Partner ' ) ,
' account_id ' : fields . many2one ( ' account.account ' , ' Account ' ,
required = True ) ,
' statement_id ' : fields . many2one ( ' account.bank.statement ' , ' Statement ' ,
2009-12-01 09:57:30 +00:00
select = True , required = True , ondelete = ' cascade ' ) ,
2008-07-22 15:11:28 +00:00
' reconcile_id ' : fields . many2one ( ' account.bank.statement.reconcile ' ,
2010-05-20 12:02:51 +00:00
' Reconcile ' ) ,
2008-07-22 15:11:28 +00:00
' move_ids ' : fields . many2many ( ' account.move ' ,
' account_bank_statement_line_move_rel ' , ' move_id ' , ' statement_id ' ,
' Moves ' ) ,
2009-12-22 09:38:41 +00:00
' ref ' : fields . char ( ' Reference ' , size = 32 ) ,
2008-07-22 15:11:28 +00:00
' note ' : fields . text ( ' Notes ' ) ,
' reconcile_amount ' : fields . function ( _reconcile_amount ,
string = ' Amount reconciled ' , method = True , type = ' float ' ) ,
2010-05-19 12:49:23 +00:00
' sequence ' : fields . integer ( ' Sequence ' , help = " Gives the sequence order when displaying a list of bank statement lines. " ) ,
2008-07-22 15:11:28 +00:00
}
_defaults = {
' name ' : lambda self , cr , uid , context = { } : self . pool . get ( ' ir.sequence ' ) . get ( cr , uid , ' account.bank.statement.line ' ) ,
' date ' : lambda * a : time . strftime ( ' % Y- % m- %d ' ) ,
' type ' : lambda * a : ' general ' ,
2009-11-25 09:31:44 +00:00
' sequence ' : lambda * a : 10 ,
2008-07-22 15:11:28 +00:00
}
2007-09-05 14:02:52 +00:00
2007-01-04 09:45:50 +00:00
account_bank_statement_line ( )
2010-08-24 13:06:22 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: