1
# -*- encoding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
8
# This program is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU General Public License for more details.
18
# You should have received a copy of the GNU General Public License
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
21
##############################################################################
24
from osv import fields
30
class dm_order(osv.osv):
33
'raw_datas' : fields.char('Raw Datas', size=128),
34
'customer_code' : fields.char('Customer Code',size=64),
35
'title' : fields.char('Title',size=32),
36
'customer_firstname' : fields.char('First Name', size=64),
37
'customer_lastname' : fields.char('Last Name', size=64),
38
'customer_add1' : fields.char('Address1', size=64),
39
'customer_add2' : fields.char('Address2', size=64),
40
'customer_add3' : fields.char('Address3', size=64),
41
'customer_add4' : fields.char('Address4', size=64),
42
'country' : fields.char('Country', size=16),
43
'zip' : fields.char('Zip Code', size=12),
44
'zip_summary' : fields.char('Zip Summary', size=64),
45
'distribution_office' : fields.char('Distribution Office', size=64),
46
'segment_code' : fields.char('Segment Code', size=64),
47
'offer_step_code' : fields.char('Offer Step Code', size=64),
48
'state' : fields.selection([('draft','Draft'),('done','Done')], 'Status', readonly=True),
51
'state': lambda *a: 'draft',
54
def set_confirm(self, cr, uid, ids, *args):
57
def onchange_rawdatas(self,cr,uid,ids,raw_datas):
60
raw_datas = "2;00573G;162220;MR;Shah;Harshit;W Sussex;;25 Oxford Road;;GBR;BN;BN11 1XQ;WORTHING.LU.SX"
61
value = raw_datas.split(';')
62
key = ['datamatrix_type','segment_code','customer_code','title','customer_lastname','customer_firstname','customer_add1','customer_add2','customer_add3','customer_add4','country','zip_summary','zip','distribution_office']
63
value = dict(zip(key,value))
64
return {'value':value}
69
class res_partner(osv.osv):
70
_inherit = "res.partner"
72
'language_ids' : fields.many2many('res.lang','dm_customer_langs','lang_id','customer_id','Other Languages'),
73
'prospect_media_ids' : fields.many2many('dm.media','dm_customer_prospect_media','prospect_media_id','customer_id','Prospect for Media'),
74
'client_media_ids' : fields.many2many('dm.media','dm_customer_client_media','client_media_id','customer_id','Client for Media'),
75
'decoy_address' : fields.boolean('Decoy Address', help='A decoy address is an address used to identify unleagal uses of a customers file'),
76
'decoy_owner' : fields.many2one('res.partner','Decoy Address Owner', help='The partner this decoy address belongs to'),
77
'decoy_external_ref' : fields.char('External Reference', size=64, help='The reference of the decoy address for the owner'),
78
'decoy_media_ids': fields.many2many('dm.media','dm_decoy_media_rel','decoy_media_id','customer_id','decoy address for Media'),
79
'decoy_for_campaign': fields.boolean('Used for Campaigns', help='Define if this decoy address can be used with campaigns'),
80
'decoy_for_renting': fields.boolean('Used for File Renting', help='Define if this decoy address can be used with used with customers files renting'),
85
class dm_customer_order(osv.osv):
86
_name = "dm.customer.order"
87
_inherit = "sale.order"
90
'customer_id' : fields.many2one('res.partner', 'Customer', ondelete='cascade'),
91
'segment_id' : fields.many2one('dm.campaign.proposition.segment','Segment'),
92
'offer_step_id' : fields.many2one('dm.offer.step','Offer Step'),
93
# 'note' : fields.text('Notes'),
94
'state' : fields.selection([('draft','Draft'),('done','Done')], 'Status', readonly=True),
97
'picking_policy': lambda *a: 'one',
98
# 'state': lambda *a: 'draft',
100
def set_confirm(self, cr, uid, ids, *args):
101
self.write(cr, uid, ids, {'state': 'done'})
106
class dm_customer_gender(osv.osv):
107
_name = "dm.customer.gender"
108
def _customer_gender_code(self, cr, uid, ids, name, args, context={}):
112
cust_gender = self.browse(cr,uid,[id])[0]
113
if cust_gender.lang_id:
114
if not cust_gender.from_gender_id:
115
code='_'.join([cust_gender.lang_id.code, cust_gender.to_gender_id.name])
117
code='_'.join([cust_gender.lang_id.code, 'from', cust_gender.from_gender_id.name, 'to', cust_gender.to_gender_id.name])
119
if not cust_gender.from_gender_id:
120
code=cust_gender.to_gender_id.name
122
code='_'.join(['from', cust_gender.from_gender_id.name, 'to', cust_gender.to_gender_id.name])
127
'name' : fields.char('Name', size=16),
128
'code' : fields.function(_customer_gender_code,string='Code',type='char',method=True,readonly=True),
129
'from_gender_id' : fields.many2one('res.partner.title', 'From Gender', domain="[('domain','=','contact')]"),
130
'to_gender_id' : fields.many2one('res.partner.title', 'To Gender', required=True, domain="[('domain','=','contact')]"),
131
'lang_id' : fields.many2one('res.lang', 'Language'),
132
'description' : fields.text('Description'),
136
class dm_workitem(osv.osv):
137
_name = "dm.workitem"
138
_description = "workitem"
140
_SOURCES = [('address_id','Partner Address')]
143
'step_id' : fields.many2one('dm.offer.step', 'Offer Step', select="1", ondelete="cascade"),
144
'segment_id' : fields.many2one('dm.campaign.proposition.segment', 'Segments', select="1", ondelete="cascade"),
145
'address_id' : fields.many2one('res.partner.address', 'Customer Address', select="1", ondelete="cascade"),
146
'action_time' : fields.datetime('Action Time'),
147
'source' : fields.selection(_SOURCES, 'Source', required=True),
148
'error_msg' : fields.text('Error Message'),
149
'state' : fields.selection([('pending','Pending'),('error','Error'),('cancel','Cancel'),('done','Done')], 'Status'),
152
'source': lambda *a: 'address_id',
153
'state': lambda *a: 'pending',
156
def run(self, cr, uid, wi, context={}):
158
context['active_id'] = wi.id
161
server_obj = self.pool.get('ir.actions.server')
162
print "Calling run for : ",wi.step_id.action_id.server_action_id.name
163
res = server_obj.run(cr, uid, [wi.step_id.action_id.server_action_id.id], context)
164
self.write(cr, uid, [wi.id], {'state': 'done','error_msg':""})
167
self.write(cr, uid, [wi.id], {'state': 'error','error_msg':sys.exc_info()})
169
""" Create next auto workitems """
170
for tr in wi.step_id.outgoing_transition_ids:
171
if tr.condition_id.type == "auto":
172
print "Creating auto workitem"
173
print "Delay : ",tr.delay
174
print "Delay Type: ",tr.delay_type
175
wi_action_time = datetime.datetime.strptime(wi.action_time, '%Y-%m-%d %H:%M:%S')
176
if tr.delay_type == 'minute':
177
next_action_time = wi_action_time + datetime.timedelta(minutes=tr.delay)
178
elif tr.delay_type == 'hour':
179
next_action_time = wi_action_time + datetime.timedelta(hours=tr.delay)
180
elif tr.delay_type == 'day':
181
next_action_time = wi_action_time + datetime.timedelta(days=tr.delay)
182
elif tr.delay_type == 'week':
183
next_action_time = wi_action_time + datetime.timedelta(weeks=tr.delay)
184
elif tr.delay_type == 'month':
185
next_action_time = wi_action_time + datetime.timedelta(months=tr.delay)
187
print "Next action date : ",next_action_time
189
aw_id = self.copy(cr, uid, wi.id, {'step_id':tr.step_to_id.id, 'action_time':next_action_time})
190
print "auto wi : ",aw_id
194
def __init__(self, *args):
195
self.is_running = False
196
return super(dm_workitem, self).__init__(*args)
198
def check_all(self, cr, uid, context={}):
199
print "Calling check all"
200
if not self.is_running:
201
self.is_running = True
202
ids = self.search(cr, uid, [('state','=','pending'),
203
('action_time','<=',time.strftime('%Y-%m-%d %H:%M:%S'))])
204
print "WI to process : ",ids
205
for wi in self.browse(cr, uid, ids, context=context):
206
self.run(cr, uid, wi, context=context)
207
self.is_running = False
211
class dm_customer_segmentation(osv.osv):
212
_name = "dm.customer.segmentation"
213
_description = "Segmentation"
216
'name' : fields.char('Name', size=64, required=True),
217
'code' : fields.char('Code', size=32, required=True),
218
'notes' : fields.text('Description'),
219
'sql_query' : fields.text('SQL Query'),
220
'customer_text_criteria_ids' : fields.one2many('dm.customer.text_criteria', 'segmentation_id', 'Customers Textual Criteria'),
221
'customer_numeric_criteria_ids' : fields.one2many('dm.customer.numeric_criteria', 'segmentation_id', 'Customers Numeric Criteria'),
222
'customer_boolean_criteria_ids' : fields.one2many('dm.customer.boolean_criteria', 'segmentation_id', 'Customers Boolean Criteria'),
223
'customer_date_criteria_ids' : fields.one2many('dm.customer.date_criteria', 'segmentation_id', 'Customers Date Criteria'),
224
'order_text_criteria_ids' : fields.one2many('dm.customer.order.text_criteria', 'segmentation_id', 'Customers Order Textual Criteria'),
225
'order_numeric_criteria_ids' : fields.one2many('dm.customer.order.numeric_criteria', 'segmentation_id', 'Customers Order Numeric Criteria'),
226
'order_boolean_criteria_ids' : fields.one2many('dm.customer.order.boolean_criteria', 'segmentation_id', 'Customers Order Boolean Criteria'),
227
'order_date_criteria_ids' : fields.one2many('dm.customer.order.date_criteria', 'segmentation_id', 'Customers Order Date Criteria'),
230
def set_customer_criteria(self, cr, uid, id, context={}):
232
browse_id = self.browse(cr, uid, id)
233
if browse_id.customer_text_criteria_ids:
234
for i in browse_id.customer_text_criteria_ids:
235
criteria.append("p.%s %s '%s'"%(i.field_id.name, i.operator, "%"+i.value+"%"))
236
if browse_id.customer_numeric_criteria_ids:
237
for i in browse_id.customer_numeric_criteria_ids:
238
criteria.append("p.%s %s %f"%(i.field_id.name, i.operator, i.value))
239
if browse_id.customer_boolean_criteria_ids:
240
for i in browse_id.customer_boolean_criteria_ids:
241
criteria.append("p.%s %s %s"%(i.field_id.name, i.operator, i.value))
242
if browse_id.customer_date_criteria_ids:
243
for i in browse_id.customer_date_criteria_ids:
244
criteria.append("p.%s %s '%s'"%(i.field_id.name, i.operator, i.value))
245
if browse_id.order_text_criteria_ids:
246
for i in browse_id.order_text_criteria_ids:
247
criteria.append("s.%s %s '%s'"%(i.field_id.name, i.operator, "%"+i.value+"%"))
248
if browse_id.order_numeric_criteria_ids:
249
for i in browse_id.order_numeric_criteria_ids:
250
criteria.append("s.%s %s %f"%(i.field_id.name, i.operator, i.value))
251
if browse_id.order_boolean_criteria_ids:
252
for i in browse_id.order_boolean_criteria_ids:
253
criteria.append("s.%s %s %s"%(i.field_id.name, i.operator, i.value))
254
if browse_id.order_date_criteria_ids:
255
for i in browse_id.order_date_criteria_ids:
256
criteria.append("s.%s %s '%s'"%(i.field_id.name, i.operator, i.value))
259
sql_query = ("""select distinct p.name \nfrom res_partner p, sale_order s\nwhere p.id = s.customer_id and %s\n""" % (' and '.join(criteria))).replace('isnot','is not')
261
sql_query = """select distinct p.name \nfrom res_partner p, sale_order s\nwhere p.id = s.customer_id"""
262
return super(dm_customer_segmentation,self).write(cr, uid, id, {'sql_query':sql_query})
264
def create(self,cr,uid,vals,context={}):
265
id = super(dm_customer_segmentation,self).create(cr,uid,vals,context)
266
self.set_customer_criteria(cr, uid, id)
269
def write(self, cr, uid, ids, vals, context=None):
270
id = super(dm_customer_segmentation,self).write(cr, uid, ids, vals, context)
272
self.set_customer_criteria(cr, uid, i)
275
dm_customer_segmentation()
282
NUMERIC_OPERATORS = [
284
('<','smaller then'),
299
class dm_customer_text_criteria(osv.osv):
300
_name = "dm.customer.text_criteria"
301
_description = "Customer Segmentation Textual Criteria"
302
_rec_name = "segmentation_id"
305
'segmentation_id' : fields.many2one('dm.customer.segmentation', 'Segmentation'),
306
'field_id' : fields.many2one('ir.model.fields','Customers Field',
307
domain=[('model_id.model','=','res.partner'),
308
('ttype','like','char')],
309
context={'model':'res.partner'}),
310
'operator' : fields.selection(TEXT_OPERATORS, 'Operator', size=32),
311
'value' : fields.char('Value', size=128),
313
dm_customer_text_criteria()
315
class dm_customer_numeric_criteria(osv.osv):
316
_name = "dm.customer.numeric_criteria"
317
_description = "Customer Segmentation Numeric Criteria"
318
_rec_name = "segmentation_id"
321
'segmentation_id' : fields.many2one('dm.customer.segmentation', 'Segmentation'),
322
'field_id' : fields.many2one('ir.model.fields','Customers Field',
323
domain=[('model_id.model','=','res.partner'),
324
(('ttype','like','integer') or ('ttype','like','float'))],
325
context={'model':'res.partner'}),
326
'operator' : fields.selection(NUMERIC_OPERATORS, 'Operator', size=32),
327
'value' : fields.float('Value', digits=(16,2)),
329
dm_customer_numeric_criteria()
331
class dm_customer_boolean_criteria(osv.osv):
332
_name = "dm.customer.boolean_criteria"
333
_description = "Customer Segmentation Boolean Criteria"
334
_rec_name = "segmentation_id"
337
'segmentation_id' : fields.many2one('dm.customer.segmentation', 'Segmentation'),
338
'field_id' : fields.many2one('ir.model.fields','Customers Field',
339
domain=[('model_id.model','=','res.partner'),
340
('ttype','like','boolean')],
341
context={'model':'res.partner'}),
342
'operator' : fields.selection(BOOL_OPERATORS, 'Operator', size=32),
343
'value' : fields.selection([('true','True'),('false','False')],'Value'),
345
dm_customer_boolean_criteria()
347
class dm_customer_date_criteria(osv.osv):
348
_name = "dm.customer.date_criteria"
349
_description = "Customer Segmentation Date Criteria"
350
_rec_name = "segmentation_id"
353
'segmentation_id' : fields.many2one('dm.customer.segmentation', 'Segmentation'),
354
'field_id' : fields.many2one('ir.model.fields','Customers Field',
355
domain=[('model_id.model','=','res.partner'),
356
(('ttype','like','date') or ('ttype','like','datetime'))],
357
context={'model':'res.partner'}),
358
'operator' : fields.selection(DATE_OPERATORS, 'Operator', size=32),
359
'value' : fields.date('Date'),
361
dm_customer_date_criteria()
363
class dm_customer_order_text_criteria(osv.osv):
364
_name = "dm.customer.order.text_criteria"
365
_description = "Customer Order Segmentation Textual Criteria"
366
_rec_name = "segmentation_id"
369
'segmentation_id' : fields.many2one('dm.customer.segmentation', 'Segmentation'),
370
'field_id' : fields.many2one('ir.model.fields','Customers Field',
371
domain=[('model_id.model','=','dm.customer.order'),
372
('ttype','like','char')],
373
context={'model':'dm.customer.order'}),
374
'operator' : fields.selection(TEXT_OPERATORS, 'Operator', size=32),
375
'value' : fields.char('Value', size=128),
377
dm_customer_order_text_criteria()
379
class dm_customer_order_numeric_criteria(osv.osv):
380
_name = "dm.customer.order.numeric_criteria"
381
_description = "Customer Order Segmentation Numeric Criteria"
382
_rec_name = "segmentation_id"
385
'segmentation_id' : fields.many2one('dm.customer.segmentation', 'Segmentation'),
386
'field_id' : fields.many2one('ir.model.fields','Customers Field',
387
domain=[('model_id.model','=','dm.customer.order'),
388
(('ttype','like','integer') or ('ttype','like','float'))],
389
context={'model':'dm.customer.order'}),
390
'operator' : fields.selection(NUMERIC_OPERATORS, 'Operator', size=32),
391
'value' : fields.float('Value', digits=(16,2)),
393
dm_customer_order_numeric_criteria()
395
class dm_customer_order_boolean_criteria(osv.osv):
396
_name = "dm.customer.order.boolean_criteria"
397
_description = "Customer Order Segmentation Boolean Criteria"
398
_rec_name = "segmentation_id"
401
'segmentation_id' : fields.many2one('dm.customer.segmentation', 'Segmentation'),
402
'field_id' : fields.many2one('ir.model.fields','Customers Field',
403
domain=[('model_id.model','=','dm.customer.order'),
404
('ttype','like','boolean')],
405
context={'model':'dm.customer.order'}),
406
'operator' : fields.selection(BOOL_OPERATORS, 'Operator', size=32),
407
'value' : fields.selection([('true','True'),('false','False')],'Value'),
409
dm_customer_order_boolean_criteria()
411
class dm_customer_order_date_criteria(osv.osv):
412
_name = "dm.customer.order.date_criteria"
413
_description = "Customer Order Segmentation Date Criteria"
414
_rec_name = "segmentation_id"
417
'segmentation_id' : fields.many2one('dm.customer.segmentation', 'Segmentation'),
418
'field_id' : fields.many2one('ir.model.fields','Customers Field',
419
domain=[('model_id.model','=','dm.customer.order'),
420
(('ttype','like','date') or ('ttype','like','datetime'))],
421
context={'model':'dm.customer.order'}),
422
'operator' : fields.selection(DATE_OPERATORS, 'Operator', size=32),
423
'value' : fields.date('Date'),
425
dm_customer_order_date_criteria()
427
class dm_offer_history(osv.osv):
428
_name = "dm.offer.history"
431
'offer_id' : fields.many2one('dm.offer', 'Offer', required=True, ondelete="cascade"),
432
'date' : fields.date('Drop Date'),
433
'campaign_id' : fields.many2one('dm.campaign','Name', ondelete="cascade"),
434
'code' : fields.char('Code', size=16),
435
'responsible_id' : fields.many2one('res.users','Responsible'),