source: main/waeup.uniben/trunk/src/waeup/uniben/students/utils.py @ 9727

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

Configure hostel maintenance fee payment (2012/2013 only).

  • Property svn:keywords set to Id
File size: 10.4 KB
Line 
1## $Id: utils.py 9727 2012-11-27 10:05:02Z 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##
18import grok
19from time import time
20from zope.component import createObject, getUtility
21from reportlab.lib.styles import getSampleStyleSheet
22from reportlab.platypus import Paragraph, Image, Table, Spacer
23from waeup.kofa.interfaces import (IKofaUtils,
24    CLEARED, RETURNING, PAID, REGISTERED, VALIDATED)
25from kofacustom.nigeria.students.utils import NigeriaStudentsUtils
26from waeup.kofa.accesscodes import create_accesscode
27from waeup.uniben.interfaces import MessageFactory as _
28from waeup.kofa.students.utils import (trans, render_student_data,
29    render_table_data, get_signature_table)
30
31class CustomStudentsUtils(NigeriaStudentsUtils):
32    """A collection of customized methods.
33
34    """
35
36    def getReturningData(self, student):
37        """ This method defines what happens after school fee payment
38        of returning students depending on the student's senate verdict.
39        """
40        prev_level = student['studycourse'].current_level
41        cur_verdict = student['studycourse'].current_verdict
42        if cur_verdict in ('A','B','L','M','N','Z',):
43            # Successful student
44            new_level = divmod(int(prev_level),100)[0]*100 + 100
45        elif cur_verdict == 'C':
46            # Student on probation
47            new_level = int(prev_level) + 10
48        else:
49            # Student is somehow in an undefined state.
50            # Level has to be set manually.
51            new_level = prev_level
52        new_session = student['studycourse'].current_session + 1
53        return new_session, new_level
54
55    def _paymentMade(self, student, session):
56        if len(student['payments']):
57            for ticket in student['payments'].values():
58                if ticket.p_state == 'paid' and \
59                    ticket.p_category == 'schoolfee' and \
60                    ticket.p_session == session:
61                    return True
62        return False
63
64    def setPaymentDetails(self, category, student,
65            previous_session, previous_level):
66        """Create Payment object and set the payment data of a student for
67        the payment category specified.
68
69        """
70        p_item = u''
71        amount = 0.0
72        if previous_session:
73            if previous_session < student['studycourse'].entry_session:
74                return _('The previous session must not fall below '
75                         'your entry session.'), None
76            if category == 'schoolfee':
77                # School fee is always paid for the following session
78                if previous_session > student['studycourse'].current_session:
79                    return _('This is not a previous session.'), None
80            else:
81                if previous_session > student['studycourse'].current_session - 1:
82                    return _('This is not a previous session.'), None
83            p_session = previous_session
84            p_level = previous_level
85            p_current = False
86        else:
87            p_session = student['studycourse'].current_session
88            p_level = student['studycourse'].current_level
89            p_current = True
90        academic_session = self._getSessionConfiguration(p_session)
91        if academic_session == None:
92            return _(u'Session configuration object is not available.'), None
93        # Determine fee.
94        if category == 'transfer':
95            amount = academic_session.transfer_fee
96        elif category == 'gown':
97            amount = academic_session.gown_fee
98        elif category == 'bed_allocation':
99            amount = academic_session.booking_fee
100        elif category == 'hostel_maintenance':
101            amount = academic_session.maint_fee
102        elif category == 'tempmaint_1':
103            amount = 8550.0
104        elif category == 'tempmaint_2':
105            amount = 13050.0
106        elif category == 'tempmaint_3':
107            amount = 10050.0
108        elif category == 'clearance':
109            try:
110                p_item = student['studycourse'].certificate.code
111            except (AttributeError, TypeError):
112                return _('Study course data are incomplete.'), None
113            if p_item in ('BSCANA', 'BSCMBC', 'BMLS', 'BSCNUR', 'BSCPHS', 'BDS',
114                'MBBSMED', 'MBBSNDU'):
115                amount = 65000.0
116            elif p_item in ('BEDCET', 'BIOEDCET', 'CHMEDCET', 'ISEDCET',
117                'MTHEDCET', 'PHYEDCET', 'ITECET', 'AGREDCET', 'HEEDCET'):
118                amount = 22500.0
119            else:
120                amount = 45000.0
121        elif category == 'schoolfee':
122            try:
123                certificate = student['studycourse'].certificate
124                p_item = certificate.code
125            except (AttributeError, TypeError):
126                return _('Study course data are incomplete.'), None
127            if previous_session:
128                # Students can pay for previous sessions in all workflow states.
129                # Fresh students are excluded by the update method of the
130                # PreviousPaymentAddFormPage.
131                if previous_session == student['studycourse'].entry_session:
132                    if student.is_foreigner:
133                        amount = getattr(certificate, 'school_fee_3', 0.0)
134                    else:
135                        amount = getattr(certificate, 'school_fee_1', 0.0)
136                else:
137                    if student.is_foreigner:
138                        amount = getattr(certificate, 'school_fee_4', 0.0)
139                    else:
140                        amount = getattr(certificate, 'school_fee_2', 0.0)
141            else:
142                if student.state == CLEARED:
143                    if student.is_foreigner:
144                        amount = getattr(certificate, 'school_fee_3', 0.0)
145                    else:
146                        amount = getattr(certificate, 'school_fee_1', 0.0)
147                elif student.state in (PAID, REGISTERED, VALIDATED):
148                    p_session += 1
149                    # We don't know which level the student is paying for.
150                    p_level = None
151                    academic_session = self._getSessionConfiguration(p_session)
152                    if academic_session == None:
153                        return _(u'Session configuration object is not available.'), None
154
155                    # Students are only allowed to pay for the next session
156                    # if current session payment
157                    # has really been made, i.e. payment object exists.
158                    #if not self._paymentMade(
159                    #    student, student.current_session):
160                    #    return _('You have not yet paid your current/active' +
161                    #             ' session. Please use the previous session' +
162                    #             ' payment form first.'), None
163
164                    if student.is_foreigner:
165                        amount = getattr(certificate, 'school_fee_4', 0.0)
166                    else:
167                        amount = getattr(certificate, 'school_fee_2', 0.0)
168                elif student.state == RETURNING:
169                    # In case of returning school fee payment the payment session
170                    # and level contain the values of the session the student
171                    # has paid for.
172                    p_session, p_level = self.getReturningData(student)
173                    academic_session = self._getSessionConfiguration(p_session)
174                    if academic_session == None:
175                        return _(u'Session configuration object is not available.'), None
176
177                    # Students are only allowed to pay for the next session
178                    # if current session payment has really been made,
179                    # i.e. payment object exists and is paid.
180                    #if not self._paymentMade(
181                    #    student, student.current_session):
182                    #    return _('You have not yet paid your current/active' +
183                    #             ' session. Please use the previous session' +
184                    #             ' payment form first.'), None
185
186                    if student.is_foreigner:
187                        amount = getattr(certificate, 'school_fee_4', 0.0)
188                    else:
189                        amount = getattr(certificate, 'school_fee_2', 0.0)
190            # Give 50% school fee discount to staff members.
191            if student.is_staff:
192                amount /= 2
193        if amount in (0.0, None):
194            return _('Amount could not be determined.'), None
195        # Add session specific penalty fee.
196        if category == 'schoolfee' and student.is_postgrad:
197            amount += academic_session.penalty_pg
198        elif category == 'schoolfee':
199            amount += academic_session.penalty_ug
200        # XXX: Obsolete in 2013
201        if category.startswith('tempmaint'):
202            p_item = getUtility(IKofaUtils).PAYMENT_CATEGORIES[category]
203            p_item = unicode(p_item)
204            # Now we change the category because tempmaint payments
205            # will be obsolete in 2013
206            category = 'hostel_maintenance'
207        # Create ticket.
208        for key in student['payments'].keys():
209            ticket = student['payments'][key]
210            if ticket.p_state == 'paid' and\
211               ticket.p_category == category and \
212               ticket.p_item == p_item and \
213               ticket.p_session == p_session:
214                  return _('This type of payment has already been made.'), None
215        payment = createObject(u'waeup.StudentOnlinePayment')
216        timestamp = ("%d" % int(time()*10000))[1:]
217        payment.p_id = "p%s" % timestamp
218        payment.p_category = category
219        payment.p_item = p_item
220        payment.p_session = p_session
221        payment.p_level = p_level
222        payment.p_current = p_current
223        payment.amount_auth = amount
224        return None, payment
225
226    # Uniben prefix
227    STUDENT_ID_PREFIX = u'B'
Note: See TracBrowser for help on using the repository browser.