1
# -*- encoding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (c) 2011 Zikzakmedia S.L. (http://zikzakmedia.com) All Rights Reserved.
6
# Jesús Martín <jmartin@zikzakmedia.com>
9
# This program is free software: you can redistribute it and/or modify
10
# it under the terms of the GNU General Public License as published by
11
# the Free Software Foundation, either version 3 of the License, or
12
# (at your option) any later version.
14
# This program is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
# GNU General Public License for more details.
19
# You should have received a copy of the GNU General Public License
20
# along with this program. If not, see <http://www.gnu.org/licenses/>.
22
##############################################################################
25
from osv import fields
27
from tools.translate import _
29
class training_subscription_cancellation_wizard(osv.osv_memory):
30
_name = 'training.subscription.cancellation.wizard'
32
_description = 'Training Subscription Cancellation Wizard'
35
'subscription_line_id' : fields.many2one('training.subscription.line', 'Subscription Line',
36
domain="[('state', 'in', ['draft', 'confirmed']),('session_id.state', 'in', ('opened', 'opened_confirmed', 'closed_confirmed'))]",
38
'subscription_id': fields.related('subscription_line_id', 'subscription_id',
40
relation='training.subscription',
41
string='Subscription',
43
'partner_subscription_id': fields.related('subscription_line_id', 'subscription_id', 'partner_id',
45
relation='res.partner',
48
'participant_id': fields.related('subscription_line_id', 'job_id',
50
relation='res.partner.job',
53
'session_id': fields.related('subscription_line_id', 'session_id',
55
relation='training.session',
58
'session_offer_id': fields.related('subscription_line_id', 'session_id', 'offer_id',
60
relation='training.session',
61
string='Session Offer',
63
'session_date': fields.related('subscription_line_id', 'session_id', 'date',
65
string='Session Date',
67
'session_state': fields.related('subscription_line_id', 'session_id', 'state',
72
('opened_confirmed', 'Confirmed'),
73
('closed_confirmed', 'Closed Subscriptions'),
74
('inprogress', 'In Progress'),
76
('cancelled', 'Cancelled')
78
string='Session State',
80
'new_participant_id': fields.many2one('res.partner.job', 'Participant',
81
domain="[('name', '=', partner_id),('id', '!=', participant_id),('state', '=', 'current')]"),
82
'new_participant_email': fields.char('Email', size=128),
83
'new_session_id': fields.many2one('training.session', 'Session',
84
domain="[('state', 'in', ('opened', 'opened_confirmed')),('date', '>', time.strftime('%Y-%m-%d')),('date', '>', session_date),('offer_id', '=', session_offer_id)]"
86
'new_session_date': fields.related('new_session_id', 'date', type='datetime', string='Session Date', readonly=True),
87
'cancellation_reason': fields.text('Reason'),
88
'cancellation_medical_certificate_toggle': fields.boolean('Has Justification'),
89
'cancellation_medical_certificate_name': fields.char('Filename', size=128),
90
'cancellation_medical_certificate': fields.binary('Justification'),
91
'state': fields.selection([('init', 'Init'),
92
('replacement', 'Replacement'),
93
('postponement', 'Postponement'),
94
('cancellation', 'Cancellation'),
103
'subscription_line_id': lambda obj, cr, uid, context: context['active_id'],
104
'state': lambda *a: 'init',
107
def on_change_subscription_line(self, cr, uid, ids, subscription_line_id, context=None):
108
if not subscription_line_id:
110
subscription_line = self.pool.get('training.subscription.line').browse(cr, uid, subscription_line_id, context=context)
113
'subscription_id' : subscription_line.subscription_id.id,
114
'subscription_line_id' : subscription_line.id,
115
'session_id' : subscription_line.session_id.id,
116
'session_date' : subscription_line.session_id.date,
117
'session_state' : subscription_line.session_id.state,
118
'partner_subscription_id' : subscription_line.subscription_id.partner_id.id,
119
'participant_id' : subscription_line.job_id.id,
120
'session_offer_id' : subscription_line.session_id.offer_id.id,
124
def on_change_new_participant(self, cr, uid, ids, new_participant_id, context=None):
125
if not new_participant_id:
127
job = self.pool.get('res.partner.job').browse(cr, uid, new_participant_id, context=context)
128
return {'value' : {'new_participant_email' : job.email }}
130
def on_change_new_session(self, cr, uid, ids, new_session_id, context=None):
131
if not new_session_id:
133
session = self.pool.get('training.session').browse(cr, uid, new_session_id, context=context)
136
'new_session_date' : session.date,
140
def action_cancel(self, cr, uid, ids, context=None):
141
return {'type':'ir.actions.act_window_close'}
143
def action_cancellation(self, cr, uid, ids, context=None):
144
return self.write(cr, uid, ids, {'state' : 'cancellation'}, context=context)
146
def action_replacement(self, cr, uid, ids, context=None):
147
return self.write(cr, uid, ids, {'state' : 'replacement'}, context=context)
149
def action_postponement(self, cr, uid, ids, context=None):
150
# Assign a new session to the subscription line
151
return self.write(cr, uid, ids, {'state' : 'postponement'}, context=context)
153
def action_apply(self, cr, uid, ids, context=None):
156
this = self.browse(cr, uid, ids[0], context=context)
157
old_participant_id = this.participant_id
158
workflow = netsvc.LocalService('workflow')
159
context2 = context.copy()
160
if 'default_state' in context2:
161
del context2['default_state']
162
if this.state == 'cancellation':
163
if this.cancellation_medical_certificate:
165
'name' : 'Medical Certificate',
166
'datas' : this.cancellation_medical_certificate,
167
'datas_fname' : this.cancellation_medical_certificate_name,
168
'description' : 'Medical Certificate',
169
'res_model' : 'training.subscription.line',
170
'res_id' : this.subscription_line_id.id,
172
self.pool.get('ir.attachment').create(cr, uid, values, context=context2)
173
this.subscription_line_id.write(
175
'has_certificate' : this.cancellation_medical_certificate_toggle,
176
'reason_cancellation' : this.cancellation_reason,
180
workflow.trg_validate(uid, 'training.subscription.line', this.subscription_line_id.id, 'signal_cancel', cr)
181
elif this.state == 'replacement':
183
'new_participant_id' : this.new_participant_id,
184
'old_participant_id' : old_participant_id,
186
this.subscription_line_id.write( { 'job_id' : this.new_participant_id.id, 'job_email' : this.new_participant_email, })
188
if this.subscription_line_id.internal_note:
189
internal_note.append(this.subscription_line_id.internal_note)
190
internal_note.append(_("Replacement: %s %s -> %s %s") % (old_participant_id.contact_id.first_name,
191
old_participant_id.contact_id.name,
192
this.new_participant_id.contact_id.first_name,
193
this.new_participant_id.contact_id.name))
194
this.subscription_line_id.write({'internal_note' : "\n----\n".join(internal_note)})
195
elif this.state == 'postponement':
197
'session_id' : this.new_session_id.id,
199
sl_proxy = self.pool.get('training.subscription.line')
200
new_sl_id = sl_proxy.copy(cr, uid, this.subscription_line_id.id, values, context = context2 or {})
201
new_sl = sl_proxy.browse(cr, uid, new_sl_id, context=context2)
202
new_sl.write({'internal_note' : _("Created by Postponement of %s") % this.subscription_line_id.name})
203
this.subscription_line_id.write({'reason_cancellation' : _("Cancelled by Postponement: %s") % new_sl.name })
204
if this.subscription_line_id.state == 'confirmed':
205
workflow.trg_validate(uid, 'training.subscription.line', new_sl_id, 'signal_confirm', cr)
206
workflow.trg_validate(uid, 'training.subscription.line', this.subscription_line_id.id, 'signal_cancel', cr)
207
return self.write(cr, uid, ids, {'state' : 'end'}, context=context)
209
def action_done(self, cr, uid, ids, context=None):
210
return {'type' : 'ir.actions.act_window_close'}
212
training_subscription_cancellation_wizard()