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

Last change on this file since 14344 was 14344, checked in by Henrik Bettermann, 8 years ago

Implement payment by instalments.

  • Property svn:keywords set to Id
File size: 6.4 KB
Line 
1## $Id: utils.py 14344 2016-12-14 16:57:13Z 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 academic_session == None:
75            return _(u'Session configuration object is not available.'), None
76        # Determine fee.
77        if category.startswith('schoolfee'):
78            try:
79                certificate = student['studycourse'].certificate
80                p_item = certificate.code
81            except (AttributeError, TypeError):
82                return _('Study course data are incomplete.'), None
83            if student.state == RETURNING:
84                # Override p_session and p_level
85                p_session, p_level = self.getReturningData(student)
86                academic_session = self._getSessionConfiguration(p_session)
87                if academic_session == None:
88                    return _(u'Session configuration object '
89                              'is not available.'), None
90            if p_level in PAYMENT_LEVELS:
91                amount = SCHOOL_FEES.get_fee(
92                    (
93                     local_nonlocal(student),
94                     student.current_mode,
95                     p_level)
96                    )
97            if amount and category in ('schoolfee_1', 'schoolfee_2'):
98                amount /= 2
99            if amount:
100                amount += GATEWAY_AMT
101        elif category == 'clearance':
102            try:
103                p_item = student['studycourse'].certificate.code
104            except (AttributeError, TypeError):
105                return _('Study course data are incomplete.'), None
106            amount = academic_session.clearance_fee
107            if local_nonlocal(student) == 'non-local':
108                amount += 5000.0
109        elif category == 'bed_allocation':
110            p_item = self.getAccommodationDetails(student)['bt']
111            amount = academic_session.booking_fee
112        elif category == 'hostel_maintenance':
113            amount = 0.0
114            bedticket = student['accommodation'].get(
115                str(student.current_session), None)
116            if bedticket is not None and bedticket.bed is not None:
117                p_item = bedticket.bed_coordinates
118                if bedticket.bed.__parent__.maint_fee > 0:
119                    amount = bedticket.bed.__parent__.maint_fee
120                else:
121                    # fallback
122                    amount = academic_session.maint_fee
123            else:
124                return _(u'No bed allocated.'), None
125        elif category == 'transcript':
126            amount = academic_session.transcript_fee
127        elif category == 'transfer':
128            amount = academic_session.transfer_fee
129        elif category == 'late_registration':
130            amount = academic_session.late_registration_fee
131        if amount in (0.0, None):
132            return _('Amount could not be determined.'), None
133        if self.samePaymentMade(student, category, p_item, p_session):
134            return _('This type of payment has already been made.'), None
135        if self._isPaymentDisabled(p_session, category, student):
136            return _('This category of payments has been disabled.'), None
137        payment = createObject(u'waeup.StudentOnlinePayment')
138        timestamp = ("%d" % int(time()*10000))[1:]
139        payment.p_id = "p%s" % timestamp
140        payment.p_category = category
141        payment.p_item = p_item
142        payment.p_session = p_session
143        payment.p_level = p_level
144        payment.p_current = p_current
145        payment.amount_auth = amount
146        return None, payment
147
148    # prefix
149    STUDENT_ID_PREFIX = u'R'
150
151    PORTRAIT_CHANGE_STATES = (
152        ADMITTED, CLEARED, RETURNING, PAID, REGISTERED, VALIDATED)
Note: See TracBrowser for help on using the repository browser.