~school-dev-team/school-base-openerp-module/school-ampa-openerp-module

« back to all changes in this revision

Viewing changes to oerp_modules/training/wizard/subscription_cancelation.py

  • Committer: pereerro
  • Date: 2013-11-30 20:34:17 UTC
  • Revision ID: pereerro-20131130203417-whwzik8hkmm6j89g
[REF] Begining of integration with school and training.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- encoding: utf-8 -*-
 
2
##############################################################################
 
3
#
 
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>
 
7
#    $Id$
 
8
#
 
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.
 
13
#
 
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.
 
18
#
 
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/>.
 
21
#
 
22
##############################################################################
 
23
 
 
24
from osv import osv
 
25
from osv import fields
 
26
import netsvc
 
27
from tools.translate import _
 
28
 
 
29
class training_subscription_cancellation_wizard(osv.osv_memory):
 
30
    _name = 'training.subscription.cancellation.wizard'
 
31
 
 
32
    _description = 'Training Subscription Cancellation Wizard'
 
33
 
 
34
    _columns = {
 
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'))]",
 
37
             required=True),
 
38
        'subscription_id': fields.related('subscription_line_id', 'subscription_id',
 
39
                                           type='many2one',
 
40
                                           relation='training.subscription',
 
41
                                           string='Subscription',
 
42
                                           readonly=True),
 
43
        'partner_subscription_id': fields.related('subscription_line_id', 'subscription_id', 'partner_id',
 
44
                                      type='many2one',
 
45
                                      relation='res.partner',
 
46
                                      string='Partner',
 
47
                                      readonly=True),
 
48
        'participant_id': fields.related('subscription_line_id', 'job_id',
 
49
                                          type='many2one',
 
50
                                          relation='res.partner.job',
 
51
                                          string='Participant',
 
52
                                          readonly=True),
 
53
        'session_id': fields.related('subscription_line_id', 'session_id',
 
54
                                      type='many2one',
 
55
                                      relation='training.session',
 
56
                                      string='Session',
 
57
                                      readonly=True),
 
58
        'session_offer_id': fields.related('subscription_line_id', 'session_id', 'offer_id',
 
59
                                            type='many2one',
 
60
                                            relation='training.session',
 
61
                                            string='Session Offer',
 
62
                                            readonly=True),
 
63
        'session_date': fields.related('subscription_line_id', 'session_id', 'date',
 
64
                                        type='datetime',
 
65
                                        string='Session Date',
 
66
                                        readonly=True),
 
67
        'session_state': fields.related('subscription_line_id', 'session_id', 'state',
 
68
                                         type='selection',
 
69
                                         selection=[
 
70
                                             ('draft', 'Draft'),
 
71
                                             ('opened', 'Opened'),
 
72
                                             ('opened_confirmed', 'Confirmed'),
 
73
                                             ('closed_confirmed', 'Closed Subscriptions'),
 
74
                                             ('inprogress', 'In Progress'),
 
75
                                             ('closed', 'Closed'),
 
76
                                             ('cancelled', 'Cancelled')
 
77
                                         ],
 
78
                                         string='Session State',
 
79
                                         readonly=True),
 
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)]"
 
85
                                          ),
 
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'),
 
95
                                    ('end', 'End')],
 
96
                                   'State',
 
97
                                   required=True,
 
98
                                   readonly=True
 
99
                                  ),
 
100
    }
 
101
 
 
102
    _defaults = {
 
103
        'subscription_line_id': lambda obj, cr, uid, context: context['active_id'],
 
104
        'state': lambda *a: 'init',
 
105
    }
 
106
 
 
107
    def on_change_subscription_line(self, cr, uid, ids, subscription_line_id, context=None):
 
108
        if not subscription_line_id:
 
109
            return {}
 
110
        subscription_line = self.pool.get('training.subscription.line').browse(cr, uid, subscription_line_id, context=context)
 
111
        return {
 
112
            'value' : {
 
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,
 
121
            }
 
122
        }
 
123
 
 
124
    def on_change_new_participant(self, cr, uid, ids, new_participant_id, context=None):
 
125
        if not new_participant_id:
 
126
            return {}
 
127
        job = self.pool.get('res.partner.job').browse(cr, uid, new_participant_id, context=context)
 
128
        return {'value' : {'new_participant_email' : job.email }}
 
129
 
 
130
    def on_change_new_session(self, cr, uid, ids, new_session_id, context=None):
 
131
        if not new_session_id:
 
132
            return {}
 
133
        session = self.pool.get('training.session').browse(cr, uid, new_session_id, context=context)
 
134
        return {
 
135
            'value' : {
 
136
                'new_session_date' : session.date,
 
137
            }
 
138
        }
 
139
 
 
140
    def action_cancel(self, cr, uid, ids, context=None):
 
141
        return {'type':'ir.actions.act_window_close'}
 
142
 
 
143
    def action_cancellation(self, cr, uid, ids, context=None):
 
144
        return self.write(cr, uid, ids, {'state' : 'cancellation'}, context=context)
 
145
 
 
146
    def action_replacement(self, cr, uid, ids, context=None):
 
147
        return self.write(cr, uid, ids, {'state' : 'replacement'}, context=context)
 
148
 
 
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)
 
152
 
 
153
    def action_apply(self, cr, uid, ids, context=None):
 
154
        if not ids:
 
155
            return False
 
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:
 
164
                values = {
 
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,
 
171
                }
 
172
                self.pool.get('ir.attachment').create(cr, uid, values, context=context2)
 
173
            this.subscription_line_id.write(
 
174
                {
 
175
                    'has_certificate' : this.cancellation_medical_certificate_toggle,
 
176
                    'reason_cancellation' : this.cancellation_reason,
 
177
                },
 
178
                context=context2
 
179
            )
 
180
            workflow.trg_validate(uid, 'training.subscription.line', this.subscription_line_id.id, 'signal_cancel', cr)
 
181
        elif this.state == 'replacement':
 
182
            objects = {
 
183
                'new_participant_id' : this.new_participant_id,
 
184
                'old_participant_id' : old_participant_id,
 
185
            }
 
186
            this.subscription_line_id.write( { 'job_id' : this.new_participant_id.id, 'job_email' : this.new_participant_email, })
 
187
            internal_note = []
 
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':
 
196
            values = {
 
197
                'session_id' : this.new_session_id.id,
 
198
            }
 
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)
 
208
 
 
209
    def action_done(self, cr, uid, ids, context=None):
 
210
        return {'type' : 'ir.actions.act_window_close'}
 
211
 
 
212
training_subscription_cancellation_wizard()