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

Last change on this file since 9000 was 8959, checked in by Henrik Bettermann, 13 years ago

Fix bug. Returning students and pg students get penalty fee data from next academic_session.

  • Property svn:keywords set to Id
File size: 6.0 KB
Line 
1## $Id: utils.py 8959 2012-07-09 13:38:21Z 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
21from waeup.kofa.interfaces import CLEARED, RETURNING, PAID
22from kofacustom.nigeria.students.utils import NigeriaStudentsUtils
23from waeup.kofa.accesscodes import create_accesscode
24from waeup.uniben.interfaces import MessageFactory as _
25
26class CustomStudentsUtils(NigeriaStudentsUtils):
27    """A collection of customized methods.
28
29    """
30
31    def getReturningData(self, student):
32        """ This method defines what happens after school fee payment
33        of returning students depending on the student's senate verdict.
34        """
35        prev_level = student['studycourse'].current_level
36        cur_verdict = student['studycourse'].current_verdict
37        if cur_verdict in ('A','B','L','M','N','Z',):
38            # Successful student
39            new_level = divmod(int(prev_level),100)[0]*100 + 100
40        elif cur_verdict == 'C':
41            # Student on probation
42            new_level = int(prev_level) + 10
43        else:
44            # Student is somehow in an undefined state.
45            # Level has to be set manually.
46            new_level = prev_level
47        new_session = student['studycourse'].current_session + 1
48        return new_session, new_level
49
50    def setPaymentDetails(self, category, student):
51        """Create Payment object and set the payment data of a student for
52        the payment category specified.
53
54        """
55        details = {}
56        p_item = u''
57        amount = 0.0
58        error = u''
59        p_session = student['studycourse'].current_session
60        p_level = student['studycourse'].current_level
61        session = str(p_session)
62        try:
63            academic_session = grok.getSite()['configuration'][session]
64        except KeyError:
65            return _(u'Session configuration object is not available.'), None
66        # Determine fee.
67        if category == 'transfer':
68            amount = academic_session.transfer_fee
69        elif category == 'gown':
70            amount = academic_session.gown_fee
71        elif category == 'bed_allocation':
72            amount = academic_session.booking_fee
73        elif category == 'hostel_maintenance':
74            amount = academic_session.maint_fee
75        elif category == 'clearance':
76            try:
77                p_item = student['studycourse'].certificate.code
78            except (AttributeError, TypeError):
79                return _('Study course data are incomplete.'), None
80            if p_item in ('BEDCET', 'BIOEDCET', 'CHMEDCET', 'ISEDCET',
81                'MTHEDCET', 'PHYEDCET', 'ITECET', 'AGREDCET', 'HEEDCET'):
82                amount = 17250.0
83            else:
84                amount = 34250.0
85        elif category == 'schoolfee':
86            try:
87                certificate = student['studycourse'].certificate
88                p_item = certificate.code
89            except (AttributeError, TypeError):
90                return _('Study course data are incomplete.'), None
91            if student.state == CLEARED:
92                amount = getattr(certificate, 'school_fee_1', 0.0)
93            elif student.state == RETURNING:
94                # In case of returning school fee payment the payment session
95                # and level contain the values of the session the student
96                # has paid for.
97                p_session, p_level = self.getReturningData(student)
98                amount = getattr(certificate, 'school_fee_2', 0.0)
99                try:
100                    academic_session = grok.getSite()[
101                        'configuration'][str(p_session)]
102                except KeyError:
103                    return _(u'Session configuration object is not available.'), None
104            elif student.is_postgrad and student.state == PAID:
105                # Returning postgraduate students also pay for the next session
106                # but their level always remains the same.
107                p_session += 1
108                amount = getattr(certificate, 'school_fee_2', 0.0)
109                try:
110                    academic_session = grok.getSite()[
111                        'configuration'][str(p_session)]
112                except KeyError:
113                    return _(u'Session configuration object is not available.'), None
114        if amount in (0.0, None):
115            return _(u'Amount could not be determined.'), None
116        # Add session specific penalty fee.
117        if category == 'schoolfee' and student.is_postgrad:
118            amount += academic_session.penalty_pg
119        elif category == 'schoolfee':
120            amount += academic_session.penalty_ug
121        # Create ticket.
122        for key in student['payments'].keys():
123            ticket = student['payments'][key]
124            if ticket.p_state == 'paid' and\
125               ticket.p_category == category and \
126               ticket.p_item == p_item and \
127               ticket.p_session == p_session:
128                  return _('This type of payment has already been made.'), None
129        payment = createObject(u'waeup.StudentOnlinePayment')
130        timestamp = ("%d" % int(time()*10000))[1:]
131        payment.p_id = "p%s" % timestamp
132        payment.p_category = category
133        payment.p_item = p_item
134        payment.p_session = p_session
135        payment.p_level = p_level
136        payment.amount_auth = amount
137        return None, payment
138
139    # Uniben prefix
140    STUDENT_ID_PREFIX = u'B'
Note: See TracBrowser for help on using the repository browser.