source: main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/students/browser.py @ 16631

Last change on this file since 16631 was 16631, checked in by Henrik Bettermann, 3 years ago

Add 'Balance Brought Forward'.

  • Property svn:keywords set to Id
File size: 35.5 KB
Line 
1## $Id: browser.py 16631 2021-09-20 21:41:15Z henrik $
2##
3## Copyright (C) 2012 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
19import os
20from zope.i18n import translate
21from zope.schema.interfaces import ConstraintNotSatisfied
22from zope.component import getUtility
23from zope.security import checkPermission
24from zope.formlib.textwidgets import BytesDisplayWidget
25from hurry.workflow.interfaces import IWorkflowInfo
26from waeup.kofa.interfaces import (
27    REQUESTED, ADMITTED, CLEARANCE, REQUESTED, CLEARED,
28    IExtFileStore, IKofaUtils, academic_sessions_vocab)
29from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
30from waeup.kofa.browser.layout import (
31    action, jsaction, UtilityView, KofaEditFormPage)
32from waeup.kofa.students.browser import (
33    StudyLevelEditFormPage, StudyLevelDisplayFormPage,
34    StudentBasePDFFormPage, ExportPDFCourseRegistrationSlip,
35    CourseTicketDisplayFormPage, StudentTriggerTransitionFormPage,
36    StartClearancePage, BalancePaymentAddFormPage,
37    ExportPDFAdmissionSlip, ExportPDFPersonalDataSlip,
38    PaymentsManageFormPage,
39    msave, emit_lock_message)
40from waeup.kofa.students.interfaces import (
41    IStudentsUtils, ICourseTicket, IStudent)
42from waeup.kofa.students.vocabularies import StudyLevelSource
43from waeup.kofa.students.workflow import FORBIDDEN_POSTGRAD_TRANS
44from kofacustom.nigeria.students.browser import (
45    NigeriaOnlinePaymentDisplayFormPage,
46    NigeriaStudentBaseDisplayFormPage,
47    NigeriaStudentBaseManageFormPage,
48    NigeriaStudentClearanceEditFormPage,
49    NigeriaOnlinePaymentAddFormPage,
50    NigeriaExportPDFPaymentSlip,
51    NigeriaExportPDFClearanceSlip,
52    NigeriaExportPDFCourseRegistrationSlip,
53    NigeriaStudentBaseEditFormPage,
54    NigeriaBedTicketAddPage,
55    NigeriaAccommodationManageFormPage,
56    NigeriaAccommodationDisplayFormPage,
57    NigeriaStudentPersonalManageFormPage,
58    NigeriaStudentPersonalEditFormPage,
59    NigeriaStudentPersonalDisplayFormPage
60    )
61from kofacustom.iuokada.students.interfaces import (
62    ICustomStudentOnlinePayment, ICustomStudentStudyCourse,
63    ICustomStudentStudyLevel, ICustomStudentBase, ICustomStudent,
64    ICustomStudentPersonal, ICustomStudentPersonalEdit)
65from kofacustom.iuokada.interfaces import MessageFactory as _
66
67class CustomStudentBaseDisplayFormPage(NigeriaStudentBaseDisplayFormPage):
68    """ Page to display student base data
69    """
70    form_fields = grok.AutoFields(ICustomStudentBase).omit(
71        'password', 'suspended', 'suspended_comment', 'flash_notice')
72
73class CustomStudentBaseManageFormPage(NigeriaStudentBaseManageFormPage):
74    """ View to manage student base data
75    """
76    form_fields = grok.AutoFields(ICustomStudentBase).omit(
77        'student_id', 'adm_code', 'suspended',
78        'financially_cleared_by', 'financial_clearance_date')
79
80class StudentBaseEditFormPage(NigeriaStudentBaseEditFormPage):
81    """ View to edit student base data
82    """
83    @property
84    def form_fields(self):
85        form_fields = grok.AutoFields(ICustomStudentBase).select(
86            'email', 'email2', 'parents_email', 'phone',)
87        if not self.context.state in (ADMITTED, CLEARANCE):
88            form_fields['parents_email'].for_display = True
89        return form_fields
90
91class CustomExportPDFCourseRegistrationSlip(
92    NigeriaExportPDFCourseRegistrationSlip):
93    """Deliver a PDF slip of the context.
94    """
95
96    def _signatures(self):
97        return (
98                ['Student Signature'],
99                ['HoD / Course Adviser Signature'],
100                ['College Officer Signature'],
101                ['Dean Signature']
102                )
103
104    #def _sigsInFooter(self):
105    #    return (_('Student'),
106    #            _('HoD / Course Adviser'),
107    #            _('College Officer'),
108    #            _('Dean'),
109    #            )
110    #    return ()
111
112class CustomStudentPersonalDisplayFormPage(NigeriaStudentPersonalDisplayFormPage):
113    """ Page to display student personal data
114    """
115    form_fields = grok.AutoFields(ICustomStudentPersonal)
116    form_fields['perm_address'].custom_widget = BytesDisplayWidget
117    form_fields['postal_address'].custom_widget = BytesDisplayWidget
118    form_fields['hostel_address'].custom_widget = BytesDisplayWidget
119    form_fields['father_address'].custom_widget = BytesDisplayWidget
120    form_fields['mother_address'].custom_widget = BytesDisplayWidget
121    form_fields['guardian_address'].custom_widget = BytesDisplayWidget
122    form_fields[
123        'personal_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
124
125
126class CustomStudentPersonalEditFormPage(NigeriaStudentPersonalEditFormPage):
127    """ Page to edit personal data
128    """
129    form_fields = grok.AutoFields(ICustomStudentPersonalEdit).omit(
130        'personal_updated')
131
132    def update(self):
133        #if not self.context.is_fresh:
134        #    self.flash('Not allowed.', type="danger")
135        #    self.redirect(self.url(self.context))
136        #    return
137        if not self.context.minimumStudentPayments():
138            self.flash('Please make 40% of your tution fee payments first.',
139                       type="warning")
140            self.redirect(self.url(self.context, 'view_personal'))
141            return
142        super(CustomStudentPersonalEditFormPage, self).update()
143        return
144
145
146class CustomStudentPersonalManageFormPage(NigeriaStudentPersonalManageFormPage):
147    """ Page to manage personal data
148    """
149    form_fields = grok.AutoFields(ICustomStudentPersonal)
150    form_fields['personal_updated'].for_display = True
151    form_fields[
152        'personal_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
153
154class CustomExportPDFPersonalDataSlip(ExportPDFPersonalDataSlip):
155    """Deliver a PDF base and personal data slip.
156    """
157    grok.name('course_registration_clearance.pdf')
158    omit_fields = (
159        'phone', 'email',
160        'suspended',
161        'adm_code', 'suspended_comment',
162        'current_level',
163        'flash_notice', 'entry_session',
164        'parents_email')
165
166    form_fields = grok.AutoFields(ICustomStudentPersonal)
167
168    def _signatures(self):
169        return ([('I certify that the above named student has satisfied the financial requirements for registration.', 'Name and Signature of Bursary Staff', '<br><br>')],
170                [('I certify that the credentials of the student have been screened by me and the student is hereby cleared.', 'Name and Signature of Registry Staff', '<br><br>')],
171                [('I certify that the above named student has registered with the Library.', 'Name and Signature of Library Staff', '<br><br>')],
172                [('I certify that the above named student has been registered with the college. ', 'Name and Signature of College Officer', '<br><br>')],
173                [('I certify that the above named student has completed his/her ICT registration. ', 'Name and Signature of ICT Staff', '<br><br>')],
174                [('Eligibility/Congratulation Station', 'Name and Signature of Registrar', '')],
175                )
176
177    @property
178    def tabletitle(self):
179        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
180        tabletitle = []
181        session = self.context.student.current_session
182        tabletitle.append('_PB_Successful %s/%s Session Payments' %(session, session+1))
183        return tabletitle
184
185    def render(self):
186        if not self.context.minimumStudentPayments():
187            self.redirect(self.url(self.context))
188            return
189        studentview = StudentBasePDFFormPage(self.context.student,
190            self.request, self.omit_fields)
191        students_utils = getUtility(IStudentsUtils)
192
193        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
194        P_ID = translate(_('Payment Id'), 'waeup.kofa', target_language=portal_language)
195        #CD = translate(_('Creation Date'), 'waeup.kofa', target_language=portal_language)
196        PD = translate(_('Payment Date'), 'waeup.kofa', target_language=portal_language)
197        CAT = translate(_('Payment Category'), 'waeup.kofa', target_language=portal_language)
198        ITEM = translate(_('Payment Item'), 'waeup.kofa', target_language=portal_language)
199        AMT = translate(_('Amount (Naira)'), 'waeup.kofa', target_language=portal_language)
200        SSS = translate(_('Payment Session'), 'waeup.kofa', target_language=portal_language)
201        tabledata = []
202        tableheader = []
203        tabledata.append(sorted(
204            [value for value in self.context['payments'].values()
205             if value.p_state in ('paid', 'waived', 'scholarship')
206             and value.p_session >= value.student.current_session],
207             key=lambda value: value.p_session))
208        tableheader.append([(P_ID,'p_id', 4.2),
209                         #(CD,'creation_date', 3),
210                         (PD,'formatted_p_date', 3),
211                         (CAT,'category', 3),
212                         (ITEM, 'p_item', 3),
213                         (AMT, 'amount_auth', 2),
214                         (SSS, 'p_session', 2),
215                         ])
216
217        #watermark_path = os.path.join(
218        #    os.path.dirname(__file__), 'static', 'watermark.pdf')
219        #watermark = open(watermark_path, 'rb')
220        #file_path = os.path.join(
221        #    os.path.dirname(__file__), 'static', 'biodataPage2.pdf')
222        #file = open(file_path, 'rb')
223        #mergefiles = [file,]
224
225        return students_utils.renderPDF(
226            self, 'course_registration_clearance.pdf',
227            self.context.student, studentview,
228            omit_fields=self.omit_fields,
229            signatures=self._signatures(),
230
231            tableheader=tableheader,
232            tabledata=tabledata,
233
234            pagebreak=True,
235        #    mergefiles=mergefiles,
236        #    watermark=watermark
237            )
238
239class CustomAccommodationDisplayFormPage(NigeriaAccommodationDisplayFormPage):
240    """ Page to view bed tickets.
241    """
242    with_hostel_selection = True
243
244class CustomAccommodationManageFormPage(NigeriaAccommodationManageFormPage):
245    """ Page to manage bed tickets.
246    This manage form page is for both students and students officers.
247    """
248    with_hostel_selection = True
249
250class CustomBedTicketAddPage(NigeriaBedTicketAddPage):
251    """ Page to add a bed ticket
252    """
253    with_ac = False
254    with_bedselection = True
255
256class CustomPaymentsManageFormPage(PaymentsManageFormPage):
257    """ Page to manage the student payments. This manage form page is for
258    both students and students officers. IUOkada does not allow students
259    to remove any payment ticket.
260    """
261    grok.template('paymentsmanagepage')
262
263    @property
264    def manage_payments_allowed(self):
265        return checkPermission('waeup.manageStudent', self.context)
266
267    @property
268    def schoolfee_payments_made(self):
269        cs = self.context.student.current_session
270        SF_PAYMENTS = ('schoolfee', 'schoolfee40', 'secondinstal', 'clearance')
271        if cs > self.context.student.entry_session:
272            sf_paid = {cs-1: 0, cs: 0, cs+1: 0}
273            sessions = (cs-1, cs, cs+1)
274        else:
275            sf_paid = {cs: 0, cs+1: 0}
276            sessions = (cs, cs+1)
277        try:
278            certificate = self.context.student['studycourse'].certificate
279        except (AttributeError, TypeError):
280            return sf_paid, 0
281        if self.context.student in (ADMITTED, CLEARANCE, REQUESTED, CLEARED):
282            total_sf = getattr(certificate, 'school_fee_1', 0.0)
283        else:
284            total_sf = getattr(certificate, 'school_fee_2', 0.0)
285        for ticket in self.context.student['payments'].values():
286            if ticket.p_category in SF_PAYMENTS and \
287                ticket.p_state == 'paid' and \
288                ticket.p_session in sessions:
289                sf_paid[ticket.p_session] += ticket.net_amt
290        brought_fwd = 0.0
291        for key in self.context.keys():
292            ticket = self.context[key]
293            if ticket.p_state != 'paid' and\
294               ticket.p_category == 'brought_fwd':
295                  brought_fwd += ticket.amount_auth
296        return sf_paid, total_sf, brought_fwd
297
298class StudentGetMatricNumberPage(UtilityView, grok.View):
299    """ Construct and set the matriculation number.
300    """
301    grok.context(IStudent)
302    grok.name('get_matric_number')
303    grok.require('waeup.manageStudent')
304
305    def update(self):
306        students_utils = getUtility(IStudentsUtils)
307        msg, mnumber = students_utils.setMatricNumber(self.context)
308        if msg:
309            self.flash(msg, type="danger")
310        else:
311            self.flash(_('Matriculation number %s assigned.' % mnumber))
312            self.context.writeLogMessage(self, '%s assigned' % mnumber)
313        self.redirect(self.url(self.context))
314        return
315
316    def render(self):
317        return
318
319class SwitchLibraryAccessView(UtilityView, grok.View):
320    """ Switch the library attribute
321    """
322    grok.context(ICustomStudent)
323    grok.name('switch_library_access')
324    grok.require('waeup.switchLibraryAccess')
325
326    def update(self):
327        if self.context.library:
328            self.context.library = False
329            self.context.writeLogMessage(self, 'library access disabled')
330            self.flash(_('Library access disabled'))
331        else:
332            self.context.library = True
333            self.context.writeLogMessage(self, 'library access enabled')
334            self.flash(_('Library access enabled'))
335        self.redirect(self.url(self.context))
336        return
337
338    def render(self):
339        return
340
341class ExportLibIdCard(UtilityView, grok.View):
342    """Deliver an id card for the library.
343    """
344    grok.context(ICustomStudent)
345    grok.name('lib_idcard.pdf')
346    grok.require('waeup.viewStudent')
347    prefix = 'form'
348
349    label = u"Library Clearance"
350
351    omit_fields = (
352        'suspended', 'email', 'phone',
353        'adm_code', 'suspended_comment',
354        'date_of_birth',
355        'current_mode', 'certificate',
356        'entry_session',
357        'flash_notice')
358
359    form_fields = []
360
361    def _sigsInFooter(self):
362        isStudent = getattr(
363            self.request.principal, 'user_type', None) == 'student'
364        if isStudent:
365            return ''
366        return (_("Date, Reader's Signature"),
367                _("Date, Circulation Librarian's Signature"),
368                )
369
370    def update(self):
371        if not self.context.library:
372            self.flash(_('Forbidden!'), type="danger")
373            self.redirect(self.url(self.context))
374        return
375
376    @property
377    def note(self):
378        return """
379<br /><br /><br /><br /><font size='12'>
380This is to certify that the bearer whose photograph and other details appear
381 overleaf is a registered user of the <b>University Library</b>.
382 The card is not transferable. A replacement fee is charged for a loss,
383 mutilation or otherwise. If found, please, return to the University Library,
384 Igbinedion University, Okada.
385</font>
386
387"""
388        return
389
390    def render(self):
391        studentview = StudentBasePDFFormPage(self.context.student,
392            self.request, self.omit_fields)
393        students_utils = getUtility(IStudentsUtils)
394        return students_utils.renderPDF(
395            self, 'lib_idcard',
396            self.context.student, studentview,
397            omit_fields=self.omit_fields,
398            sigs_in_footer=self._sigsInFooter(),
399            note=self.note)
400
401class CustomStartClearancePage(StartClearancePage):
402    with_ac = False
403
404class CustomBalancePaymentAddFormPage(BalancePaymentAddFormPage):
405    grok.require('waeup.payStudent')
406
407class CustomExportPDFAdmissionSlip(ExportPDFAdmissionSlip):
408    """Deliver a PDF Admission slip.
409    """
410
411    omit_fields = ('date_of_birth',
412                   #'current_level',
413                   #'current_mode',
414                   #'entry_session'
415                   )
416
417    @property
418    def session(self):
419        return academic_sessions_vocab.getTerm(
420            self.context.entry_session).title
421
422    @property
423    def level(self):
424        studylevelsource = StudyLevelSource()
425        return studylevelsource.factory.getTitle(
426            self.context['studycourse'].certificate, self.context.current_level)
427
428    @property
429    def label(self):
430        return 'OFFER OF PROVISIONAL ADMISSION \nFOR %s SESSION' % self.session
431
432    @property
433    def pre_text_ug(self):
434        return (
435            'Following your performance in the screening exercise '
436            'for the %s academic session, I am pleased to inform '
437            'you that you have been offered provisional admission into the '
438            'Igbinedion University, Okada as follows:' % self.session)
439
440    @property
441    def pre_text_pg(self):
442        return (
443            'I am pleased to inform you that your application for admission'
444            ' into the Igbinedion University, Okada was successful. You have'
445            ' been admitted as follows:')
446
447    @property
448    def basic_medical_only_text(self):
449        return"""
450Progression to 200 Level MBBS programmes is highly competitive and strictly based on merit/approved quota. Students who are unable to make the cut off point will have the option of joining allied courses such as BSc Nursing, BSc Anatomy, BSc Biochemistry, BSc Physiology, Bachelor of Medical Laboratory Science, including Computer Science and engineering courses at 200 Level provided they have the relevant O/L credits.
451"""
452
453    @property
454    def basic_pharmacy_only_text(self):
455        return"""
456Progression to 200 Level Pharmacy programmes is highly competitive and strictly based on merit/approved quota. Students who are unable to make the cut off point will have the option of joining allied courses such as BSc Nursing, BSc Anatomy, BSc Biochemistry, BSc Physiology, Bachelor of Medical Laboratory Science, including Computer Science and engineering courses at 200 Level provided they have the relevant O/L credits.
457"""
458
459    @property
460    def post_text_ug(self):
461        return """
462Please note that at the point of registration for your programme of study (course), you will be required to present the following documents: Current UTME result slip, WAEC/NECO (0' Level) result, Birth certificate or sworn affidavit of age, and health certificate from a recognized Medical Centre.
463
464All credentials (original) will be checked during registration. This admission will be cancelled at any point in time it is found that your claims in the application form are false.
465
466You are required to show evidence of the result / credentials you presented on application for admission.
467
468Fees can be paid using any of the following options:
469
470Fees can be paid through your portal page. INSTRUCTIONS can be found below "FEES PAYMENT PROCEDURE" for the options you have to make your payment, as well as instructions on how to use your preferred payment option. If you choose to use the bank payment option, you can pay at any branch of the following banks through Etranzact platform only: Access Bank, First Bank, Zenith Bank
471
472Kindly note the following:
473
474Fees indicated on the Fee Structure page are valid for the current session only.
475Your Student Id (indicated above) Is your logln to the University portal.
476As an indication of your acceptance of this offer of admission, you should pay a non-refundable Acceptance deposit of N200,000. Further note that the 200,000 deposit is part of the tuition fee for the session. Failure to pay after the expiration of two weeks may lead to forfeiture of admission.
477All fees must be paid in full at the beginning of the session, as basis for accommodation, registration and attendance of lectures. This is the rule for all students at all levels. Install mental payments of not more than two installments, may be allowed under exceptional circumstances.
478Fees once paid are not refundable.
479It is advisable that you keep the original receipts of fees paid and present them on demand.
480
481Accommodation: Accommodation in University hostels is compulsory for every student. No student Is allowed to live outside the hostels. Any student who does so will be expelled from the University.
482
483Food: Food is available in cafeteria on "pay-as-you-eat" basis.
484
485Resumption Date: The University opens for fresh students on Saturday, 2nd October, 2021. All newly admitted students are expected to resume on that date.
486
487Registration/Orientation Programme: Orientation programme/registration for fresh students will start on Monday, 4th October, 2021 - Thursday, 7th October, 2021. A late registration fee of N50,000 will be charged after this date. All credentials, O'Level Results, Birth Certificate/Age Declaration, UTME Result Slip (Original) will be checked during registration. This admission will be cancelled at any point in time it is found that any of your claims in the application form is false.
488
489Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the other charges.
490
491Kindly note that fresh students are not allowed the use of private vehicles.
492
493Conduct: All students are expected to conduct themselves properly and dress decently on campus, as well as obey all rules and regulations as failure to comply will attract appropriate sanctions.
494
495We wish you a successful academic career in Igbinedion University.
496
497Congratulations!
498
499
500
501<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
502
503Friday Benji Bakare Esq.
504Registrar
505registrar@iuokada.edu.ng
50608035902949
507"""
508
509    @property
510    def post_text_2020(self):    # no longer used
511        return """
512Please note that at the point of registration for your programme of study (course), you will be required to present the following documents: Current UTME result slip, WAEC/NECO (0' Level) result, Birth certificate or sworn affidavit of age, and health certificate from a recognized Medical Centre.
513
514All credentials (original) will be checked during registration. This admission will be cancelled at any point in time it is found that your claims in the application form are false.
515
516You are required to show evidence of the result / credentials you presented on application for admission.
517
518Fees can be paid using any of the following options:
519
520Fees can be paid through your portal page. INSTRUCTIONS can be found below "FEES PAYMENT PROCEDURE" for the options you have to make your payment, as well as instructions on how to use your preferred payment option. If you choose to use the bank payment option, you can pay at any branch of the following banks through Etranzact platform only: Access Bank, First Bank, Zenith Bank
521
522Kindly note the following:
523
524Fees indicated on the Fee Structure page are valid for the current session only.
525Your Student Id (indicated above) Is your logln to the University portal.
526As an indication of your acceptance of this offer of admission, you should pay a non-refundable Acceptance deposit of N200,000. Further note that the 200,000 deposit is part of the tuition fee for the session. Failure to pay after the expiration of two weeks may lead to forfeiture of admission.
527All fees must be paid in full at the beginning of the session, as basis for accommodation, registration and attendance of lectures. This is the rule for all students at all levels. Install mental payments of not more than two installments, may be allowed under exceptional circumstances.
528Fees once paid are not refundable.
529It is advisable that you keep the original receipts of fees paid and present them on demand.
530
531Accommodation: Accommodation in University hostels is compulsory for every student. No student Is allowed to live outside the hostels. Any student who does so will be expelled from the University.
532
533Food: Food is available in cafeteria on "pay-as-you-eat" basis.
534
535Resumption Date: The University opens for fresh students with online registration starting from Monday 28th September, 2020. The date for physical resumption is 14th November, 2020.
536
537Registration/Orientation Programme: Orientation programme/registration for fresh students will start on Monday, 16th November 2020. Registration ends on 2020-11-30.  A late registration fee of N50,000 will be charged after this date. All credentials, O'Level Results, Birth Certificate/Age Declaration, UTME Result Slip (Original) will be checked during registration. This admission will be cancelled at any point in time it is found that any of your claims in the application form is false.
538
539Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the other charges.
540
541Kindly note that fresh students are not allowed the use of private vehicles.
542
543Conduct: All students are expected to conduct themselves properly and dress decently on campus, as well as obey all rules and regulations as failure to comply will attract appropriate sanctions.
544
545We wish you a successful academic career in Igbinedion University.
546
547Congratulations!
548
549
550
551<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
552
553Friday Benji Bakare Esq.
554Registrar
555registrar@iuokada.edu.ng
55608035902949
557"""
558
559    @property
560    def post_text_pg(self):
561        return """
5621. Details of your programme will be made available to you by the Head of your Department on your arrival at the Igbinedion University.
563
5642. This offer is conditional upon the confirmation of your qualifications as listed by you in your application form. You will be required to produce the ORIGINAL COPIES of all your certificates for verification during registration. If at any time after admission, it is discovered that you do not possess any of the qualifications upon which this offer of admission was made, you will be required to withdraw from the University.
565
5663. If you accept this offer of admission upon the conditions above, you should please:
567
568(a) Complete the enclosed Acceptance Form of Provisional Offer of Admission in duplicate and send  by registered mail or by hand to the
569
570Secretary
571School of Postgraduate Studies and Research
572Igbinedion University,
573P.M.B. 0006,
574Benin City, Edo State,
575Nigeria
576
577(b)     Forward the following along with the Acceptance Form of Provisional Offer of Admission.
578
579(i) A non-refundable deposit of N100,000.00 (One Hundred Thousand Naira Only) which is part of the School fees: Payable Online.
580
581(ii) Four recent passport-size photograph of yourself with your full-names (surname first in BLOCK LETTERS) written on the reverse side of the photograph and pinned to the Acceptance Form.
582
5834. The following will be required for Registration:
584
585(a) A medical examination to be conducted by an approved medical practitioner. On your arrival at the Igbinedion University, you should submit the enclosed Igbinedion University Medical Examination Form duly completed and signed by an approved medical practitioner together with your chest X-ray film to Director of Health Service at the Igbinedion University, Okada.
586
587(b) The original copies of all credentials listed in your application form (including NYSC discharge/exemption certificate) should be brought for sighting.
588
5895. You are required to pay the necessary fees and register for your degree programme not later than three weeks from the beginning of the Academic Session. Late registration may be allowed during an additional period of five weeks on payment of a late registration fees. Please note that you will be allowed to register after two months have elapsed from the beginning of the sessions.
590
5916. Please find attached:
592
593(a) A copy of School fees Regime
594(b) A copy of Acceptance Forms
595
5967. Note:
597
598(a) All Tuition fees are to be paid online
599(b) Post-graduate dues and other charges are to be paid into ABC Microfinance Bank Okada, Account No: 30125
600
6018.  CONGRATULATIONS!!!
602
603Yours faithfully,
604
605<img src="${signature_ezewele_img_path}" valign="-20" height="38" width="86" />
606
607Mrs. Angela Ezewele
608Secretary, School of Postgraduate Studies & Research
609"""
610
611    @property
612    def post_text_pt(self):
613        return """
614Please note that at the point of registration for your programme of study (course), you will be required to present the following documents: Current UTME result slip where available, WAEC/NECO (0' Level) result, Birth certificate or sworn affidavit of age, and health certificate from a recognized Medical Centre.
615
616All credentials (original) will be checked during registration. This admission will be cancelled at any point in time it is found that your claims in the application form are false.
617
618You are required to show evidence of the result / credentials you presented on application for admission.
619
620Fees are paid through bank draft only. Fees can be paid using any of the following options: Professional courses N180,000 (One Hundred and Eighty Thousand Naira only) and Non- Professional N150,000 (One Hundred and Fifty Thousand Naira only).
621
622Your Student Id (indicated above) is your login to the University portal. As an indication of your acceptance of this offer of admission, you should immediatelty raise a draft of fees above at the beginning of the session,. Install mental payments of not more than two installments, may be allowed under exceptional circumstances. Fees once paid are not refundable.
623
624It is advisable that you keep the original receipts of fees paid and present them on demand.
625
626Resumption Date: The University opens for fresh students with online registration starting from Monday 28th September, 2020. The date for physical resumption is 14th November, 2020.
627
628All credentials, O'Level Results, Birth Certificate/Age Declaration, UTME Result Slip where available (Original) will be checked during registration. This admission will be cancelled at any point in time it is found that any of your claims in the application form is false.
629
630Conduct: All students are expected to conduct themselves properly and dress decently on campus, as well as obey all rules and regulations as failure to comply will attract appropriate sanctions.
631
632We wish you a successful academic career in Igbinedion University.
633
634Congratulations!
635
636<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
637
638Friday Benji Bakare Esq.
639Registrar
640registrar@iuokada.edu.ng
64108035902949
642"""
643
644    @property
645    def post_text_jupeb(self):
646        return """
647Please note that at the point of registration for your programme of study (course), you will be required to present the following documents: WAEC/NECO (O' Level) result, Birth certificate or sworn affidavit of age, and certificate of medical fitness from a recognized Medical Centre.
648
649The fee schedule and the options for payment are indicated below. If you choose to use the bank payment option, you can pay at any branch of Access bank on 0787077169 with account name IUO JUPEB or on https://iuokada.waeup.org/e-tranzact or Interswitch platform.
650
651Kindly note the following:
652
6531. As an indication of your acceptance of this offer of admission, you should pay a non- refundable Acceptance deposit of N50,000:00.
6542. Tuition fee for the session is N250,000:00 for Arts and N300,000:00 for Sciences
6553. Accommodation fee for the session is N175,000:00
6564. Administrative fee is N110.000.00
6575. All fees must be paid in full at the beginning of the session, as basis for accommodation, registration and attendance of lectures. Instalmental payments of not more than two instalments, may be allowed
6586. Fees once paid are not refundable.
6597. It is advisable that you keep the original receipts of fees paid and present them on demand.
660
661Accommodation: Accommodation in University hostels is compulsory for every student. No student is allowed to live outside the hostels. Any student who does so will be expelled from the programme.
662
663Food: Food is available in cafeteria on "pay-as-you-eat" basis.
664
665Resumption Date: The University opens for dual mode of teaching (physical/online) for students on Monday, 27th September, 2021.
666
667Registration Programme: Online registration for fresh students will start on Monday, 27th September, 2021 and end on 4th October 2021. A late registration fee of N20,000 will be charged after this date.
668
669Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the tuition.
670Kindly note that JUPEB students are not allowed the use of private vehicles on campus.
671
672Conduct: All students are expected to conduct themselves properly and dress decently on campus, as well as obey all rules and regulations as failure to comply will attract appropriate sanctions.
673
674We wish you a successful academic career in Igbinedion University. Enquiries: 08034331960, 08120611736
675
676Congratulations!
677
678
679
680<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
681
682Friday Benji Bakare Esq.
683Registrar
684"""
685
686    def render(self):
687        students_utils = getUtility(IStudentsUtils)
688        watermark_path = os.path.join(
689            os.path.dirname(__file__), 'static', 'watermark.pdf')
690        watermark = open(watermark_path, 'rb')
691        if self.context.is_jupeb:
692            return students_utils.renderPDFAdmissionLetter(self,
693                self.context.student, omit_fields=self.omit_fields,
694                pre_text=self.pre_text_ug, post_text=self.post_text_jupeb,
695                watermark=watermark)
696        if self.context.current_mode.endswith('_pt'):
697            return students_utils.renderPDFAdmissionLetter(self,
698                self.context.student, omit_fields=self.omit_fields,
699                pre_text=self.pre_text_ug, post_text=self.post_text_pt,
700                watermark=watermark)
701        if self.context.is_postgrad:
702            file_path = os.path.join(
703                os.path.dirname(__file__), 'static', 'admission_letter_pg.pdf')
704            file = open(file_path, 'rb')
705            mergefiles = [file,]
706            return students_utils.renderPDFAdmissionLetter(self,
707                self.context.student, omit_fields=self.omit_fields,
708                pre_text=self.pre_text_pg, post_text=self.post_text_pg,
709                mergefiles=mergefiles,
710                watermark=watermark)
711        file_path = os.path.join(
712            os.path.dirname(__file__), 'static', 'admission_letter_ug.pdf')
713        file = open(file_path, 'rb')
714        mergefiles = [file,]
715        if self.context.certcode in ('BBMS', 'MBBS') and self.context.current_level == 100:
716            post_text = self.basic_medical_only_text + self.post_text_ug
717        elif self.context.certcode in ('BPHARM',) and self.context.current_level == 100:
718            post_text = self.basic_pharmacy_only_text + self.post_text_ug
719        else:
720            post_text = self.post_text_ug
721        return students_utils.renderPDFAdmissionLetter(self,
722            self.context.student, omit_fields=self.omit_fields,
723            pre_text=self.pre_text_ug, post_text=post_text,
724            mergefiles=mergefiles,
725            watermark=watermark)
726
727class CustomOnlinePaymentDisplayFormPage(NigeriaOnlinePaymentDisplayFormPage):
728    """ Page to view an online payment ticket. We do not omit provider_amt.
729    """
730    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
731        'gateway_amt', 'thirdparty_amt', 'p_item','p_combi', 'provider_amt')
732    form_fields[
733        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
734    form_fields[
735        'payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
736
737class CustomExportPDFPaymentSlip(NigeriaExportPDFPaymentSlip):
738    """Deliver a PDF slip of the context. We do not omit provider_amt.
739    """
740    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
741        'gateway_amt', 'thirdparty_amt', 'p_item',
742        'p_split_data','p_combi', 'provider_amt')
743    form_fields['creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
744    form_fields['payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
Note: See TracBrowser for help on using the repository browser.