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

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

Disable all school fee categories.

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