cbc5a966f79faba0dafaf3bfe6fd862f54626862
[odoo/odoo.git] / addons / account / account_bank.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
6 #
7 #    This program is free software: you can redistribute it and/or modify
8 #    it under the terms of the GNU Affero General Public License as
9 #    published by the Free Software Foundation, either version 3 of the
10 #    License, or (at your option) any later version.
11 #
12 #    This program is distributed in the hope that it will be useful,
13 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #    GNU Affero General Public License for more details.
16 #
17 #    You should have received a copy of the GNU Affero General Public License
18 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##############################################################################
21
22 from tools.translate import _
23 from osv import fields, osv
24
25 class bank(osv.osv):
26     _inherit = "res.partner.bank"
27     _columns = {
28         'journal_id': fields.many2one('account.journal', 'Account Journal', help="This journal will be created automatically for this bank account when you save the record"),
29         'currency_id': fields.related('journal_id', 'currency', type="many2one", relation='res.currency', readonly=True,
30             string="Currency", help="Currency of the related account journal."),
31     }
32     def create(self, cr, uid, data, context={}):
33         result = super(bank, self).create(cr, uid, data, context=context)
34         self.post_write(cr, uid, [result], context=context)
35         return result
36
37     def write(self, cr, uid, ids, data, context={}):
38         result = super(bank, self).write(cr, uid, ids, data, context=context)
39         self.post_write(cr, uid, ids, context=context)
40         return result
41
42     def _prepare_name(self, bank):
43         "Return the name to use when creating a bank journal"
44         return (bank.bank_name or '') + ' ' + bank.acc_number
45
46     def post_write(self, cr, uid, ids, context={}):
47         if isinstance(ids, (int, long)):
48           ids = [ids]
49
50         obj_acc = self.pool.get('account.account')
51         obj_data = self.pool.get('ir.model.data')
52
53         for bank in self.browse(cr, uid, ids, context):
54             if bank.company_id and not bank.journal_id:
55                 # Find the code and parent of the bank account to create
56                 dig = 6
57                 current_num = 1
58                 ids = obj_acc.search(cr, uid, [('type','=','liquidity'), ('company_id', '=', bank.company_id.id)], context=context)
59                 # No liquidity account exists, no template available
60                 if not ids: continue
61
62                 ref_acc_bank_temp = obj_acc.browse(cr, uid, ids[0], context=context)
63                 ref_acc_bank = ref_acc_bank_temp.parent_id
64                 while True:
65                     new_code = str(ref_acc_bank.code.ljust(dig-len(str(current_num)), '0')) + str(current_num)
66                     ids = obj_acc.search(cr, uid, [('code', '=', new_code), ('company_id', '=', bank.company_id.id)])
67                     if not ids:
68                         break
69                     current_num += 1
70                 name = self._prepare_name(bank)
71                 acc = {
72                     'name': name,
73                     'code': new_code,
74                     'type': 'liquidity',
75                     'user_type': ref_acc_bank_temp.user_type.id,
76                     'reconcile': False,
77                     'parent_id': ref_acc_bank.id,
78                     'company_id': bank.company_id.id,
79                 }
80                 acc_bank_id  = obj_acc.create(cr,uid,acc,context=context)
81
82                 # Get the journal view id
83                 data_id = obj_data.search(cr, uid, [('model','=','account.journal.view'), ('name','=','account_journal_bank_view')])
84                 data = obj_data.browse(cr, uid, data_id[0], context=context)
85                 view_id_cash = data.res_id
86
87                 jour_obj = self.pool.get('account.journal')
88                 new_code = 1
89                 while True:
90                     code = _('BNK')+str(new_code)
91                     ids = jour_obj.search(cr, uid, [('code','=',code)], context=context)
92                     if not ids:
93                         break
94                     new_code += 1
95
96                 #create the bank journal
97                 vals_journal = {
98                     'name': name,
99                     'code': code,
100                     'type': 'bank',
101                     'company_id': bank.company_id.id,
102                     'analytic_journal_id': False,
103                     'default_credit_account_id': acc_bank_id,
104                     'default_debit_account_id': acc_bank_id,
105                     'view_id': view_id_cash
106                 }
107                 journal_id = jour_obj.create(cr, uid, vals_journal, context=context)
108
109                 self.write(cr, uid, [bank.id], {'journal_id': journal_id}, context=context)
110         return True
111
112 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: