259 lines
12 KiB
Python
259 lines
12 KiB
Python
# -*- encoding: utf-8 -*-
|
|
##############################################################################
|
|
#
|
|
# OpenERP, Open Source Management Solution
|
|
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
|
|
# $Id$
|
|
#
|
|
# 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 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 General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
##############################################################################
|
|
|
|
import time
|
|
import netsvc
|
|
from osv import fields, osv
|
|
import ir
|
|
import pooler
|
|
import mx.DateTime
|
|
from mx.DateTime import RelativeDateTime
|
|
from tools import config
|
|
|
|
class Account(osv.osv):
|
|
_inherit = "account.account"
|
|
|
|
def _get_level(self, cr, uid, ids, field_name, arg, context={}):
|
|
res={}
|
|
acc_obj=self.browse(cr,uid,ids)
|
|
for aobj in acc_obj:
|
|
level = 0
|
|
if aobj.parent_id :
|
|
obj=self.browse(cr,uid,aobj.parent_id.id)
|
|
level= obj.level + 1
|
|
res[aobj.id] = level
|
|
return res
|
|
|
|
def _get_children_and_consol(self, cr, uid, ids, context={}):
|
|
ids2=[]
|
|
temp=[]
|
|
read_data= self.read(cr, uid, ids,['id','child_id'], context)
|
|
for data in read_data:
|
|
ids2.append(data['id'])
|
|
if data['child_id']:
|
|
temp=[]
|
|
for x in data['child_id']:
|
|
temp.append(x)
|
|
ids2 += self._get_children_and_consol(cr, uid, temp, context)
|
|
return ids2
|
|
|
|
_columns = {
|
|
|
|
'journal_id':fields.many2one('account.journal', 'Journal',domain=[('type','=','situation')]),
|
|
'open_bal' : fields.float('Opening Balance',digits=(16,2)),
|
|
'level': fields.function(_get_level, string='Level', method=True, store=True, type='integer'),
|
|
'type1':fields.selection([('dr','Debit'),('cr','Credit'),('none','None')], 'Dr/Cr',store=True),
|
|
}
|
|
|
|
def compute_total(self, cr, uid, ids, yr_st_date, yr_end_date, st_date, end_date, field_names, context={}, query=''):
|
|
#compute the balance/debit/credit accordingly to the value of field_name for the given account ids
|
|
mapping = {
|
|
'credit': "COALESCE(SUM(l.credit), 0) as credit ",
|
|
'balance': "COALESCE(SUM(l.debit),0) - COALESCE(SUM(l.credit), 0) as balance ",
|
|
'debit': "COALESCE(SUM(l.debit), 0) as debit ",
|
|
}
|
|
#get all the necessary accounts
|
|
ids2 = self._get_children_and_consol(cr, uid, ids, context)
|
|
acc_set = ",".join(map(str, ids2))
|
|
#compute for each account the balance/debit/credit from the move lines
|
|
if not (st_date >= yr_st_date and end_date <= yr_end_date):
|
|
return {}
|
|
accounts = {}
|
|
if ids2:
|
|
query = self.pool.get('account.move.line')._query_get(cr, uid,
|
|
context=context)
|
|
cr.execute("SELECT l.account_id as id, " \
|
|
+ ' , '.join(map(lambda x: mapping[x], field_names.keys() )) + \
|
|
"FROM account_move_line l " \
|
|
"WHERE l.account_id IN ("+ acc_set +") " \
|
|
"AND " + query + " " \
|
|
" AND l.date >= "+"'"+ st_date +"'"+" AND l.date <= "+"'"+ end_date +""+"'"" " \
|
|
"GROUP BY l.account_id ")
|
|
for res in cr.dictfetchall():
|
|
accounts[res['id']] = res
|
|
#for the asked accounts, get from the dictionnary 'accounts' the value of it
|
|
res = {}
|
|
for id in ids:
|
|
res[id] = self._get_account_values(cr, uid, id, accounts, field_names, context)
|
|
return res
|
|
|
|
def create(self, cr, uid, vals, context={}):
|
|
name=self.search(cr,uid,[('name','ilike',vals['name']),('company_id','=',vals['name'])])
|
|
if name:
|
|
raise osv.except_osv('Error', 'Account is Already Created !')
|
|
obj=self.pool.get('account.account.type').browse(cr,uid,vals['user_type'])
|
|
if obj.code in ('cash','asset','expense'):
|
|
vals['type1'] = 'dr'
|
|
elif obj.code in ('equity','income','liability') :
|
|
vals['type1'] = 'cr'
|
|
else:
|
|
vals['type1'] = 'none'
|
|
journal_ids=self.pool.get('account.journal').search(cr,uid,[('name','=','Opening Journal')])
|
|
vals['journal_id'] = journal_ids and journal_ids[0] or False
|
|
account_id = super(Account, self).create(cr, uid, vals, context)
|
|
if vals.get('type1', False) != False:
|
|
journal_id = vals.get('journal_id',False)
|
|
if journal_id and vals.has_key('open_bal'):
|
|
if vals['open_bal'] != 0.0:
|
|
journal = self.pool.get('account.journal').browse(cr, uid, [journal_id])
|
|
if journal and journal[0].sequence_id:
|
|
name = self.pool.get('ir.sequence').get_id(cr, uid, journal[0].sequence_id.id)
|
|
move=self.pool.get('account.move').search(cr,uid,[('journal_id','=',journal_id)])
|
|
if not move:
|
|
move = False
|
|
move_data = {'name': name, 'journal_id': journal_id}
|
|
move_id=self.pool.get('account.move').create(cr,uid,move_data)
|
|
move_obj=self.pool.get('account.move').browse(cr,uid,move_id)
|
|
else:
|
|
move_obj=self.pool.get('account.move').browse(cr,uid,move[0])
|
|
self_obj=self.browse(cr,uid,account_id)
|
|
move_line = {
|
|
'name':journal[0].name,
|
|
'debit':self_obj.debit or False,
|
|
'credit':self_obj.credit or False,
|
|
'account_id':account_id or False,
|
|
'move_id':move and move[0] or move_id,
|
|
'journal_id':journal_id ,
|
|
'period_id':move_obj.period_id.id,
|
|
}
|
|
if vals['type1'] == 'dr':
|
|
move_line['debit'] = vals['open_bal'] or False
|
|
elif vals['type1'] == 'cr':
|
|
move_line['credit'] = vals['open_bal'] or False
|
|
self.pool.get('account.move.line').create(cr,uid,move_line)
|
|
return account_id
|
|
|
|
def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True):
|
|
res_temp={}
|
|
if vals.has_key('name'):
|
|
if not vals.has_key('company_id'):
|
|
vals['company_id']=self.browse(cr,uid,ids)[0].company_id.id
|
|
name=self.search(cr,uid,[('name','ilike',vals['name']),('company_id','=',vals['company_id'])])
|
|
if name:
|
|
raise osv.except_osv('Error', 'Same Account Name is Already present !')
|
|
if vals.has_key('user_type'):
|
|
obj=self.pool.get('account.account.type').browse(cr,uid,vals['user_type'])
|
|
if obj.code in ('asset','expense'):
|
|
vals['type1'] = 'dr'
|
|
elif obj.code in ('income','liability') :
|
|
vals['type1'] = 'cr'
|
|
else:
|
|
vals['type1'] = 'none'
|
|
super(Account, self).write(cr, uid,ids, vals, context)
|
|
if vals.has_key('open_bal'):
|
|
self_obj= self.browse(cr,uid,ids)
|
|
move_pool=self.pool.get('account.move')
|
|
if vals:
|
|
for obj in self_obj:
|
|
flg=0
|
|
if obj.journal_id and obj.journal_id.type == 'situation':
|
|
move=move_pool.search(cr,uid,[('journal_id','=',obj.journal_id.id)])
|
|
if move:
|
|
move_obj=move_pool.browse(cr,uid,move[0])
|
|
move=move[0]
|
|
else:
|
|
name = self.pool.get('ir.sequence').get_id(cr, uid, obj.journal_id.sequence_id.id)
|
|
move_data = {'name': name, 'journal_id': obj.journal_id.id}
|
|
move=self.pool.get('account.move').create(cr,uid,move_data)
|
|
move_obj=move_pool.browse(cr,uid,move)
|
|
move_line_data={'name':obj.journal_id.name,
|
|
'debit':obj.debit or 0.0,
|
|
'credit':obj.credit or 0.0,
|
|
'account_id':obj.id,
|
|
'move_id':move,
|
|
'journal_id':obj.journal_id.id,
|
|
'period_id':move_obj.period_id.id,
|
|
}
|
|
if obj.type1:
|
|
if obj.type1 == 'dr':
|
|
move_line_data['debit'] = obj.open_bal
|
|
elif obj.type1 == 'cr':
|
|
move_line_data['credit'] = obj.open_bal
|
|
if move_obj and move:
|
|
for move_line in move_obj.line_id:
|
|
if move_line.account_id.id == obj.id:
|
|
if move_line_data['debit'] == 0.0 and move_line_data['credit']== 0.0:
|
|
self.pool.get('account.move.line').unlink(cr,uid,[move_line.id])
|
|
else:
|
|
self.pool.get('account.move.line').write(cr,uid,[move_line.id],move_line_data)
|
|
flg=1
|
|
if not flg:
|
|
self.pool.get('account.move.line').create(cr,uid,move_line_data)
|
|
return True
|
|
|
|
def onchange_type(self, cr, uid, ids,user_type,type1):
|
|
if not user_type:
|
|
return {'value' : {}}
|
|
type_obj=self.pool.get('account.account.type').browse(cr,uid,user_type)
|
|
if type_obj.code in ('asset','expense'):
|
|
type1 = 'dr'
|
|
elif type_obj.code in ('income','liability') :
|
|
type1 = 'cr'
|
|
else:
|
|
type1 = 'none'
|
|
|
|
return {
|
|
'value' : {'type1' : type1}
|
|
}
|
|
Account()
|
|
|
|
class AccountMove(osv.osv):
|
|
_inherit = "account.move"
|
|
_columns = {
|
|
'name':fields.char('Name', size=256, required=True, readonly=True, states={'draft':[('readonly',False)]}),
|
|
'voucher_type': fields.selection([
|
|
('pay_voucher','Cash Payment Voucher'),
|
|
('bank_pay_voucher','Bank Payment Voucher'),
|
|
('rec_voucher','Cash Receipt Voucher'),
|
|
('bank_rec_voucher','Bank Receipt Voucher'),
|
|
('cont_voucher','Contra Voucher'),
|
|
('journal_sale_vou','Journal Sale Voucher'),
|
|
('journal_pur_voucher','Journal Purchase Voucher'),
|
|
('journal_voucher','Journal Voucher'),
|
|
],'Voucher Type', readonly=True, select=True, states={'draft':[('readonly',False)]}),
|
|
'narration':fields.text('Narration'),
|
|
}
|
|
|
|
AccountMove()
|
|
|
|
class res_currency(osv.osv):
|
|
_inherit = "res.currency"
|
|
|
|
_columns = {
|
|
'sub_name': fields.char('Sub Currency', size=32, required=True)
|
|
}
|
|
_defaults = {
|
|
'sub_name': lambda *a: 'cents',
|
|
|
|
}
|
|
res_currency()
|
|
|
|
class account_account_template(osv.osv):
|
|
_inherit = "account.account.template"
|
|
|
|
_columns = {
|
|
'type1':fields.selection([('dr','Debit'),('cr','Credit'),('none','None')], 'Dr/Cr',store=True),
|
|
}
|
|
|
|
account_account_template()
|
|
|
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |