1
# -*- encoding: utf-8 -*-
2
##############################################################################
4
# Copyright (c) 2007 TINY SPRL. (http://tiny.be) All Rights Reserved.
6
# WARNING: This program as such is intended to be used by professional
7
# programmers who take the whole responsability of assessing all potential
8
# consequences resulting from its eventual inadequacies and bugs
9
# End users who are looking for a ready-to-use solution with commercial
10
# garantees and support are strongly adviced to contract a Free Software
13
# This program is Free Software; you can redistribute it and/or
14
# modify it under the terms of the GNU General Public License
15
# as published by the Free Software Foundation; either version 2
16
# of the License, or (at your option) any later version.
18
# This program is distributed in the hope that it will be useful,
19
# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
# GNU General Public License for more details.
23
# You should have received a copy of the GNU General Public License
24
# along with this program; if not, write to the Free Software
25
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27
##############################################################################
31
from osv import fields, osv
33
class res_company(osv.osv):
34
_inherit = 'res.company'
35
_description = 'res.company'
38
'federation_key' : fields.char('ID for the Federation',size=50,help="ID key for the sending of data to the belgian CCI's Federation"),
43
class res_partner_state(osv.osv):
44
_name = "res.partner.state"
45
_description = 'res.partner.state'
47
'name': fields.char('Partner Status',size=50,required=True),
51
class res_partner_state2(osv.osv):
52
_name = "res.partner.state2"
53
_description = 'res.partner.state2'
55
'name': fields.char('Customer Status',size=50,required=True),
59
class res_partner_article_review(osv.osv):
60
_name = "res.partner.article.review"
61
_description = 'res.partner.article.review'
63
'name': fields.char('Name',size=50, required=True),
64
'date':fields.date('Date', required=True),
65
'article_ids':fields.one2many('res.partner.article','review_id','Articles'),
69
'date': lambda *args: time.strftime('%Y-%m-%d')
72
res_partner_article_review()
75
class res_partner_article(osv.osv):
76
_name = "res.partner.article"
77
_description = 'res.partner.article'
78
_rec_name = 'article_id'
80
'article_id': fields.char('Article',size=256),
81
'page':fields.integer('Page',size=16),
82
'article_length':fields.float('Length'),
83
'picture':fields.boolean('Picture'),
84
'data':fields.boolean('Data'),
85
'graph':fields.boolean('Graph'),
86
'summary':fields.text('Summary'),
87
'source_id':fields.char('Source',size=256),
88
'date':fields.date('Date', required=True),
89
'title':fields.char('Title',size=250, required=True),
90
'subtitle':fields.text('Subtitle'),
91
'press_review':fields.boolean('In the next press review',help='Must be inserted on the next press review'),
92
'canal_id':fields.char('Reference',size=200,help='A text with or without a link incorporated'),
93
'review_id':fields.many2one('res.partner.article.review','Review'),
94
'partner_ids':fields.many2many('res.partner','res_partner_article_rel','article_id','partner_id','Partners'),
95
'contact_ids':fields.many2many('res.partner.contact','res_partner_contact_article_rel', 'article_id','contact_id','Contacts'),
98
'press_review' : lambda *a: False,
99
'article_id': lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'res.partner.article'),
101
res_partner_article()
103
class res_partner_article_keywords(osv.osv):
104
_name = "res.partner.article.keywords"
105
_description = 'res.partner.article.keywords'
107
'name': fields.char('Name',size=80,required=True),
108
'article_ids':fields.many2many('res.partner.article','partner_article_keword_rel','keyword_id','article_id','Articles'),
110
res_partner_article_keywords()
113
class res_partner_article(osv.osv):
114
_inherit = "res.partner.article"
116
'keywords_ids':fields.many2many('res.partner.article.keywords','article_keyword_rel','article_id','keyword_id','Keywords'),
118
res_partner_article()
120
class res_partner(osv.osv):
121
_inherit = "res.partner"
122
_description = "res.partner"
124
def create(self, cr, uid, vals, *args, **kwargs):
125
new_id = super(osv.osv,self).create(cr, uid, vals, *args, **kwargs)
126
#complete the user_id (salesman) automatically according to the zip code of the main address. Use res.partner.zip to select salesman according to zip code
127
if vals.has_key('address') and vals['address']:
128
for add in vals['address']:
129
if add[2]['zip_id'] and add[2]['type']=='default':
130
data=self.pool.get('res.partner.zip').browse(cr, uid, add[2]['zip_id'])
131
saleman_id = data.user_id.id
132
self.write(cr,uid,[new_id],{'user_id':saleman_id})
135
# def write(self, cr, uid, ids,vals, *args, **kwargs):
136
# print "vals: ", vals
138
# print "args: ", args
139
# print "kwargs: ", kwargs
142
# for partner in self.browse(cr, uid, ids):
143
# if not partner.user_id:
144
# #if not self.pool.get('res.partner').browse(cr, uid, ids)[0].user_id.id:
145
# if 'address' in vals:
146
# for add in vals['address']:
147
# if add[2] and (add[2]['zip_id'] and add[2]['type']=='default'):
148
# data=self.pool.get('res.partner.zip').browse(cr, uid, add[2]['zip_id'])
149
# saleman_id = data.user_id.id
150
# self.write(cr,uid,[partner.id],{'user_id':saleman_id})
152
# # data_partner=self.browse(cr, uid,ids)
153
# # for d in data_partner:
154
# for i in partner.address:
155
# list.append(i.type)
156
# if i.type=='default' and (not i.zip_id):
157
# self.write(cr,uid,[partner.id],{'user_id':False})
158
# if (not partner.address) or (not 'default' in list):
159
# self.write(cr,uid,[partner.id],{'user_id':False})
160
# return super(res_partner,self).write(cr, uid, ids,vals, *args, **kwargs)
163
def check_address(self, cr, uid, ids):
164
#constraints to ensure that there is only one default address by partner.
165
data_address=self.browse(cr, uid, ids)
167
for add in data_address[0].address:
168
if add.type in list and add.type=='default':
170
list.append(add.type)
173
def _check_activity(self,cr,uid,ids):
174
data_partner=self.browse(cr, uid, ids)
175
for data in data_partner:
177
for activity in data.activity_code_ids:
178
list_activities.append((activity.importance, activity.activity_id.list_id))
180
for (importance, list_id) in list_activities:
181
if importance == "main":
182
if list_id in main_list:
184
main_list.append(list_id)
187
def _get_customer_state(self, cr, uid, ctx):
188
ids = self.pool.get('res.partner.state').search(cr, uid, [('name','like', 'Imputable')])
193
def _get_partner_state(self, cr, uid, ctx):
194
ids = self.pool.get('res.partner.state2').search(cr, uid, [('name','like', 'En Activité')])
200
'employee_nbr': fields.integer('Nbr of Employee (Area)',help="Nbr of Employee in the area of the CCI"),
201
'employee_nbr_total':fields.integer('Nbr of Employee (Tot)',help="Nbr of Employee all around the world"),
202
'invoice_paper':fields.selection([('transfert belgian','Transfer belgian'),('transfert iban','Transfer iban'),('none','No printed transfert')], 'Bank Transfer Type', size=32),
203
'invoice_public':fields.boolean('Invoice Public'),
204
'invoice_special':fields.boolean('Invoice Special'),
205
'state_id':fields.many2one('res.partner.state','Partner State',help='status of activity of the partner'),
206
'state_id2':fields.many2one('res.partner.state2','Customer State',help='status of the partner as a customer'),
207
'activity_description':fields.text('Activity Description',translate=True),
208
'activity_code_ids':fields.one2many('res.partner.activity.relation','partner_id','Activity Codes'),
209
'export_procent':fields.integer('Export(%)'),
210
'export_year':fields.date('Export date',help='year of the export_procent value'),
211
'import_procent':fields.integer('Import (%)'),
212
'import_year':fields.date('Import Date',help='year of the import_procent value'),
213
'invoice_nbr':fields.integer('Nbr of invoice to print',help='number of additive invoices to be printed for this customer'),
214
'name_official':fields.char('Official Name',size=80),
215
'name_old':fields.char('Former Name',size=80),
216
'wall_exclusion':fields.boolean('Not in Walloon DB',help='exclusion of this partner from the walloon database'),
217
#'mag_send':fields.selection([('never','Never'),('always','Always'),('managed_by_poste','Managed_by_Poste'),('prospect','Prospect')], 'Send mag.'),
218
'date_founded':fields.date('Founding Date',help='Date of foundation of this company'),
219
'training_authorization':fields.char('Checks Auth.',size=12,help='Formation and Language Checks Authorization number'),
220
'alert_advertising':fields.boolean('Adv.Alert',help='Partners description to be shown when inserting new advertising sale'),
221
'alert_events':fields.boolean('Event Alert',help='Partners description to be shown when inserting new subscription to a meeting'),
222
'alert_legalisations':fields.boolean('Legal. Alert',help='Partners description to be shown when inserting new legalisation'),
223
'alert_membership':fields.boolean('Membership Alert',help='Partners description to be shown when inserting new ship sale'),
224
'alert_others':fields.boolean('Other alert',help='Partners description to be shown when inserting new sale not treated by _advertising, _events, _legalisations, _Membership'),
225
'alert_explanation':fields.text('Warning'),
226
'dir_name':fields.char('Name in Member Dir.',size=250,help='Name under wich the partner will be inserted in the members directory'),
227
'dir_name2':fields.char('1st Shortcut name ',size=250,help='First shortcut in the members directory, pointing to the dir_name field'),
228
'dir_name3':fields.char('2nd Shortcut name ',size=250,help='Second shortcut'),
229
'dir_date_last':fields.date('Partner Data Date',help='Date of latest update of the partner data by itself (via paper or Internet)'),
230
'dir_date_accept':fields.date("Good to shoot Date",help='Date of last acceptation of Bon a Tirer'),
231
'dir_presence':fields.boolean('Dir. Presence',help='Present in the directory of the members'),
232
'dir_date_publication':fields.date('Publication Date'),
233
'dir_exclude':fields.boolean('Dir. exclude',help='Exclusion from the Members directory'),
235
'magazine_subscription':fields.selection( [('never','Never'),('prospect','Prospect'),('personal','Personnal'), ('postal','Postal')], "Magazine subscription"),
236
'magazine_subscription_source':fields.char('Mag. Subscription Source',size=30),
237
'country_relation':fields.one2many('res.partner.country.relation','partner_id','Country Relation'),
238
'address': fields.one2many('res.partner.address', 'partner_id', 'Addresses'),# overridden just to change the name with "Addresses" instead of "Contacts"
239
'relation_ids' : fields.one2many('res.partner.relation','current_partner_id','Partner Relation'),
240
'canal_id': fields.many2one('res.partner.canal', 'Favourite Channel'),
242
'article_ids' : fields.many2many('res.partner.article','res_partner_article_rel','partner_id','article_id','Articles')
243
#Never,Always,Managed_by_Poste,Prospect
245
#virement belge,virement iban
248
'wall_exclusion' : lambda *a: False,
249
'dir_presence' : lambda *a: True,
250
'dir_exclude':lambda *a: False,
251
'magazine_subscription': lambda *a: 'prospect',
252
'state_id': _get_partner_state,
253
'state_id2': _get_customer_state,
255
_constraints = [(check_address, 'Only One default address is allowed!', ['address']),(_check_activity, 'Partner Should have only one Main Activity!', ['activity_code_ids'])]
258
('vat_uniq', 'unique (vat)', 'The VAT of the partner must be unique !')
263
class res_partner_zip_group_type(osv.osv):
264
_name = "res.partner.zip.group.type"
265
_description = 'res.partner.zip.group.type'
267
'name':fields.char('Name',size=50,required=True),
269
res_partner_zip_group_type()
271
class res_partner_zip_group(osv.osv):
272
_name = "res.partner.zip.group"
273
_description = 'res.partner.zip.group'
275
'type_id':fields.many2one('res.partner.zip.group.type','Type'),
276
'name':fields.char('Name',size=50,required=True),
278
res_partner_zip_group()
280
class res_partner_zip(osv.osv):
281
_name = "res.partner.zip"
282
_description = 'res.partner.zip'
283
def check_group_type(self, cr, uid, ids):
284
data=self.browse(cr, uid, ids)
287
select group_id from partner_zip_group_rel1 where zip_id=%d
290
groups = cr.fetchall()
293
list_group.append(group[0])
294
data_zip = self.pool.get('res.partner.zip.group').browse(cr, uid,list_group)
296
for data in data_zip:
297
if data.type_id.id in list_zip:
299
list_zip.append(data.type_id.id)
302
def name_get(self, cr, user, ids, context={}):
303
#will return zip code and city......
307
for r in self.read(cr, user, ids, ['name','city']):
308
zip_city = str(r['name'] or '')
309
if r['name'] and r['city']:
311
zip_city += str(r['city'] or '')
312
res.append((r['id'], zip_city))
315
_constraints = [(check_group_type, 'Error: Only one group of the same group type is allowed!', ['groups_id'])]
317
'name':fields.char('Zip Code',size=10,required=True, select=1),
318
'city':fields.char('City',size=60,translate=True),
319
'partner_id':fields.many2one('res.partner','Master Cci'),
320
'post_center_id':fields.char('Post Center',size=40),
321
'post_center_special':fields.boolean('Post Center Special'),
322
'user_id':fields.many2one('res.users','Salesman Responsible'),
323
'groups_id': fields.many2many('res.partner.zip.group', 'partner_zip_group_rel1', 'zip_id', 'group_id', 'Areas'),
324
'distance':fields.integer('Distance',help='Distance (km) between zip location and the cci.')
329
class res_partner_job(osv.osv):
331
def unlink(self, cr, uid, ids, context={}):
332
#Unlink related contact if: no other job AND not self_sufficient
333
job_ids=self.pool.get('res.partner.job').browse(cr, uid, ids)
334
for job_id in job_ids:
335
id_contact = job_id.contact_id.id
336
super(res_partner_job,self).unlink(cr, uid, job_id.id,context=context)
338
data_contact=self.pool.get('res.partner.contact').browse(cr, uid,[id_contact])
339
for data in data_contact:
340
if (not data.self_sufficent) and (not data.job_ids):
341
self.pool.get('res.partner.contact').unlink(cr, uid,[data.id], context)
344
def create(self, cr, uid, vals, *args, **kwargs):
345
if vals.has_key('function_code_label') and vals['function_code_label']:
347
for letter in vals['function_code_label']:
348
res = self.pool.get('res.partner.function').search(cr, uid, [('code','=', letter)])
350
temp += self.pool.get('res.partner.function').browse(cr, uid,res)[0].code
351
vals['function_code_label'] = temp
352
vals['function_id'] = self.pool.get('res.partner.function').search(cr, uid, [])[0]
353
return super(res_partner_job,self).create(cr, uid, vals, *args, **kwargs)
355
def write(self, cr, uid, ids,vals, *args, **kwargs):
356
if vals.has_key('function_code_label') and vals['function_code_label']:
358
for letter in vals['function_code_label']:
359
res = self.pool.get('res.partner.function').search(cr, uid, [('code','=', letter)])
361
temp += self.pool.get('res.partner.function').browse(cr, uid,res)[0].code
362
vals['function_code_label'] = temp
363
vals['function_id'] = self.pool.get('res.partner.function').search(cr, uid, [])[0]
364
return super(res_partner_job,self).write(cr, uid, ids,vals, *args, **kwargs)
366
_inherit = 'res.partner.job'
368
'function_label':fields.char('Function Label',size=128, required=True),
369
'function_code_label':fields.char('Codes',size=128,),
370
'date_start':fields.date('Date start'),
371
'date_end':fields.date('Date end'),
372
'canal_id':fields.many2one('res.partner.canal','Canal',help='favorite chanel for communication'),
373
'active':fields.boolean('Active'),
374
'who_presence':fields.boolean('In Whos Who'),
375
'dir_presence':fields.boolean('In Directory'),
376
'department': fields.char('Department',size=20),
380
'who_presence' : lambda *a: True,
381
'dir_presence' : lambda *a: True,
382
'active' : lambda *a: True,
387
class res_partner_address(osv.osv):
388
_inherit = "res.partner.address"
389
_description = 'res.partner.address'
391
def create(self, cr, uid, vals, *args, **kwargs):
392
if vals.has_key('zip_id') and vals['zip_id']:
393
vals['zip'] = self.pool.get('res.partner.zip').browse(cr, uid,vals['zip_id']).name
394
vals['city'] = self.pool.get('res.partner.zip').browse(cr, uid,vals['zip_id']).city
395
return super(res_partner_address,self).create(cr, uid, vals, *args, **kwargs)
397
def write(self, cr, uid, ids,vals, *args, **kwargs):
398
if vals.has_key('zip_id') and vals['zip_id']:
399
vals['zip'] = self.pool.get('res.partner.zip').browse(cr, uid,vals['zip_id']).name
400
vals['city'] = self.pool.get('res.partner.zip').browse(cr, uid,vals['zip_id']).city
401
return super(res_partner_address,self).write(cr, uid, ids,vals, *args, **kwargs)
405
# def _get_name(self, cr, uid, ids, name, arg, context={}):
407
# for add in self.browse(cr, uid, ids, context):
409
# res[add.id] = (add.department or '') + ' ' + add.contact_id.name
411
# res[add.id] = add.department
415
#'name': fields.function(_get_name, method=True, string='Contact Name',type='char',size=64),#override parent field
416
'state': fields.selection([('correct','Correct'),('to check','To check')],'Code'),
417
'zip_id':fields.many2one('res.partner.zip','Zip'),
419
'sequence_partner':fields.integer('Sequence (Partner)',help='order of importance of this address in the list of addresses of the linked partner'),
424
'state' : lambda *a: 'correct',
427
def onchange_user_id(self, cr, uid, ids,zip_id):
428
#Changing the zip code can change the salesman
429
if not ids or not zip_id:
431
id = self.browse(cr, uid, ids)[0]
432
if not id.partner_id.user_id:
433
data_add=self.pool.get('res.partner.address').browse(cr, uid,ids)
435
for data in data_add:
436
if data.type=='default':
437
data_zip=self.pool.get('res.partner.zip').browse(cr, uid,[zip_id])
438
for data1 in data_zip:
440
self.pool.get('res.partner').write(cr, uid,[data.partner_id.id],{'user_id':data1.user_id.id})
443
# def onchange_contact_id(self, cr, uid, ids, contact_id):
446
# return {'value':{'name' : False}}
447
# contact_data=self.pool.get('res.partner.contact').browse(cr, uid, contact_id)
448
# return {'value':{'name' : contact_data.name}}
451
res_partner_address()
453
class res_partner_activity_list(osv.osv):#new object added!
454
_name = "res.partner.activity.list"
455
_description = 'res.partner.activity.list'
457
'name': fields.char('Code list',size=256,required=True),
458
'abbreviation':fields.char('Abbreviation',size=16),
460
res_partner_activity_list()
462
class res_partner_activity(osv.osv):#modfiy res.activity.code to res.partner.activity
463
_name = "res.partner.activity"
464
_description = 'res.partner.activity'
466
def name_get(self, cr, uid, ids, context={}):
467
#return somethong like”list_id.abbreviation or list_id.name – code”
469
for act in self.browse(cr, uid, ids, context):
470
res.append( (act.id, (act.code or '')+' - '+(act.label or '')))
471
# data_activity = self.read(cr, uid, ids, ['list_id','code'], context)
473
# list_obj = self.pool.get('res.partner.activity.list')
474
# for read in data_activity:
475
# if read['list_id']:
476
# data=list_obj.read(cr, uid, read['list_id'][0],['abbreviation','name'], context)
477
# if data['abbreviation']:
478
# res.append((read['id'], data['abbreviation']))
480
# str=data['name']+'-'+read['code']
481
# res.append((read['id'],str))
484
'code': fields.char('Code',size=6,required=True),
485
'label':fields.char('Label',size=250,transtale=True,required=True),
486
'description':fields.text('Description'),
487
'code_relations':fields.many2many('res.partner.activity','res_activity_code_rel','code_id1','code_id2','Related codes'),
488
#'partner_id':fields.many2one('res.partner','Partner'),
489
'list_id':fields.many2one('res.partner.activity.list','List',required=True)
491
res_partner_activity()
493
class res_partner_activity_relation(osv.osv):
494
_name = "res.partner.activity.relation"
495
_description = 'res.partner.activity.relation'
497
'importance': fields.selection([('main','Main'),('primary','Primary'),('secondary','Secondary')],'Importance',required=True),
498
'activity_id':fields.many2one('res.partner.activity','Activity', ondelete="cascade"),
499
'partner_id':fields.many2one('res.partner','Partner', ondelete="cascade"),
502
'importance': lambda *args: 'main'
504
res_partner_activity_relation()
506
class res_partner_function(osv.osv):
507
_inherit = 'res.partner.function'
508
_description = 'Function of the contact inherit'
510
def name_get(self, cr, uid, ids, context={}):
513
reads = self.read(cr, uid, ids, ['code','name'], context)
517
if record['name'] or record['code']:
518
str1=record['name']+'('+(record['code'] or '')+')'
519
res.append((record['id'], str1))
521
res_partner_function()
523
class res_partner_relation_type(osv.osv):
524
_name = "res.partner.relation.type"
525
_description ='res.partner.relation.type'
527
'name': fields.char('Contact',size=50, required=True),
529
res_partner_relation_type()
531
class res_partner_relation(osv.osv):
532
_name = "res.partner.relation"
533
_description = 'res.partner.relation'
534
_rec_name = 'partner_id'
536
'partner_id': fields.many2one('res.partner','Partner', required=True),
537
'current_partner_id':fields.many2one('res.partner','Partner', required=True),
538
'description':fields.text('Description'),
539
'percent':fields.float('Ownership'),
540
'type_id':fields.many2one('res.partner.relation.type','Type', required=True),
542
res_partner_relation()
544
class res_partner_country_relation(osv.osv):
545
_name = "res.partner.country.relation"
546
_description = 'res.partner.country.relation'
548
'frequency': fields.selection([('frequent','Frequent'),('occasional','Occasionnel'),('prospect','Prospection')],'Frequency'),
549
'partner_id':fields.many2one('res.partner','Partner'),
550
'country_id':fields.many2one('cci_country.cci_country','Country'),
551
'type':fields.selection([('export','Export'),('import','Import'),('saloon','Salon'),('representation','Representation'),('expert','Expert')],'Types'),
553
res_partner_country_relation()
555
class res_partner_contact(osv.osv):
556
_inherit='res.partner.contact'
558
'article_ids':fields.many2many('res.partner.article','res_partner_contact_article_rel','contact_id','article_id','Articles'),
560
res_partner_contact()
562
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: