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

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

Change fees.

  • Property svn:keywords set to Id
File size: 7.3 KB
Line 
1## $Id: utils.py 14924 2017-12-18 11:40:41Z 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        (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        (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        (54600.0, 54600.0, 22600.0, 22600.0, 20100.0, 20100.0,     0.0,     0.0, 0.0, 0.0), # nce_ft
52        (55200.0, 55200.0, 42200.0, 42200.0, 44700.0, 44700.0, 42200.0, 42200.0, 0.0, 0.0), # nce_pt
53        (79200.0, 79200.0, 63100.0, 63100.0, 63100.0, 63100.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 setPaymentDetails(self, category, student,
66            previous_session=None, previous_level=None):
67        """Create a payment ticket and set the payment data of a
68        student for the payment category specified.
69        """
70        p_item = u''
71        amount = 0.0
72        p_session = student['studycourse'].current_session
73        p_level = student['studycourse'].current_level
74        p_current = True
75        academic_session = self._getSessionConfiguration(p_session)
76        if previous_session:
77            return _('Previous session payment not yet implemented.'), None
78        if academic_session == None:
79            return _(u'Session configuration object is not available.'), None
80        # Determine fee.
81        if category.startswith('schoolfee'):
82            try:
83                certificate = student['studycourse'].certificate
84                p_item = certificate.code
85            except (AttributeError, TypeError):
86                return _('Study course data are incomplete.'), None
87            if student.state == RETURNING:
88                # Override p_session and p_level
89                p_session, p_level = self.getReturningData(student)
90                academic_session = self._getSessionConfiguration(p_session)
91                if academic_session == None:
92                    return _(u'Session configuration object '
93                              'is not available.'), None
94            if p_level in PAYMENT_LEVELS:
95                if student.entry_mode == 'de_ft' and p_level == 200:
96                    amount = SCHOOL_FEES.get_fee(
97                        (
98                         local_nonlocal(student),
99                         student.current_mode,
100                         100)
101                        )
102                else:
103                    amount = SCHOOL_FEES.get_fee(
104                        (
105                         local_nonlocal(student),
106                         student.current_mode,
107                         p_level)
108                        )
109            if amount and category in ('schoolfee_1', 'schoolfee_2'):
110                amount /= 2
111            if amount:
112                amount += GATEWAY_AMT
113        elif category == 'clearance':
114            try:
115                p_item = student['studycourse'].certificate.code
116            except (AttributeError, TypeError):
117                return _('Study course data are incomplete.'), None
118            if student.entry_mode == 'nce_we_pt':
119                amount = academic_session.clearance_fee_3
120            elif student.entry_mode == 'ug_ft':
121                amount = academic_session.clearance_fee_2
122            else:
123                amount = academic_session.clearance_fee_1
124            if local_nonlocal(student) == 'non-local'  \
125                and student.entry_mode != 'nce_we_pt':
126                amount += 5000.0
127        elif category == 'bed_allocation':
128            p_item = self.getAccommodationDetails(student)['bt']
129            amount = academic_session.booking_fee
130        elif category == 'hostel_maintenance':
131            amount = 0.0
132            bedticket = student['accommodation'].get(
133                str(student.current_session), None)
134            if bedticket is not None and bedticket.bed is not None:
135                p_item = bedticket.bed_coordinates
136                if bedticket.bed.__parent__.maint_fee > 0:
137                    amount = bedticket.bed.__parent__.maint_fee
138                else:
139                    # fallback
140                    amount = academic_session.maint_fee
141            else:
142                return _(u'No bed allocated.'), None
143        elif category == 'transcript':
144            amount = academic_session.transcript_fee
145        elif category == 'transfer':
146            amount = academic_session.transfer_fee
147        elif category == 'late_registration':
148            amount = academic_session.late_registration_fee
149        if amount in (0.0, None):
150            return _('Amount could not be determined.'), None
151        if self.samePaymentMade(student, category, p_item, p_session):
152            return _('This type of payment has already been made.'), None
153        if self._isPaymentDisabled(p_session, category, student):
154            return _('This category of payments has been disabled.'), None
155        payment = createObject(u'waeup.StudentOnlinePayment')
156        timestamp = ("%d" % int(time()*10000))[1:]
157        payment.p_id = "p%s" % timestamp
158        payment.p_category = category
159        payment.p_item = p_item
160        payment.p_session = p_session
161        payment.p_level = p_level
162        payment.p_current = p_current
163        payment.amount_auth = amount
164        return None, payment
165
166    # prefix
167    STUDENT_ID_PREFIX = u'R'
168
169    PORTRAIT_CHANGE_STATES = (
170        ADMITTED, CLEARED, RETURNING, PAID, REGISTERED, VALIDATED)
Note: See TracBrowser for help on using the repository browser.