source: main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py @ 9257

Last change on this file since 9257 was 9148, checked in by Henrik Bettermann, 12 years ago

Enable previous session payments. Do not create activation code after successful previous session payment. Show previous session payment form only if current session ticket creation failed.

Attention: setPaymentDetails method has changed. Two additional parameters expected.

  • Property svn:keywords set to Id
File size: 5.5 KB
Line 
1## $Id: payments.py 9148 2012-09-03 14:47:24Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18"""
19Student payment components.
20"""
21import grok
22from zope.component.interfaces import IFactory
23from zope.interface import implementedBy
24from waeup.kofa.interfaces import MessageFactory as _
25from waeup.kofa.students.interfaces import (
26    IStudentPaymentsContainer, IStudentNavigation, IStudentOnlinePayment)
27from waeup.kofa.payments import PaymentsContainer, OnlinePayment
28from waeup.kofa.payments.interfaces import IPaymentWebservice
29from waeup.kofa.utils.helpers import attrs_to_fields
30from waeup.kofa.accesscodes import create_accesscode
31
32class StudentPaymentsContainer(PaymentsContainer):
33    """This is a container for student payments.
34    """
35    grok.implements(IStudentPaymentsContainer, IStudentNavigation)
36    grok.provides(IStudentPaymentsContainer)
37
38    def __init__(self):
39        super(StudentPaymentsContainer, self).__init__()
40        return
41
42    @property
43    def student(self):
44        return self.__parent__
45
46    def writeLogMessage(self, view, message):
47        return self.__parent__.writeLogMessage(view, message)
48
49StudentPaymentsContainer = attrs_to_fields(StudentPaymentsContainer)
50
51class StudentOnlinePayment(OnlinePayment):
52    """This is an online payment.
53    """
54    grok.implements(IStudentOnlinePayment, IStudentNavigation)
55    grok.provides(IStudentOnlinePayment)
56
57    def __init__(self):
58        super(StudentOnlinePayment, self).__init__()
59        return
60
61    @property
62    def student(self):
63        try:
64            return self.__parent__.__parent__
65        except AttributeError:
66            return None
67
68    def writeLogMessage(self, view, message):
69        return self.__parent__.__parent__.writeLogMessage(view, message)
70
71    def _createActivationCodes(self):
72        student = self.student
73        if self.p_category == 'clearance':
74            # Create CLR access code
75            pin, error = create_accesscode(
76                'CLR',0,self.amount_auth,student.student_id)
77            if error:
78                return error
79            self.ac = pin
80        elif self.p_category in ('schoolfee', 'schoolfee_1'):
81            # Create SFE access code
82            pin, error = create_accesscode(
83                'SFE',0,self.amount_auth,student.student_id)
84            if error:
85                return error
86            self.ac = pin
87        elif self.p_category == 'bed_allocation':
88            # Create HOS access code
89            pin, error = create_accesscode(
90                'HOS',0,self.amount_auth,student.student_id)
91            if error:
92                return error
93            self.ac = pin
94        return None
95
96    def doAfterStudentPayment(self):
97        """Process student after payment was made.
98        """
99        if self.p_current:
100            error = self._createActivationCodes()
101            if error is not None:
102                return False, error, error
103        log = 'successful payment: %s' % self.p_id
104        msg = _('Successful payment')
105        return True, msg, log
106
107    def doAfterStudentPaymentApproval(self):
108        """Process student after payment was approved.
109        """
110        if self.p_current:
111            error = self._createActivationCodes()
112            if error is not None:
113                return False, error, error
114        log = 'payment approved: %s' % self.p_id
115        msg = _('Payment approved')
116        return True, msg, log
117
118    def approveStudentPayment(self):
119        """Approve payment and process student.
120        """
121        if self.p_state == 'paid':
122            return False, _('This ticket has already been paid.'), None
123        self.approve()
124        return self.doAfterStudentPaymentApproval()
125
126
127StudentOnlinePayment = attrs_to_fields(StudentOnlinePayment)
128
129class PaymentWebservice(grok.Adapter):
130    """An adapter to publish student data through a webservice.
131    """
132    grok.context(IStudentOnlinePayment)
133    grok.implements(IPaymentWebservice)
134
135    @property
136    def display_fullname(self):
137        "Name of  payee."
138        return self.context.student.display_fullname
139
140    @property
141    def id(self):
142        "Id of payee"
143        return self.context.student.student_id
144
145    @property
146    def faculty(self):
147        "Faculty of payee"
148        return self.context.student.faccode
149
150    @property
151    def department(self):
152        "Department of payee"
153        return self.context.student.depcode
154
155# Student online payments must be importable. So we might need a factory.
156class StudentOnlinePaymentFactory(grok.GlobalUtility):
157    """A factory for student online payments.
158    """
159    grok.implements(IFactory)
160    grok.name(u'waeup.StudentOnlinePayment')
161    title = u"Create a new online payment.",
162    description = u"This factory instantiates new online payment instances."
163
164    def __call__(self, *args, **kw):
165        return StudentOnlinePayment()
166
167    def getInterfaces(self):
168        return implementedBy(StudentOnlinePayment)
Note: See TracBrowser for help on using the repository browser.