source: main/kofacustom.coewarri/trunk/src/kofacustom/coewarri/students/utils.py @ 14659

Last change on this file since 14659 was 14659, checked in by Henrik Bettermann, 7 years ago

ug_ft with entry mode de_ft at level 200 should pay the same as 100 level students.

  • Property svn:keywords set to Id
File size: 7.1 KB
Line 
1## $Id: utils.py 14659 2017-03-29 17:49:00Z 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##
18from time import time
19from zope.component import createObject, getUtility
20from waeup.kofa.fees import FeeTable
21from waeup.kofa.interfaces import (IKofaUtils,
22    ADMITTED, CLEARED, RETURNING, PAID, REGISTERED, VALIDATED)
23from kofacustom.nigeria.students.utils import NigeriaStudentsUtils
24from kofacustom.coewarri.interfaces import MessageFactory as _
25from kofacustom.coewarri.interswitch.browser import GATEWAY_AMT
26
27
28def local_nonlocal(student):
29    lga = getattr(student, 'lga')
30    if lga and lga.startswith('delta'):
31        return 'local'
32    else:
33        return 'non-local'
34
35PAYMENT_LEVELS = (100, 110, 200, 210, 300, 310, 400, 410, 500, 999)
36
37FEES_PARAMS = (
38        ('local', 'non-local'),
39        ('nce_ft', 'nce_pt', 'ug_ft'),
40        PAYMENT_LEVELS
41    )
42
43FEES_VALUES = (
44      ( # 100      110      200      210      300      310      400      410     500  999
45        (42000.0, 42000.0, 20600.0, 20600.0, 18100.0, 18100.0,     0.0,     0.0, 0.0, 0.0), # nce_ft
46        (55200.0, 55200.0, 42200.0, 42200.0, 44700.0, 44700.0, 42200.0, 42200.0, 0.0, 0.0), # nce_pt
47        (69200.0, 69200.0, 63100.0, 63100.0, 63100.0, 63100.0, 62100.0, 62100.0, 0.0, 0.0), # ug_ft
48      ), # local
49      ( #
50        (54600.0, 54600.0, 22600.0, 22600.0, 20100.0, 20100.0,     0.0,     0.0, 0.0, 0.0), # nce_ft
51        (55200.0, 55200.0, 42200.0, 42200.0, 44700.0, 44700.0, 42200.0, 42200.0, 0.0, 0.0), # nce_pt
52        (79200.0, 79200.0, 63100.0, 63100.0, 63100.0, 63100.0, 62100.0, 62100.0, 0.0, 0.0), # ug_ft
53      ), # non-local
54    )
55
56SCHOOL_FEES = FeeTable(FEES_PARAMS, FEES_VALUES)
57
58class CustomStudentsUtils(NigeriaStudentsUtils):
59    """A collection of customized methods.
60
61    """
62
63    def setPaymentDetails(self, category, student,
64            previous_session=None, previous_level=None):
65        """Create a payment ticket and set the payment data of a
66        student for the payment category specified.
67        """
68        p_item = u''
69        amount = 0.0
70        p_session = student['studycourse'].current_session
71        p_level = student['studycourse'].current_level
72        p_current = True
73        academic_session = self._getSessionConfiguration(p_session)
74        if previous_session:
75            return _('Previous session payment not yet implemented.'), None
76        if academic_session == None:
77            return _(u'Session configuration object is not available.'), None
78        # Determine fee.
79        if category.startswith('schoolfee'):
80            try:
81                certificate = student['studycourse'].certificate
82                p_item = certificate.code
83            except (AttributeError, TypeError):
84                return _('Study course data are incomplete.'), None
85            if student.state == RETURNING:
86                # Override p_session and p_level
87                p_session, p_level = self.getReturningData(student)
88                academic_session = self._getSessionConfiguration(p_session)
89                if academic_session == None:
90                    return _(u'Session configuration object '
91                              'is not available.'), None
92            if p_level in PAYMENT_LEVELS:
93                if student.entry_mode == 'de_ft' and p_level == 200:
94                    amount = SCHOOL_FEES.get_fee(
95                        (
96                         local_nonlocal(student),
97                         student.current_mode,
98                         100)
99                        )
100                else:
101                    amount = SCHOOL_FEES.get_fee(
102                        (
103                         local_nonlocal(student),
104                         student.current_mode,
105                         p_level)
106                        )
107            if amount and category in ('schoolfee_1', 'schoolfee_2'):
108                amount /= 2
109            if amount:
110                amount += GATEWAY_AMT
111        elif category == 'clearance':
112            try:
113                p_item = student['studycourse'].certificate.code
114            except (AttributeError, TypeError):
115                return _('Study course data are incomplete.'), None
116            if student.entry_mode == 'nce_we_pt':
117                amount = academic_session.clearance_fee_3
118            elif student.entry_mode == 'ug_ft':
119                amount = academic_session.clearance_fee_2
120            else:
121                amount = academic_session.clearance_fee_1
122            if local_nonlocal(student) == 'non-local'  \
123                and student.entry_mode != 'nce_we_pt':
124                amount += 5000.0
125        elif category == 'bed_allocation':
126            p_item = self.getAccommodationDetails(student)['bt']
127            amount = academic_session.booking_fee
128        elif category == 'hostel_maintenance':
129            amount = 0.0
130            bedticket = student['accommodation'].get(
131                str(student.current_session), None)
132            if bedticket is not None and bedticket.bed is not None:
133                p_item = bedticket.bed_coordinates
134                if bedticket.bed.__parent__.maint_fee > 0:
135                    amount = bedticket.bed.__parent__.maint_fee
136                else:
137                    # fallback
138                    amount = academic_session.maint_fee
139            else:
140                return _(u'No bed allocated.'), None
141        elif category == 'transcript':
142            amount = academic_session.transcript_fee
143        elif category == 'transfer':
144            amount = academic_session.transfer_fee
145        elif category == 'late_registration':
146            amount = academic_session.late_registration_fee
147        if amount in (0.0, None):
148            return _('Amount could not be determined.'), None
149        if self.samePaymentMade(student, category, p_item, p_session):
150            return _('This type of payment has already been made.'), None
151        if self._isPaymentDisabled(p_session, category, student):
152            return _('This category of payments has been disabled.'), None
153        payment = createObject(u'waeup.StudentOnlinePayment')
154        timestamp = ("%d" % int(time()*10000))[1:]
155        payment.p_id = "p%s" % timestamp
156        payment.p_category = category
157        payment.p_item = p_item
158        payment.p_session = p_session
159        payment.p_level = p_level
160        payment.p_current = p_current
161        payment.amount_auth = amount
162        return None, payment
163
164    # prefix
165    STUDENT_ID_PREFIX = u'R'
166
167    PORTRAIT_CHANGE_STATES = (
168        ADMITTED, CLEARED, RETURNING, PAID, REGISTERED, VALIDATED)
Note: See TracBrowser for help on using the repository browser.