5a7c73c7f6dd73ccc88e4a8e3ded5a48056dd222
[odoo/odoo.git] / openerp / addons / base / res / res_bank.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #    
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2009 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 osv import fields, osv
23
24 class Bank(osv.osv):
25     _description='Bank'
26     _name = 'res.bank'
27     _order = 'name'
28     _columns = {
29         'name': fields.char('Name', size=128, required=True),
30         'street': fields.char('Street', size=128),
31         'street2': fields.char('Street2', size=128),
32         'zip': fields.char('Zip', change_default=True, size=24),
33         'city': fields.char('City', size=128),
34         'state': fields.many2one("res.country.state", 'State',
35             domain="[('country_id', '=', country)]"),
36         'country': fields.many2one('res.country', 'Country'),
37         'email': fields.char('E-Mail', size=64),
38         'phone': fields.char('Phone', size=64),
39         'fax': fields.char('Fax', size=64),
40         'active': fields.boolean('Active'),
41         'bic': fields.char('Bank Identifier Code', size=64,
42             help="Sometimes called BIC or Swift."),
43     }
44     _defaults = {
45         'active': lambda *a: 1,
46     }
47     def name_get(self, cr, uid, ids, context=None):
48         result = []
49         for bank in self.browse(cr, uid, ids, context):
50             result.append((bank.id, (bank.bic and (bank.bic + ' - ') or '') + bank.name))
51         return result
52
53 Bank()
54
55
56 class res_partner_bank_type(osv.osv):
57     _description='Bank Account Type'
58     _name = 'res.partner.bank.type'
59     _order = 'name'
60     _columns = {
61         'name': fields.char('Name', size=64, required=True, translate=True),
62         'code': fields.char('Code', size=64, required=True),
63         'field_ids': fields.one2many('res.partner.bank.type.field', 'bank_type_id', 'Type fields'),
64         'format_layout': fields.text('Format Layout', translate=True)
65     }
66     _defaults = {
67         'format_layout': lambda *args: "%(bank_name)s: %(acc_number)s"
68     }
69 res_partner_bank_type()
70
71 class res_partner_bank_type_fields(osv.osv):
72     _description='Bank type fields'
73     _name = 'res.partner.bank.type.field'
74     _order = 'name'
75     _columns = {
76         'name': fields.char('Field Name', size=64, required=True, translate=True),
77         'bank_type_id': fields.many2one('res.partner.bank.type', 'Bank Type', required=True, ondelete='cascade'),
78         'required': fields.boolean('Required'),
79         'readonly': fields.boolean('Readonly'),
80         'size': fields.integer('Max. Size'),
81     }
82 res_partner_bank_type_fields()
83
84
85 class res_partner_bank(osv.osv):
86     '''Bank Accounts'''
87     _name = "res.partner.bank"
88     _rec_name = "acc_number"
89     _description = __doc__
90     _order = 'sequence'
91
92     def _bank_type_get(self, cr, uid, context=None):
93         bank_type_obj = self.pool.get('res.partner.bank.type')
94
95         result = []
96         type_ids = bank_type_obj.search(cr, uid, [])
97         bank_types = bank_type_obj.browse(cr, uid, type_ids, context=context)
98         for bank_type in bank_types:
99             result.append((bank_type.code, bank_type.name))
100         return result
101
102     def _default_value(self, cursor, user, field, context=None):
103         if field in ('country_id', 'state_id'):
104             value = False
105         else:
106             value = ''
107         if not context.get('address', False):
108             return value
109         for ham, spam, address in context['address']:
110             if address.get('type', False) == 'default':
111                 return address.get(field, value)
112             elif not address.get('type', False):
113                 value = address.get(field, value)
114         return value
115
116     _rec_name = 'acc_number'
117     _columns = {
118         'name': fields.char('Bank Account', size=64), # to be removed in v6.2 ?
119         'acc_number': fields.char('Account Number', size=64, required=True),
120         'bank': fields.many2one('res.bank', 'Bank'),
121         'bank_bic': fields.char('Bank Identifier Code', size=16),
122         'bank_name': fields.char('Bank Name', size=32),
123         'owner_name': fields.char('Account Owner Name', size=64),
124         'street': fields.char('Street', size=128),
125         'zip': fields.char('Zip', change_default=True, size=24),
126         'city': fields.char('City', size=128),
127         'country_id': fields.many2one('res.country', 'Country',
128             change_default=True),
129         'state_id': fields.many2one("res.country.state", 'State',
130             change_default=True, domain="[('country_id','=',country_id)]"),
131         'company_id': fields.many2one('res.company', 'Company',
132             ondelete='cascade', help="Only if this bank account belong to your company"),
133         'partner_id': fields.many2one('res.partner', 'Account Owner', required=True,
134             ondelete='cascade', select=True),
135         'state': fields.selection(_bank_type_get, 'Bank Account Type', required=True,
136             change_default=True),
137         'sequence': fields.integer('Sequence'),
138         'footer': fields.boolean("Display on Reports")
139     }
140     _defaults = {
141         'owner_name': lambda obj, cursor, user, context: obj._default_value(
142             cursor, user, 'name', context=context),
143         'street': lambda obj, cursor, user, context: obj._default_value(
144             cursor, user, 'street', context=context),
145         'city': lambda obj, cursor, user, context: obj._default_value(
146             cursor, user, 'city', context=context),
147         'zip': lambda obj, cursor, user, context: obj._default_value(
148             cursor, user, 'zip', context=context),
149         'country_id': lambda obj, cursor, user, context: obj._default_value(
150             cursor, user, 'country_id', context=context),
151         'state_id': lambda obj, cursor, user, context: obj._default_value(
152             cursor, user, 'state_id', context=context),
153         'name': lambda *args: '/'
154     }
155
156     def fields_get(self, cr, uid, fields=None, context=None):
157         res = super(res_partner_bank, self).fields_get(cr, uid, fields, context)
158         bank_type_obj = self.pool.get('res.partner.bank.type')
159         type_ids = bank_type_obj.search(cr, uid, [])
160         types = bank_type_obj.browse(cr, uid, type_ids)
161         for type in types:
162             for field in type.field_ids:
163                 if field.name in res:
164                     res[field.name].setdefault('states', {})
165                     res[field.name]['states'][type.code] = [
166                             ('readonly', field.readonly),
167                             ('required', field.required)]
168         return res
169
170     def name_get(self, cr, uid, ids, context=None):
171         if not len(ids):
172             return []
173         bank_type_obj = self.pool.get('res.partner.bank.type')
174         res = []
175         for val in self.browse(cr, uid, ids, context=context):
176             result = val.acc_number
177             if val.state:
178                 type_ids = bank_type_obj.search(cr, uid, [('code','=',val.state)])
179                 if type_ids:
180                     t = bank_type_obj.browse(cr, uid, type_ids[0], context=context)
181                     try:
182                         result = t.format_layout % val._data[val.id]
183                     except:
184                         result += ' [Formating Error]'
185                         raise
186             res.append((val.id, result))
187         return res
188
189     def onchange_company_id(self, cr, uid, ids, company_id, context={}):
190         result = {}
191         if company_id:
192             c = self.pool.get('res.company').browse(cr, uid, company_id, context=context)
193             if c.partner_id:
194                 r = self.onchange_partner_id(cr, uid, ids, c.partner_id.id, context=context)
195                 r['value']['partner_id'] = c.partner_id.id
196                 r['value']['footer'] = 1
197                 result = r
198         return result
199
200     def onchange_bank_id(self, cr, uid, ids, bank_id, context={}):
201         result = {}
202         if bank_id:
203             bank = self.pool.get('res.bank').browse(cr, uid, bank_id, context=context)
204             result['bank_name'] = bank.name
205             result['bank_bic'] = bank.bic
206         return {'value': result}
207
208
209     def onchange_partner_id(self, cr, uid, id, partner_id, context={}):
210         result = {}
211         if partner_id:
212             part = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
213             result['owner_name'] = part.name
214             result['street'] = part.address and part.address[0].street or False
215             result['city'] = part.address and part.address[0].city or False
216             result['zip'] =  part.address and part.address[0].zip or False
217             result['country_id'] =  part.address and part.address[0].country_id and part.address[0].country_id.id or False
218             result['state_id'] = part.address and part.address[0].state_id and part.address[0].state_id.id or False
219         return {'value': result}
220
221 res_partner_bank()
222
223