Index: /WAeUP_SRP/trunk/profiles/aaua/skins.xml
===================================================================
--- /WAeUP_SRP/trunk/profiles/aaua/skins.xml	(revision 3690)
+++ /WAeUP_SRP/trunk/profiles/aaua/skins.xml	(revision 3690)
@@ -0,0 +1,188 @@
+<?xml version="1.0"?>
+<object name="portal_skins" meta_type="CMF Skins Tool" allow_any="False"
+   cookie_persistence="False"
+   request_varname="portal_skin"
+   default_skin="CPSSkins">
+ <object name="Images" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/Images"/>
+ <object name="cmf_calendar" meta_type="Filesystem Directory View"
+    directory="CMFCalendar/skins/calendar"/>
+ <object name="cmf_zpt_calendar" meta_type="Filesystem Directory View"
+    directory="CMFCalendar/skins/zpt_calendar"/>
+ <object name="content" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/content"/>
+ <object name="control" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/control"/>
+ <object name="cps_default" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_default"/>
+ <object name="cps_devel" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_devel"/>
+ <object name="cps_directory" meta_type="Filesystem Directory View"
+    directory="CPSDirectory/skins/cps_directory"/>
+ <object name="cps_document" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document"/>
+ <object name="cps_document_images" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document_images"/>
+ <object name="cps_document_js" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document_js"/>
+ <object name="cps_images" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_images"/>
+ <object name="cps_javascript" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_javascript"/>
+ <object name="cps_jscalendar" meta_type="Filesystem Directory View"
+    directory="CPSSchemas/skins/cps_jscalendar"/>
+ <object name="cps_nuxeo_style" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_styles/nuxeo"/>
+ <object name="cpsportlets_default" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_default"/>
+ <object name="cpsportlets_layouts" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_layouts"/>
+ <object name="cpsportlets_schemas" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_schemas"/>
+ <object name="cpsportlets_types" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_vocabularies"/>
+ <object name="cpsportlets_vocabularies" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_types"/>
+ <object name="cpsportlets_widgets" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_widgets"/>
+ <object name="cps_schemas" meta_type="Filesystem Directory View"
+    directory="CPSSchemas/skins/cps_schemas"/>
+ <object name="cps_styles" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_styles"/>
+ <object name="cpsnavigation_default" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_default"/>
+ <object name="cpsnavigation_devel" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_devel"/>
+ <object name="cpsnavigation_images" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_images"/>
+ <object name="CPSSkins" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/CPSSkins"/>
+ <object name="cpsskins_cmf" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cmf"/>
+ <object name="cpsskins_cps3" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cps3"/>
+ <object name="cpsskins_cps3_macroless" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cps3_macroless"/>
+ <object name="cpsskins_icons" meta_type="Filesystem Directory View"
+    directory="CPSSkins/icons"/>
+ <object name="custom" meta_type="Folder"/>
+ <object name="fckeditor" meta_type="Filesystem Directory View"
+    directory="FCKeditor/skins/fckeditor"/>
+ <object name="generic" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/generic"/>
+ <object name="mimetypes_icons" meta_type="Filesystem Directory View"
+    directory="PortalTransforms/skins/mimetypes_icons"/>
+ <object name="no_css" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/no_css"/>
+ <object name="nouvelle" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/nouvelle"/>
+ <object name="scriptaculous" meta_type="Filesystem Directory View"
+    directory="CPSUtil/skins/scriptaculous"/>
+ <object name="topic" meta_type="Filesystem Directory View"
+    directory="CMFTopic/skins/topic"/>
+ <object name="zpt_content" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_content"/>
+ <object name="zpt_control" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_control"/>
+ <object name="zpt_generic" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_generic"/>
+ <object name="zpt_topic" meta_type="Filesystem Directory View"
+    directory="CMFTopic/skins/zpt_topic"/>
+    
+    
+ <object name="cps_custom" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/cps_custom"/>
+ <object name="waeup_statistics" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_statistics"/>
+ <object name="waeup_layout" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_layout"/>    
+ <object name="waeup_custom" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_custom"/>
+ <object name="waeup_default" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_default"/>
+ <object name="waeup_design" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_design"/>
+ <object name="waeup_images" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_images"/>
+ <object name="waeup_directory" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_directory"/>
+ <object name="waeup_epayment" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_epayment"/>
+ <object name="waeup_academics" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_academics"/>
+ <object name="waeup_accommodation" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_accommodation"/>
+ <object name="waeup_pins" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_pins"/>
+ <object name="waeup_student" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_student"/>
+ <object name="waeup_utilities" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_utilities"/>
+ <object name="waeup_documents" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_documents"/>
+ <object name="waeup_upload" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_upload"/>    
+    
+    
+ <skin-path name="CPSSkins">
+  <layer name="custom" insert-before="*"/>
+  <layer name="CPSSkins"/>
+  <layer name="cpsskins_icons"/>
+  <layer name="cpsskins_cps3_macroless"/>
+  <layer name="cpsskins_cps3"/>
+  <layer name="cpsskins_cmf"/>
+  <layer name="cpsportlets_schemas" insert-after="custom"/>
+  <layer name="cpsportlets_vocabularies" insert-after="custom"/>
+  <layer name="cpsportlets_layouts" insert-after="custom"/>
+  <layer name="cpsportlets_widgets" insert-after="custom"/>
+  <layer name="cpsportlets_default" insert-after="custom"/>
+  <layer name="cpsportlets_types" insert-after="custom"/>
+  <layer name="cpsnavigation_images"/>
+  <layer name="cpsnavigation_default"/>
+  <layer name="cpsnavigation_devel"/>
+  <layer name="cps_directory"/>
+  <layer name="mimetypes_icons"/>
+  <layer name="cps_jscalendar"/>
+  <layer name="cps_schemas"/>
+  <layer name="cps_document"/>
+  <layer name="cps_document_js"/>
+  <layer name="cps_document_images"/>
+  <layer name="fckeditor"/>
+  <layer name="scriptaculous"/>
+  <layer name="cps_javascript"/>
+  <layer name="cps_default"/>
+  <layer name="cps_images"/>
+  <layer name="cmf_calendar"/>
+  <layer name="cps_styles"/>
+  <layer name="cps_nuxeo_style"/>
+  <layer name="cmf_zpt_calendar"/>
+  <layer name="cps_devel"/>
+  <layer name="zpt_topic"/>
+  <layer name="zpt_content"/>
+  <layer name="zpt_generic"/>
+  <layer name="zpt_control"/>
+  <layer name="Images"/> 
+ 
+  <layer name="waeup_aaua" insert-after="custom"/>
+  <layer name="cps_custom" insert-after="waeup_custom"/>
+  <layer name="waeup_statistics" insert-after="waeup_custom"/>
+  <layer name="waeup_default" insert-after="waeup_custom"/>
+  <layer name="waeup_directory" insert-after="waeup_custom"/>
+  <layer name="waeup_epayment" insert-after="waeup_custom"/>
+  <layer name="waeup_pins" insert-after="waeup_custom"/>
+  <layer name="waeup_student" insert-after="waeup_custom"/>
+  <layer name="waeup_academics" insert-after="waeup_custom"/>
+  <layer name="waeup_documents" insert-after="waeup_custom"/>
+  <layer name="waeup_upload" insert-after="waeup_custom"/>
+  <layer name="waeup_accommodation" insert-after="waeup_custom"/>
+  <layer name="waeup_utilities" insert-after="waeup_custom"/>
+  <layer name="waeup_images" insert-after="waeup_custom"/>
+  <layer name="waeup_layout" insert-after="waeup_custom"/>
+  <layer name="waeup_design" insert-after="waeup_custom"/>
+  <layer name="CPSSkins" remove="" />
+  <layer name="cpsskins_icons" remove="" />
+  <layer name="cpsskins_cps3" remove="" />
+  <layer name="cpsskins_cmf" remove="" />
+ </skin-path>
+
+</object>
Index: /WAeUP_SRP/trunk/profiles/fceokene/skins.xml
===================================================================
--- /WAeUP_SRP/trunk/profiles/fceokene/skins.xml	(revision 3690)
+++ /WAeUP_SRP/trunk/profiles/fceokene/skins.xml	(revision 3690)
@@ -0,0 +1,188 @@
+<?xml version="1.0"?>
+<object name="portal_skins" meta_type="CMF Skins Tool" allow_any="False"
+   cookie_persistence="False"
+   request_varname="portal_skin"
+   default_skin="CPSSkins">
+ <object name="Images" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/Images"/>
+ <object name="cmf_calendar" meta_type="Filesystem Directory View"
+    directory="CMFCalendar/skins/calendar"/>
+ <object name="cmf_zpt_calendar" meta_type="Filesystem Directory View"
+    directory="CMFCalendar/skins/zpt_calendar"/>
+ <object name="content" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/content"/>
+ <object name="control" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/control"/>
+ <object name="cps_default" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_default"/>
+ <object name="cps_devel" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_devel"/>
+ <object name="cps_directory" meta_type="Filesystem Directory View"
+    directory="CPSDirectory/skins/cps_directory"/>
+ <object name="cps_document" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document"/>
+ <object name="cps_document_images" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document_images"/>
+ <object name="cps_document_js" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document_js"/>
+ <object name="cps_images" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_images"/>
+ <object name="cps_javascript" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_javascript"/>
+ <object name="cps_jscalendar" meta_type="Filesystem Directory View"
+    directory="CPSSchemas/skins/cps_jscalendar"/>
+ <object name="cps_nuxeo_style" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_styles/nuxeo"/>
+ <object name="cpsportlets_default" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_default"/>
+ <object name="cpsportlets_layouts" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_layouts"/>
+ <object name="cpsportlets_schemas" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_schemas"/>
+ <object name="cpsportlets_types" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_vocabularies"/>
+ <object name="cpsportlets_vocabularies" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_types"/>
+ <object name="cpsportlets_widgets" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_widgets"/>
+ <object name="cps_schemas" meta_type="Filesystem Directory View"
+    directory="CPSSchemas/skins/cps_schemas"/>
+ <object name="cps_styles" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_styles"/>
+ <object name="cpsnavigation_default" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_default"/>
+ <object name="cpsnavigation_devel" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_devel"/>
+ <object name="cpsnavigation_images" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_images"/>
+ <object name="CPSSkins" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/CPSSkins"/>
+ <object name="cpsskins_cmf" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cmf"/>
+ <object name="cpsskins_cps3" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cps3"/>
+ <object name="cpsskins_cps3_macroless" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cps3_macroless"/>
+ <object name="cpsskins_icons" meta_type="Filesystem Directory View"
+    directory="CPSSkins/icons"/>
+ <object name="custom" meta_type="Folder"/>
+ <object name="fckeditor" meta_type="Filesystem Directory View"
+    directory="FCKeditor/skins/fckeditor"/>
+ <object name="generic" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/generic"/>
+ <object name="mimetypes_icons" meta_type="Filesystem Directory View"
+    directory="PortalTransforms/skins/mimetypes_icons"/>
+ <object name="no_css" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/no_css"/>
+ <object name="nouvelle" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/nouvelle"/>
+ <object name="scriptaculous" meta_type="Filesystem Directory View"
+    directory="CPSUtil/skins/scriptaculous"/>
+ <object name="topic" meta_type="Filesystem Directory View"
+    directory="CMFTopic/skins/topic"/>
+ <object name="zpt_content" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_content"/>
+ <object name="zpt_control" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_control"/>
+ <object name="zpt_generic" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_generic"/>
+ <object name="zpt_topic" meta_type="Filesystem Directory View"
+    directory="CMFTopic/skins/zpt_topic"/>
+    
+    
+ <object name="cps_custom" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/cps_custom"/>
+ <object name="waeup_statistics" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_statistics"/>
+ <object name="waeup_layout" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_layout"/>    
+ <object name="waeup_custom" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_custom"/>
+ <object name="waeup_default" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_default"/>
+ <object name="waeup_design" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_design"/>
+ <object name="waeup_images" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_images"/>
+ <object name="waeup_directory" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_directory"/>
+ <object name="waeup_epayment" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_epayment"/>
+ <object name="waeup_academics" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_academics"/>
+ <object name="waeup_accommodation" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_accommodation"/>
+ <object name="waeup_pins" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_pins"/>
+ <object name="waeup_student" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_student"/>
+ <object name="waeup_utilities" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_utilities"/>
+ <object name="waeup_documents" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_documents"/>
+ <object name="waeup_upload" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_upload"/>    
+    
+    
+ <skin-path name="CPSSkins">
+  <layer name="custom" insert-before="*"/>
+  <layer name="CPSSkins"/>
+  <layer name="cpsskins_icons"/>
+  <layer name="cpsskins_cps3_macroless"/>
+  <layer name="cpsskins_cps3"/>
+  <layer name="cpsskins_cmf"/>
+  <layer name="cpsportlets_schemas" insert-after="custom"/>
+  <layer name="cpsportlets_vocabularies" insert-after="custom"/>
+  <layer name="cpsportlets_layouts" insert-after="custom"/>
+  <layer name="cpsportlets_widgets" insert-after="custom"/>
+  <layer name="cpsportlets_default" insert-after="custom"/>
+  <layer name="cpsportlets_types" insert-after="custom"/>
+  <layer name="cpsnavigation_images"/>
+  <layer name="cpsnavigation_default"/>
+  <layer name="cpsnavigation_devel"/>
+  <layer name="cps_directory"/>
+  <layer name="mimetypes_icons"/>
+  <layer name="cps_jscalendar"/>
+  <layer name="cps_schemas"/>
+  <layer name="cps_document"/>
+  <layer name="cps_document_js"/>
+  <layer name="cps_document_images"/>
+  <layer name="fckeditor"/>
+  <layer name="scriptaculous"/>
+  <layer name="cps_javascript"/>
+  <layer name="cps_default"/>
+  <layer name="cps_images"/>
+  <layer name="cmf_calendar"/>
+  <layer name="cps_styles"/>
+  <layer name="cps_nuxeo_style"/>
+  <layer name="cmf_zpt_calendar"/>
+  <layer name="cps_devel"/>
+  <layer name="zpt_topic"/>
+  <layer name="zpt_content"/>
+  <layer name="zpt_generic"/>
+  <layer name="zpt_control"/>
+  <layer name="Images"/> 
+ 
+  <layer name="waeup_fceokene" insert-after="custom"/>
+  <layer name="cps_custom" insert-after="waeup_custom"/>
+  <layer name="waeup_statistics" insert-after="waeup_custom"/>
+  <layer name="waeup_default" insert-after="waeup_custom"/>
+  <layer name="waeup_directory" insert-after="waeup_custom"/>
+  <layer name="waeup_epayment" insert-after="waeup_custom"/>
+  <layer name="waeup_pins" insert-after="waeup_custom"/>
+  <layer name="waeup_student" insert-after="waeup_custom"/>
+  <layer name="waeup_academics" insert-after="waeup_custom"/>
+  <layer name="waeup_documents" insert-after="waeup_custom"/>
+  <layer name="waeup_upload" insert-after="waeup_custom"/>
+  <layer name="waeup_accommodation" insert-after="waeup_custom"/>
+  <layer name="waeup_utilities" insert-after="waeup_custom"/>
+  <layer name="waeup_images" insert-after="waeup_custom"/>
+  <layer name="waeup_layout" insert-after="waeup_custom"/>
+  <layer name="waeup_design" insert-after="waeup_custom"/>
+  <layer name="CPSSkins" remove="" />
+  <layer name="cpsskins_icons" remove="" />
+  <layer name="cpsskins_cps3" remove="" />
+  <layer name="cpsskins_cmf" remove="" />
+ </skin-path>
+
+</object>
Index: /WAeUP_SRP/trunk/profiles/ois/skins.xml
===================================================================
--- /WAeUP_SRP/trunk/profiles/ois/skins.xml	(revision 3690)
+++ /WAeUP_SRP/trunk/profiles/ois/skins.xml	(revision 3690)
@@ -0,0 +1,188 @@
+<?xml version="1.0"?>
+<object name="portal_skins" meta_type="CMF Skins Tool" allow_any="False"
+   cookie_persistence="False"
+   request_varname="portal_skin"
+   default_skin="CPSSkins">
+ <object name="Images" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/Images"/>
+ <object name="cmf_calendar" meta_type="Filesystem Directory View"
+    directory="CMFCalendar/skins/calendar"/>
+ <object name="cmf_zpt_calendar" meta_type="Filesystem Directory View"
+    directory="CMFCalendar/skins/zpt_calendar"/>
+ <object name="content" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/content"/>
+ <object name="control" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/control"/>
+ <object name="cps_default" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_default"/>
+ <object name="cps_devel" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_devel"/>
+ <object name="cps_directory" meta_type="Filesystem Directory View"
+    directory="CPSDirectory/skins/cps_directory"/>
+ <object name="cps_document" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document"/>
+ <object name="cps_document_images" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document_images"/>
+ <object name="cps_document_js" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document_js"/>
+ <object name="cps_images" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_images"/>
+ <object name="cps_javascript" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_javascript"/>
+ <object name="cps_jscalendar" meta_type="Filesystem Directory View"
+    directory="CPSSchemas/skins/cps_jscalendar"/>
+ <object name="cps_nuxeo_style" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_styles/nuxeo"/>
+ <object name="cpsportlets_default" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_default"/>
+ <object name="cpsportlets_layouts" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_layouts"/>
+ <object name="cpsportlets_schemas" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_schemas"/>
+ <object name="cpsportlets_types" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_vocabularies"/>
+ <object name="cpsportlets_vocabularies" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_types"/>
+ <object name="cpsportlets_widgets" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_widgets"/>
+ <object name="cps_schemas" meta_type="Filesystem Directory View"
+    directory="CPSSchemas/skins/cps_schemas"/>
+ <object name="cps_styles" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_styles"/>
+ <object name="cpsnavigation_default" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_default"/>
+ <object name="cpsnavigation_devel" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_devel"/>
+ <object name="cpsnavigation_images" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_images"/>
+ <object name="CPSSkins" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/CPSSkins"/>
+ <object name="cpsskins_cmf" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cmf"/>
+ <object name="cpsskins_cps3" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cps3"/>
+ <object name="cpsskins_cps3_macroless" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cps3_macroless"/>
+ <object name="cpsskins_icons" meta_type="Filesystem Directory View"
+    directory="CPSSkins/icons"/>
+ <object name="custom" meta_type="Folder"/>
+ <object name="fckeditor" meta_type="Filesystem Directory View"
+    directory="FCKeditor/skins/fckeditor"/>
+ <object name="generic" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/generic"/>
+ <object name="mimetypes_icons" meta_type="Filesystem Directory View"
+    directory="PortalTransforms/skins/mimetypes_icons"/>
+ <object name="no_css" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/no_css"/>
+ <object name="nouvelle" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/nouvelle"/>
+ <object name="scriptaculous" meta_type="Filesystem Directory View"
+    directory="CPSUtil/skins/scriptaculous"/>
+ <object name="topic" meta_type="Filesystem Directory View"
+    directory="CMFTopic/skins/topic"/>
+ <object name="zpt_content" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_content"/>
+ <object name="zpt_control" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_control"/>
+ <object name="zpt_generic" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_generic"/>
+ <object name="zpt_topic" meta_type="Filesystem Directory View"
+    directory="CMFTopic/skins/zpt_topic"/>
+    
+    
+ <object name="cps_custom" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/cps_custom"/>
+ <object name="waeup_statistics" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_statistics"/>
+ <object name="waeup_layout" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_layout"/>    
+ <object name="waeup_custom" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_custom"/>
+ <object name="waeup_default" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_default"/>
+ <object name="waeup_design" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_design"/>
+ <object name="waeup_images" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_images"/>
+ <object name="waeup_directory" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_directory"/>
+ <object name="waeup_epayment" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_epayment"/>
+ <object name="waeup_academics" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_academics"/>
+ <object name="waeup_accommodation" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_accommodation"/>
+ <object name="waeup_pins" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_pins"/>
+ <object name="waeup_student" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_student"/>
+ <object name="waeup_utilities" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_utilities"/>
+ <object name="waeup_documents" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_documents"/>
+ <object name="waeup_upload" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_upload"/>    
+    
+    
+ <skin-path name="CPSSkins">
+  <layer name="custom" insert-before="*"/>
+  <layer name="CPSSkins"/>
+  <layer name="cpsskins_icons"/>
+  <layer name="cpsskins_cps3_macroless"/>
+  <layer name="cpsskins_cps3"/>
+  <layer name="cpsskins_cmf"/>
+  <layer name="cpsportlets_schemas" insert-after="custom"/>
+  <layer name="cpsportlets_vocabularies" insert-after="custom"/>
+  <layer name="cpsportlets_layouts" insert-after="custom"/>
+  <layer name="cpsportlets_widgets" insert-after="custom"/>
+  <layer name="cpsportlets_default" insert-after="custom"/>
+  <layer name="cpsportlets_types" insert-after="custom"/>
+  <layer name="cpsnavigation_images"/>
+  <layer name="cpsnavigation_default"/>
+  <layer name="cpsnavigation_devel"/>
+  <layer name="cps_directory"/>
+  <layer name="mimetypes_icons"/>
+  <layer name="cps_jscalendar"/>
+  <layer name="cps_schemas"/>
+  <layer name="cps_document"/>
+  <layer name="cps_document_js"/>
+  <layer name="cps_document_images"/>
+  <layer name="fckeditor"/>
+  <layer name="scriptaculous"/>
+  <layer name="cps_javascript"/>
+  <layer name="cps_default"/>
+  <layer name="cps_images"/>
+  <layer name="cmf_calendar"/>
+  <layer name="cps_styles"/>
+  <layer name="cps_nuxeo_style"/>
+  <layer name="cmf_zpt_calendar"/>
+  <layer name="cps_devel"/>
+  <layer name="zpt_topic"/>
+  <layer name="zpt_content"/>
+  <layer name="zpt_generic"/>
+  <layer name="zpt_control"/>
+  <layer name="Images"/> 
+ 
+  <layer name="waeup_ois" insert-after="custom"/>
+  <layer name="cps_custom" insert-after="waeup_custom"/>
+  <layer name="waeup_statistics" insert-after="waeup_custom"/>
+  <layer name="waeup_default" insert-after="waeup_custom"/>
+  <layer name="waeup_directory" insert-after="waeup_custom"/>
+  <layer name="waeup_epayment" insert-after="waeup_custom"/>
+  <layer name="waeup_pins" insert-after="waeup_custom"/>
+  <layer name="waeup_student" insert-after="waeup_custom"/>
+  <layer name="waeup_academics" insert-after="waeup_custom"/>
+  <layer name="waeup_documents" insert-after="waeup_custom"/>
+  <layer name="waeup_upload" insert-after="waeup_custom"/>
+  <layer name="waeup_accommodation" insert-after="waeup_custom"/>
+  <layer name="waeup_utilities" insert-after="waeup_custom"/>
+  <layer name="waeup_images" insert-after="waeup_custom"/>
+  <layer name="waeup_layout" insert-after="waeup_custom"/>
+  <layer name="waeup_design" insert-after="waeup_custom"/>
+  <layer name="CPSSkins" remove="" />
+  <layer name="cpsskins_icons" remove="" />
+  <layer name="cpsskins_cps3" remove="" />
+  <layer name="cpsskins_cmf" remove="" />
+ </skin-path>
+
+</object>
Index: /WAeUP_SRP/trunk/profiles/unilorin/skins.xml
===================================================================
--- /WAeUP_SRP/trunk/profiles/unilorin/skins.xml	(revision 3690)
+++ /WAeUP_SRP/trunk/profiles/unilorin/skins.xml	(revision 3690)
@@ -0,0 +1,188 @@
+<?xml version="1.0"?>
+<object name="portal_skins" meta_type="CMF Skins Tool" allow_any="False"
+   cookie_persistence="False"
+   request_varname="portal_skin"
+   default_skin="CPSSkins">
+ <object name="Images" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/Images"/>
+ <object name="cmf_calendar" meta_type="Filesystem Directory View"
+    directory="CMFCalendar/skins/calendar"/>
+ <object name="cmf_zpt_calendar" meta_type="Filesystem Directory View"
+    directory="CMFCalendar/skins/zpt_calendar"/>
+ <object name="content" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/content"/>
+ <object name="control" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/control"/>
+ <object name="cps_default" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_default"/>
+ <object name="cps_devel" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_devel"/>
+ <object name="cps_directory" meta_type="Filesystem Directory View"
+    directory="CPSDirectory/skins/cps_directory"/>
+ <object name="cps_document" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document"/>
+ <object name="cps_document_images" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document_images"/>
+ <object name="cps_document_js" meta_type="Filesystem Directory View"
+    directory="CPSDocument/skins/cps_document_js"/>
+ <object name="cps_images" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_images"/>
+ <object name="cps_javascript" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_javascript"/>
+ <object name="cps_jscalendar" meta_type="Filesystem Directory View"
+    directory="CPSSchemas/skins/cps_jscalendar"/>
+ <object name="cps_nuxeo_style" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_styles/nuxeo"/>
+ <object name="cpsportlets_default" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_default"/>
+ <object name="cpsportlets_layouts" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_layouts"/>
+ <object name="cpsportlets_schemas" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_schemas"/>
+ <object name="cpsportlets_types" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_vocabularies"/>
+ <object name="cpsportlets_vocabularies" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_types"/>
+ <object name="cpsportlets_widgets" meta_type="Filesystem Directory View"
+    directory="CPSPortlets/skins/cpsportlets_widgets"/>
+ <object name="cps_schemas" meta_type="Filesystem Directory View"
+    directory="CPSSchemas/skins/cps_schemas"/>
+ <object name="cps_styles" meta_type="Filesystem Directory View"
+    directory="CPSDefault/skins/cps_styles"/>
+ <object name="cpsnavigation_default" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_default"/>
+ <object name="cpsnavigation_devel" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_devel"/>
+ <object name="cpsnavigation_images" meta_type="Filesystem Directory View"
+    directory="CPSNavigation/skins/cpsnavigation_images"/>
+ <object name="CPSSkins" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/CPSSkins"/>
+ <object name="cpsskins_cmf" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cmf"/>
+ <object name="cpsskins_cps3" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cps3"/>
+ <object name="cpsskins_cps3_macroless" meta_type="Filesystem Directory View"
+    directory="CPSSkins/skins/cpsskins_cps3_macroless"/>
+ <object name="cpsskins_icons" meta_type="Filesystem Directory View"
+    directory="CPSSkins/icons"/>
+ <object name="custom" meta_type="Folder"/>
+ <object name="fckeditor" meta_type="Filesystem Directory View"
+    directory="FCKeditor/skins/fckeditor"/>
+ <object name="generic" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/generic"/>
+ <object name="mimetypes_icons" meta_type="Filesystem Directory View"
+    directory="PortalTransforms/skins/mimetypes_icons"/>
+ <object name="no_css" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/no_css"/>
+ <object name="nouvelle" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/nouvelle"/>
+ <object name="scriptaculous" meta_type="Filesystem Directory View"
+    directory="CPSUtil/skins/scriptaculous"/>
+ <object name="topic" meta_type="Filesystem Directory View"
+    directory="CMFTopic/skins/topic"/>
+ <object name="zpt_content" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_content"/>
+ <object name="zpt_control" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_control"/>
+ <object name="zpt_generic" meta_type="Filesystem Directory View"
+    directory="CMFDefault/skins/zpt_generic"/>
+ <object name="zpt_topic" meta_type="Filesystem Directory View"
+    directory="CMFTopic/skins/zpt_topic"/>
+    
+    
+ <object name="cps_custom" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/cps_custom"/>
+ <object name="waeup_statistics" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_statistics"/>
+ <object name="waeup_layout" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_layout"/>    
+ <object name="waeup_custom" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_custom"/>
+ <object name="waeup_default" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_default"/>
+ <object name="waeup_design" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_design"/>
+ <object name="waeup_images" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_images"/>
+ <object name="waeup_directory" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_directory"/>
+ <object name="waeup_epayment" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_epayment"/>
+ <object name="waeup_academics" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_academics"/>
+ <object name="waeup_accommodation" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_accommodation"/>
+ <object name="waeup_pins" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_pins"/>
+ <object name="waeup_student" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_student"/>
+ <object name="waeup_utilities" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_utilities"/>
+ <object name="waeup_documents" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_documents"/>
+ <object name="waeup_upload" meta_type="Filesystem Directory View"
+    directory="WAeUP_SRP/skins/waeup_upload"/>    
+    
+    
+ <skin-path name="CPSSkins">
+  <layer name="custom" insert-before="*"/>
+  <layer name="CPSSkins"/>
+  <layer name="cpsskins_icons"/>
+  <layer name="cpsskins_cps3_macroless"/>
+  <layer name="cpsskins_cps3"/>
+  <layer name="cpsskins_cmf"/>
+  <layer name="cpsportlets_schemas" insert-after="custom"/>
+  <layer name="cpsportlets_vocabularies" insert-after="custom"/>
+  <layer name="cpsportlets_layouts" insert-after="custom"/>
+  <layer name="cpsportlets_widgets" insert-after="custom"/>
+  <layer name="cpsportlets_default" insert-after="custom"/>
+  <layer name="cpsportlets_types" insert-after="custom"/>
+  <layer name="cpsnavigation_images"/>
+  <layer name="cpsnavigation_default"/>
+  <layer name="cpsnavigation_devel"/>
+  <layer name="cps_directory"/>
+  <layer name="mimetypes_icons"/>
+  <layer name="cps_jscalendar"/>
+  <layer name="cps_schemas"/>
+  <layer name="cps_document"/>
+  <layer name="cps_document_js"/>
+  <layer name="cps_document_images"/>
+  <layer name="fckeditor"/>
+  <layer name="scriptaculous"/>
+  <layer name="cps_javascript"/>
+  <layer name="cps_default"/>
+  <layer name="cps_images"/>
+  <layer name="cmf_calendar"/>
+  <layer name="cps_styles"/>
+  <layer name="cps_nuxeo_style"/>
+  <layer name="cmf_zpt_calendar"/>
+  <layer name="cps_devel"/>
+  <layer name="zpt_topic"/>
+  <layer name="zpt_content"/>
+  <layer name="zpt_generic"/>
+  <layer name="zpt_control"/>
+  <layer name="Images"/> 
+ 
+  <layer name="waeup_unilorin" insert-after="custom"/>
+  <layer name="cps_custom" insert-after="waeup_custom"/>
+  <layer name="waeup_statistics" insert-after="waeup_custom"/>
+  <layer name="waeup_default" insert-after="waeup_custom"/>
+  <layer name="waeup_directory" insert-after="waeup_custom"/>
+  <layer name="waeup_epayment" insert-after="waeup_custom"/>
+  <layer name="waeup_pins" insert-after="waeup_custom"/>
+  <layer name="waeup_student" insert-after="waeup_custom"/>
+  <layer name="waeup_academics" insert-after="waeup_custom"/>
+  <layer name="waeup_documents" insert-after="waeup_custom"/>
+  <layer name="waeup_upload" insert-after="waeup_custom"/>
+  <layer name="waeup_accommodation" insert-after="waeup_custom"/>
+  <layer name="waeup_utilities" insert-after="waeup_custom"/>
+  <layer name="waeup_images" insert-after="waeup_custom"/>
+  <layer name="waeup_layout" insert-after="waeup_custom"/>
+  <layer name="waeup_design" insert-after="waeup_custom"/>
+  <layer name="CPSSkins" remove="" />
+  <layer name="cpsskins_icons" remove="" />
+  <layer name="cpsskins_cps3" remove="" />
+  <layer name="cpsskins_cmf" remove="" />
+ </skin-path>
+
+</object>
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/apply_admission_manage_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/apply_admission_manage_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/apply_admission_manage_form.pt	(revision 3690)
@@ -0,0 +1,94 @@
+<tal:block define="rendered_main options/rendered|nothing;
+           portal_status_message options/psm|nothing;
+           reg_no options/reg_no|nothing;
+           ds options/ds|nothing;
+           "
+           >	
+  <metal:block define-macro="edit_form">
+    <metal:block use-macro="here/main_template/macros/master">
+      <metal:block fill-slot="main">
+
+        <form action="" id="editForm" method="post" 
+              enctype="multipart/form-data" class="workflow"
+              tal:attributes="action string:${context/absolute_url}/apply_admission_manage"
+              >
+
+          <span tal:condition="not: rendered_main">
+            <h3>Application Process</h3>
+            <br />
+            
+            <table tal:define="info_applicants context/getApplicantsStatistics">
+            <tr> 
+              <td>PCE Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_pce" /></td>  
+            </tr>
+            <tr> 
+              <td>Pre-NCE Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_prence" /></td>
+            </tr>
+            <tr> 
+              <td>All Applicants (status admitted):</td> 
+              <td><span tal:replace="info_applicants/admitted" /></td>  
+            </tr>
+            <tr> 
+              <td>All Applicants (status student record created):</td> 
+              <td><span tal:replace="info_applicants/created" /></td>
+            </tr>            
+            <tr> 
+              <td>All Applicants (status not admitted):</td> 
+              <td><span tal:replace="info_applicants/not_admitted" /></td>  
+            </tr>    
+            </table>            
+            
+            <br/>
+            
+            <div class="label">Registration No:</div>
+            <input type="text" name="reg_no" size="15"
+                   />
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search" 
+                   />
+          </span>
+
+          <span tal:condition="rendered_main">
+            <h3>Application Record <span tal:replace="reg_no"/></h3>
+            <br />
+            <div tal:replace="structure rendered_main" />
+                        
+            <input type="hidden" name="reg_no"
+                   tal:attributes="value reg_no|nothing"
+                   />
+            <input type="submit" class="standalone" 
+                   name="reset"
+                   value="Reset" 
+                   tal:condition="python: ds['status'] and 'submitted' in ds['status']"
+                   />
+                   
+                   
+            <input type="submit" class="standalone" 
+                   name="edit"
+                   value="Save" 
+                   />                   
+                   
+            <br /><br />
+            
+
+            <div class="label">Registration No:</div>
+            <input type="text" name="new_reg_no" size="15"
+                   /> &nbsp;
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search next" 
+                   />
+          </span>
+        </form>
+        
+        <br/>
+        
+      
+        
+      </metal:block>
+    </metal:block>
+  </metal:block>
+</tal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/getAccommodationInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/getAccommodationInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/getAccommodationInfo.py	(revision 3690)
@@ -0,0 +1,108 @@
+## Script (Python) "getAccommodationInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_id=None
+##title=
+##
+# $Id: getAccommodationInfo.py 1726 2007-05-02 06:21:50Z henrik $
+"""
+return Info about the current Student
+"""
+import logging
+logger = logging.getLogger('Skins.getAccommodationInfo')
+import DateTime
+
+request = context.REQUEST
+mtool = context.portal_membership
+wf = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+path_info = request.get('PATH_INFO').split('/')
+
+if mtool.isAnonymousUser():
+    return None
+info = {}
+if student_id is None:
+    requested_id = context.getStudentId()
+    if requested_id and not context.isStaff() and member_id != requested_id:
+        logger.info('%s tried to access %s' % (member_id,requested_id))
+        return None
+    elif context.isStaff():
+        student_id = requested_id
+    else:
+        student_id = member_id
+student_record = context.students_catalog.getRecordByKey(student_id)
+if student_record is None:
+    logger.info('%s not found in students_catalog' % student_id)
+    return None
+
+info['error'] = None
+info['matric_no']=student_record.matric_no
+info['jamb_reg_no']=student_record.jamb_reg_no
+info['name']=student_record.name
+info['email']=student_record.email
+info['level']=student_record.level
+info['verdict']=getattr(student_record,'verdict','')
+review_state = info['review_state'] = student_record.review_state
+info['session'] = session = context.getSessionId()
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['student_id'] = student_id
+info['student'] = student
+
+booking_allowed = False
+
+# customize from here
+
+try:
+    level = int(student_record.level)
+except:
+    logger.info('%s has invalid level %s' % (student_id,student_record.level))
+    info['acco'] = None
+    info['booking_allowed'] = False
+    info['student_status'] = ''
+    return info    
+
+if review_state in ('school_fee_paid','courses_registered', 'courses_validated',) and student_record.session == session[0]:
+    info['booking_allowed'] = True
+    info['online_payment'] = True
+else:
+    info['acco'] = None
+    info['booking_allowed'] = False
+    info['student_status'] = ''
+    return info
+
+acco_id = 'accommodation_' + session[0]
+acco = getattr(student,acco_id,None)
+info['acco'] = acco
+info['acco_id'] = acco_id
+
+info['maintenance_paid'] = False
+if acco is not None:
+    info['acco_doc'] = acco.getContent()
+    info['acco_review_state'] = wf.getInfoFor(acco,'review_state',None)
+    info['maintenance_paid'] = info['acco_review_state'] == "maintenance_fee_paid"
+d = {}
+if level >= 300:
+   bt = 'fi'
+if level == 100:
+    bt = 'fr'
+elif level < 100:
+    bt = 'pr'    
+elif level < 300:
+    bt = 're'
+
+d['sex'] = 'male'
+if student_record.sex:
+    d['sex'] = 'female'
+
+
+info['sex']=d['sex']
+d['bt'] = bt
+student_status = "%(sex)s_%(bt)s" % d
+info['student_status'] = student_status
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/getApplicantsStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/getApplicantsStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/getApplicantsStatistics.py	(revision 3690)
@@ -0,0 +1,39 @@
+## Script (Python) "getApplicantsStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getApplicantsStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getApplicantsStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return 'Not allowed'
+
+
+info = {}
+res_submitted_pce = context.applicants_catalog(status = 'submitted', screening_type = 'pce')
+res_not_admitted = context.applicants_catalog(status = 'not admitted')
+res_submitted_prence = context.applicants_catalog(status = 'submitted', screening_type = 'prence')
+res_admitted = context.applicants_catalog(status = 'admitted')
+res_created = context.applicants_catalog(status = 'created')
+
+info['submitted_pce'] = len(res_submitted_pce)
+info['admitted'] = len(res_admitted)
+info['not_admitted'] = len(res_not_admitted)
+info['submitted_prence'] = len(res_submitted_prence)
+info['created'] = len(res_created)
+
+return info
+
+
+
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/getCosCombinedVoc.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/getCosCombinedVoc.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/getCosCombinedVoc.py	(revision 3690)
@@ -0,0 +1,17 @@
+##parameters=key=None
+# $Id: getCosCombinedVoc.py 2814 2007-11-28 12:26:51Z henrik $
+"""
+Return the combined courses as an vocabulary
+
+"""
+if key is None:
+    l = []
+    for k,v in context.portal_vocabularies.cos.items():
+        l += (k,v),
+    return l
+for voc in (context.portal_vocabularies.cos,):
+    title = voc.get(key,None)
+    if title is not None:
+        return title
+    else:
+        raise KeyError
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/getInterswitchParams.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/getInterswitchParams.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/getInterswitchParams.py	(revision 3690)
@@ -0,0 +1,40 @@
+## Script (Python) "getInterswitchParams"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=paytype,student,payment_id,student_record
+##title=
+##
+# $Id: getInterswitchParams.py 3626 2008-08-17 08:07:34Z henrik $
+
+test = ""
+d = {}
+d['payment_possible'] = True
+d['pay_ship_to'] = "Federal College Okene"
+
+d['site_id'] = '83'
+d['site_name'] = "fceokene.waeup.org"
+d['currency_id'] = '566'
+d['type'] = 'online'
+d['status'] = 'started'
+d['surcharge'] = '150'
+if test == 'simulate':
+    d['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),payment_id) #do not use simulate_callback
+elif test == 'test':
+    d['action'] = "https://webpay.interswitchng.com/test_paydirect/webpay/pay.aspx"
+else:
+    d['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+if paytype in ("HOM",):
+    d['callback_function'] = 'interswitch_cb'
+    d['pay_item_id'] = '8300'
+    d['type_description'] = 'Hostel Maintenance Fee'
+    d['pay_item_name'] = "FCE Okene %(type_description)s" % d
+    d['amount'] = '4000'
+    d['category'] = 'hostel_maintenance'
+    d['item'] = paytype
+    #d['payment_params'] = 'switch_college_split'
+    d['payment_params'] = '0'
+
+return d
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/getNextInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/getNextInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/getNextInfo.py	(revision 3690)
@@ -0,0 +1,62 @@
+## Script (Python) "getNextInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_brain
+##title=
+##
+# $Id: getNextInfo.py 2678 2007-11-16 13:41:44Z henrik $
+"""
+return the students next info
+"""
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+info = {}
+
+reasons = ''
+
+session_id = student_brain.session
+level_id = student_brain.level
+review_state = student_brain.review_state
+verdict = student_brain.verdict
+
+has_verdict = verdict and verdict != 'N/A'
+has_session = session_id and session_id != 'N/A'
+has_level = level_id and level_id != 'N/A'
+
+info['next_transition'] = None
+info['next_session_id'] = next_session_id = session_id
+info['next_level_id'] = next_level_id = level_id
+info['next_verdict'] = verdict
+info['next_previous_verdict'] = ''
+verdicts_voc = context.portal_vocabularies.verdicts
+if review_state == 'cleared_and_validated':
+    info['next_transition'] = "pay_school_fee"
+    info['next_verdict'] = ''
+elif review_state == 'returning' and has_verdict and has_level and has_session:
+    info['next_session_id'] = next_session_id = "%02d" % (int(session_id)+1)
+    if int(session_id) > 4:
+        info['next_transition'] = "pay_school_fee"
+        info['next_verdict'] = ''
+        info['next_previous_verdict'] = verdict
+        if verdict in ('A','B','G','C','Z',):                                     #customized
+            info['next_level_id'] = "%s" % (int(level_id) + 100)
+        #elif verdict == 'C':
+        #    info['next_level_id'] = "%s" % (int(level_id) + 10)
+        else:
+            info['next_level_id'] = level_id
+    else:
+        info['next_level_id'] = "%s" % (int(level_id) + 100)
+elif review_state == 'returning' and not (has_session and has_level and has_verdict):
+    reasons = "Your data record is incomplete. School fee payment has been disabled, please contact your faculty!"
+
+info['reasons'] = reasons
+info['next_session_str'] = context.getSessionsVoc(next_session_id)
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/getPaymentsFolderInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/getPaymentsFolderInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/getPaymentsFolderInfo.py	(revision 3690)
@@ -0,0 +1,131 @@
+## Script (Python) "getPaymentsFolderInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getPaymentsFolderInfo.py 2480 2007-10-30 15:23:25Z joachim $
+"""
+Info for the PaymentsFolder
+"""
+from Products.AdvancedQuery import Eq, Between, Le,In
+
+mtool = context.portal_membership
+wftool = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+payments_catalog = context.payments_catalog
+aq_payments = payments_catalog.evalAdvancedQuery
+if mtool.isAnonymousUser():
+    return None
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+def cmp_id(a,b):
+    s1 = "%(id)s" % a
+    s2 = "%(id)s" % b
+    if s1 == s2:
+        return 0
+    if s1 > s2:
+        return 1
+    return -1
+
+import DateTime
+request = context.REQUEST
+#students = context.portal_url.getPortalObject().campus.students
+student_id = context.getStudentId()
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+#student = getattr(students,student_id)
+student_record = context.students_catalog.getRecordByKey(student_id)
+
+
+info = {}
+is_so = info['is_so'] = context.isSectionOfficer()
+is_student = info['is_student'] = context.isStudent()
+info['student_name'] = student_record.name
+info['query_url'] = "https://webpay.interswitchng.com/paydirect/services/TransactionQueryURL.aspx"
+review_state = info['review_state'] = student_record.review_state
+parttime = student_record.mode and student_record.mode.endswith('_pt')
+fulltime = student_record.mode and student_record.mode.endswith('_ft')
+
+
+session = student_record.session
+next_info = context.getNextInfo(student_record)
+info['next_session'] = next_info['next_session_id']
+info['next_session_str'] = next_info['next_session_str']
+info['payment_method'] = ""
+info['reasons'] = next_info['reasons']
+
+# begin customization
+
+if review_state == 'cleared_and_validated':
+    info['payment_method'] = "online_payment"
+#elif review_state == 'cleared_and_validated' and session == '07':
+#    info['payment_method'] = "sc_payment"
+elif review_state == 'returning' and info['next_session'] != session:
+    info['payment_method'] = "online_payment"
+info['prod_id'] = '105'
+
+# end customization
+
+info['student_name'] = student_record.name
+payments_path = "%s/campus/students/%s/payments" % (context.portal_url(),student_id)
+payments = []
+payment_records = aq_payments(Eq('student_id',student_id)) # & Eq('session_id',student_record.session))
+vocabularies = context.portal_vocabularies
+paid_fees = []
+for payment in payment_records:
+    if payment.status == "paid":
+        paid_fees += "%s_%s" % (payment.category,payment.session_id),
+#info['pf'] = paid_fees
+for payment in payment_records:
+    row = {}
+    row['id'] = payment.key
+    if payment.status == 'invalid':
+        row['title'] = "Invalid Payment, Naira %s, %s" % (payment.amount,
+                                                          payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    else:
+        row['title'] = "%s for Session %s, Naira %s, %s" % (vocabularies.payment_categories.get(payment.category),
+                                                            vocabularies.sessions.get(payment.session_id),
+                                                            payment.amount,
+                                                            payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    oid = payment.order_id
+    onr = oid.rfind('-')+1
+    if onr > 0:
+        start_pos = onr
+    else:
+        start_pos = 6
+    url = row['url'] = "%s/p%s" % (payments_path,oid[start_pos:])
+    row['is_requeryable'] = "%s_%s" % (payment.category,payment.session_id) not in paid_fees and not payment.resp_desc and payment.type == 'online'# or str(member) in ('admin',)  # customized too
+    row['is_approvable'] = is_so and row['is_requeryable'] and payment.category == 'schoolfee' # does not make sense for maintenance
+    row['resp_desc'] = payment.resp_desc or 'Payment Process Interrupted'
+    row['trans_ref'] = payment.order_id
+    if row['is_requeryable']:
+        row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        if payment.category == 'schoolfee':
+#            row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        elif payment.category == 'hostel_maintenance':
+#            row['callback_url'] = "%(url)s/interswitch_acco_cb" % row
+#        else:
+        href = '%(query_url)s' % info
+        href += '?transRef=%(trans_ref)s' % row
+        href += '&prodID=%(prod_id)s' % info
+        href += '&redirectURL=%(callback_url)s' % row
+        row['href'] = href
+    if payment.status == 'paid':
+        row['confirmed'] = 'active'
+    else:
+        row['confirmed'] = 'unsuccessful'
+    row['is_editable'] = is_so and (row['confirmed'] == 'active')
+    payments.append(row)
+
+payments.sort(cmp_id)
+info['payments'] = payments
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/getSchoolFee.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/getSchoolFee.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/getSchoolFee.py	(revision 3690)
@@ -0,0 +1,54 @@
+## Script (Python) "getSchoolFee"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None
+##title=
+##
+# $Id: getSchoolFee.py 2534 2007-11-05 06:37:12Z henrik $
+"""
+return SchoolFee
+"""
+
+
+d = {}
+
+if brain.mode == 'ug_sw':  
+    if str(brain.level) == '100':    # both 100 fresh and 100 returning who register for 200
+        d['all'] = 35000
+    else:
+        d['all'] = 30000
+elif brain.mode == 'pg_sw':  
+    d['all'] = 35000
+elif brain.mode == 'dp_pt':  
+    if str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':    # only 100 fresh 
+        d['all'] = 40000
+    else:
+        d['all'] = 35000
+elif brain.mode == 'ug_pt':  
+    if str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':    # only 100 fresh 
+        d['all'] = 50000
+    else:
+        d['all'] = 45000
+elif brain.mode == 'pg_pt':  
+    if str(brain.level) == '600' and brain.review_state == 'cleared_and_validated':    # only 600 fresh 
+        d['all'] = 60000
+    elif str(brain.level) == '600' and brain.verdict == 'C':                           # 600 repeaters
+        d['all'] = 55000
+    elif str(brain.level) == '600':                                                    # going to register for 700
+        d['all'] = 75000        
+    else:
+        d['all'] = 65000
+else:
+    d['all'] = 0
+
+
+next_info = context.getNextInfo(brain)
+next_session_str = next_info['next_session_str']
+d['next_session_id'] = next_info['next_session_id']
+d['description'] = "School Fee for Session %s" % next_session_str
+
+return d
+
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/getSimpleStudentStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/getSimpleStudentStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/getSimpleStudentStatistics.py	(revision 3690)
@@ -0,0 +1,137 @@
+## Script (Python) "getRetStudentStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getStudentStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getSimpleStudentStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return
+
+
+catA =      (      'school_fee_paid',
+                   'courses_registered',
+                   'courses_validated',
+                   )
+
+catB =      (      'courses_registered',
+                   'courses_validated',
+                   )
+
+catC =      (      'student_created',
+                   'returning',
+                   'admitted',
+                   'clearance_pin_entered',
+                   'objection_raised',
+                   'clearance_requested',
+                   'cleared_and_validated',
+                   )
+
+current_session = context.getSessionId()[0]
+
+
+returning =  ('110','120','200','210','220','300','310','320','400','410','420','500','510', '520','500','510','520','610','620','700','710','720','800','810','820',)
+new =        ('100','600')
+
+
+faculties = context.portal_catalog(portal_type="Faculty")
+
+l = []
+
+fac_res = {}
+
+dict = {}
+dict['id'] = 'All Faculties'
+dict['title'] = 'All Faculties'
+
+
+res_ft = context.students_catalog(level = returning)
+dict['total_ft'] = len(res_ft)
+
+res_pt = context.students_catalog(level = new)
+dict['total_pt'] = len(res_pt)
+
+res_Aft = context.students_catalog(review_state = catA, level = returning, session = current_session)
+dict['total_Aft'] = len(res_Aft)
+
+res_Apt = context.students_catalog(review_state = catA, level = new, session = current_session)
+dict['total_Apt'] = len(res_Apt)
+
+
+
+res_Bft = context.students_catalog(review_state = catB, level = returning, session = current_session)
+dict['total_Bft'] = len(res_Bft)
+
+res_Bpt = context.students_catalog(review_state = catB, level = new, session = current_session)
+dict['total_Bpt'] = len(res_Bpt)
+
+
+
+res_Cft = context.students_catalog(review_state = catC, level = returning, session = current_session)
+dict['total_Cft'] = len(res_Cft)
+
+res_Cpt = context.students_catalog(review_state = catC, level = new, session = current_session)
+dict['total_Cpt'] = len(res_Cpt)
+
+
+
+
+res_total = context.students_catalog()
+dict['total_in_catalog'] = len(res_total)
+dict['not_categorized'] = dict['total_in_catalog'] - dict['total_ft'] - dict['total_pt']
+
+l.append(dict)
+
+
+for f in faculties:
+    dict = {}
+    dict['id'] = f.getId
+    dict['title'] = f.Title
+
+    res_ft = context.students_catalog(faculty = f.getId, level = returning)
+    dict['total_ft'] = len(res_ft)
+
+    res_pt = context.students_catalog(faculty = f.getId, level = new)
+    dict['total_pt'] = len(res_pt)
+
+
+    res_Aft = context.students_catalog(faculty = f.getId, review_state = catA, level = returning, session = current_session)
+    dict['total_Aft'] = len(res_Aft)
+
+    res_Apt = context.students_catalog(faculty = f.getId, review_state = catA, level = new, session = current_session)
+    dict['total_Apt'] = len(res_Apt)
+
+
+
+    res_Bft = context.students_catalog(faculty = f.getId, review_state = catB, level = returning, session = current_session)
+    dict['total_Bft'] = len(res_Bft)
+
+    res_Bpt = context.students_catalog(faculty = f.getId, review_state = catB, level = new, session = current_session)
+    dict['total_Bpt'] = len(res_Bpt)
+
+
+
+    res_Cft = context.students_catalog(faculty = f.getId, review_state = catC, level = returning, session = current_session)
+    dict['total_Cft'] = len(res_Cft)
+
+    res_Cpt = context.students_catalog(faculty = f.getId, review_state = catC, level = new, session = current_session)
+    dict['total_Cpt'] = len(res_Cpt)
+
+
+
+
+    l.append(dict)
+
+return l
+
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/getStudyLevelInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/getStudyLevelInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/getStudyLevelInfo.py	(revision 3690)
@@ -0,0 +1,120 @@
+## Script (Python) "getStudyLevelInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student=None
+##title=
+##
+# $Id: getStudyLevelInfo.py 2760 2007-11-26 07:39:15Z henrik $
+"""
+return Info about the Studylevel
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+"""
+
+info = context.waeup_tool.getAccessInfo(context)
+student_id = info['student_id']
+if student_id is None:
+    return None
+
+mtool = context.portal_membership
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+
+course_results = context.course_results
+request = context.REQUEST
+response = request.RESPONSE
+import logging
+logger = logging.getLogger('Skins.getStudyLevelInfo')
+
+level_id  =  context.getId()
+level_doc = info['doc'] = context.getContent()
+
+info['is_so'] = is_so = info['is_sectionofficer']
+#info['is_student'] = is_student = context.isStudent()
+info['is_ca'] = is_ca = context.isCourseAdviser()
+#info['student'] = student = context.students_catalog(id=student_id)[0]
+info['student'] = student = context.students_catalog.getRecordByKey(student_id)
+info['review_state'] = review_state = student.review_state
+is_current_level = level_id == student.level
+school_fee_paid =  review_state == 'school_fee_paid'
+info['is_current_level'] = is_current_level
+info['has_verdict'] = has_verdict = level_doc.verdict
+
+info['submission_allowed']= school_fee_paid and is_current_level and not has_verdict
+info['validation_allowed']= review_state == 'courses_registered' and is_current_level
+info['rejection_allowed']= review_state in ('courses_registered', 'courses_validated',) and is_current_level
+info['validated'] = review_state == 'courses_validated' and is_current_level
+
+info['show_check_boxes'] =  (is_ca and school_fee_paid and is_current_level and not has_verdict) or\
+                            (info['is_student'] and school_fee_paid and is_current_level and not has_verdict) or\
+                            (is_so and is_current_level and not has_verdict)
+
+info['verdict'] = context.portal_vocabularies.verdicts.get(level_doc.verdict).upper()
+info['session'] = context.portal_vocabularies.sessions.get(level_doc.session)
+info['level_str'] = context.portal_vocabularies.student_levels.get(level_id)
+
+info['choosen_ids'] = request.get('ids',[])
+
+#info['status_info'] = ""
+#if is_student:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Request for course validation pending"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+#elif is_ca:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Please validate these courses"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+
+cert_id = student.course
+info['cert_id'] = cert_id
+total_credits,gpa,carry_overs,normal1,normal2,normal3 = course_results.getCourses(student_id,level_id)
+info['total_credits'] = total_credits
+
+#start customization
+
+max_credits = 58
+info['without_score'] = False
+info['without_cascore'] = True
+
+
+
+
+
+
+
+
+
+#end customization
+
+info['max_credits'] = max_credits
+info['credits_exceeded'] = total_credits > max_credits
+current_session = student.session
+
+info['gpa'] = gpa
+if gpa and total_credits:
+    info['gpa'] = "%4.2f" % (float(gpa)/int(total_credits))
+
+# carry_overs.sort(cmp_semester_id)
+info['carry_overs'] = carry_overs
+# normal.sort(cmp_semester_id)
+info['normal1'] = normal1
+info['normal2'] = normal2
+info['normal3'] = normal3
+
+info['data_missing'] = not info['normal1'] and not info['normal2'] and not info['normal3']
+info['spillover'] = student.level > student.end_level
+
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['app'] = student.application
+info['app_doc'] = student.application.getContent()
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/goto_interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/goto_interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/goto_interswitch_form.pt	(revision 3690)
@@ -0,0 +1,52 @@
+<metal:body use-macro="here/main_template/macros/master">
+    <metal:main fill-slot="main"
+                tal:define="info options/info">
+                
+        <h3>Authorize Online Payment! </h3>
+        <br />
+                
+      <form method="post" action="pay_online"
+            tal:attributes="action info/action ">
+      <span tal:repeat="arg python:info['args'].items()"
+            tal:omit-tag="">
+          <input type="hidden" tal:attributes="name python:arg[0];value python:arg[1]" />
+      </span>          
+      
+      <span tal:replace = "structure info/xml_data" /> 
+      
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+          <tr>
+            <td >
+            Surcharge:
+            </td>
+            <td> Naira <span tal:content="info/surcharge" /></td>
+          </tr>          
+      
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Proceed to Interswitch Payment Gateway" 
+               />
+      </form>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/interswitch_form.pt	(revision 3690)
@@ -0,0 +1,46 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="info options/info">
+    <h3>Confirm Your Payment Data! </h3>
+    <br />
+    <span tal:condition="not: info/payment_possible">
+      No payment information for your course available.
+    </span>
+    <span tal:condition="info/payment_possible">
+      <form method="post" action="pay_interswitch">
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+          <tr>
+            <td >
+            Surcharge:
+            </td>
+            <td> Naira <span tal:content="info/surcharge" /></td>
+          </tr>                  
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Confirm" 
+               />
+      </form>
+    </span>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/layout_student_acco_view_slip.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/layout_student_acco_view_slip.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/layout_student_acco_view_slip.pt	(revision 3690)
@@ -0,0 +1,34 @@
+<!-- a layout_lib macro -->
+<!-- $Id: layout_student_acco_view_slip.pt 1316 2007-01-17 18:05:49Z henrik $ -->
+<metal:block define-macro="default_view"
+  tal:define="layout options/layout;
+              dm options/datastructure/getDataModel;
+              widgets python:context.getRenderedWidgets(layout);
+              fields python:('bed',
+                              'acco_res_date',
+                                 'acco_maint_pay_id', 
+                                 'acco_maint_fee',
+                                 'acco_maint_date',
+                                 )"
+                                 >
+  <table width="" cellpadding="2" cellspacing="0" summary="Form layout">
+    <tr tal:repeat="field fields">
+      <tal:block tal:define="cell python: widgets[field]">
+        <tal:block define="widget cell/widget">
+          <div tal:attributes="class cell/widget_css_class|string:label;
+            id python:widget.getHtmlWidgetId()+'_widget';">
+            <td width="180px" valign="top">
+             <span class="dlabel"
+                    tal:condition="widget/label"
+                    tal:content="widget/label">label</span>:
+            </td>
+            <td> 
+               <span tal:condition="cell" tal:content="structure cell/widget_rendered"></span>
+               <span tal:condition="not:cell/widget_rendered"> none </span>
+            </td>
+          </div>
+        </tal:block>
+      </tal:block>
+    </tr>
+  </table>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/mail2admin.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/mail2admin.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/mail2admin.py	(revision 3690)
@@ -0,0 +1,44 @@
+## Script (Python) "mail2admin"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=fullname=None,regno=None,email=None,probtype=None,descr=None,commt=None
+##title=
+##
+# $Id: mail2admin.py 2334 2007-10-09 15:01:36Z henrik $
+
+mhost = context.MailHost
+prop = context.portal_properties
+
+d = {}
+d['fullname'] = fullname
+d['email'] = email
+d['email_from'] = prop.email_from_address
+d['regno'] = regno
+d['probtype'] = probtype
+d['descr'] = descr
+
+message = """
+From: %(fullname)s <%(email)s>
+To: %(email_from)s
+Cc: %(email)s
+Bcc: waeup@saoas.org
+Reply-To: %(email)s
+Subject: AAUA Contact
+
+Fullname: %(fullname)s
+Member ID: %(regno)s
+Problem Type: %(probtype)s
+Description: %(descr)s
+"""
+
+mhost.send(message % d)
+
+REQUEST = context.REQUEST
+RESPONSE = REQUEST.RESPONSE
+
+redirect_url = REQUEST.HTTP_REFERER
+redirect_url = '%s/?%s' % (redirect_url,'portal_status_message=Your message has been sent!')
+RESPONSE.redirect(redirect_url)
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/mail2student.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/mail2student.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/mail2student.py	(revision 3690)
@@ -0,0 +1,45 @@
+## Script (Python) "mail2student"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=co_name=None,co_email=None,student_email=None,probtype=None,commt=None, action=None
+##title=
+##
+# $Id: mail2admin.py 869 2006-11-15 13:46:49Z henrik $
+
+from urllib import urlencode
+
+mhost = context.MailHost
+prop = context.portal_properties
+REQUEST = context.REQUEST
+
+d = {}
+#d['co_name'] = co_name
+#d['co_email'] = co_email
+d['co_name'] = 'AAUA'
+d['co_email'] = prop.email_from_address
+d['student_email'] = student_email
+d['probtype'] = probtype
+d['commt'] = commt
+
+message = """
+From: %(co_name)s <%(co_email)s>
+To: %(student_email)s
+Cc: %(co_email)s
+Reply-To: %(co_email)s
+Subject: %(probtype)s
+%(commt)s
+"""
+
+mhost.send(message % d)
+
+args = {}
+psm = "Your message has been sent!"
+args['portal_status_message'] = psm
+if action:
+    url = context.absolute_url() + '/' + action + '?' + urlencode(args)
+else:
+    url = context.absolute_url() +'?' + urlencode(args)
+return REQUEST.RESPONSE.redirect(url)
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/main_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/main_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/main_template.pt	(revision 3690)
@@ -0,0 +1,217 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+  
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  base_url here/getBaseUrl;
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${here/getBaseUrl}${static_dir};
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  student_theme python:test(waeup_skin == 'WAeUP_Student',1,0);
+  navigation_slot python:test(student_theme,'student_navigation_slot','navigation_slot');
+  object_tabs python:test(student_theme,'student_object_slot','staff_object_slot');
+  
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}${waeup_skin}/render.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      
+     
+      <table summary="Logo Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0" 
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;"></td>
+            <td style="width: 170px; text-align: center; padding-top: 0.5em;">
+              <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo" />
+            </td>
+            <td padding=0.5em><h1>Adekunle Ajasin University<br />Akungba-Akoko, Ondo State, Nigeria</h1></td>
+            <td style="width: 20px;"></td>
+          </tr>
+        </tbody>
+      </table>
+
+      <table summary="Navigation Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="" valign="top">
+              <div id="navigation_slot" 
+                       style="padding: 0em 0em 1px; text-align: right;"
+                       class="fontColornavigation fontShapenavigation portalTabTabStyle cpsskinsHBox body">
+                 <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot=navigation_slot)"
+                  tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+              </div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+      </table>
+      
+      
+      <table summary="Main Table Block 1"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: center;"
+              valign="top">
+            <div id="portal_session" style="padding: 0.4em 0.4em 0.4em 0.3em;"
+                 class="colorBarAreaColor fontColordefaultnovisitedlinks fontShapeaverage shapeAreaShape9">
+                    <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='portal_session')"
+                               tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="text-align: left; padding: 0.2em 0.2em 0em;" class="colorBarColor" valign="top">
+            <metal:block define-slot="action_slot" />
+            <div id="object_tabs" class="fontColornavigation fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot=object_tabs)">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+            </div>
+          </td>
+          <td tal:condition="not:student_theme"
+              class="colorBarColor" valign="top" style="text-align: right;padding: 0.2em 0.2em 0em; width: 280px;">
+            <div id="status_slot" class="fontColordefaultfontcolors fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot='status_slot')">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="width: 20px;"
+              valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+  
+  
+  
+    <table summary="Main Table Block 2"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="" cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: left;"
+              class="colorBarColor fontColornavigation fontShapeaverage boxShapenavbox cpsskinsBox" valign="top">
+            <div id="staff_actions_slot" class="body" style="padding: 1.5em 0.5em 1.5em 0.5em;">
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='staff_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='global_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='student_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+
+              <span tal:condition="student_theme">
+              <div style="padding: 0em;">
+                <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_workflow')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>
+              </span>
+              
+              <div style="padding-top: 10px;">
+              <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_notice_slot')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>  
+
+
+            </div>
+          </td>
+          <td style="" class="shapeAreaShape5 colorBarAreaColor" valign="top">
+            <div style="padding: 0.5em; text-align: left;" class="fontColordefaultfontcolors fontShapeaverage">
+              <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+              <metal:block define-slot="header" />
+              <metal:block define-slot="main" />
+              <metal:block define-slot="sub" />
+            </div>
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+    
+    
+    <table summary="Copyright Info Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="padding: 0.2em; text-align: right;" valign="top">
+              <div class="fontColordefaultfontcolors fontShapeaverage">
+              Copyright WAeUP Group 2006-2008</div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+    </table>
+    </body>
+  </html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/no_booking_allowed.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/no_booking_allowed.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/no_booking_allowed.pt	(revision 3690)
@@ -0,0 +1,8 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+
+    <h3>You are not eligible to book accommodation!</h3>
+
+  </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/pay_interswitch.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/pay_interswitch.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/pay_interswitch.py	(revision 3690)
@@ -0,0 +1,167 @@
+## Script (Python) "pay_online"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: pay_interswitch.py 2619 2007-11-10 17:39:36Z henrik $
+"""
+pay online
+"""
+from urllib import urlencode
+import logging
+logger = logging.getLogger('Skins.pay_interswitch')
+import DateTime
+
+if context.portal_membership.isAnonymousUser():
+    return None
+
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+request = context.REQUEST
+wftool = context.portal_workflow
+students = context.portal_url.getPortalObject().campus.students
+
+
+student_id = context.getStudentId()
+student = getattr(students,student_id)
+
+student_record = context.students_catalog.getRecordByKey(student_id)
+#amount,description = context.getSchoolFee(student_record.faculty,student_record.session,student_record.course)
+info = {}
+info['student'] = student_record
+info['payment_possible'] = False
+info['amount'] = '0'
+info['bank'] = ''
+info['type_description'] = ''
+info['pay_bill_to'] = ''
+fee_dict = context.getSchoolFee(student_record)
+fulltime = student_record.mode.endswith('_ft')
+
+if not fee_dict:
+    return context.interswitch_form(info=info)
+
+info['site_id'] = '105'
+info['currency_id'] = '566'
+pay_item_id = "10500"
+
+#info['type_code'] = sbrain.course  #type_code is redundant and will be removed soon
+info['bank'] = ''
+info['payment_possible'] = True
+info['type_description'] = fee_dict['description']
+info['pay_bill_to'] = student_record.name
+info['student_id'] = student_id
+info['student_name'] = student_record.name
+info['type'] = 'online'
+info['status'] = 'started'
+info['session_id'] = fee_dict['next_session_id']
+info['item'] = student_record.course
+info['category'] = 'schoolfee'
+info['student_email'] = student_record.email
+now = DateTime.DateTime()
+info['date'] = now
+info['pay_ship_to'] = "Adekunle Ajasin University"
+timestamp = "%d" % int(now.timeTime()*1000)
+info['order_id'] = "%s%s" % (student_id[1:],timestamp)
+p_id = "p%s" % timestamp
+
+
+info['surcharge'] = interswitch_amount = '150'
+info['amount'] = amount = fee_dict['all']
+total_amount = 100*int(amount) + 100*int(interswitch_amount)
+
+
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+
+if True:
+    info['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+else:
+    #pass
+    #return None
+    info['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),p_id)
+
+
+if "payments" not in student.objectIds():
+    student.invokeFactory('PaymentsFolder','payments')
+    payments = getattr(student,'payments')
+    d = {}
+    d['Title'] = 'Payments'
+    payments.getContent().edit(mapping=d)
+    wftool.doActionFor(payments,'open')
+else:
+    payments = getattr(student,'payments')
+if request.has_key('epayment'):
+    return context.interswitch_form(info=info)
+
+
+payments.invokeFactory('Payment', p_id)
+payment = getattr(payments,p_id)
+wftool.doActionFor(payment,'open')
+d = {}
+d.update(info)
+payment.getContent().edit(mapping=d)
+
+
+info['callback_url'] = "%s/payments/%s/interswitch_cb?echo=%s" % (student.absolute_url(),
+                                                                  p_id,
+                                                                  p_id)
+
+logger.info('%(student_id)s initiated online school fee payment with order_id %(order_id)s and callback url %(callback_url)s' % info)
+payment_fields = (('product_id','site_id'),
+                  ('site_redirect_url','callback_url'),
+                  ('Currency','currency_id'),
+                  ('cust_id','student_id'),
+                  ('cust_id_desc','type_description'),
+                  ('cust_name','student_name'),
+                  ('txn_ref','order_id'),
+                  ('Amount','amount'),
+                  )
+args = {}
+for arg,field in payment_fields:
+    args[arg] = info[field]
+
+bt_amount = 4000
+
+aaua_amount = amount - bt_amount
+xmldict = {}
+xmldict['detail_ref'] = args['txn_ref']
+xmldict['department'] = student_record.department
+xmldict['faculty'] = student_record.faculty
+xmldict['aaua_amount'] = "%d" % int(100*aaua_amount)
+xmldict['bt_amount'] = "%d" % int(100*bt_amount)
+if student_record.mode.endswith('_pt'):
+    xmldict['aaua_acct'] = "0321100000000046"
+elif student_record.mode.endswith('_sw'):
+    xmldict['aaua_acct'] = "0321100000000056"
+else:
+    xmldict['aaua_acct'] = "0000000000000000"
+
+
+xmltext = """<payment_item_detail>
+<item_details detail_ref="%(detail_ref)s" college="AAUA" department="%(department)s" faculty="%(faculty)s">
+<item_detail item_id="1" item_name="AAUA" item_amt="%(aaua_amount)s" bank_id="89" acct_num="%(aaua_acct)s" />
+<item_detail item_id="2" item_name="BT" item_amt="%(bt_amount)s" bank_id="117" acct_num="6012015294" />
+</item_details>
+</payment_item_detail>""" % xmldict
+
+info['xml_data'] = """<input type="hidden" name="xml_data" value='%s'  />""" % xmltext
+
+args['Amount'] = "%d" % (total_amount)
+args['site_name'] = "aaua.waeup.org"
+args['cust_name_desc'] = "Student Name"
+args['pay_item_id'] = pay_item_id
+args['pay_item_name'] = "AAUA Tuition Payments"
+args['payment_params'] = 'college_split'
+#args['xml_data'] = ''
+#args['xml_data'] = xmltext   # info['xml_data']can be used instead
+info['args'] = args
+
+return context.goto_interswitch_form(info=info)
+
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/search_students_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/search_students_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/search_students_form.pt	(revision 3690)
@@ -0,0 +1,128 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="rendered options/rendered;
+              portal_status_message options/psm;
+              students options/students;
+              info options/info|nothing;
+              is_so context/isSectionOfficer;
+              allowed options/allowed|nothing;"
+              >
+    <span tal:condition="not: allowed">
+      <span tal:content="here/illegal_view" />
+    </span>
+    <span tal:condition="allowed" tal:omit-tag="">
+      <strong>
+        <nobr><a href="statistics_simple_view">Basic Student Statistics</a>
+        &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+        <span tal:condition="is_so">
+          <nobr><a href="apply_admission_manage">Application Process</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+          <nobr><a href="view_logs">View Log Files</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="add_student">Add Student Record</a>        
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="deactivate_students">Deactivate Student Record(s)</a></nobr>
+        </span>
+      </strong>
+      <h3> Search Student Section</h3><br />
+      You are logged in as member <span tal:replace="info/member|nothing" /> 
+      <span tal:condition="info/faculties|nothing" tal:omit-tag="">
+        who is ClearanceOfficer for Faculty 
+        <span tal:repeat="faculty info/faculties" tal:content="faculty" />
+      </span>
+      <span tal:condition="info/departments|nothing" tal:omit-tag="">
+        and <span tal:repeat="department info/departments|nothing" tal:content="department"/></span>.
+      <br /><br />
+      <span tal:replace="structure rendered" />
+      <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+      <span tal:condition="students">
+        <span tal:define="items students;
+        columns python:3;
+        items_per_page python:40;
+        max_items python:300;
+        zoom python:0;
+        batches_all python:here.getBatchList(items,columns, items_per_page,zoom,max_items=400);
+        batches python:batches_all[0];
+        batch_info python:batches_all[1];
+        zoomed python:batches_all[2];
+        mq nocall:modules/ZTUtils/make_query;"
+        tal:omit-tag="">
+          <tal:block tal:condition="python: items and batch_info and batch_info['nb_pages'] > 1">
+            <div class="batchLayout" i18n:translate="">
+              Objects:<strong><tal:block replace="batch_info/start"
+                                         i18n:name="batch_start" /> - <tal:block replace="batch_info/limit"
+                                                                                 i18n:name="batch_limit" />
+              </strong> of <tal:block replace="batch_info/length" i18n:name="batch_length" />
+            </div>
+            <br />
+          </tal:block>
+          <table class="contentListing" width="100%">
+            <span tal:repeat="rows batches" tal:omit-tag="">
+              <span tal:repeat="student rows">
+                <tr tal:condition="student" 
+                    tal:attributes="class python:test(repeat['student'].even(), 'even ajaxtd', 'odd ajaxtd')">
+                  <td><a href="id" tal:attributes="href string:${context/portal_url}/campus/students/${student/id}"
+                         tal:content="student/id"></a></td>    
+                  <td>
+                    <span tal:replace="student/name" />
+                  </td>    
+                  <td><span tal:replace="student/matric_no" /></td>   
+                  <td><span tal:replace="student/jamb_reg_no" /></td>
+                  <td tal:condition="options/co_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/clearance/external_clearance_edit_form"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and change state]</a></td>
+                  <td tal:condition="options/ca_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/study_course/${student/level}/external_study_level_view"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and validate course list]</a></td>
+                </tr>
+              </span>
+            </span>
+          </table>
+          <tal:block condition="python:batch_info and batch_info['nb_pages'] > 1">
+            <div class="pageNavigationLayout">
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=0))"
+                 >
+              (&lt;&lt;)</a>
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=previous))"
+                 i18n:translate="batch_previous">Previous</a>
+              <tal:block repeat="page batch_info/pages">
+                <tal:block condition="python:page != batch_info['start'] - 1">
+                  <a tal:attributes="href python:'%s?%s'%(request['URL'],
+                  mq(request.form, b_start=page))"
+                  tal:content="repeat/page/number">1</a>&nbsp;
+                </tal:block>
+                <tal:block condition="python:page == batch_info['start'] - 1">
+                  <span tal:content="string:${repeat/page/number}" />&nbsp;
+                </tal:block>
+              </tal:block>
+              <a tal:define="next batch_info/next"
+                 tal:condition="python:next is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=next))"
+                 i18n:translate="batch_next">Next</a>
+              <a tal:define="next batch_info/next;
+              last_page python:batch_info['pages'][-1]"
+              tal:condition="python:next is not None"
+              tal:attributes="href python:'%s?%s'%(request['URL'],
+              mq(request.form, b_start=last_page))"
+              >
+              (&gt;&gt;)</a>
+            </div>
+          </tal:block>
+        </span>
+      </span>
+    </span>
+  </metal:main>
+</metal:body>
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/slip_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/slip_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/slip_template.pt	(revision 3690)
@@ -0,0 +1,109 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  base_url here/getBaseUrl;
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${base_url}${static_dir};    
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+   
+    <table summary="Logo Block"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           class="shapeNoBorder colorTransparent" cellpadding="0"
+           cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td valign="top" style="width: 80px; padding: 0.5em; text-align: right;">
+            <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo"
+                     height="84"  />
+          </td>
+          <td style="padding: 1em 0em 0em 0em; text-align: left;" valign="top">
+             <h2>Adekunle Ajasin University<br />Akungba-Akoko, Ondo State, Nigeria</h2>
+          
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+      
+    <table summary="Main Block" cellpadding="0" cellspacing="0" 
+           style="margin-left:auto;margin-right:auto;width:100%;">
+      <tr>
+        <td valign="top" style="width:700px">
+          <div style="padding:2em; text-align: left;" 
+               class="fontColordefaultfontcolors fontShapeTitleindex shapeAreaShape">
+                  <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+                  <metal:block define-slot="header" />
+                  <metal:block define-slot="main" />
+                  <metal:block define-slot="sub" />
+          </div>
+        </td>
+      </tr>
+    </table>
+  </body>
+</html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/statistics_simple_view.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/statistics_simple_view.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/statistics_simple_view.pt	(revision 3690)
@@ -0,0 +1,125 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+  <metal:block tal:define="faculties context/getSimpleStudentStatistics;
+                        mtool here/portal_membership;
+                        member mtool/getAuthenticatedMember;
+                        session_str python:context.getSessionId()[1]">       
+
+      <span tal:condition="not: faculties">
+        <span tal:content="here/illegal_view" />
+      </span>
+      <span tal:condition="faculties">
+  
+      <strong>
+      <nobr><a href="search_students">Search Students</a>
+      &nbsp;&nbsp;&nbsp;&nbsp;</nobr>        
+   
+      </strong>     
+
+      <h3>Basic Student Statistics <span tal:content="session_str" /></h3>
+      <br />      
+      <span tal:condition="not:isAnon">
+      Student records imported: <span tal:content="python: faculties[0]['total_in_catalog']" />
+      <br />  <br />  
+        <table >  
+
+          <tr>
+            <th>&nbsp;</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">All Students</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">Category A</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">Category B</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">Category C</th>
+
+
+          </tr>
+
+          <tr class="odd ajaxtd">
+            <th >Faculty</th>
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+
+          </tr>
+          <tr tal:repeat="d faculties"
+              tal:attributes="class python:test(repeat['d'].even(), 'even ajaxtd', 'odd ajaxtd')">
+              <td width="80px"> <span tal:content="d/id" /> </td>
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_ft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_pt" />
+              </td>              
+
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Aft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Apt" />
+              </td>              
+
+     
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bpt" />
+              </td>              
+              
+   
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cft" />
+              </td>      
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cpt" />
+              </td>      
+              
+                                        
+
+                                       
+
+          </tr>
+        </table>
+
+        <br />
+        <table   border=0>
+
+        <tr><td>Category A: </td> <td>students who paid their school fee in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category B: </td> <td>students who registered their courses online (A contains B) in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category C: </td> <td>students who 'arrived' in <span tal:content="session_str" /> but have not yet paid their school fee</td></tr>
+        <tr><td>New: </td> <td>students in level 100 or 600</td></tr>
+        <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
+        <tr><td colspan="2"><strong>Remark:</strong> <span tal:content="python: faculties[0]['not_categorized']" /> returning students are not categorized.
+             </td>
+        </tr>
+          
+        </table>
+        
+        
+        
+      </span>
+      </span>
+  </metal:block>      
+  </metal:main>
+</metal:body>
+      
Index: /WAeUP_SRP/trunk/skins/waeup_aaua/student_index.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_aaua/student_index.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_aaua/student_index.py	(revision 3690)
@@ -0,0 +1,54 @@
+## Script (Python) "student_index"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=batch=None,portal_status_message=None
+##title=
+##
+# $Id: student_index.py 2297 2007-10-01 07:26:30Z henrik $
+"""
+return the current student_index
+"""
+
+request = context.REQUEST
+#session = request.SESSION
+response = request.RESPONSE
+redirect = response.redirect
+pm = context.portal_membership
+member = pm.getAuthenticatedMember()
+
+#from Products.zdb import set_trace;set_trace()
+if context.isStaff():
+    if context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.study_level_view()
+    elif context.portal_type == 'StudentClearance':
+        return context.clearance_view()
+    elif context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Student':
+        if portal_status_message:
+            return redirect("%s/student_view?portal_status_message=%s" % (context.absolute_url(),portal_status_message))
+        else:
+            return redirect("%s/student_view" % context.absolute_url())
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    return redirect("%s/waeup_document_view" % context.absolute_url())
+if context.isStudent():
+    if context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.study_level_view()
+    elif context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    students_url = "%s/campus/students" % (context.portal_url())
+    id = str(member)
+    return redirect("%s/%s/student_view" % (students_url, id))
+
+return redirect("%s/srp_anonymous_view" % context.portal_url())
+
Index: /WAeUP_SRP/trunk/skins/waeup_custom/apply_admission_manage_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/apply_admission_manage_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/apply_admission_manage_form.pt	(revision 3690)
@@ -0,0 +1,107 @@
+<tal:block define="rendered_main options/rendered|nothing;
+           portal_status_message options/psm|nothing;
+           reg_no options/reg_no|nothing;
+           serial options/ds/serial|nothing;
+           ccode options/ds/course1|nothing;
+           ds options/ds|nothing;
+           ">	
+  <metal:block define-macro="edit_form">
+    <metal:block use-macro="here/main_template/macros/master">
+      <metal:block fill-slot="main">
+
+        <form action="" id="editForm" method="post" 
+              enctype="multipart/form-data" class="workflow"
+              tal:attributes="action string:${context/absolute_url}/apply_admission_manage"
+              >
+
+          <span tal:condition="not: rendered_main">
+            <h3>Application Process</h3>
+            <br />
+            
+            <table tal:define="info_applicants context/getApplicantsStatistics">
+            <tr> 
+              <td>PUME Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_pume" /></td>  
+            </tr>
+            <tr> 
+              <td>PUDE Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_pde" /></td>
+            </tr>
+            <tr> 
+              <td>CEST Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_cest" /></td>
+            </tr>        
+            <tr> 
+              <td>Sandwich Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_sandwich" /></td>
+            </tr>                   
+            <tr> 
+              <td>All Applicants (status admitted):</td> 
+              <td><span tal:replace="info_applicants/admitted" /></td>  
+            </tr>
+            <tr> 
+              <td>All Applicants (status student record created):</td> 
+              <td><span tal:replace="info_applicants/created" /></td>
+            </tr>            
+            <tr> 
+              <td>All Applicants (status not admitted):</td> 
+              <td><span tal:replace="info_applicants/not_admitted" /></td>  
+            </tr>    
+            </table>            
+            
+            <br/>
+            
+            <div class="label">Registration No:</div>
+            <input type="text" name="reg_no" size="15"
+                   />
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search" 
+                   />
+          </span>
+
+        <span tal:condition="rendered_main">
+          <h3>Application Record <span tal:replace="reg_no"/> 
+            <tal:block condition="python: ds['screening_type'] == 'cest' and ccode">
+                (<span tal:replace="python:'%s%s/07' % (ccode[:3],serial)" />)
+            </tal:block>
+          </h3>
+            <br />
+            <div tal:replace="structure rendered_main" />
+                        
+            <input type="hidden" name="reg_no"
+                   tal:attributes="value reg_no|nothing"
+                   />
+            <input type="submit" class="standalone" 
+                   name="reset"
+                   value="Reset" 
+                   tal:condition="python: ds['status'] and 'submitted' in ds['status']"
+                   />
+                   
+                   
+            <input type="submit" class="standalone" 
+                   name="edit"
+                   value="Save" 
+                   />                   
+                   
+            <br /><br />
+            
+
+            <div class="label">Registration No:</div>
+            <input type="text" name="new_reg_no" size="15"
+                   /> &nbsp;
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search next" 
+                   />
+          </span>
+        </form>
+        
+        <br/>
+        
+
+        
+      </metal:block>
+    </metal:block>
+  </metal:block>
+</tal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_custom/getAccommodationInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/getAccommodationInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/getAccommodationInfo.py	(revision 3690)
@@ -0,0 +1,149 @@
+## Script (Python) "getAccommodationInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_id=None
+##title=
+##
+# $Id: getAccommodationInfo.py 1726 2007-05-02 06:21:50Z henrik $
+"""
+return Info about the current Student
+"""
+import logging
+logger = logging.getLogger('Skins.getAccommodationInfo')
+import DateTime
+
+request = context.REQUEST
+mtool = context.portal_membership
+wf = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+path_info = request.get('PATH_INFO').split('/')
+
+if mtool.isAnonymousUser():
+    return None
+info = {}
+if student_id is None:
+    requested_id = context.getStudentId()
+    if requested_id and not context.isStaff() and member_id != requested_id:
+        logger.info('%s tried to access %s' % (member_id,requested_id))
+        return None
+    elif context.isStaff():
+        student_id = requested_id
+    else:
+        student_id = member_id
+student_record = context.students_catalog.getRecordByKey(student_id)
+if student_record is None:
+    logger.info('%s not found in students_catalog' % student_id)
+    return None
+
+info['error'] = None
+info['matric_no']=student_record.matric_no
+info['jamb_reg_no']=student_record.jamb_reg_no
+info['name']=student_record.name
+info['email']=student_record.email
+info['level']=student_record.level
+info['verdict']=getattr(student_record,'verdict','')
+review_state = info['review_state'] = student_record.review_state
+info['session'] = session = context.getSessionId()
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['student_id'] = student_id
+info['student'] = student
+
+booking_allowed = False
+
+# customize from here
+
+ekehuan_certificates = ('BARTAPG',
+                        'BARTAPM',
+                        'BARTCER',
+                        'BARTFAA',
+                        'BARTFAP',
+                        'BARTSCP',
+                        'BARTTXT',
+                        'BARTMAS',
+                        'BARTTHR',
+                        )
+
+new_states = ('cleared_and_validated',
+              'school_fee_paid',
+              'courses_registered',
+              'courses_validated',
+              )
+
+new = student_record.entry_session == session[0]
+arrived = student_record.session == session[0]
+
+level = None
+end_level = None
+previous = None
+
+try:
+    level = int(student_record.level)
+except:
+    logger.info('%s has invalid level %s' % (student_id,student_record.level))
+try:
+    end_level = int(student_record.end_level)
+except:
+    logger.info('%s has invalid end_level %s' % (student_id,student_record.end_level))
+try:
+    previous = int(student_record.session) == int(session[0]) - 1
+except:
+    logger.info('%s has invalid session %s' % (student_id,student_record.session))
+
+if level is None or end_level is None or student_record.review_state == 'deactivated':
+    pass
+elif arrived:
+    if new:
+        booking_allowed = student_record.review_state in new_states
+    else:
+        booking_allowed = not (level % 100)
+elif previous:
+    booking_allowed = student_record.verdict in ('A','B',)
+
+info['booking_allowed'] = booking_allowed
+if not booking_allowed:
+    info['acco'] = None
+    info['student_status'] = ''
+    return info
+
+acco_id = 'accommodation_' + session[0]
+acco = getattr(student,acco_id,None)
+info['acco'] = acco
+info['acco_id'] = acco_id
+bt = 're'
+info['maintenance_paid'] = False
+if acco is not None:
+    info['acco_doc'] = acco.getContent()
+    info['acco_review_state'] = wf.getInfoFor(acco,'review_state',None)
+    info['maintenance_paid'] = info['acco_review_state'] == "maintenance_fee_paid"
+
+d = {}
+delta = 0
+if previous:
+    delta = 100
+if new:
+    bt = 'fr'
+elif level + delta < end_level:
+    bt = 're'
+else:
+    bt = 'fi'
+
+d['sex'] = 'male'
+if student_record.sex:
+    d['sex'] = 'female'
+if student_record.faculty in ('MED','DEN') and level > 400:
+    bt += "_med"
+elif student_record.course in ekehuan_certificates:
+    bt += "_ekenhuan"
+#elif student_record.course in pti_certificates:
+#    bt += "_pti"
+info['sex']=d['sex']
+d['bt'] = bt
+student_status = "%(sex)s_%(bt)s" % d
+info['student_status'] = student_status
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_custom/getApplicantsStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/getApplicantsStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/getApplicantsStatistics.py	(revision 3690)
@@ -0,0 +1,43 @@
+## Script (Python) "getApplicantsStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getApplicantsStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getApplicantsStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return 'Not allowed'
+
+
+info = {}
+res_submitted_pume = context.applicants_catalog(status = 'submitted', screening_type = 'pume')
+res_submitted_cest = context.applicants_catalog(status = 'submitted', screening_type = 'cest')
+res_submitted_sandwich = context.applicants_catalog(status = 'submitted', screening_type = 'sandwich')
+res_not_admitted = context.applicants_catalog(status = 'not admitted')
+res_submitted_pde = context.applicants_catalog(status = 'submitted', screening_type = 'pde')
+res_admitted = context.applicants_catalog(status = 'admitted')
+res_created = context.applicants_catalog(status = 'created')
+
+info['submitted_pume'] = len(res_submitted_pume)
+info['submitted_cest'] = len(res_submitted_cest)
+info['submitted_sandwich'] = len(res_submitted_sandwich)
+info['admitted'] = len(res_admitted)
+info['not_admitted'] = len(res_not_admitted)
+info['submitted_pde'] = len(res_submitted_pde)
+info['created'] = len(res_created)
+
+return info
+
+
+
Index: /WAeUP_SRP/trunk/skins/waeup_custom/getCosCombinedVoc.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/getCosCombinedVoc.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/getCosCombinedVoc.py	(revision 3690)
@@ -0,0 +1,21 @@
+##parameters=key=None
+# $Id: getCosCombinedVoc.py 2814 2007-11-28 12:26:51Z henrik $
+"""
+Return the combined courses as an vocabulary
+
+"""
+if key is None:
+    l = []
+    for k,v in context.portal_vocabularies.cos.items():
+        l += (k,v),
+    for k,v in context.portal_vocabularies.cos_cest.items():
+        if k:
+            l += (k,v),
+    return l
+for voc in (context.portal_vocabularies.cos,
+            context.portal_vocabularies.cos_cest,
+            context.portal_vocabularies.cos_sandwich):
+    title = voc.get(key,None)
+    if title is not None:
+        return title
+raise KeyError
Index: /WAeUP_SRP/trunk/skins/waeup_custom/getNextInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/getNextInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/getNextInfo.py	(revision 3690)
@@ -0,0 +1,62 @@
+## Script (Python) "getNextInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_brain
+##title=
+##
+# $Id: getNextInfo.py 2678 2007-11-16 13:41:44Z henrik $
+"""
+return the students next info
+"""
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+info = {}
+
+reasons = ''
+
+session_id = student_brain.session
+level_id = student_brain.level
+review_state = student_brain.review_state
+verdict = student_brain.verdict
+
+has_verdict = verdict and verdict != 'N/A'
+has_session = session_id and session_id != 'N/A'
+has_level = level_id and level_id != 'N/A'
+
+info['next_transition'] = None
+info['next_session_id'] = next_session_id = session_id
+info['next_level_id'] = next_level_id = level_id
+info['next_verdict'] = verdict
+info['next_previous_verdict'] = ''
+verdicts_voc = context.portal_vocabularies.verdicts
+if review_state == 'cleared_and_validated':
+    info['next_transition'] = "pay_school_fee"
+    info['next_verdict'] = ''
+elif review_state == 'returning' and has_verdict and has_level and has_session:
+    info['next_session_id'] = next_session_id = "%02d" % (int(session_id)+1)
+    if int(session_id) > 4:
+        info['next_transition'] = "pay_school_fee"
+        info['next_verdict'] = ''
+        info['next_previous_verdict'] = verdict
+        if verdict in ('A','B','M',):
+            info['next_level_id'] = "%s" % (divmod(int(level_id),100)[0]*100 + 100)
+        elif verdict == 'C':
+            info['next_level_id'] = "%s" % (int(level_id) + 10)
+        else:
+            info['next_level_id'] = level_id
+    else:
+        info['next_level_id'] = "%s" % (int(level_id) + 100)
+elif review_state == 'returning' and not (has_session and has_level and has_verdict):
+    reasons = "Your data record is incomplete. School fee payment has been disabled, please contact your faculty!"
+
+info['reasons'] = reasons
+info['next_session_str'] = context.getSessionsVoc(next_session_id)
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_custom/getPaymentsFolderInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/getPaymentsFolderInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/getPaymentsFolderInfo.py	(revision 3690)
@@ -0,0 +1,131 @@
+## Script (Python) "getPaymentsFolderInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getPaymentsFolderInfo.py 2761 2007-11-26 09:45:58Z henrik $
+"""
+Info for the PaymentsFolder
+"""
+from Products.AdvancedQuery import Eq, Between, Le,In
+
+mtool = context.portal_membership
+wftool = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+payments_catalog = context.payments_catalog
+aq_payments = payments_catalog.evalAdvancedQuery
+if mtool.isAnonymousUser():
+    return None
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+def cmp_id(a,b):
+    s1 = "%(id)s" % a
+    s2 = "%(id)s" % b
+    if s1 == s2:
+        return 0
+    if s1 > s2:
+        return 1
+    return -1
+
+import DateTime
+request = context.REQUEST
+#students = context.portal_url.getPortalObject().campus.students
+student_id = context.getStudentId()
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+#student = getattr(students,student_id)
+student_record = context.students_catalog.getRecordByKey(student_id)
+
+
+info = {}
+is_so = info['is_so'] = context.isSectionOfficer()
+is_student = info['is_student'] = context.isStudent()
+info['student_name'] = student_record.name
+info['query_url'] = "https://webpay.interswitchng.com/paydirect/services/TransactionQueryURL.aspx"
+review_state = info['review_state'] = student_record.review_state
+parttime = student_record.mode and student_record.mode.endswith('_pt')
+fulltime = student_record.mode and student_record.mode.endswith('_ft')
+
+
+session = student_record.session
+next_info = context.getNextInfo(student_record)
+info['next_session'] = next_info['next_session_id']
+info['next_session_str'] = next_info['next_session_str']
+info['payment_method'] = ""
+info['reasons'] = next_info['reasons']
+
+# begin customization
+
+if review_state == 'cleared_and_validated' and session != '07':
+    info['payment_method'] = "online_payment"
+elif review_state == 'cleared_and_validated' and session == '07':
+    info['payment_method'] = "sc_payment"
+elif review_state == 'returning' and info['next_session'] != session:
+    info['payment_method'] = "sc_payment"
+info['prod_id'] = '61'
+
+# end customization
+
+info['student_name'] = student_record.name
+payments_path = "%s/campus/students/%s/payments" % (context.portal_url(),student_id)
+payments = []
+payment_records = aq_payments(Eq('student_id',student_id)) # & Eq('session_id',student_record.session))
+vocabularies = context.portal_vocabularies
+paid_fees = []
+for payment in payment_records:
+    if payment.status == "paid":
+        paid_fees += "%s_%s" % (payment.category,payment.session_id),
+#info['pf'] = paid_fees
+for payment in payment_records:
+    row = {}
+    row['id'] = payment.key
+    if payment.status == 'invalid':
+        row['title'] = "Invalid Payment, Naira %s, %s" % (payment.amount,
+                                                          payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    else:
+        row['title'] = "%s for Session %s, Naira %s, %s" % (vocabularies.payment_categories.get(payment.category),
+                                                            vocabularies.sessions.get(payment.session_id),
+                                                            payment.amount,
+                                                            payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    oid = payment.order_id
+    onr = oid.rfind('-')+1
+    if onr > 0:
+        start_pos = onr
+    else:
+        start_pos = 6
+    url = row['url'] = "%s/p%s" % (payments_path,oid[start_pos:])
+    row['is_requeryable'] = "%s_%s" % (payment.category,payment.session_id) not in paid_fees and payment.type == 'online' or str(member) in ('admin',)
+    row['is_approvable'] = is_so and row['is_requeryable'] and payment.category == 'schoolfee' # does not make sense for maitenance
+    row['resp_desc'] = payment.resp_desc or 'Payment Process Interrupted'
+    row['trans_ref'] = payment.order_id
+    if row['is_requeryable']:
+        row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        if payment.category == 'schoolfee':
+#            row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        elif payment.category == 'hostel_maintenance':
+#            row['callback_url'] = "%(url)s/interswitch_acco_cb" % row
+#        else:
+        href = '%(query_url)s' % info
+        href += '?transRef=%(trans_ref)s' % row
+        href += '&prodID=%(prod_id)s' % info
+        href += '&redirectURL=%(callback_url)s' % row
+        row['href'] = href
+    if payment.status == 'paid':
+        row['confirmed'] = 'active'
+    else:
+        row['confirmed'] = 'unsuccessful'
+    row['is_editable'] = is_so and (row['confirmed'] == 'active')
+    payments.append(row)
+
+payments.sort(cmp_id)
+info['payments'] = payments
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_custom/getSchoolFee.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/getSchoolFee.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/getSchoolFee.py	(revision 3690)
@@ -0,0 +1,127 @@
+## Script (Python) "getSchoolFee"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None
+##title=
+##
+# $Id: getSchoolFee.py 2797 2007-11-27 20:48:00Z henrik $
+"""
+return SchoolFee
+"""
+
+fee1 = ("ART",
+        "SSC",
+        "LAW",
+        "EDU",
+        )
+session_fees = {'99': ('22200','23700'),
+                '00': ('22200','23700'),
+                '01': ('22200','23700'),
+                '02': ('22200','23700'),
+                '03': ('22200','23700'),
+                '04': ('22200','23700'),
+                '05': ('22200','23700'),
+                '06': ('22200','23700'),
+                '07': ('22200','23700'),
+                }
+pt_fees = {
+            "DIF":{'description':"Diploma in French",'returning':"17700",'new':"32200"},
+            "DTA":{'description':"Diploma in Theatre Arts",'returning':"19700",'new':"34200"},
+            "DISD":{'description':"Diploma in International Studies",'returning':"27700",'new':"42200"},
+            "DFA":{'description':"Diploma in Fine & Applied Arts",'returning':"19700",'new':"34200"},
+            "DAE":{'description':"Diploma in Agric Econs",'returning':"25700",'new':"41700"},
+            "DFS":{'description':"Diploma in Fishery, Forestry & Wildlife",'returning':"22700",'new':"38700"},
+            "DAC":{'description':"Diploma in Agric Crop Science",'returning':"19700",'new':"35700"},
+            "DFBS":{'description':"Diploma in Food & Brewering Science",'returning':"22700",'new':"38700"},
+            "DIA":{'description':"Diploma in Accounting",'returning':"27700",'new':"42200"},
+            "DBF":{'description':"Diploma in Banking & Finance",'returning':"27700",'new':"42200"},
+            "DAIC":{'description':"Diploma in Applied Industrial Chemistry",'returning':"22700",'new':"38700"},
+            "DAM":{'description':"Diploma in Applied Microbiology",'returning':"22700",'new':"38700"},
+            "DIG":{'description':"Diploma in Geology",'returning':"25700",'new':"41700"},
+            "DSLT":{'description':"Diploma in Science Lab Tech.",'returning':"25700",'new':"41700"},
+            "DES":{'description':"Diploma in Environmental Science",'returning':"22700",'new':"38700"},
+            "DICE":{'description':"Diploma in Computer Engineering",'returning':"27700",'new':"43700"},
+            "DICHE":{'description':"Diploma in Chemical Engineering",'returning':"27700",'new':"43700"},
+            "DDP":{'description':"Diploma in Data Processing",'returning':"27700",'new':"43700"},
+            "DCG":{'description':"Diploma in Cartography",'returning':"19700",'new':"34200"},
+            "DSW":{'description':"Diploma in Social Works",'returning':"25700",'new':"40200"},
+            "DIL":{'description':"Diploma in Law",'returning':"27700",'new':"42200"},
+            "DHT":{'description':"Diploma in Recreation, Hotel & Tourism Management",'returning':"27700",'new':"42200"},
+            "DIE":{'description':"Diploma in Epidermiology",'returning':"27700",'new':"42200"},
+            "CIE":{'description':"Certificate in Epidermiology",'returning':"21200",'new':"36200"},
+            "CEHD":{'description':"Certificate in early Child Health & Development",'returning':"21200",'new':"36200"},
+            "DLS":{'description':"Diploma in Library & Information Science",'returning':"24200",'new':"37200"},
+            "BFA":{'description':"Bachelor in Fine & Applied Arts",'returning':"27700",'new':"42200"},
+            "BTA":{'description':"Bachelor in Theatre Arts",'returning':"27700",'new':"42200"},
+            "BEL":{'description':"Bachelor in English",'returning':"27700",'new':"42200"},
+            "BFR":{'description':"Bachelor in French",'returning':"27700",'new':"42200"},
+            "BISD":{'description':"Bachelor in International Studies & Diplomacy",'returning':"27700",'new':"42200"},
+            "BAE":{'description':"Bachelor in Agric Econs",'returning':"32700",'new':"48700"},
+            "BAN":{'description':"Bachelor in Animal Science",'returning':"27700",'new':"43700"},
+            "BAC":{'description':"Bachelor in Crop Science",'returning':"27700",'new':"43700"},
+            "BAS":{'description':"Bachelor in Soil Science",'returning':"27700",'new':"43700"},
+            "BIA":{'description':"Bachelor in Accounting",'returning':"32700",'new':"47200"},
+            "BBF":{'description':"Bachelor in Banking & Finance",'returning':"32700",'new':"47200"},
+            "BLG":{'description':"Bachelor in Local Govt. Admin.",'returning':"22700",'new':"37200"},
+            "BPA":{'description':"Bachelor in Public Admin.",'returning':"32700",'new':"47200"},
+            "BSW":{'description':"Bachelor in Social Works",'returning':"27700",'new':"42200"},
+            "BES":{'description':"Bachelor in Environmental Science",'returning':"27700",'new':"43700"},
+            "BSLT":{'description':"Bachelor in Science Lab. Tech.",'returning':"27700",'new':"43700"},
+            "BIP":{'description':"Bachelor in Industrial Physics",'returning':"27700",'new':"43700"},
+            "BSCS":{'description':"Bachelor in Statistics & Computer",'returning':"29700",'new':"45700"},
+            "BEEL":{'description':"Bachelor in Electronic & Electrical Engineering",'returning':"32700",'new':"48700"},
+            "BECV":{'description':"Bachelor in Civil Engineering",'returning':"32700",'new':"48700"},
+            "BEMCH":{'description':"Bachelor in Mechanical Engineering",'returning':"32700",'new':"48700"},
+            "BEPE":{'description':"Bachelor in Petroleum Engineering",'returning':"32700",'new':"48700"},
+            "BESTR":{'description':"Bachelor in Structural Engineering",'returning':"32700",'new':"48700"},
+            "BECE":{'description':"Bachelor in Chemical Engineering",'returning':"32700",'new':"48700"},
+            "BPRE":{'description':"Bachelor in Production Engineering",'returning':"32700",'new':"48700"},
+            "LLBPT":{'description':"Bachelor in Law",'returning':"32700",'new':"48700"},
+            "ODPT":{'description':"Doctor of Optometry",'returning':"42700",'new':"58700"},
+            "PHARMD1":{'description':"Doctor of Pharmacy",'returning':"44700",'new':"58700"},
+
+            "CPA":{'description':"Certificate in Public Admin",'returning':"21200",'new':"35200"},
+            "DHAM":{'description':"Diploma in Health Management",'returning':"24200",'new':"37200"},
+            "DNAM":{'description':"Diploma in Nursing Admin & Management",'returning':"27200",'new':"40200"},
+            "DPA":{'description':"Diploma in Public Admin",'returning':"27200",'new':"40200"},
+            "DHS":{'description':"Diploma in Primary Health Care & Statistics",'returning':"27200",'new':"40200"},
+            "ADHFM":{'description':"Advanced Diploma in Health Care Financing and Management",'returning':"29200",'new':"42200"},
+            "DAE":{'description':"Diploma in Adult Education",'returning':"20200",'new':"33200"},
+            "DME":{'description':"Diploma in Maths Education",'returning':"23200",'new':"36200"},
+            "DPE":{'description':"Diploma in Physical Education",'returning':"23200",'new':"36200"},
+            "DHE":{'description':"Diploma in Health Education",'returning':"23200",'new':"36200"},
+            "DEC":{'description':"Diploma in Early Childhood Education",'returning':"20200",'new':"33200"},
+            "DLS":{'description':"Diploma in Library & Information Science",'returning':"24200",'new':"37200"},
+            "BECO":{'description':"Bachelor in Computer Engineering",'returning':"32700",'new':"48700"},
+
+            "BECOSW":{'description':"Bachelor of Economics Education (Sandwich)",'returning':"22700",'new':"37200"},
+
+            "BBEDSW":{'description':"Bachelor of Business Education (Sandwich)",'returning':"22700",'new':"37200"},
+            "BENLSW":{'description':"Bachelor of English & Literature Education (Sandwich)",'returning':"22700",'new':"37200"},
+            "BEMGTSW":{'description':"Bachelor of Management Education (Sandwich)",'returning':"22700",'new':"37200"},
+            "BBIOSW":{'description':"Bachelor of Biology Education (Sandwich)",'returning':"23200",'new':"38700"},
+            "BCSCSW":{'description':"Bachelor of Computer Science Education (Sandwich)",'returning':"23200",'new':"38700"},
+            "BAGRSW":{'description':"Bachelor of Agricultural Science Education (Sandwich)",'returning':"23200",'new':"38700"},
+            "BHEDSW":{'description':"Bachelor of Health Education (Sandwich)",'returning':"23200",'new':"38700"},
+            "BAH":{'description':"Bachelor of Arts in History",'returning':"27700",'new':"42200"},
+            "BFW":{'description':"Bachelor in Agriculture (Forestry & Wildlife)",'returning':"27700",'new':"42200"},
+
+         }
+
+d = {}
+if brain.mode.endswith('_ft'):
+    f = 1
+    if brain.faculty in fee1:
+        f = 0
+    d['new'] = session_fees[brain.session][f]
+    d['returning'] = 'not set'
+    d['description'] = "School Fee for Session %s" % context.getSessionsVoc(key=brain.session)
+if pt_fees.has_key(brain.course):
+    d = pt_fees[brain.course]
+    d['description'] = "School Fee for Session %s, %s" % (context.getSessionsVoc(key=brain.session),
+                                                         d['description'])
+return d
+
Index: /WAeUP_SRP/trunk/skins/waeup_custom/getSimpleStudentStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/getSimpleStudentStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/getSimpleStudentStatistics.py	(revision 3690)
@@ -0,0 +1,150 @@
+## Script (Python) "getRetStudentStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getStudentStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getSimpleStudentStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return
+
+
+catA =      (      'school_fee_paid',
+                   'courses_registered',
+                   'courses_validated',
+                   )
+
+catB =      (      'courses_registered',
+                   'courses_validated',
+                   )
+
+catC =      (      'student_created',
+                   'returning',
+                   'admitted',
+                   'clearance_pin_entered',
+                   'objection_raised',
+                   'clearance_requested',
+                   'cleared_and_validated',
+                   )
+
+current_session = context.getSessionId()[0]
+
+
+full_time =       ('ume_ft','de_ft','ug_ft','pg_ft')
+part_time =       (         'de_pt','ug_pt','pg_pt')
+diploma   =       ('dp_ft','dp_pt')
+
+
+faculties = context.portal_catalog(portal_type="Faculty")
+
+l = []
+
+fac_res = {}
+
+dict = {}
+dict['id'] = 'All Faculties'
+dict['title'] = 'All Faculties'
+
+
+res_ft = context.students_catalog(mode = full_time)
+dict['total_ft'] = len(res_ft)
+
+res_pt = context.students_catalog(mode = part_time)
+dict['total_pt'] = len(res_pt)
+
+res_dp = context.students_catalog(mode = diploma)
+dict['total_dp'] = len(res_dp)
+
+res_Aft = context.students_catalog(review_state = catA, mode = full_time, session = current_session)
+dict['total_Aft'] = len(res_Aft)
+
+res_Apt = context.students_catalog(review_state = catA, mode = part_time, session = current_session)
+dict['total_Apt'] = len(res_Apt)
+
+res_Adp = context.students_catalog(review_state = catA, mode = diploma, session = current_session)
+dict['total_Adp'] = len(res_Adp)
+
+res_Bft = context.students_catalog(review_state = catB, mode = full_time, session = current_session)
+dict['total_Bft'] = len(res_Bft)
+
+res_Bpt = context.students_catalog(review_state = catB, mode = part_time, session = current_session)
+dict['total_Bpt'] = len(res_Bpt)
+
+res_Bdp = context.students_catalog(review_state = catB, mode = diploma, session = current_session)
+dict['total_Bdp'] = len(res_Bpt)
+
+res_Cft = context.students_catalog(review_state = catC, mode = full_time, session = current_session)
+dict['total_Cft'] = len(res_Cft)
+
+res_Cpt = context.students_catalog(review_state = catC, mode = part_time, session = current_session)
+dict['total_Cpt'] = len(res_Cpt)
+
+res_Cdp = context.students_catalog(review_state = catC, mode = diploma, session = current_session)
+dict['total_Cdp'] = len(res_Cdp)
+
+
+res_total = context.students_catalog()
+dict['total_in_catalog'] = len(res_total)
+dict['not_categorized'] = dict['total_in_catalog'] - dict['total_ft'] - dict['total_pt'] - dict['total_dp']
+
+l.append(dict)
+
+
+for f in faculties:
+    dict = {}
+    dict['id'] = f.getId
+    dict['title'] = f.Title
+
+    res_ft = context.students_catalog(faculty = f.getId, mode = full_time)
+    dict['total_ft'] = len(res_ft)
+
+    res_pt = context.students_catalog(faculty = f.getId, mode = part_time)
+    dict['total_pt'] = len(res_pt)
+
+    res_dp = context.students_catalog(faculty = f.getId, mode = diploma)
+    dict['total_dp'] = len(res_dp)
+
+    res_Aft = context.students_catalog(faculty = f.getId, review_state = catA, mode = full_time, session = current_session)
+    dict['total_Aft'] = len(res_Aft)
+
+    res_Apt = context.students_catalog(faculty = f.getId, review_state = catA, mode = part_time, session = current_session)
+    dict['total_Apt'] = len(res_Apt)
+
+    res_Adp = context.students_catalog(faculty = f.getId, review_state = catA, mode = diploma, session = current_session)
+    dict['total_Adp'] = len(res_Adp)
+
+    res_Bft = context.students_catalog(faculty = f.getId, review_state = catB, mode = full_time, session = current_session)
+    dict['total_Bft'] = len(res_Bft)
+
+    res_Bpt = context.students_catalog(faculty = f.getId, review_state = catB, mode = part_time, session = current_session)
+    dict['total_Bpt'] = len(res_Bpt)
+
+    res_Bdp = context.students_catalog(faculty = f.getId, review_state = catB, mode = diploma, session = current_session)
+    dict['total_Bdp'] = len(res_Bpt)
+
+    res_Cft = context.students_catalog(faculty = f.getId, review_state = catC, mode = full_time, session = current_session)
+    dict['total_Cft'] = len(res_Cft)
+
+    res_Cpt = context.students_catalog(faculty = f.getId, review_state = catC, mode = part_time, session = current_session)
+    dict['total_Cpt'] = len(res_Cpt)
+
+    res_Cdp = context.students_catalog(faculty = f.getId, review_state = catC, mode = diploma, session = current_session)
+    dict['total_Cdp'] = len(res_Cdp)
+
+
+    l.append(dict)
+
+return l
+
+
Index: /WAeUP_SRP/trunk/skins/waeup_custom/getStudyLevelInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/getStudyLevelInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/getStudyLevelInfo.py	(revision 3690)
@@ -0,0 +1,124 @@
+## Script (Python) "getStudyLevelInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student=None
+##title=
+##
+# $Id: getStudyLevelInfo.py 2760 2007-11-26 07:39:15Z henrik $
+"""
+return Info about the Studylevel
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+"""
+
+info = context.waeup_tool.getAccessInfo(context)
+student_id = info['student_id']
+if student_id is None:
+    return None
+
+mtool = context.portal_membership
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+
+course_results = context.course_results
+request = context.REQUEST
+response = request.RESPONSE
+import logging
+logger = logging.getLogger('Skins.getStudyLevelInfo')
+
+level_id  =  context.getId()
+level_doc = info['doc'] = context.getContent()
+
+info['is_so'] = is_so = info['is_sectionofficer']
+#info['is_student'] = is_student = context.isStudent()
+info['is_ca'] = is_ca = context.isCourseAdviser()
+#info['student'] = student = context.students_catalog(id=student_id)[0]
+info['student'] = student = context.students_catalog.getRecordByKey(student_id)
+info['review_state'] = review_state = student.review_state
+is_current_level = level_id == student.level
+school_fee_paid =  review_state == 'school_fee_paid'
+info['is_current_level'] = is_current_level
+info['has_verdict'] = has_verdict = level_doc.verdict
+
+info['submission_allowed']= school_fee_paid and is_current_level and not has_verdict
+info['validation_allowed']= review_state == 'courses_registered' and is_current_level
+info['rejection_allowed']= review_state in ('courses_registered', 'courses_validated',) and is_current_level
+info['validated'] = review_state in ('courses_validated','returning') and is_current_level
+
+info['show_check_boxes'] =  (is_ca and school_fee_paid and is_current_level and not has_verdict) or\
+                            (info['is_student'] and school_fee_paid and is_current_level and not has_verdict) or\
+                            (is_so) # and is_current_level and not has_verdict)
+
+info['verdict'] = context.portal_vocabularies.verdicts.get(level_doc.verdict).upper()
+info['session'] = context.portal_vocabularies.sessions.get(level_doc.session)
+info['level_str'] = context.portal_vocabularies.student_levels.get(level_id)
+
+info['choosen_ids'] = request.get('ids',[])
+
+#info['status_info'] = ""
+#if is_student:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Request for course validation pending"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+#elif is_ca:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Please validate these courses"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+
+cert_id = student.course
+info['cert_id'] = cert_id
+total_credits,gpa,carry_overs,normal1,normal2,normal3 = course_results.getCourses(student_id,level_id)
+info['total_credits'] = total_credits
+
+#start customization
+
+if context.objectIds():
+    course_results.moveResultsHere(context,student_id)
+    logger.info("%s initiated moveResultsHere for %s in level %s" % (member_id,student_id,level_id))
+
+max_credits = 50
+try:
+    if int(context.getId()) >=  int(student.end_level):
+        max_credits = 51
+except:
+    logger.info("%s has strange level id %s" % (student_id,level_id))
+info['without_score'] = without_score = True
+if without_score:
+    for rows in (normal1,normal2,normal3):
+        for row in rows:
+            row['score'] = 0
+info['without_cascore'] = True
+#end customization
+
+info['max_credits'] = max_credits
+info['credits_exceeded'] = total_credits > max_credits
+current_session = student.session
+
+info['gpa'] = gpa
+if gpa and total_credits:
+    info['gpa'] = "%4.2f" % (float(gpa)/int(total_credits))
+
+# carry_overs.sort(cmp_semester_id)
+info['carry_overs'] = carry_overs
+# normal.sort(cmp_semester_id)
+
+info['normal1'] = normal1
+info['normal2'] = normal2
+info['normal3'] = normal3
+
+info['data_missing'] = not info['normal1'] and not info['normal2'] and not info['normal3']
+info['spillover'] = student.level > student.end_level
+
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['app'] = student.application
+info['app_doc'] = student.application.getContent()
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_custom/goto_interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/goto_interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/goto_interswitch_form.pt	(revision 3690)
@@ -0,0 +1,43 @@
+<metal:body use-macro="here/main_template/macros/master">
+    <metal:main fill-slot="main"
+                tal:define="info options/info">
+                
+        <h3>Authorize Online Payment! </h3>
+        <br />
+                
+      <form method="post" action="pay_online"
+            tal:attributes="action info/action ">
+      <span tal:repeat="arg python:info['args'].items()"
+            tal:omit-tag="">
+          <input type="hidden" tal:attributes="name python:arg[0];value python:arg[1]" />
+      </span>          
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+      
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Proceed to Payment Gateway" 
+               />
+      </form>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_custom/interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/interswitch_form.pt	(revision 3690)
@@ -0,0 +1,41 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="info options/info">
+    <h3>Confirm Your Payment Data! </h3>
+    <br />
+    <span tal:condition="not: info/payment_possible">
+      No payment information for your course available.
+    </span>
+    <span tal:condition="info/payment_possible">
+      <form method="post" action="pay_interswitch">
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Confirm" 
+               />
+
+      </form>
+    </span>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_custom/layout_student_acco_view_slip.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/layout_student_acco_view_slip.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/layout_student_acco_view_slip.pt	(revision 3690)
@@ -0,0 +1,35 @@
+<!-- a layout_lib macro -->
+<!-- $Id: layout_student_acco_view_slip.pt 1316 2007-01-17 18:05:49Z henrik $ -->
+<metal:block define-macro="default_view"
+  tal:define="layout options/layout;
+              dm options/datastructure/getDataModel;
+              widgets python:context.getRenderedWidgets(layout);
+              fields python:('bed',
+                                 'acco_res_sc_pin',
+                                 'acco_res_date',
+                                 'acco_maint_sc_pin', 
+                                 'acco_maint_fee',
+                                 'acco_maint_date',
+                                 )"
+                                 >
+  <table width="" cellpadding="2" cellspacing="0" summary="Form layout">
+    <tr tal:repeat="field fields">
+      <tal:block tal:define="cell python: widgets[field]">
+        <tal:block define="widget cell/widget">
+          <div tal:attributes="class cell/widget_css_class|string:label;
+            id python:widget.getHtmlWidgetId()+'_widget';">
+            <td width="180px" valign="top">
+             <span class="dlabel"
+                    tal:condition="widget/label"
+                    tal:content="widget/label">label</span>:
+            </td>
+            <td> 
+               <span tal:condition="cell" tal:content="structure cell/widget_rendered"></span>
+               <span tal:condition="not:cell/widget_rendered"> none </span>
+            </td>
+          </div>
+        </tal:block>
+      </tal:block>
+    </tr>
+  </table>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_custom/mail2admin.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/mail2admin.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/mail2admin.py	(revision 3690)
@@ -0,0 +1,44 @@
+## Script (Python) "mail2admin"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=fullname=None,regno=None,email=None,probtype=None,descr=None,commt=None
+##title=
+##
+# $Id: mail2admin.py 2334 2007-10-09 15:01:36Z henrik $
+
+mhost = context.MailHost
+prop = context.portal_properties
+
+d = {}
+d['fullname'] = fullname
+d['email'] = email
+d['email_from'] = prop.email_from_address
+d['regno'] = regno
+d['probtype'] = probtype
+d['descr'] = descr
+
+message = """
+From: %(fullname)s <%(email)s>
+To: %(email_from)s
+Cc: %(email)s
+Bcc: waeup@saoas.org
+Reply-To: %(email)s
+Subject: Uniben Contact
+
+Fullname: %(fullname)s
+Member ID: %(regno)s
+Problem Type: %(probtype)s
+Description: %(descr)s
+"""
+
+mhost.send(message % d)
+
+REQUEST = context.REQUEST
+RESPONSE = REQUEST.RESPONSE
+
+redirect_url = REQUEST.HTTP_REFERER
+redirect_url = '%s/?%s' % (redirect_url,'portal_status_message=Your message has been sent!')
+RESPONSE.redirect(redirect_url)
Index: /WAeUP_SRP/trunk/skins/waeup_custom/mail2student.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/mail2student.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/mail2student.py	(revision 3690)
@@ -0,0 +1,45 @@
+## Script (Python) "mail2student"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=co_name=None,co_email=None,student_email=None,probtype=None,commt=None, action=None
+##title=
+##
+# $Id: mail2admin.py 869 2006-11-15 13:46:49Z henrik $
+
+from urllib import urlencode
+
+mhost = context.MailHost
+prop = context.portal_properties
+REQUEST = context.REQUEST
+
+d = {}
+#d['co_name'] = co_name
+#d['co_email'] = co_email
+d['co_name'] = 'CRPU Uniben'
+d['co_email'] = prop.email_from_address
+d['student_email'] = student_email
+d['probtype'] = probtype
+d['commt'] = commt
+
+message = """
+From: %(co_name)s <%(co_email)s>
+To: %(student_email)s
+Cc: %(co_email)s
+Reply-To: %(co_email)s
+Subject: %(probtype)s
+%(commt)s
+"""
+
+mhost.send(message % d)
+
+args = {}
+psm = "Your message has been sent!"
+args['portal_status_message'] = psm
+if action:
+    url = context.absolute_url() + '/' + action + '?' + urlencode(args)
+else:
+    url = context.absolute_url() +'?' + urlencode(args)
+return REQUEST.RESPONSE.redirect(url)
Index: /WAeUP_SRP/trunk/skins/waeup_custom/main_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/main_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/main_template.pt	(revision 3690)
@@ -0,0 +1,219 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+  
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${here/getBaseUrl}${static_dir};
+  base_url here/getBaseUrl;
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  student_theme python:test(waeup_skin == 'WAeUP_Student',1,0);
+  navigation_slot python:test(student_theme,'student_navigation_slot','navigation_slot');
+  object_tabs python:test(student_theme,'student_object_slot','staff_object_slot');
+  
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}${waeup_skin}/render.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      
+     
+      <table summary="Logo Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0" 
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;"></td>
+            <td valign="top" style="width: 120px; padding: 10px 10px 0 0; text-align: right;">
+              <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo" />
+            </td>
+            <td style="padding: 27px 0 0 0; text-align: left;" valign="top">
+              <img tal:attributes="src string:${static_base_url}logo_right.gif" alt="Logo" />
+            </td>
+            <td style="width: 20px;"></td>
+          </tr>
+        </tbody>
+      </table>
+
+      <table summary="Navigation Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="" valign="top">
+              <div id="navigation_slot" 
+                       style="padding: 0em 0em 1px; text-align: right;"
+                       class="fontColornavigation fontShapenavigation portalTabTabStyle cpsskinsHBox body">
+                 <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot=navigation_slot)"
+                  tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+              </div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+      </table>
+      
+      
+      <table summary="Main Table Block 1"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: center;"
+              valign="top">
+            <div id="portal_session" style="padding: 0.4em 0.4em 0.4em 0.3em;"
+                 class="colorBarAreaColor fontColordefaultnovisitedlinks fontShapeaverage shapeAreaShape9">
+                    <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='portal_session')"
+                               tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="text-align: left; padding: 0.2em 0.2em 0em;" class="colorBarColor" valign="top">
+            <metal:block define-slot="action_slot" />
+            <div id="object_tabs" class="fontColornavigation fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot=object_tabs)">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+            </div>
+          </td>
+          <td tal:condition="not:student_theme"
+              class="colorBarColor" valign="top" style="text-align: right;padding: 0.2em 0.2em 0em; width: 280px;">
+            <div id="status_slot" class="fontColordefaultfontcolors fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot='status_slot')">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="width: 20px;"
+              valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+  
+  
+  
+    <table summary="Main Table Block 2"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="" cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: left;"
+              class="colorBarColor fontColornavigation fontShapeaverage boxShapenavbox cpsskinsBox" valign="top">
+            <div id="staff_actions_slot" class="body" style="padding: 1.5em 0.5em 1.5em 0.5em;">
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='staff_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='global_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='student_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+
+              <span tal:condition="student_theme">
+              <div style="padding: 0em;">
+                <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_workflow')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>
+              </span>
+              
+              <div style="padding-top: 10px;">
+              <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_notice_slot')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>  
+
+
+            </div>
+          </td>
+          <td style="" class="shapeAreaShape5 colorBarAreaColor" valign="top">
+            <div style="padding: 0.5em; text-align: left;" class="fontColordefaultfontcolors fontShapeaverage">
+              <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+              <metal:block define-slot="header" />
+              <metal:block define-slot="main" />
+              <metal:block define-slot="sub" />
+            </div>
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+    
+    
+    <table summary="Copyright Info Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="padding: 0.2em; text-align: right;" valign="top">
+              <div class="fontColordefaultfontcolors fontShapeaverage">
+              Copyright WAeUP Group 2006-2008</div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+    </table>
+    </body>
+  </html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_custom/no_booking_allowed.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/no_booking_allowed.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/no_booking_allowed.pt	(revision 3690)
@@ -0,0 +1,8 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+
+    <h3>Sorry, you are not eligible to book accommodation!</h3>
+
+  </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_custom/pay_interswitch.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/pay_interswitch.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/pay_interswitch.py	(revision 3690)
@@ -0,0 +1,167 @@
+## Script (Python) "pay_online"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: pay_interswitch.py 2664 2007-11-15 14:35:05Z henrik $
+"""
+pay online
+"""
+from urllib import urlencode
+import logging
+logger = logging.getLogger('Skins.pay_interswitch')
+import DateTime
+
+if context.portal_membership.isAnonymousUser():
+    return None
+
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+request = context.REQUEST
+wftool = context.portal_workflow
+students = context.portal_url.getPortalObject().campus.students
+
+
+student_id = context.getStudentId()
+student = getattr(students,student_id)
+
+student_record = context.students_catalog.getRecordByKey(student_id)
+#amount,description = context.getSchoolFee(student_record.faculty,student_record.session,student_record.course)
+info = {}
+info['student'] = student_record
+info['payment_possible'] = False
+info['amount'] = '0'
+info['bank'] = ''
+info['type_description'] = ''
+info['pay_bill_to'] = ''
+fee_dict = context.getSchoolFee(student_record)
+fulltime = student_record.mode.endswith('_ft')
+new = student_record.review_state == 'cleared_and_validated'
+returning = student_record.review_state == 'returning'
+if not fee_dict or (not new and fulltime) or not (new or returning):
+    return context.interswitch_form(info=info)
+info['site_id'] = '61'
+info['currency_id'] = '566'
+if new:
+    amount = info['amount'] = fee_dict['new']
+elif returning:
+    amount = info['amount'] = fee_dict['returning']
+if fulltime:
+    pay_item_id = "6100"
+    #info['type_code'] = student_record.faculty   #type_code is redundant and will be removed soon
+    info['bank'] = ''
+else:
+    pay_item_id = "6101"
+    #info['type_code'] = student_record.course  #type_code is redundant and will be removed soon
+    info['bank'] = ''
+info['payment_possible'] = True
+info['type_description'] = fee_dict['description']
+info['pay_bill_to'] = student_record.name
+info['pay_ship_to'] = "University of Benin"
+info['student_id'] = student_id
+info['student_name'] = student_record.name
+info['student_email'] = student_record.email
+info['session_id'] = student_record.session   # this holds only for new students und must be replaced when also previous session students will pay online !!!!!!
+info['type'] = 'online'
+info['status'] = 'started'
+info['item'] = student_record.course
+info['category'] = 'schoolfee'
+now = DateTime.DateTime()
+info['date'] = now
+timestamp = "%d" % int(now.timeTime()*1000)
+info['order_id'] = "%s%s" % (student_id[1:],timestamp)
+p_id = "p%s" % timestamp
+
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+
+if True or context.portal_url().find('uniben-demo.waeup.org') >-1 or\
+   context.portal_url().find('uniben.waeup.org') >-1:
+    info['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+else:
+    #pass
+    #return None
+    info['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),p_id)
+
+
+if "payments" not in student.objectIds():
+    student.invokeFactory('PaymentsFolder','payments')
+    payments = getattr(student,'payments')
+    d = {}
+    d['Title'] = 'Payments'
+    payments.getContent().edit(mapping=d)
+    wftool.doActionFor(payments,'open')
+else:
+    payments = getattr(student,'payments')
+if request.has_key('epayment'):
+    return context.interswitch_form(info=info)
+
+
+payments.invokeFactory('Payment', p_id)
+payment = getattr(payments,p_id)
+wftool.doActionFor(payment,'open')
+d = {}
+d.update(info)
+#from Products.zdb import set_trace;set_trace()
+payment.getContent().edit(mapping=d)
+#wftool.doActionFor(payment,'close')
+#wftool.doActionFor(student,'pay_school_fee')
+info['callback_url'] = "%s/payments/%s/interswitch_cb?echo=%s" % (student.absolute_url(),
+                                                                  p_id,
+                                                                  p_id)
+
+logger.info('%(student_id)s initiated online school fee payment with order_id %(order_id)s and callback url %(callback_url)s' % info)
+payment_fields = (('product_id','site_id'),
+                  ('site_redirect_url','callback_url'),
+                  ('Currency','currency_id'),
+                  ('cust_id','student_id'),
+                  ('cust_id_desc','type_description'),
+                  ('cust_name','student_name'),
+                  ('txn_ref','order_id'),
+                  ('Amount','amount'),
+                  )
+args = {}
+for arg,field in payment_fields:
+    args[arg] = info[field]
+itotal = int(amount)*100
+wema_amount = 10000
+provider_amount = 35000
+interswitch_amount = 15000
+#uniben_amount = itotal - wema_amount - provider_amount - interswitch_amount
+uniben_amount = itotal - interswitch_amount
+xmldict = {}
+xmldict['detail_ref'] = args['txn_ref']
+xmldict['department'] = student_record.department
+xmldict['faculty'] = student_record.faculty
+#xmldict['wema_amt'] = "%d" % wema_amount
+#xmldict['provider_amt'] = "%d" % provider_amount
+xmldict['uniben_amt'] = "%d" % uniben_amount
+##<item_detail item_id="2" item_name="WEMA" item_amt="%(wema_amt)s" bank_id="16" acct_num="48398023902" />
+##<item_detail item_id="3" item_name="Portal Provider" item_amt="%(provider_amt)s" bank_id="47" acct_num="0980938209483" />
+xmltext = """
+<payment_item_detail>
+<item_details detail_ref="%(detail_ref)s" college="UNIBEN" department="%(department)s"
+faculty="%(faculty)s">
+<item_detail item_id="1" item_name="UNIBEN" item_amt="%(uniben_amt)s" bank_id="16" acct_num="384950902390" />
+</item_details>
+</payment_item_detail>
+""" % xmldict
+#total = int(xmldict['uniben_amt'])+int(xmldict['wema_amt'])+int(xmldict['provider_amt'])
+total = int(xmldict['uniben_amt'])
+args['Amount'] = "%d" % (total + 15000)
+args['site_name'] = "uniben.waeup.org"
+args['cust_name_desc'] = "Student Name"
+args['pay_item_id'] = pay_item_id
+args['pay_item_name'] = "UNIBEN Tuition Payments"
+args['payment_params'] = 'switch_college_split'
+#args['xml_data'] = xmltext % info
+args['xml_data'] = ''
+info['args'] = args
+return context.goto_interswitch_form(info=info)
Index: /WAeUP_SRP/trunk/skins/waeup_custom/search_students_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/search_students_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/search_students_form.pt	(revision 3690)
@@ -0,0 +1,132 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="rendered options/rendered;
+              portal_status_message options/psm;
+              students options/students;
+              info options/info|nothing;
+              is_so context/isSectionOfficer;
+              allowed options/allowed|nothing;"
+              >
+    <span tal:condition="not: allowed">
+      <span tal:content="here/illegal_view" />
+    </span>
+    <span tal:condition="allowed" tal:omit-tag="">
+      <strong>
+        <nobr><a href="statistics_new_view">New Student Statistics</a>
+        &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+        <nobr><a href="statistics_ret_view">Returning Student Statistics</a>
+        &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+        <nobr><a href="statistics_simple_view">Basic Student Statistics</a>
+        &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+        <span tal:condition="is_so">
+          <nobr><a href="apply_admission_manage">Application Process</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+          <nobr><a href="view_logs">View Log Files</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="add_student">Add Student Record</a>        
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="deactivate_students">Deactivate Student Record(s)</a></nobr>
+        </span>
+      </strong>
+      <h3> Search Student Section</h3><br />
+      You are logged in as member <span tal:replace="info/member|nothing" /> 
+      <span tal:condition="info/faculties|nothing" tal:omit-tag="">
+        who is ClearanceOfficer for Faculty 
+        <span tal:repeat="faculty info/faculties" tal:content="faculty" />
+      </span>
+      <span tal:condition="info/departments|nothing" tal:omit-tag="">
+        and <span tal:repeat="department info/departments|nothing" tal:content="department"/></span>.
+      <br /><br />
+      <span tal:replace="structure rendered" />
+      <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+      <span tal:condition="students">
+        <span tal:define="items students;
+        columns python:3;
+        items_per_page python:40;
+        max_items python:300;
+        zoom python:0;
+        batches_all python:here.getBatchList(items,columns, items_per_page,zoom,max_items=5000);
+        batches python:batches_all[0];
+        batch_info python:batches_all[1];
+        zoomed python:batches_all[2];
+        mq nocall:modules/ZTUtils/make_query;"
+        tal:omit-tag="">
+          <tal:block tal:condition="python: items and batch_info and batch_info['nb_pages'] > 1">
+            <div class="batchLayout" i18n:translate="">
+              Objects:<strong><tal:block replace="batch_info/start"
+                                         i18n:name="batch_start" /> - <tal:block replace="batch_info/limit"
+                                                                                 i18n:name="batch_limit" />
+              </strong> of <tal:block replace="batch_info/length" i18n:name="batch_length" />
+            </div>
+            <br />
+          </tal:block>
+          <table class="contentListing" width="100%">
+            <span tal:repeat="rows batches" tal:omit-tag="">
+              <span tal:repeat="student rows">
+                <tr tal:condition="student" 
+                    tal:attributes="class python:test(repeat['student'].even(), 'even ajaxtd', 'odd ajaxtd')">
+                  <td><a href="id" tal:attributes="href string:${context/portal_url}/campus/students/${student/id}"
+                         tal:content="student/id"></a></td>    
+                  <td>
+                    <span tal:replace="student/name" />
+                  </td>    
+                  <td><span tal:replace="student/matric_no" /></td>   
+                  <td><span tal:replace="student/jamb_reg_no" /></td>
+                  <td tal:condition="options/co_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/clearance/external_clearance_edit_form"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and change state]</a></td>
+                  <td tal:condition="options/ca_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/study_course/${student/level}/external_study_level_view"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and validate course list]</a></td>
+                </tr>
+              </span>
+            </span>
+          </table>
+          <tal:block condition="python:batch_info and batch_info['nb_pages'] > 1">
+            <div class="pageNavigationLayout">
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=0))"
+                 >
+              (&lt;&lt;)</a>
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=previous))"
+                 i18n:translate="batch_previous">Previous</a>
+              <tal:block repeat="page batch_info/pages">
+                <tal:block condition="python:page != batch_info['start'] - 1">
+                  <a tal:attributes="href python:'%s?%s'%(request['URL'],
+                  mq(request.form, b_start=page))"
+                  tal:content="repeat/page/number">1</a>&nbsp;
+                </tal:block>
+                <tal:block condition="python:page == batch_info['start'] - 1">
+                  <span tal:content="string:${repeat/page/number}" />&nbsp;
+                </tal:block>
+              </tal:block>
+              <a tal:define="next batch_info/next"
+                 tal:condition="python:next is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=next))"
+                 i18n:translate="batch_next">Next</a>
+              <a tal:define="next batch_info/next;
+              last_page python:batch_info['pages'][-1]"
+              tal:condition="python:next is not None"
+              tal:attributes="href python:'%s?%s'%(request['URL'],
+              mq(request.form, b_start=last_page))"
+              >
+              (&gt;&gt;)</a>
+            </div>
+          </tal:block>
+        </span>
+      </span>
+    </span>
+  </metal:main>
+</metal:body>
Index: /WAeUP_SRP/trunk/skins/waeup_custom/slip_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/slip_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/slip_template.pt	(revision 3690)
@@ -0,0 +1,109 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  base_url here/getBaseUrl;  
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${base_url}${static_dir};  
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+   
+    <table summary="Logo Block"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           class="shapeNoBorder colorTransparent" cellpadding="0"
+           cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td valign="top" style="width: 80px; padding: 0.5em; text-align: right;">
+            <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo"
+                     height="84" width="82" />
+          </td>
+          <td style="padding: 2em 0em 0em 0em; text-align: left;" valign="top">
+            <img tal:attributes="src string:${static_base_url}logo_right.gif" 
+                     alt="Logo" height="51" width="234" />
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+      
+    <table summary="Main Block" cellpadding="0" cellspacing="0" 
+           style="margin-left:auto;margin-right:auto;width:100%;">
+      <tr>
+        <td valign="top" style="width:700px">
+          <div style="padding:2em; text-align: left;" 
+               class="fontColordefaultfontcolors fontShapeTitleindex shapeAreaShape">
+                  <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+                  <metal:block define-slot="header" />
+                  <metal:block define-slot="main" />
+                  <metal:block define-slot="sub" />
+          </div>
+        </td>
+      </tr>
+    </table>
+  </body>
+</html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_custom/statistics_simple_view.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/statistics_simple_view.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/statistics_simple_view.pt	(revision 3690)
@@ -0,0 +1,136 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+  <metal:block tal:define="faculties context/getSimpleStudentStatistics;
+                        mtool here/portal_membership;
+                        member mtool/getAuthenticatedMember;
+                        session_str python:context.getSessionId()[1]">       
+
+      <span tal:condition="not: faculties">
+        <span tal:content="here/illegal_view" />
+      </span>
+      <span tal:condition="faculties">
+  
+      <strong>
+      <nobr><a href="search_students">Search Students</a>
+      &nbsp;&nbsp;&nbsp;&nbsp;</nobr>        
+      <nobr><a href="statistics_new_view">New Student Statistics</a>
+      &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+      <nobr><a href="statistics_ret_view">Returning Student Statistics</a>
+      &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+      </strong>     
+
+      <h3>Basic Student Statistics <span tal:content="session_str" /></h3>
+      <br />      
+      <span tal:condition="not:isAnon">
+      Student records imported: <span tal:content="python: faculties[0]['total_in_catalog']" />
+      <br />  <br />  
+        <table >  
+
+          <tr>
+            <th>&nbsp;</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="3">Total</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="3">Category A</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="3">Category B</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="3">Category C</th>
+
+
+          </tr>
+
+          <tr class="odd ajaxtd">
+            <th >Faculty</th>
+            <th align="right">FT</th>
+            <th align="right">PT</th>
+            <th align="right">DP</th>
+            <th align="right">FT</th>
+            <th align="right">PT</th>
+            <th align="right">DP</th>
+            <th align="right">FT</th>
+            <th align="right">PT</th>
+            <th align="right">DP</th>
+            <th align="right">FT</th>
+            <th align="right">PT</th>
+            <th align="right">DP</th>
+
+          </tr>
+          <tr tal:repeat="d faculties"
+              tal:attributes="class python:test(repeat['d'].even(), 'even ajaxtd', 'odd ajaxtd')">
+              <td width="80px"> <span tal:content="d/id" /> </td>
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_ft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_pt" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_dp" />
+              </td>                 
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Aft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Apt" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Adp" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bpt" />
+              </td>              
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bdp" />
+              </td>      
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cft" />
+              </td>      
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cpt" />
+              </td>      
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cdp" />
+              </td>                                                
+
+                                       
+
+          </tr>
+        </table>
+
+        <br />
+        <table   border=0>
+
+        <tr><td>Category A: </td> <td>students who paid their school fee in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category B: </td> <td>students who registered their courses online (A contains B) in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category C: </td> <td>students who 'arrived' in <span tal:content="session_str" /> but have not yet paid their school fee</td></tr>
+        <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
+        <tr><td colspan="2"><strong>Remark:</strong> <span tal:content="python: faculties[0]['not_categorized']" /> returning students have not yet logged in and are thus not categorized.
+             </td>
+        </tr>
+          
+        </table>
+        
+        
+        
+      </span>
+      </span>
+  </metal:block>      
+  </metal:main>
+</metal:body>
+      
Index: /WAeUP_SRP/trunk/skins/waeup_custom/student_index.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/student_index.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/student_index.py	(revision 3690)
@@ -0,0 +1,54 @@
+## Script (Python) "student_index"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=batch=None,portal_status_message=None
+##title=
+##
+# $Id: student_index.py 2297 2007-10-01 07:26:30Z henrik $
+"""
+return the current student_index
+"""
+
+request = context.REQUEST
+#session = request.SESSION
+response = request.RESPONSE
+redirect = response.redirect
+pm = context.portal_membership
+member = pm.getAuthenticatedMember()
+
+#from Products.zdb import set_trace;set_trace()
+if context.isStaff():
+    if context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.study_level_view()
+    elif context.portal_type == 'StudentClearance':
+        return context.clearance_view()
+    elif context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Student':
+        if portal_status_message:
+            return redirect("%s/student_view?portal_status_message=%s" % (context.absolute_url(),portal_status_message))
+        else:
+            return redirect("%s/student_view" % context.absolute_url())
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    return redirect("%s/waeup_document_view" % context.absolute_url())
+if context.isStudent():
+    if context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.study_level_view()
+    elif context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    students_url = "%s/campus/students" % (context.portal_url())
+    id = str(member)
+    return redirect("%s/%s/student_view" % (students_url, id))
+
+return redirect("%s/srp_anonymous_view" % context.portal_url())
+
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/apply_admission_manage_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/apply_admission_manage_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/apply_admission_manage_form.pt	(revision 3690)
@@ -0,0 +1,94 @@
+<tal:block define="rendered_main options/rendered|nothing;
+           portal_status_message options/psm|nothing;
+           reg_no options/reg_no|nothing;
+           ds options/ds|nothing;
+           "
+           >	
+  <metal:block define-macro="edit_form">
+    <metal:block use-macro="here/main_template/macros/master">
+      <metal:block fill-slot="main">
+
+        <form action="" id="editForm" method="post" 
+              enctype="multipart/form-data" class="workflow"
+              tal:attributes="action string:${context/absolute_url}/apply_admission_manage"
+              >
+
+          <span tal:condition="not: rendered_main">
+            <h3>Application Process</h3>
+            <br />
+            
+            <table tal:define="info_applicants context/getApplicantsStatistics">
+            <tr> 
+              <td>PCE Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_pce" /></td>  
+            </tr>
+            <tr> 
+              <td>Pre-NCE Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_prence" /></td>
+            </tr>
+            <tr> 
+              <td>All Applicants (status admitted):</td> 
+              <td><span tal:replace="info_applicants/admitted" /></td>  
+            </tr>
+            <tr> 
+              <td>All Applicants (status student record created):</td> 
+              <td><span tal:replace="info_applicants/created" /></td>
+            </tr>            
+            <tr> 
+              <td>All Applicants (status not admitted):</td> 
+              <td><span tal:replace="info_applicants/not_admitted" /></td>  
+            </tr>    
+            </table>            
+            
+            <br/>
+            
+            <div class="label">Registration No:</div>
+            <input type="text" name="reg_no" size="15"
+                   />
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search" 
+                   />
+          </span>
+
+          <span tal:condition="rendered_main">
+            <h3>Application Record <span tal:replace="reg_no"/></h3>
+            <br />
+            <div tal:replace="structure rendered_main" />
+                        
+            <input type="hidden" name="reg_no"
+                   tal:attributes="value reg_no|nothing"
+                   />
+            <input type="submit" class="standalone" 
+                   name="reset"
+                   value="Reset" 
+                   tal:condition="python: ds['status'] and 'submitted' in ds['status']"
+                   />
+                   
+                   
+            <input type="submit" class="standalone" 
+                   name="edit"
+                   value="Save" 
+                   />                   
+                   
+            <br /><br />
+            
+
+            <div class="label">Registration No:</div>
+            <input type="text" name="new_reg_no" size="15"
+                   /> &nbsp;
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search next" 
+                   />
+          </span>
+        </form>
+        
+        <br/>
+        
+      
+        
+      </metal:block>
+    </metal:block>
+  </metal:block>
+</tal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/getAccommodationInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/getAccommodationInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/getAccommodationInfo.py	(revision 3690)
@@ -0,0 +1,108 @@
+## Script (Python) "getAccommodationInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_id=None
+##title=
+##
+# $Id: getAccommodationInfo.py 1726 2007-05-02 06:21:50Z henrik $
+"""
+return Info about the current Student
+"""
+import logging
+logger = logging.getLogger('Skins.getAccommodationInfo')
+import DateTime
+
+request = context.REQUEST
+mtool = context.portal_membership
+wf = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+path_info = request.get('PATH_INFO').split('/')
+
+if mtool.isAnonymousUser():
+    return None
+info = {}
+if student_id is None:
+    requested_id = context.getStudentId()
+    if requested_id and not context.isStaff() and member_id != requested_id:
+        logger.info('%s tried to access %s' % (member_id,requested_id))
+        return None
+    elif context.isStaff():
+        student_id = requested_id
+    else:
+        student_id = member_id
+student_record = context.students_catalog.getRecordByKey(student_id)
+if student_record is None:
+    logger.info('%s not found in students_catalog' % student_id)
+    return None
+
+info['error'] = None
+info['matric_no']=student_record.matric_no
+info['jamb_reg_no']=student_record.jamb_reg_no
+info['name']=student_record.name
+info['email']=student_record.email
+info['level']=student_record.level
+info['verdict']=getattr(student_record,'verdict','')
+review_state = info['review_state'] = student_record.review_state
+info['session'] = session = context.getSessionId()
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['student_id'] = student_id
+info['student'] = student
+
+booking_allowed = False
+
+# customize from here
+
+try:
+    level = int(student_record.level)
+except:
+    logger.info('%s has invalid level %s' % (student_id,student_record.level))
+    info['acco'] = None
+    info['booking_allowed'] = False
+    info['student_status'] = ''
+    return info    
+
+if review_state in ('school_fee_paid','courses_registered', 'courses_validated',) and student_record.session == session[0]:
+    info['booking_allowed'] = True
+    info['online_payment'] = True
+else:
+    info['acco'] = None
+    info['booking_allowed'] = False
+    info['student_status'] = ''
+    return info
+
+acco_id = 'accommodation_' + session[0]
+acco = getattr(student,acco_id,None)
+info['acco'] = acco
+info['acco_id'] = acco_id
+
+info['maintenance_paid'] = False
+if acco is not None:
+    info['acco_doc'] = acco.getContent()
+    info['acco_review_state'] = wf.getInfoFor(acco,'review_state',None)
+    info['maintenance_paid'] = info['acco_review_state'] == "maintenance_fee_paid"
+d = {}
+if level >= 300:
+   bt = 'fi'
+if level == 100:
+    bt = 'fr'
+elif level < 100:
+    bt = 'pr'    
+elif level < 300:
+    bt = 're'
+
+d['sex'] = 'male'
+if student_record.sex:
+    d['sex'] = 'female'
+
+
+info['sex']=d['sex']
+d['bt'] = bt
+student_status = "%(sex)s_%(bt)s" % d
+info['student_status'] = student_status
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/getApplicantsStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/getApplicantsStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/getApplicantsStatistics.py	(revision 3690)
@@ -0,0 +1,39 @@
+## Script (Python) "getApplicantsStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getApplicantsStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getApplicantsStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return 'Not allowed'
+
+
+info = {}
+res_submitted_pce = context.applicants_catalog(status = 'submitted', screening_type = 'pce')
+res_not_admitted = context.applicants_catalog(status = 'not admitted')
+res_submitted_prence = context.applicants_catalog(status = 'submitted', screening_type = 'prence')
+res_admitted = context.applicants_catalog(status = 'admitted')
+res_created = context.applicants_catalog(status = 'created')
+
+info['submitted_pce'] = len(res_submitted_pce)
+info['admitted'] = len(res_admitted)
+info['not_admitted'] = len(res_not_admitted)
+info['submitted_prence'] = len(res_submitted_prence)
+info['created'] = len(res_created)
+
+return info
+
+
+
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/getCosCombinedVoc.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/getCosCombinedVoc.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/getCosCombinedVoc.py	(revision 3690)
@@ -0,0 +1,17 @@
+##parameters=key=None
+# $Id: getCosCombinedVoc.py 2814 2007-11-28 12:26:51Z henrik $
+"""
+Return the combined courses as an vocabulary
+
+"""
+if key is None:
+    l = []
+    for k,v in context.portal_vocabularies.cos.items():
+        l += (k,v),
+    return l
+for voc in (context.portal_vocabularies.cos,):
+    title = voc.get(key,None)
+    if title is not None:
+        return title
+    else:
+        raise KeyError
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/getInterswitchParams.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/getInterswitchParams.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/getInterswitchParams.py	(revision 3690)
@@ -0,0 +1,44 @@
+## Script (Python) "getInterswitchParams"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=paytype,student,payment_id,student_record
+##title=
+##
+# $Id: getInterswitchParams.py 3625 2008-08-17 07:47:00Z henrik $
+
+
+test = ""
+d = {}
+d['payment_possible'] = True
+d['pay_ship_to'] = "Federal College Okene"
+
+d['site_id'] = '83'
+d['site_name'] = "fceokene.waeup.org"
+d['currency_id'] = '566'
+d['type'] = 'online'
+d['status'] = 'started'
+d['surcharge'] = '150'
+if test == 'simulate':
+    d['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),payment_id) #do not use simulate_callback
+elif test == 'test':
+    d['action'] = "https://webpay.interswitchng.com/test_paydirect/webpay/pay.aspx"
+else:
+    d['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+if paytype in ("HOM",):
+    d['callback_function'] = 'interswitch_cb'
+    d['pay_item_id'] = '8300'
+    d['type_description'] = 'Hostel Maintenance Fee'
+    d['pay_item_name'] = "FCE Okene %(type_description)s" % d
+    if student_record.mode.endswith('_sw'):
+        d['amount'] = '2500'
+    else:
+        d['amount'] = '4000'
+    d['category'] = 'hostel_maintenance'
+    d['item'] = paytype
+    #d['payment_params'] = 'switch_college_split'
+    d['payment_params'] = '0'
+
+return d
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/getNextInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/getNextInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/getNextInfo.py	(revision 3690)
@@ -0,0 +1,62 @@
+## Script (Python) "getNextInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_brain
+##title=
+##
+# $Id: getNextInfo.py 2678 2007-11-16 13:41:44Z henrik $
+"""
+return the students next info
+"""
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+info = {}
+
+reasons = ''
+
+session_id = student_brain.session
+level_id = student_brain.level
+review_state = student_brain.review_state
+verdict = student_brain.verdict
+
+has_verdict = verdict and verdict != 'N/A'
+has_session = session_id and session_id != 'N/A'
+has_level = level_id and level_id != 'N/A'
+
+info['next_transition'] = None
+info['next_session_id'] = next_session_id = session_id
+info['next_level_id'] = next_level_id = level_id
+info['next_verdict'] = verdict
+info['next_previous_verdict'] = ''
+verdicts_voc = context.portal_vocabularies.verdicts
+if review_state == 'cleared_and_validated':
+    info['next_transition'] = "pay_school_fee"
+    info['next_verdict'] = ''
+elif review_state == 'returning' and has_verdict and has_level and has_session:
+    info['next_session_id'] = next_session_id = "%02d" % (int(session_id)+1)
+    if int(session_id) > 4:
+        info['next_transition'] = "pay_school_fee"
+        info['next_verdict'] = ''
+        info['next_previous_verdict'] = verdict
+        if verdict in ('A','B','G','C',):                                     #customized
+            info['next_level_id'] = "%s" % (int(level_id) + 100)
+        #elif verdict == 'C':
+        #    info['next_level_id'] = "%s" % (int(level_id) + 10)
+        else:
+            info['next_level_id'] = level_id
+    else:
+        info['next_level_id'] = "%s" % (int(level_id) + 100)
+elif review_state == 'returning' and not (has_session and has_level and has_verdict):
+    reasons = "Your data record is incomplete. School fee payment has been disabled, please contact your faculty!"
+
+info['reasons'] = reasons
+info['next_session_str'] = context.getSessionsVoc(next_session_id)
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/getPaymentsFolderInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/getPaymentsFolderInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/getPaymentsFolderInfo.py	(revision 3690)
@@ -0,0 +1,131 @@
+## Script (Python) "getPaymentsFolderInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getPaymentsFolderInfo.py 2480 2007-10-30 15:23:25Z joachim $
+"""
+Info for the PaymentsFolder
+"""
+from Products.AdvancedQuery import Eq, Between, Le,In
+
+mtool = context.portal_membership
+wftool = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+payments_catalog = context.payments_catalog
+aq_payments = payments_catalog.evalAdvancedQuery
+if mtool.isAnonymousUser():
+    return None
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+def cmp_id(a,b):
+    s1 = "%(id)s" % a
+    s2 = "%(id)s" % b
+    if s1 == s2:
+        return 0
+    if s1 > s2:
+        return 1
+    return -1
+
+import DateTime
+request = context.REQUEST
+#students = context.portal_url.getPortalObject().campus.students
+student_id = context.getStudentId()
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+#student = getattr(students,student_id)
+student_record = context.students_catalog.getRecordByKey(student_id)
+
+
+info = {}
+is_so = info['is_so'] = context.isSectionOfficer()
+is_student = info['is_student'] = context.isStudent()
+info['student_name'] = student_record.name
+info['query_url'] = "https://webpay.interswitchng.com/paydirect/services/TransactionQueryURL.aspx"
+review_state = info['review_state'] = student_record.review_state
+parttime = student_record.mode and student_record.mode.endswith('_pt')
+fulltime = student_record.mode and student_record.mode.endswith('_ft')
+
+
+session = student_record.session
+next_info = context.getNextInfo(student_record)
+info['next_session'] = next_info['next_session_id']
+info['next_session_str'] = next_info['next_session_str']
+info['payment_method'] = ""
+info['reasons'] = next_info['reasons']
+
+# begin customization
+
+if review_state == 'cleared_and_validated':
+    info['payment_method'] = "online_payment"
+#elif review_state == 'cleared_and_validated' and session == '07':
+#    info['payment_method'] = "sc_payment"
+elif review_state == 'returning' and info['next_session'] != session:
+    info['payment_method'] = "online_payment"
+info['prod_id'] = '83'
+
+# end customization
+
+info['student_name'] = student_record.name
+payments_path = "%s/campus/students/%s/payments" % (context.portal_url(),student_id)
+payments = []
+payment_records = aq_payments(Eq('student_id',student_id)) # & Eq('session_id',student_record.session))
+vocabularies = context.portal_vocabularies
+paid_fees = []
+for payment in payment_records:
+    if payment.status == "paid":
+        paid_fees += "%s_%s" % (payment.category,payment.session_id),
+#info['pf'] = paid_fees
+for payment in payment_records:
+    row = {}
+    row['id'] = payment.key
+    if payment.status == 'invalid':
+        row['title'] = "Invalid Payment, Naira %s, %s" % (payment.amount,
+                                                          payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    else:
+        row['title'] = "%s for Session %s, Naira %s, %s" % (vocabularies.payment_categories.get(payment.category),
+                                                            vocabularies.sessions.get(payment.session_id),
+                                                            payment.amount,
+                                                            payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    oid = payment.order_id
+    onr = oid.rfind('-')+1
+    if onr > 0:
+        start_pos = onr
+    else:
+        start_pos = 6
+    url = row['url'] = "%s/p%s" % (payments_path,oid[start_pos:])
+    row['is_requeryable'] = "%s_%s" % (payment.category,payment.session_id) not in paid_fees and payment.type == 'online' or str(member) in ('admin',)
+    row['is_approvable'] = is_so and row['is_requeryable'] and payment.category == 'schoolfee' # does not make sense for maitenance
+    row['resp_desc'] = payment.resp_desc or 'Payment Process Interrupted'
+    row['trans_ref'] = payment.order_id
+    if row['is_requeryable']:
+        row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        if payment.category == 'schoolfee':
+#            row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        elif payment.category == 'hostel_maintenance':
+#            row['callback_url'] = "%(url)s/interswitch_acco_cb" % row
+#        else:
+        href = '%(query_url)s' % info
+        href += '?transRef=%(trans_ref)s' % row
+        href += '&prodID=%(prod_id)s' % info
+        href += '&redirectURL=%(callback_url)s' % row
+        row['href'] = href
+    if payment.status == 'paid':
+        row['confirmed'] = 'active'
+    else:
+        row['confirmed'] = 'unsuccessful'
+    row['is_editable'] = is_so and (row['confirmed'] == 'active')
+    payments.append(row)
+
+payments.sort(cmp_id)
+info['payments'] = payments
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/getSchoolFee.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/getSchoolFee.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/getSchoolFee.py	(revision 3690)
@@ -0,0 +1,95 @@
+## Script (Python) "getSchoolFee"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None
+##title=
+##
+# $Id: getSchoolFee.py 2534 2007-11-05 06:37:12Z henrik $
+"""
+return SchoolFee
+"""
+
+
+ARTS = ('CRS','ISS','HIS','MUS','ECO','GEO','POL','SOS','CCA','ECU','THA','GED','GSE','PES','SPC','ENG ','FRE','ARB','HAU','IGB','YOR','FAA')
+
+# SCS = ('BIO','CHE','HED','MAT','PED','PHY ','CSC','ISC','PHE','AGE','BED','HEC','TED')
+
+d = {}
+
+if not brain.mode.endswith('_sw'):
+    if str(brain.level) == '000' and brain.review_state == 'cleared_and_validated':
+        if brain.department in ARTS:
+            d['all'] = 15900
+        else:
+            d['all'] = 16400
+    elif str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':
+        if brain.department in ARTS:
+            d['all'] = 13020
+        else:
+            d['all'] = 13495
+    elif str(brain.level) == '100' and brain.review_state == 'returning':
+        if brain.department in ARTS:
+            d['all'] = 12070
+        else:
+            d['all'] = 12545
+    elif str(brain.level) in ('200','210','220'):
+        if brain.department in ARTS:
+            d['all'] = 12070
+        else:
+            d['all'] = 12545
+    # repeaters = spillover
+    elif str(brain.level) in ('300','310','320'):
+        if brain.department in ARTS:
+            d['all'] = 10170
+        else:
+            d['all'] = 10645
+    else:
+        d['all'] = 0
+else:
+    if str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':
+        if brain.department in ARTS:
+            d['all'] = 21900
+        else:
+            d['all'] = 22400
+    elif str(brain.level) == '100' and brain.review_state == 'returning':
+        if brain.department in ARTS:
+            d['all'] = 18400
+        else:
+            d['all'] = 18900
+    elif str(brain.level) in ('200','210','220'):
+        if brain.department in ARTS:
+            d['all'] = 20400
+        else:
+            d['all'] = 20900
+    elif str(brain.level) in ('300','310','320'):
+        if brain.department in ARTS:
+            d['all'] = 18400
+        else:
+            d['all'] = 18900
+
+    elif str(brain.level) in ('400','410','420'):
+        if brain.department in ARTS:
+            d['all'] = 18400
+        else:
+            d['all'] = 18900
+
+    # repeaters = spillover
+    elif str(brain.level) in ('500','510','520'):
+        if brain.department in ARTS:
+            d['all'] = 16900
+        else:
+            d['all'] = 17400
+    else:
+        d['all'] = 0
+
+
+next_info = context.getNextInfo(brain)
+next_session_str = next_info['next_session_str']
+d['next_session_id'] = next_info['next_session_id']
+d['description'] = "School Fee for Session %s" % next_session_str
+
+return d
+
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/getSimpleStudentStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/getSimpleStudentStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/getSimpleStudentStatistics.py	(revision 3690)
@@ -0,0 +1,149 @@
+## Script (Python) "getRetStudentStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getStudentStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getSimpleStudentStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return
+
+
+catA =      (      'school_fee_paid',
+                   'courses_registered',
+                   'courses_validated',
+                   )
+
+catB =      (      'courses_registered',
+                   'courses_validated',
+                   )
+
+catC =      (      'student_created',
+                   'returning',
+                   'admitted',
+                   'clearance_pin_entered',
+                   'objection_raised',
+                   'clearance_requested',
+                   'cleared_and_validated',
+                   )
+
+current_session = context.getSessionId()[0]
+
+
+returning =  ('110','120','200','210','220','300','310','320',)
+new =        ('100')
+prence   =   ('000')
+
+
+faculties = context.portal_catalog(portal_type="Faculty")
+
+l = []
+
+fac_res = {}
+
+dict = {}
+dict['id'] = 'All Schools'
+dict['title'] = 'All Schools'
+
+
+res_ft = context.students_catalog(level = returning)
+dict['total_ft'] = len(res_ft)
+
+res_pt = context.students_catalog(level = new)
+dict['total_pt'] = len(res_pt)
+
+res_dp = context.students_catalog(level = prence)
+dict['total_dp'] = len(res_dp)
+
+res_Aft = context.students_catalog(review_state = catA, level = returning, session = current_session)
+dict['total_Aft'] = len(res_Aft)
+
+res_Apt = context.students_catalog(review_state = catA, level = new, session = current_session)
+dict['total_Apt'] = len(res_Apt)
+
+res_Adp = context.students_catalog(review_state = catA, level = prence, session = current_session)
+dict['total_Adp'] = len(res_Adp)
+
+res_Bft = context.students_catalog(review_state = catB, level = returning, session = current_session)
+dict['total_Bft'] = len(res_Bft)
+
+res_Bpt = context.students_catalog(review_state = catB, level = new, session = current_session)
+dict['total_Bpt'] = len(res_Bpt)
+
+res_Bdp = context.students_catalog(review_state = catB, level = prence, session = current_session)
+dict['total_Bdp'] = len(res_Bdp)
+
+res_Cft = context.students_catalog(review_state = catC, level = returning, session = current_session)
+dict['total_Cft'] = len(res_Cft)
+
+res_Cpt = context.students_catalog(review_state = catC, level = new, session = current_session)
+dict['total_Cpt'] = len(res_Cpt)
+
+res_Cdp = context.students_catalog(review_state = catC, level = prence, session = current_session)
+dict['total_Cdp'] = len(res_Cdp)
+
+
+res_total = context.students_catalog()
+dict['total_in_catalog'] = len(res_total)
+dict['not_categorized'] = dict['total_in_catalog'] - dict['total_ft'] - dict['total_pt'] - dict['total_dp']
+
+l.append(dict)
+
+
+for f in faculties:
+    dict = {}
+    dict['id'] = f.getId
+    dict['title'] = f.Title
+
+    res_ft = context.students_catalog(faculty = f.getId, level = returning)
+    dict['total_ft'] = len(res_ft)
+
+    res_pt = context.students_catalog(faculty = f.getId, level = new)
+    dict['total_pt'] = len(res_pt)
+
+    res_dp = context.students_catalog(faculty = f.getId, level = prence)
+    dict['total_dp'] = len(res_dp)
+
+    res_Aft = context.students_catalog(faculty = f.getId, review_state = catA, level = returning, session = current_session)
+    dict['total_Aft'] = len(res_Aft)
+
+    res_Apt = context.students_catalog(faculty = f.getId, review_state = catA, level = new, session = current_session)
+    dict['total_Apt'] = len(res_Apt)
+
+    res_Adp = context.students_catalog(faculty = f.getId, review_state = catA, level = prence, session = current_session)
+    dict['total_Adp'] = len(res_Adp)
+
+    res_Bft = context.students_catalog(faculty = f.getId, review_state = catB, level = returning, session = current_session)
+    dict['total_Bft'] = len(res_Bft)
+
+    res_Bpt = context.students_catalog(faculty = f.getId, review_state = catB, level = new, session = current_session)
+    dict['total_Bpt'] = len(res_Bpt)
+
+    res_Bdp = context.students_catalog(faculty = f.getId, review_state = catB, level = prence, session = current_session)
+    dict['total_Bdp'] = len(res_Bdp)
+
+    res_Cft = context.students_catalog(faculty = f.getId, review_state = catC, level = returning, session = current_session)
+    dict['total_Cft'] = len(res_Cft)
+
+    res_Cpt = context.students_catalog(faculty = f.getId, review_state = catC, level = new, session = current_session)
+    dict['total_Cpt'] = len(res_Cpt)
+
+    res_Cdp = context.students_catalog(faculty = f.getId, review_state = catC, level = prence, session = current_session)
+    dict['total_Cdp'] = len(res_Cdp)
+
+
+    l.append(dict)
+
+return l
+
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/getStudyLevelInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/getStudyLevelInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/getStudyLevelInfo.py	(revision 3690)
@@ -0,0 +1,120 @@
+## Script (Python) "getStudyLevelInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student=None
+##title=
+##
+# $Id: getStudyLevelInfo.py 2760 2007-11-26 07:39:15Z henrik $
+"""
+return Info about the Studylevel
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+"""
+
+info = context.waeup_tool.getAccessInfo(context)
+student_id = info['student_id']
+if student_id is None:
+    return None
+
+mtool = context.portal_membership
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+
+course_results = context.course_results
+request = context.REQUEST
+response = request.RESPONSE
+import logging
+logger = logging.getLogger('Skins.getStudyLevelInfo')
+
+level_id  =  context.getId()
+level_doc = info['doc'] = context.getContent()
+
+info['is_so'] = is_so = info['is_sectionofficer']
+#info['is_student'] = is_student = context.isStudent()
+info['is_ca'] = is_ca = context.isCourseAdviser()
+#info['student'] = student = context.students_catalog(id=student_id)[0]
+info['student'] = student = context.students_catalog.getRecordByKey(student_id)
+info['review_state'] = review_state = student.review_state
+is_current_level = level_id == student.level
+school_fee_paid =  review_state == 'school_fee_paid'
+info['is_current_level'] = is_current_level
+info['has_verdict'] = has_verdict = level_doc.verdict
+
+info['submission_allowed']= school_fee_paid and is_current_level and not has_verdict
+info['validation_allowed']= review_state == 'courses_registered' and is_current_level
+info['rejection_allowed']= review_state in ('courses_registered', 'courses_validated',) and is_current_level
+info['validated'] = review_state == 'courses_validated' and is_current_level
+
+info['show_check_boxes'] =  (is_ca and school_fee_paid and is_current_level and not has_verdict) or\
+                            (info['is_student'] and school_fee_paid and is_current_level and not has_verdict) or\
+                            (is_so and is_current_level and not has_verdict)
+
+info['verdict'] = context.portal_vocabularies.verdicts.get(level_doc.verdict).upper()
+info['session'] = context.portal_vocabularies.sessions.get(level_doc.session)
+info['level_str'] = context.portal_vocabularies.student_levels.get(level_id)
+
+info['choosen_ids'] = request.get('ids',[])
+
+#info['status_info'] = ""
+#if is_student:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Request for course validation pending"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+#elif is_ca:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Please validate these courses"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+
+cert_id = student.course
+info['cert_id'] = cert_id
+total_credits,gpa,carry_overs,normal1,normal2,normal3 = course_results.getCourses(student_id,level_id)
+info['total_credits'] = total_credits
+
+#start customization
+
+max_credits = 58
+info['without_score'] = False
+info['without_cascore'] = True
+
+
+
+
+
+
+
+
+
+#end customization
+
+info['max_credits'] = max_credits
+info['credits_exceeded'] = total_credits > max_credits
+current_session = student.session
+
+info['gpa'] = gpa
+if gpa and total_credits:
+    info['gpa'] = "%4.2f" % (float(gpa)/int(total_credits))
+
+# carry_overs.sort(cmp_semester_id)
+info['carry_overs'] = carry_overs
+# normal.sort(cmp_semester_id)
+info['normal1'] = normal1
+info['normal2'] = normal2
+info['normal3'] = normal3
+
+info['data_missing'] = not info['normal1'] and not info['normal2'] and not info['normal3']
+info['spillover'] = student.level > student.end_level
+
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['app'] = student.application
+info['app_doc'] = student.application.getContent()
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/goto_interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/goto_interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/goto_interswitch_form.pt	(revision 3690)
@@ -0,0 +1,49 @@
+<metal:body use-macro="here/main_template/macros/master">
+    <metal:main fill-slot="main"
+                tal:define="info options/info">
+                
+        <h3>Authorize Online Payment! </h3>
+        <br />
+                
+      <form method="post" action="pay_online"
+            tal:attributes="action info/action ">
+      <span tal:repeat="arg python:info['args'].items()"
+            tal:omit-tag="">
+          <input type="hidden" tal:attributes="name python:arg[0];value python:arg[1]" />
+      </span>          
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+          <tr>
+            <td >
+            Surcharge:
+            </td>
+            <td> Naira <span tal:content="info/surcharge" /></td>
+          </tr>          
+      
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Proceed to Payment Gateway" 
+               />
+      </form>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/interswitch_form.pt	(revision 3690)
@@ -0,0 +1,46 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="info options/info">
+    <h3>Confirm Your Payment Data! </h3>
+    <br />
+    <span tal:condition="not: info/payment_possible">
+      No payment information for your course available.
+    </span>
+    <span tal:condition="info/payment_possible">
+      <form method="post" action="pay_interswitch">
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+          <tr>
+            <td >
+            Surcharge:
+            </td>
+            <td> Naira <span tal:content="info/surcharge" /></td>
+          </tr>                  
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Confirm" 
+               />
+      </form>
+    </span>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/layout_student_acco_view_slip.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/layout_student_acco_view_slip.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/layout_student_acco_view_slip.pt	(revision 3690)
@@ -0,0 +1,34 @@
+<!-- a layout_lib macro -->
+<!-- $Id: layout_student_acco_view_slip.pt 1316 2007-01-17 18:05:49Z henrik $ -->
+<metal:block define-macro="default_view"
+  tal:define="layout options/layout;
+              dm options/datastructure/getDataModel;
+              widgets python:context.getRenderedWidgets(layout);
+              fields python:('bed',
+                              'acco_res_date',
+                                 'acco_maint_pay_id', 
+                                 'acco_maint_fee',
+                                 'acco_maint_date',
+                                 )"
+                                 >
+  <table width="" cellpadding="2" cellspacing="0" summary="Form layout">
+    <tr tal:repeat="field fields">
+      <tal:block tal:define="cell python: widgets[field]">
+        <tal:block define="widget cell/widget">
+          <div tal:attributes="class cell/widget_css_class|string:label;
+            id python:widget.getHtmlWidgetId()+'_widget';">
+            <td width="180px" valign="top">
+             <span class="dlabel"
+                    tal:condition="widget/label"
+                    tal:content="widget/label">label</span>:
+            </td>
+            <td> 
+               <span tal:condition="cell" tal:content="structure cell/widget_rendered"></span>
+               <span tal:condition="not:cell/widget_rendered"> none </span>
+            </td>
+          </div>
+        </tal:block>
+      </tal:block>
+    </tr>
+  </table>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/mail2admin.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/mail2admin.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/mail2admin.py	(revision 3690)
@@ -0,0 +1,44 @@
+## Script (Python) "mail2admin"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=fullname=None,regno=None,email=None,probtype=None,descr=None,commt=None
+##title=
+##
+# $Id: mail2admin.py 2334 2007-10-09 15:01:36Z henrik $
+
+mhost = context.MailHost
+prop = context.portal_properties
+
+d = {}
+d['fullname'] = fullname
+d['email'] = email
+d['email_from'] = prop.email_from_address
+d['regno'] = regno
+d['probtype'] = probtype
+d['descr'] = descr
+
+message = """
+From: %(fullname)s <%(email)s>
+To: %(email_from)s
+Cc: %(email)s
+Bcc: waeup@saoas.org
+Reply-To: %(email)s
+Subject: FCEOkene Contact
+
+Fullname: %(fullname)s
+Member ID: %(regno)s
+Problem Type: %(probtype)s
+Description: %(descr)s
+"""
+
+mhost.send(message % d)
+
+REQUEST = context.REQUEST
+RESPONSE = REQUEST.RESPONSE
+
+redirect_url = REQUEST.HTTP_REFERER
+redirect_url = '%s/?%s' % (redirect_url,'portal_status_message=Your message has been sent!')
+RESPONSE.redirect(redirect_url)
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/mail2student.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/mail2student.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/mail2student.py	(revision 3690)
@@ -0,0 +1,45 @@
+## Script (Python) "mail2student"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=co_name=None,co_email=None,student_email=None,probtype=None,commt=None, action=None
+##title=
+##
+# $Id: mail2admin.py 869 2006-11-15 13:46:49Z henrik $
+
+from urllib import urlencode
+
+mhost = context.MailHost
+prop = context.portal_properties
+REQUEST = context.REQUEST
+
+d = {}
+#d['co_name'] = co_name
+#d['co_email'] = co_email
+d['co_name'] = 'FCE Okene'
+d['co_email'] = prop.email_from_address
+d['student_email'] = student_email
+d['probtype'] = probtype
+d['commt'] = commt
+
+message = """
+From: %(co_name)s <%(co_email)s>
+To: %(student_email)s
+Cc: %(co_email)s
+Reply-To: %(co_email)s
+Subject: %(probtype)s
+%(commt)s
+"""
+
+mhost.send(message % d)
+
+args = {}
+psm = "Your message has been sent!"
+args['portal_status_message'] = psm
+if action:
+    url = context.absolute_url() + '/' + action + '?' + urlencode(args)
+else:
+    url = context.absolute_url() +'?' + urlencode(args)
+return REQUEST.RESPONSE.redirect(url)
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/main_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/main_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/main_template.pt	(revision 3690)
@@ -0,0 +1,217 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+  
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  base_url here/getBaseUrl;
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${here/getBaseUrl}${static_dir};
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  student_theme python:test(waeup_skin == 'WAeUP_Student',1,0);
+  navigation_slot python:test(student_theme,'student_navigation_slot','navigation_slot');
+  object_tabs python:test(student_theme,'student_object_slot','staff_object_slot');
+  
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}${waeup_skin}/render.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      
+     
+      <table summary="Logo Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0" 
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;"></td>
+            <td style="width: 170px; text-align: center; padding-top: 0.5em;">
+              <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo" />
+            </td>
+            <td padding=0.5em><h1>Federal College of Education Okene<br />Kogi State, Nigeria</h1></td>
+            <td style="width: 20px;"></td>
+          </tr>
+        </tbody>
+      </table>
+
+      <table summary="Navigation Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="" valign="top">
+              <div id="navigation_slot" 
+                       style="padding: 0em 0em 1px; text-align: right;"
+                       class="fontColornavigation fontShapenavigation portalTabTabStyle cpsskinsHBox body">
+                 <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot=navigation_slot)"
+                  tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+              </div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+      </table>
+      
+      
+      <table summary="Main Table Block 1"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: center;"
+              valign="top">
+            <div id="portal_session" style="padding: 0.4em 0.4em 0.4em 0.3em;"
+                 class="colorBarAreaColor fontColordefaultnovisitedlinks fontShapeaverage shapeAreaShape9">
+                    <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='portal_session')"
+                               tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="text-align: left; padding: 0.2em 0.2em 0em;" class="colorBarColor" valign="top">
+            <metal:block define-slot="action_slot" />
+            <div id="object_tabs" class="fontColornavigation fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot=object_tabs)">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+            </div>
+          </td>
+          <td tal:condition="not:student_theme"
+              class="colorBarColor" valign="top" style="text-align: right;padding: 0.2em 0.2em 0em; width: 280px;">
+            <div id="status_slot" class="fontColordefaultfontcolors fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot='status_slot')">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="width: 20px;"
+              valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+  
+  
+  
+    <table summary="Main Table Block 2"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="" cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: left;"
+              class="colorBarColor fontColornavigation fontShapeaverage boxShapenavbox cpsskinsBox" valign="top">
+            <div id="staff_actions_slot" class="body" style="padding: 1.5em 0.5em 1.5em 0.5em;">
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='staff_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='global_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='student_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+
+              <span tal:condition="student_theme">
+              <div style="padding: 0em;">
+                <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_workflow')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>
+              </span>
+              
+              <div style="padding-top: 10px;">
+              <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_notice_slot')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>  
+
+
+            </div>
+          </td>
+          <td style="" class="shapeAreaShape5 colorBarAreaColor" valign="top">
+            <div style="padding: 0.5em; text-align: left;" class="fontColordefaultfontcolors fontShapeaverage">
+              <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+              <metal:block define-slot="header" />
+              <metal:block define-slot="main" />
+              <metal:block define-slot="sub" />
+            </div>
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+    
+    
+    <table summary="Copyright Info Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="padding: 0.2em; text-align: right;" valign="top">
+              <div class="fontColordefaultfontcolors fontShapeaverage">
+              Copyright WAeUP Group 2006-2008</div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+    </table>
+    </body>
+  </html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/no_booking_allowed.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/no_booking_allowed.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/no_booking_allowed.pt	(revision 3690)
@@ -0,0 +1,8 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+
+    <h3>You are not eligible to book accommodation!</h3>
+
+  </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/pay_interswitch.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/pay_interswitch.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/pay_interswitch.py	(revision 3690)
@@ -0,0 +1,138 @@
+## Script (Python) "pay_online"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: pay_interswitch.py 2619 2007-11-10 17:39:36Z henrik $
+"""
+pay online
+"""
+from urllib import urlencode
+import logging
+logger = logging.getLogger('Skins.pay_interswitch')
+import DateTime
+
+if context.portal_membership.isAnonymousUser():
+    return None
+
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+request = context.REQUEST
+wftool = context.portal_workflow
+students = context.portal_url.getPortalObject().campus.students
+
+
+student_id = context.getStudentId()
+student = getattr(students,student_id)
+
+student_record = context.students_catalog.getRecordByKey(student_id)
+#amount,description = context.getSchoolFee(student_record.faculty,student_record.session,student_record.course)
+info = {}
+info['student'] = student_record
+info['payment_possible'] = False
+info['amount'] = '0'
+info['bank'] = ''
+info['type_description'] = ''
+info['pay_bill_to'] = ''
+fee_dict = context.getSchoolFee(student_record)
+fulltime = student_record.mode.endswith('_ft')
+
+if not fee_dict:
+    return context.interswitch_form(info=info)
+
+info['site_id'] = '83'
+info['currency_id'] = '566'
+
+pay_item_id = "8302"
+#info['type_code'] = sbrain.course  #type_code is redundant and will be removed soon
+info['bank'] = ''
+info['payment_possible'] = True
+info['type_description'] = fee_dict['description']
+info['pay_bill_to'] = student_record.name
+info['student_id'] = student_id
+info['student_name'] = student_record.name
+info['type'] = 'online'
+info['status'] = 'started'
+info['session_id'] = fee_dict['next_session_id']
+info['item'] = student_record.course
+info['category'] = 'schoolfee'
+info['student_email'] = student_record.email
+now = DateTime.DateTime()
+info['date'] = now
+info['pay_ship_to'] = "Federal College of Education Okene"
+timestamp = "%d" % int(now.timeTime()*1000)
+info['order_id'] = "%s%s" % (student_id[1:],timestamp)
+p_id = "p%s" % timestamp
+
+
+info['surcharge'] = interswitch_amount = '150'
+info['amount'] = amount = fee_dict['all']
+total_amount = 100*int(amount) + 100*int(interswitch_amount)
+
+
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+
+if True:
+    info['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+else:
+    #pass
+    #return None
+    info['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),p_id)
+
+
+if "payments" not in student.objectIds():
+    student.invokeFactory('PaymentsFolder','payments')
+    payments = getattr(student,'payments')
+    d = {}
+    d['Title'] = 'Payments'
+    payments.getContent().edit(mapping=d)
+    wftool.doActionFor(payments,'open')
+else:
+    payments = getattr(student,'payments')
+if request.has_key('epayment'):
+    return context.interswitch_form(info=info)
+
+
+payments.invokeFactory('Payment', p_id)
+payment = getattr(payments,p_id)
+wftool.doActionFor(payment,'open')
+d = {}
+d.update(info)
+payment.getContent().edit(mapping=d)
+
+
+info['callback_url'] = "%s/payments/%s/interswitch_cb?echo=%s" % (student.absolute_url(),
+                                                                  p_id,
+                                                                  p_id)
+
+logger.info('%(student_id)s initiated online school fee payment with order_id %(order_id)s and callback url %(callback_url)s' % info)
+payment_fields = (('product_id','site_id'),
+                  ('site_redirect_url','callback_url'),
+                  ('Currency','currency_id'),
+                  ('cust_id','student_id'),
+                  ('cust_id_desc','type_description'),
+                  ('cust_name','student_name'),
+                  ('txn_ref','order_id'),
+                  ('Amount','amount'),
+                  )
+args = {}
+for arg,field in payment_fields:
+    args[arg] = info[field]
+
+args['Amount'] = "%d" % (total_amount)
+args['site_name'] = "fceokene.waeup.org"
+args['cust_name_desc'] = "Student Name"
+args['pay_item_id'] = pay_item_id
+args['pay_item_name'] = "FCEOKENE Tuition Payments"
+args['payment_params'] = 'switch_college_split'
+args['xml_data'] = ''
+info['args'] = args
+return context.goto_interswitch_form(info=info)
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/search_students_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/search_students_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/search_students_form.pt	(revision 3690)
@@ -0,0 +1,128 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="rendered options/rendered;
+              portal_status_message options/psm;
+              students options/students;
+              info options/info|nothing;
+              is_so context/isSectionOfficer;
+              allowed options/allowed|nothing;"
+              >
+    <span tal:condition="not: allowed">
+      <span tal:content="here/illegal_view" />
+    </span>
+    <span tal:condition="allowed" tal:omit-tag="">
+      <strong>
+        <nobr><a href="statistics_simple_view">Basic Student Statistics</a>
+        &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+        <span tal:condition="is_so">
+          <nobr><a href="apply_admission_manage">Application Process</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+          <nobr><a href="view_logs">View Log Files</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="add_student">Add Student Record</a>        
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="deactivate_students">Deactivate Student Record(s)</a></nobr>
+        </span>
+      </strong>
+      <h3> Search Student Section</h3><br />
+      You are logged in as member <span tal:replace="info/member|nothing" /> 
+      <span tal:condition="info/faculties|nothing" tal:omit-tag="">
+        who is ClearanceOfficer for Faculty 
+        <span tal:repeat="faculty info/faculties" tal:content="faculty" />
+      </span>
+      <span tal:condition="info/departments|nothing" tal:omit-tag="">
+        and <span tal:repeat="department info/departments|nothing" tal:content="department"/></span>.
+      <br /><br />
+      <span tal:replace="structure rendered" />
+      <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+      <span tal:condition="students">
+        <span tal:define="items students;
+        columns python:3;
+        items_per_page python:40;
+        max_items python:300;
+        zoom python:0;
+        batches_all python:here.getBatchList(items,columns, items_per_page,zoom,max_items=400);
+        batches python:batches_all[0];
+        batch_info python:batches_all[1];
+        zoomed python:batches_all[2];
+        mq nocall:modules/ZTUtils/make_query;"
+        tal:omit-tag="">
+          <tal:block tal:condition="python: items and batch_info and batch_info['nb_pages'] > 1">
+            <div class="batchLayout" i18n:translate="">
+              Objects:<strong><tal:block replace="batch_info/start"
+                                         i18n:name="batch_start" /> - <tal:block replace="batch_info/limit"
+                                                                                 i18n:name="batch_limit" />
+              </strong> of <tal:block replace="batch_info/length" i18n:name="batch_length" />
+            </div>
+            <br />
+          </tal:block>
+          <table class="contentListing" width="100%">
+            <span tal:repeat="rows batches" tal:omit-tag="">
+              <span tal:repeat="student rows">
+                <tr tal:condition="student" 
+                    tal:attributes="class python:test(repeat['student'].even(), 'even ajaxtd', 'odd ajaxtd')">
+                  <td><a href="id" tal:attributes="href string:${context/portal_url}/campus/students/${student/id}"
+                         tal:content="student/id"></a></td>    
+                  <td>
+                    <span tal:replace="student/name" />
+                  </td>    
+                  <td><span tal:replace="student/matric_no" /></td>   
+                  <td><span tal:replace="student/jamb_reg_no" /></td>
+                  <td tal:condition="options/co_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/clearance/external_clearance_edit_form"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and change state]</a></td>
+                  <td tal:condition="options/ca_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/study_course/${student/level}/external_study_level_view"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and validate course list]</a></td>
+                </tr>
+              </span>
+            </span>
+          </table>
+          <tal:block condition="python:batch_info and batch_info['nb_pages'] > 1">
+            <div class="pageNavigationLayout">
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=0))"
+                 >
+              (&lt;&lt;)</a>
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=previous))"
+                 i18n:translate="batch_previous">Previous</a>
+              <tal:block repeat="page batch_info/pages">
+                <tal:block condition="python:page != batch_info['start'] - 1">
+                  <a tal:attributes="href python:'%s?%s'%(request['URL'],
+                  mq(request.form, b_start=page))"
+                  tal:content="repeat/page/number">1</a>&nbsp;
+                </tal:block>
+                <tal:block condition="python:page == batch_info['start'] - 1">
+                  <span tal:content="string:${repeat/page/number}" />&nbsp;
+                </tal:block>
+              </tal:block>
+              <a tal:define="next batch_info/next"
+                 tal:condition="python:next is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=next))"
+                 i18n:translate="batch_next">Next</a>
+              <a tal:define="next batch_info/next;
+              last_page python:batch_info['pages'][-1]"
+              tal:condition="python:next is not None"
+              tal:attributes="href python:'%s?%s'%(request['URL'],
+              mq(request.form, b_start=last_page))"
+              >
+              (&gt;&gt;)</a>
+            </div>
+          </tal:block>
+        </span>
+      </span>
+    </span>
+  </metal:main>
+</metal:body>
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/slip_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/slip_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/slip_template.pt	(revision 3690)
@@ -0,0 +1,109 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  base_url here/getBaseUrl;
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${base_url}${static_dir};    
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+   
+    <table summary="Logo Block"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           class="shapeNoBorder colorTransparent" cellpadding="0"
+           cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td valign="top" style="width: 80px; padding: 0.5em; text-align: right;">
+            <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo"
+                     height="84"  />
+          </td>
+          <td style="padding: 1em 0em 0em 0em; text-align: left;" valign="top">
+             <h2>Federal College of Education Okene<br />Kogi State, Nigeria</h2>
+          
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+      
+    <table summary="Main Block" cellpadding="0" cellspacing="0" 
+           style="margin-left:auto;margin-right:auto;width:100%;">
+      <tr>
+        <td valign="top" style="width:700px">
+          <div style="padding:2em; text-align: left;" 
+               class="fontColordefaultfontcolors fontShapeTitleindex shapeAreaShape">
+                  <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+                  <metal:block define-slot="header" />
+                  <metal:block define-slot="main" />
+                  <metal:block define-slot="sub" />
+          </div>
+        </td>
+      </tr>
+    </table>
+  </body>
+</html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/statistics_simple_view.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/statistics_simple_view.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/statistics_simple_view.pt	(revision 3690)
@@ -0,0 +1,135 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+  <metal:block tal:define="faculties context/getSimpleStudentStatistics;
+                        mtool here/portal_membership;
+                        member mtool/getAuthenticatedMember;
+                        session_str python:context.getSessionId()[1]">       
+
+      <span tal:condition="not: faculties">
+        <span tal:content="here/illegal_view" />
+      </span>
+      <span tal:condition="faculties">
+  
+      <strong>
+      <nobr><a href="search_students">Search Students</a>
+      &nbsp;&nbsp;&nbsp;&nbsp;</nobr>        
+   
+      </strong>     
+
+      <h3>Basic Student Statistics <span tal:content="session_str" /></h3>
+      <br />      
+      <span tal:condition="not:isAnon">
+      Student records imported: <span tal:content="python: faculties[0]['total_in_catalog']" />
+      <br />  <br />  
+        <table >  
+
+          <tr>
+            <th>&nbsp;</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="3">All Students</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="3">Category A</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="3">Category B</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="3">Category C</th>
+
+
+          </tr>
+
+          <tr class="odd ajaxtd">
+            <th >School</th>
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+            <th align="right">Pre-NCE</th>
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+            <th align="right">Pre-NCE</th>
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+            <th align="right">Pre-NCE</th>
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+            <th align="right">Pre-NCE</th>
+
+          </tr>
+          <tr tal:repeat="d faculties"
+              tal:attributes="class python:test(repeat['d'].even(), 'even ajaxtd', 'odd ajaxtd')">
+              <td width="80px"> <span tal:content="d/id" /> </td>
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_ft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_pt" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_dp" />
+              </td>                 
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Aft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Apt" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Adp" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bpt" />
+              </td>              
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bdp" />
+              </td>      
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cft" />
+              </td>      
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cpt" />
+              </td>      
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cdp" />
+              </td>                                                
+
+                                       
+
+          </tr>
+        </table>
+
+        <br />
+        <table   border=0>
+
+        <tr><td>Category A: </td> <td>students who paid their school fee in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category B: </td> <td>students who registered their courses online (A contains B) in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category C: </td> <td>students who 'arrived' in <span tal:content="session_str" /> but have not yet paid their school fee</td></tr>
+        <tr><td>Returning: </td> <td>students in NCE-II or NCE-III</td></tr>
+        <tr><td>New: </td> <td>students in NCE-I</td></tr>
+        <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
+        <tr><td colspan="2"><strong>Remark:</strong> <span tal:content="python: faculties[0]['not_categorized']" /> returning students are not categorized.
+             </td>
+        </tr>
+          
+        </table>
+        
+        
+        
+      </span>
+      </span>
+  </metal:block>      
+  </metal:main>
+</metal:body>
+      
Index: /WAeUP_SRP/trunk/skins/waeup_fceokene/student_index.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_fceokene/student_index.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_fceokene/student_index.py	(revision 3690)
@@ -0,0 +1,54 @@
+## Script (Python) "student_index"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=batch=None,portal_status_message=None
+##title=
+##
+# $Id: student_index.py 2297 2007-10-01 07:26:30Z henrik $
+"""
+return the current student_index
+"""
+
+request = context.REQUEST
+#session = request.SESSION
+response = request.RESPONSE
+redirect = response.redirect
+pm = context.portal_membership
+member = pm.getAuthenticatedMember()
+
+#from Products.zdb import set_trace;set_trace()
+if context.isStaff():
+    if context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.study_level_view()
+    elif context.portal_type == 'StudentClearance':
+        return context.clearance_view()
+    elif context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Student':
+        if portal_status_message:
+            return redirect("%s/student_view?portal_status_message=%s" % (context.absolute_url(),portal_status_message))
+        else:
+            return redirect("%s/student_view" % context.absolute_url())
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    return redirect("%s/waeup_document_view" % context.absolute_url())
+if context.isStudent():
+    if context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.study_level_view()
+    elif context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    students_url = "%s/campus/students" % (context.portal_url())
+    id = str(member)
+    return redirect("%s/%s/student_view" % (students_url, id))
+
+return redirect("%s/srp_anonymous_view" % context.portal_url())
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/apply_admission_manage_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/apply_admission_manage_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/apply_admission_manage_form.pt	(revision 3690)
@@ -0,0 +1,94 @@
+<tal:block define="rendered_main options/rendered|nothing;
+           portal_status_message options/psm|nothing;
+           reg_no options/reg_no|nothing;
+           ds options/ds|nothing;
+           "
+           >	
+  <metal:block define-macro="edit_form">
+    <metal:block use-macro="here/main_template/macros/master">
+      <metal:block fill-slot="main">
+
+        <form action="" id="editForm" method="post" 
+              enctype="multipart/form-data" class="workflow"
+              tal:attributes="action string:${context/absolute_url}/apply_admission_manage"
+              >
+
+          <span tal:condition="not: rendered_main">
+            <h3>Application Process</h3>
+            <br />
+            
+            <table tal:define="info_applicants context/getApplicantsStatistics">
+            <tr> 
+              <td>PCE Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_pce" /></td>  
+            </tr>
+            <tr> 
+              <td>Pre-NCE Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_prence" /></td>
+            </tr>
+            <tr> 
+              <td>All Applicants (status admitted):</td> 
+              <td><span tal:replace="info_applicants/admitted" /></td>  
+            </tr>
+            <tr> 
+              <td>All Applicants (status student record created):</td> 
+              <td><span tal:replace="info_applicants/created" /></td>
+            </tr>            
+            <tr> 
+              <td>All Applicants (status not admitted):</td> 
+              <td><span tal:replace="info_applicants/not_admitted" /></td>  
+            </tr>    
+            </table>            
+            
+            <br/>
+            
+            <div class="label">Registration No:</div>
+            <input type="text" name="reg_no" size="15"
+                   />
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search" 
+                   />
+          </span>
+
+          <span tal:condition="rendered_main">
+            <h3>Application Record <span tal:replace="reg_no"/></h3>
+            <br />
+            <div tal:replace="structure rendered_main" />
+                        
+            <input type="hidden" name="reg_no"
+                   tal:attributes="value reg_no|nothing"
+                   />
+            <input type="submit" class="standalone" 
+                   name="reset"
+                   value="Reset" 
+                   tal:condition="python: ds['status'] and 'submitted' in ds['status']"
+                   />
+                   
+                   
+            <input type="submit" class="standalone" 
+                   name="edit"
+                   value="Save" 
+                   />                   
+                   
+            <br /><br />
+            
+
+            <div class="label">Registration No:</div>
+            <input type="text" name="new_reg_no" size="15"
+                   /> &nbsp;
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search next" 
+                   />
+          </span>
+        </form>
+        
+        <br/>
+        
+      
+        
+      </metal:block>
+    </metal:block>
+  </metal:block>
+</tal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getAccommodationInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getAccommodationInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getAccommodationInfo.py	(revision 3690)
@@ -0,0 +1,108 @@
+## Script (Python) "getAccommodationInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_id=None
+##title=
+##
+# $Id: getAccommodationInfo.py 1726 2007-05-02 06:21:50Z henrik $
+"""
+return Info about the current Student
+"""
+import logging
+logger = logging.getLogger('Skins.getAccommodationInfo')
+import DateTime
+
+request = context.REQUEST
+mtool = context.portal_membership
+wf = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+path_info = request.get('PATH_INFO').split('/')
+
+if mtool.isAnonymousUser():
+    return None
+info = {}
+if student_id is None:
+    requested_id = context.getStudentId()
+    if requested_id and not context.isStaff() and member_id != requested_id:
+        logger.info('%s tried to access %s' % (member_id,requested_id))
+        return None
+    elif context.isStaff():
+        student_id = requested_id
+    else:
+        student_id = member_id
+student_record = context.students_catalog.getRecordByKey(student_id)
+if student_record is None:
+    logger.info('%s not found in students_catalog' % student_id)
+    return None
+
+info['error'] = None
+info['matric_no']=student_record.matric_no
+info['jamb_reg_no']=student_record.jamb_reg_no
+info['name']=student_record.name
+info['email']=student_record.email
+info['level']=student_record.level
+info['verdict']=getattr(student_record,'verdict','')
+review_state = info['review_state'] = student_record.review_state
+info['session'] = session = context.getSessionId()
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['student_id'] = student_id
+info['student'] = student
+
+booking_allowed = False
+
+# customize from here
+
+try:
+    level = int(student_record.level)
+except:
+    logger.info('%s has invalid level %s' % (student_id,student_record.level))
+    info['acco'] = None
+    info['booking_allowed'] = False
+    info['student_status'] = ''
+    return info    
+
+if review_state in ('school_fee_paid','courses_registered', 'courses_validated',) and student_record.session == session[0]:
+    info['booking_allowed'] = True
+    info['online_payment'] = True
+else:
+    info['acco'] = None
+    info['booking_allowed'] = False
+    info['student_status'] = ''
+    return info
+
+acco_id = 'accommodation_' + session[0]
+acco = getattr(student,acco_id,None)
+info['acco'] = acco
+info['acco_id'] = acco_id
+
+info['maintenance_paid'] = False
+if acco is not None:
+    info['acco_doc'] = acco.getContent()
+    info['acco_review_state'] = wf.getInfoFor(acco,'review_state',None)
+    info['maintenance_paid'] = info['acco_review_state'] == "maintenance_fee_paid"
+d = {}
+if level >= 300:
+   bt = 'fi'
+if level == 100:
+    bt = 'fr'
+elif level < 100:
+    bt = 'pr'    
+elif level < 300:
+    bt = 're'
+
+d['sex'] = 'male'
+if student_record.sex:
+    d['sex'] = 'female'
+
+
+info['sex']=d['sex']
+d['bt'] = bt
+student_status = "%(sex)s_%(bt)s" % d
+info['student_status'] = student_status
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getApplicantsStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getApplicantsStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getApplicantsStatistics.py	(revision 3690)
@@ -0,0 +1,39 @@
+## Script (Python) "getApplicantsStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getApplicantsStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getApplicantsStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return 'Not allowed'
+
+
+info = {}
+res_submitted_pce = context.applicants_catalog(status = 'submitted', screening_type = 'pce')
+res_not_admitted = context.applicants_catalog(status = 'not admitted')
+res_submitted_prence = context.applicants_catalog(status = 'submitted', screening_type = 'prence')
+res_admitted = context.applicants_catalog(status = 'admitted')
+res_created = context.applicants_catalog(status = 'created')
+
+info['submitted_pce'] = len(res_submitted_pce)
+info['admitted'] = len(res_admitted)
+info['not_admitted'] = len(res_not_admitted)
+info['submitted_prence'] = len(res_submitted_prence)
+info['created'] = len(res_created)
+
+return info
+
+
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getCosCombinedVoc.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getCosCombinedVoc.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getCosCombinedVoc.py	(revision 3690)
@@ -0,0 +1,17 @@
+##parameters=key=None
+# $Id: getCosCombinedVoc.py 2814 2007-11-28 12:26:51Z henrik $
+"""
+Return the combined courses as an vocabulary
+
+"""
+if key is None:
+    l = []
+    for k,v in context.portal_vocabularies.cos.items():
+        l += (k,v),
+    return l
+for voc in (context.portal_vocabularies.cos,):
+    title = voc.get(key,None)
+    if title is not None:
+        return title
+    else:
+        raise KeyError
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getInterswitchParams.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getInterswitchParams.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getInterswitchParams.py	(revision 3690)
@@ -0,0 +1,40 @@
+## Script (Python) "getInterswitchParams"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=paytype,student,payment_id,student_record
+##title=
+##
+# $Id: getInterswitchParams.py 3627 2008-08-17 08:07:44Z henrik $
+
+test = ""
+d = {}
+d['payment_possible'] = True
+d['pay_ship_to'] = "Federal College Okene"
+
+d['site_id'] = '83'
+d['site_name'] = "fceokene.waeup.org"
+d['currency_id'] = '566'
+d['type'] = 'online'
+d['status'] = 'started'
+d['surcharge'] = '150'
+if test == 'simulate':
+    d['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),payment_id) #do not use simulate_callback
+elif test == 'test':
+    d['action'] = "https://webpay.interswitchng.com/test_paydirect/webpay/pay.aspx"
+else:
+    d['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+if paytype in ("HOM",):
+    d['callback_function'] = 'interswitch_cb'
+    d['pay_item_id'] = '8300'
+    d['type_description'] = 'Hostel Maintenance Fee'
+    d['pay_item_name'] = "FCE Okene %(type_description)s" % d
+    d['amount'] = '4000'
+    d['category'] = 'hostel_maintenance'
+    d['item'] = paytype
+    #d['payment_params'] = 'switch_college_split'
+    d['payment_params'] = '0'
+
+return d
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getNextInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getNextInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getNextInfo.py	(revision 3690)
@@ -0,0 +1,62 @@
+## Script (Python) "getNextInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_brain
+##title=
+##
+# $Id: getNextInfo.py 2678 2007-11-16 13:41:44Z henrik $
+"""
+return the students next info
+"""
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+info = {}
+
+reasons = ''
+
+session_id = student_brain.session
+level_id = student_brain.level
+review_state = student_brain.review_state
+verdict = student_brain.verdict
+
+has_verdict = verdict and verdict != 'N/A'
+has_session = session_id and session_id != 'N/A'
+has_level = level_id and level_id != 'N/A'
+
+info['next_transition'] = None
+info['next_session_id'] = next_session_id = session_id
+info['next_level_id'] = next_level_id = level_id
+info['next_verdict'] = verdict
+info['next_previous_verdict'] = ''
+verdicts_voc = context.portal_vocabularies.verdicts
+if review_state == 'cleared_and_validated':
+    info['next_transition'] = "pay_school_fee"
+    info['next_verdict'] = ''
+elif review_state == 'returning' and has_verdict and has_level and has_session:
+    info['next_session_id'] = next_session_id = "%02d" % (int(session_id)+1)
+    if int(session_id) > 4:
+        info['next_transition'] = "pay_school_fee"
+        info['next_verdict'] = ''
+        info['next_previous_verdict'] = verdict
+        if verdict in ('A','B','G','C','Z',):                                     #customized
+            info['next_level_id'] = "%s" % (int(level_id) + 100)
+        #elif verdict == 'C':
+        #    info['next_level_id'] = "%s" % (int(level_id) + 10)
+        else:
+            info['next_level_id'] = level_id
+    else:
+        info['next_level_id'] = "%s" % (int(level_id) + 100)
+elif review_state == 'returning' and not (has_session and has_level and has_verdict):
+    reasons = "Your data record is incomplete. School fee payment has been disabled, please contact your faculty!"
+
+info['reasons'] = reasons
+info['next_session_str'] = context.getSessionsVoc(next_session_id)
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getPaymentsFolderInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getPaymentsFolderInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getPaymentsFolderInfo.py	(revision 3690)
@@ -0,0 +1,131 @@
+## Script (Python) "getPaymentsFolderInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getPaymentsFolderInfo.py 2480 2007-10-30 15:23:25Z joachim $
+"""
+Info for the PaymentsFolder
+"""
+from Products.AdvancedQuery import Eq, Between, Le,In
+
+mtool = context.portal_membership
+wftool = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+payments_catalog = context.payments_catalog
+aq_payments = payments_catalog.evalAdvancedQuery
+if mtool.isAnonymousUser():
+    return None
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+def cmp_id(a,b):
+    s1 = "%(id)s" % a
+    s2 = "%(id)s" % b
+    if s1 == s2:
+        return 0
+    if s1 > s2:
+        return 1
+    return -1
+
+import DateTime
+request = context.REQUEST
+#students = context.portal_url.getPortalObject().campus.students
+student_id = context.getStudentId()
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+#student = getattr(students,student_id)
+student_record = context.students_catalog.getRecordByKey(student_id)
+
+
+info = {}
+is_so = info['is_so'] = context.isSectionOfficer()
+is_student = info['is_student'] = context.isStudent()
+info['student_name'] = student_record.name
+info['query_url'] = "https://webpay.interswitchng.com/paydirect/services/TransactionQueryURL.aspx"
+review_state = info['review_state'] = student_record.review_state
+parttime = student_record.mode and student_record.mode.endswith('_pt')
+fulltime = student_record.mode and student_record.mode.endswith('_ft')
+
+
+session = student_record.session
+next_info = context.getNextInfo(student_record)
+info['next_session'] = next_info['next_session_id']
+info['next_session_str'] = next_info['next_session_str']
+info['payment_method'] = ""
+info['reasons'] = next_info['reasons']
+
+# begin customization
+
+if review_state == 'cleared_and_validated':
+    info['payment_method'] = "online_payment"
+#elif review_state == 'cleared_and_validated' and session == '07':
+#    info['payment_method'] = "sc_payment"
+elif review_state == 'returning' and info['next_session'] != session:
+    info['payment_method'] = "online_payment"
+info['prod_id'] = '105'
+
+# end customization
+
+info['student_name'] = student_record.name
+payments_path = "%s/campus/students/%s/payments" % (context.portal_url(),student_id)
+payments = []
+payment_records = aq_payments(Eq('student_id',student_id)) # & Eq('session_id',student_record.session))
+vocabularies = context.portal_vocabularies
+paid_fees = []
+for payment in payment_records:
+    if payment.status == "paid":
+        paid_fees += "%s_%s" % (payment.category,payment.session_id),
+#info['pf'] = paid_fees
+for payment in payment_records:
+    row = {}
+    row['id'] = payment.key
+    if payment.status == 'invalid':
+        row['title'] = "Invalid Payment, Naira %s, %s" % (payment.amount,
+                                                          payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    else:
+        row['title'] = "%s for Session %s, Naira %s, %s" % (vocabularies.payment_categories.get(payment.category),
+                                                            vocabularies.sessions.get(payment.session_id),
+                                                            payment.amount,
+                                                            payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    oid = payment.order_id
+    onr = oid.rfind('-')+1
+    if onr > 0:
+        start_pos = onr
+    else:
+        start_pos = 6
+    url = row['url'] = "%s/p%s" % (payments_path,oid[start_pos:])
+    row['is_requeryable'] = "%s_%s" % (payment.category,payment.session_id) not in paid_fees and not payment.resp_desc and payment.type == 'online'# or str(member) in ('admin',)  # customized too
+    row['is_approvable'] = is_so and row['is_requeryable'] and payment.category == 'schoolfee' # does not make sense for maintenance
+    row['resp_desc'] = payment.resp_desc or 'Payment Process Interrupted'
+    row['trans_ref'] = payment.order_id
+    if row['is_requeryable']:
+        row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        if payment.category == 'schoolfee':
+#            row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        elif payment.category == 'hostel_maintenance':
+#            row['callback_url'] = "%(url)s/interswitch_acco_cb" % row
+#        else:
+        href = '%(query_url)s' % info
+        href += '?transRef=%(trans_ref)s' % row
+        href += '&prodID=%(prod_id)s' % info
+        href += '&redirectURL=%(callback_url)s' % row
+        row['href'] = href
+    if payment.status == 'paid':
+        row['confirmed'] = 'active'
+    else:
+        row['confirmed'] = 'unsuccessful'
+    row['is_editable'] = is_so and (row['confirmed'] == 'active')
+    payments.append(row)
+
+payments.sort(cmp_id)
+info['payments'] = payments
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getSchoolFee.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getSchoolFee.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getSchoolFee.py	(revision 3690)
@@ -0,0 +1,54 @@
+## Script (Python) "getSchoolFee"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None
+##title=
+##
+# $Id: getSchoolFee.py 2534 2007-11-05 06:37:12Z henrik $
+"""
+return SchoolFee
+"""
+
+
+d = {}
+
+if brain.mode == 'ug_sw':  
+    if str(brain.level) == '100':    # both 100 fresh and 100 returning who register for 200
+        d['all'] = 35000
+    else:
+        d['all'] = 30000
+elif brain.mode == 'pg_sw':  
+    d['all'] = 35000
+elif brain.mode == 'dp_pt':  
+    if str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':    # only 100 fresh 
+        d['all'] = 40000
+    else:
+        d['all'] = 35000
+elif brain.mode == 'ug_pt':  
+    if str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':    # only 100 fresh 
+        d['all'] = 50000
+    else:
+        d['all'] = 45000
+elif brain.mode == 'pg_pt':  
+    if str(brain.level) == '600' and brain.review_state == 'cleared_and_validated':    # only 600 fresh 
+        d['all'] = 60000
+    elif str(brain.level) == '600' and brain.verdict == 'C':                           # 600 repeaters
+        d['all'] = 55000
+    elif str(brain.level) == '600':                                                    # going to register for 700
+        d['all'] = 75000        
+    else:
+        d['all'] = 65000
+else:
+    d['all'] = 0
+
+
+next_info = context.getNextInfo(brain)
+next_session_str = next_info['next_session_str']
+d['next_session_id'] = next_info['next_session_id']
+d['description'] = "School Fee for Session %s" % next_session_str
+
+return d
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getSimpleStudentStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getSimpleStudentStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getSimpleStudentStatistics.py	(revision 3690)
@@ -0,0 +1,137 @@
+## Script (Python) "getRetStudentStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getStudentStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getSimpleStudentStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return
+
+
+catA =      (      'school_fee_paid',
+                   'courses_registered',
+                   'courses_validated',
+                   )
+
+catB =      (      'courses_registered',
+                   'courses_validated',
+                   )
+
+catC =      (      'student_created',
+                   'returning',
+                   'admitted',
+                   'clearance_pin_entered',
+                   'objection_raised',
+                   'clearance_requested',
+                   'cleared_and_validated',
+                   )
+
+current_session = context.getSessionId()[0]
+
+
+returning =  ('110','120','200','210','220','300','310','320','400','410','420','500','510', '520','500','510','520','610','620','700','710','720','800','810','820',)
+new =        ('100','600')
+
+
+faculties = context.portal_catalog(portal_type="Faculty")
+
+l = []
+
+fac_res = {}
+
+dict = {}
+dict['id'] = 'All Faculties'
+dict['title'] = 'All Faculties'
+
+
+res_ft = context.students_catalog(level = returning)
+dict['total_ft'] = len(res_ft)
+
+res_pt = context.students_catalog(level = new)
+dict['total_pt'] = len(res_pt)
+
+res_Aft = context.students_catalog(review_state = catA, level = returning, session = current_session)
+dict['total_Aft'] = len(res_Aft)
+
+res_Apt = context.students_catalog(review_state = catA, level = new, session = current_session)
+dict['total_Apt'] = len(res_Apt)
+
+
+
+res_Bft = context.students_catalog(review_state = catB, level = returning, session = current_session)
+dict['total_Bft'] = len(res_Bft)
+
+res_Bpt = context.students_catalog(review_state = catB, level = new, session = current_session)
+dict['total_Bpt'] = len(res_Bpt)
+
+
+
+res_Cft = context.students_catalog(review_state = catC, level = returning, session = current_session)
+dict['total_Cft'] = len(res_Cft)
+
+res_Cpt = context.students_catalog(review_state = catC, level = new, session = current_session)
+dict['total_Cpt'] = len(res_Cpt)
+
+
+
+
+res_total = context.students_catalog()
+dict['total_in_catalog'] = len(res_total)
+dict['not_categorized'] = dict['total_in_catalog'] - dict['total_ft'] - dict['total_pt']
+
+l.append(dict)
+
+
+for f in faculties:
+    dict = {}
+    dict['id'] = f.getId
+    dict['title'] = f.Title
+
+    res_ft = context.students_catalog(faculty = f.getId, level = returning)
+    dict['total_ft'] = len(res_ft)
+
+    res_pt = context.students_catalog(faculty = f.getId, level = new)
+    dict['total_pt'] = len(res_pt)
+
+
+    res_Aft = context.students_catalog(faculty = f.getId, review_state = catA, level = returning, session = current_session)
+    dict['total_Aft'] = len(res_Aft)
+
+    res_Apt = context.students_catalog(faculty = f.getId, review_state = catA, level = new, session = current_session)
+    dict['total_Apt'] = len(res_Apt)
+
+
+
+    res_Bft = context.students_catalog(faculty = f.getId, review_state = catB, level = returning, session = current_session)
+    dict['total_Bft'] = len(res_Bft)
+
+    res_Bpt = context.students_catalog(faculty = f.getId, review_state = catB, level = new, session = current_session)
+    dict['total_Bpt'] = len(res_Bpt)
+
+
+
+    res_Cft = context.students_catalog(faculty = f.getId, review_state = catC, level = returning, session = current_session)
+    dict['total_Cft'] = len(res_Cft)
+
+    res_Cpt = context.students_catalog(faculty = f.getId, review_state = catC, level = new, session = current_session)
+    dict['total_Cpt'] = len(res_Cpt)
+
+
+
+
+    l.append(dict)
+
+return l
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getStudyLevelInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getStudyLevelInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getStudyLevelInfo.py	(revision 3690)
@@ -0,0 +1,124 @@
+## Script (Python) "getStudyLevelInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student=None
+##title=
+##
+# $Id: getStudyLevelInfo.py 2760 2007-11-26 07:39:15Z henrik $
+"""
+return Info about the Studylevel
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+"""
+
+info = context.waeup_tool.getAccessInfo(context)
+student_id = info['student_id']
+if student_id is None:
+    return None
+
+mtool = context.portal_membership
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+
+course_results = context.course_results
+request = context.REQUEST
+response = request.RESPONSE
+import logging
+logger = logging.getLogger('Skins.getStudyLevelInfo')
+
+level_id  =  context.getId()
+level_doc = info['doc'] = context.getContent()
+
+info['is_so'] = is_so = info['is_sectionofficer']
+#info['is_student'] = is_student = context.isStudent()
+info['is_ca'] = is_ca = context.isCourseAdviser()
+#info['student'] = student = context.students_catalog(id=student_id)[0]
+info['student'] = student = context.students_catalog.getRecordByKey(student_id)
+info['review_state'] = review_state = student.review_state
+is_current_level = level_id == student.level
+school_fee_paid =  review_state == 'school_fee_paid'
+info['is_current_level'] = is_current_level
+info['has_verdict'] = has_verdict = level_doc.verdict
+
+info['submission_allowed']= school_fee_paid and is_current_level and not has_verdict
+info['validation_allowed']= review_state == 'courses_registered' and is_current_level
+info['rejection_allowed']= review_state in ('courses_registered', 'courses_validated',) and is_current_level
+info['validated'] = review_state == 'courses_validated' and is_current_level
+
+info['show_check_boxes'] =  (is_ca and school_fee_paid and is_current_level and not has_verdict) or\
+                            (info['is_student'] and school_fee_paid and is_current_level and not has_verdict) or\
+                            (is_so and is_current_level and not has_verdict)
+
+info['verdict'] = context.portal_vocabularies.verdicts.get(level_doc.verdict).upper()
+info['session'] = context.portal_vocabularies.sessions.get(level_doc.session)
+info['level_str'] = context.portal_vocabularies.student_levels.get(level_id)
+
+info['choosen_ids'] = request.get('ids',[])
+
+#info['status_info'] = ""
+#if is_student:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Request for course validation pending"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+#elif is_ca:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Please validate these courses"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+
+cert_id = student.course
+info['cert_id'] = cert_id
+total_credits,gpa,carry_overs,normal1,normal2,normal3 = course_results.getCourses(student_id,level_id)
+info['total_credits'] = total_credits
+
+#start customization
+
+
+
+max_credits = 58
+info['without_score'] = False
+info['without_cascore'] = False
+
+items = []
+subobjects = context.objectValues()
+for subobject in subobjects:
+    row = {}
+    row['id'] = subobject.getId()
+    row['title'] = '%s' % context.portal_vocabularies.terms.get(subobject.getId())
+    items.append(row)
+info['items'] = items
+
+
+#end customization
+
+info['max_credits'] = max_credits
+info['credits_exceeded'] = total_credits > max_credits
+current_session = student.session
+
+info['gpa'] = gpa
+if gpa and total_credits:
+    info['gpa'] = "%4.2f" % (float(gpa)/int(total_credits))
+
+# carry_overs.sort(cmp_semester_id)
+info['carry_overs'] = carry_overs
+# normal.sort(cmp_semester_id)
+info['normal1'] = normal1
+info['normal2'] = normal2
+info['normal3'] = normal3
+
+info['data_missing'] = not info['normal1'] and not info['normal2'] and not info['normal3']
+info['spillover'] = student.level > student.end_level
+
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['app'] = student.application
+info['app_doc'] = student.application.getContent()
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_ois/getTranscriptInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/getTranscriptInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/getTranscriptInfo.py	(revision 3690)
@@ -0,0 +1,88 @@
+## Script (Python) "getTranscriptInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student=None
+##title=
+##
+# $Id: getStudyLevelInfo.py 2760 2007-11-26 07:39:15Z henrik $
+"""
+return Info about the Studylevel
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+"""
+
+request = context.REQUEST
+response = request.RESPONSE
+import logging
+logger = logging.getLogger('Skins.getTranscriptInfo')
+info = context.waeup_tool.getAccessInfo(context)
+student_id = info['student_id']
+if student_id is None:
+    return None
+
+mtool = context.portal_membership
+if mtool.isAnonymousUser(): # or not context.isSectionOfficer():
+    return None
+
+mtool = context.portal_membership
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+
+course_results = context.course_results
+
+
+student_record = context.students_catalog.getRecordByKey(student_id)
+info['student_record'] = context.getFormattedStudentEntry(student_record)
+
+
+year_courses = [[],[],[],[],[],[],[],[],[]]
+year_details = [{'year':0},{'year':1},{'year':2},{'year':3},{'year':4},{'year':5},{'year':6},{'year':7},{'year':8}]
+
+courses = course_results.getAllCourses(student_id)
+
+for course in courses:
+    year = divmod(int(course['level_id']),100)[0]
+    year_courses[year].append(course)
+    if not getattr(year_details[year],'session',None):
+        year_details[year]['session'] = context.portal_vocabularies.sessions.get(course['session_id'])
+
+year_counter = 0
+cgpa = 0
+c_total_credits = 0
+for year in year_courses:
+    gpa = 0
+    total_credits = 0
+    for course in year:
+        if course['weight'] and course['credits']:
+            gpa += int(course['weight']) * int(course['credits'])
+            total_credits += int(course['credits'])
+    cgpa += gpa
+    c_total_credits += total_credits
+    if gpa and total_credits:
+        year_details[year_counter]['total_credits'] = total_credits
+        year_details[year_counter]['gpa'] = "%4.2f" % (float(gpa)/int(total_credits))
+    else:
+        year_details[year_counter]['total_credits'] = 0
+        year_details[year_counter]['gpa'] = 0
+
+    if cgpa and c_total_credits:
+        year_details[year_counter]['c_total_credits'] = c_total_credits
+        year_details[year_counter]['cgpa'] = "%4.2f" % (float(cgpa)/int(c_total_credits))
+    else:
+        year_details[year_counter]['c_total_credits'] = 0
+        year_details[year_counter]['cgpa'] = 0
+
+    year.sort(cmp=lambda x,y: cmp("%(semester)s%(code)s" % x,
+                                         "%(semester)s%(code)s" % y))
+    year_counter += 1
+
+info['year_details'] = year_details
+info['year_courses'] = year_courses
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_ois/goto_interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/goto_interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/goto_interswitch_form.pt	(revision 3690)
@@ -0,0 +1,52 @@
+<metal:body use-macro="here/main_template/macros/master">
+    <metal:main fill-slot="main"
+                tal:define="info options/info">
+                
+        <h3>Authorize Online Payment! </h3>
+        <br />
+                
+      <form method="post" action="pay_online"
+            tal:attributes="action info/action ">
+      <span tal:repeat="arg python:info['args'].items()"
+            tal:omit-tag="">
+          <input type="hidden" tal:attributes="name python:arg[0];value python:arg[1]" />
+      </span>          
+      
+      <span tal:replace = "structure info/xml_data" /> 
+      
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+          <tr>
+            <td >
+            Surcharge:
+            </td>
+            <td> Naira <span tal:content="info/surcharge" /></td>
+          </tr>          
+      
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Proceed to Interswitch Payment Gateway" 
+               />
+      </form>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/interswitch_form.pt	(revision 3690)
@@ -0,0 +1,46 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="info options/info">
+    <h3>Confirm Your Payment Data! </h3>
+    <br />
+    <span tal:condition="not: info/payment_possible">
+      No payment information for your course available.
+    </span>
+    <span tal:condition="info/payment_possible">
+      <form method="post" action="pay_interswitch">
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+          <tr>
+            <td >
+            Surcharge:
+            </td>
+            <td> Naira <span tal:content="info/surcharge" /></td>
+          </tr>                  
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Confirm" 
+               />
+      </form>
+    </span>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/layout_student_acco_view_slip.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/layout_student_acco_view_slip.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/layout_student_acco_view_slip.pt	(revision 3690)
@@ -0,0 +1,34 @@
+<!-- a layout_lib macro -->
+<!-- $Id: layout_student_acco_view_slip.pt 1316 2007-01-17 18:05:49Z henrik $ -->
+<metal:block define-macro="default_view"
+  tal:define="layout options/layout;
+              dm options/datastructure/getDataModel;
+              widgets python:context.getRenderedWidgets(layout);
+              fields python:('bed',
+                              'acco_res_date',
+                                 'acco_maint_pay_id', 
+                                 'acco_maint_fee',
+                                 'acco_maint_date',
+                                 )"
+                                 >
+  <table width="" cellpadding="2" cellspacing="0" summary="Form layout">
+    <tr tal:repeat="field fields">
+      <tal:block tal:define="cell python: widgets[field]">
+        <tal:block define="widget cell/widget">
+          <div tal:attributes="class cell/widget_css_class|string:label;
+            id python:widget.getHtmlWidgetId()+'_widget';">
+            <td width="180px" valign="top">
+             <span class="dlabel"
+                    tal:condition="widget/label"
+                    tal:content="widget/label">label</span>:
+            </td>
+            <td> 
+               <span tal:condition="cell" tal:content="structure cell/widget_rendered"></span>
+               <span tal:condition="not:cell/widget_rendered"> none </span>
+            </td>
+          </div>
+        </tal:block>
+      </tal:block>
+    </tr>
+  </table>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_ois/mail2admin.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/mail2admin.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/mail2admin.py	(revision 3690)
@@ -0,0 +1,44 @@
+## Script (Python) "mail2admin"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=fullname=None,regno=None,email=None,probtype=None,descr=None,commt=None
+##title=
+##
+# $Id: mail2admin.py 2334 2007-10-09 15:01:36Z henrik $
+
+mhost = context.MailHost
+prop = context.portal_properties
+
+d = {}
+d['fullname'] = fullname
+d['email'] = email
+d['email_from'] = prop.email_from_address
+d['regno'] = regno
+d['probtype'] = probtype
+d['descr'] = descr
+
+message = """
+From: %(fullname)s <%(email)s>
+To: %(email_from)s
+Cc: %(email)s
+Bcc: waeup@saoas.org
+Reply-To: %(email)s
+Subject: AAUA Contact
+
+Fullname: %(fullname)s
+Member ID: %(regno)s
+Problem Type: %(probtype)s
+Description: %(descr)s
+"""
+
+mhost.send(message % d)
+
+REQUEST = context.REQUEST
+RESPONSE = REQUEST.RESPONSE
+
+redirect_url = REQUEST.HTTP_REFERER
+redirect_url = '%s/?%s' % (redirect_url,'portal_status_message=Your message has been sent!')
+RESPONSE.redirect(redirect_url)
Index: /WAeUP_SRP/trunk/skins/waeup_ois/mail2student.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/mail2student.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/mail2student.py	(revision 3690)
@@ -0,0 +1,45 @@
+## Script (Python) "mail2student"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=co_name=None,co_email=None,student_email=None,probtype=None,commt=None, action=None
+##title=
+##
+# $Id: mail2admin.py 869 2006-11-15 13:46:49Z henrik $
+
+from urllib import urlencode
+
+mhost = context.MailHost
+prop = context.portal_properties
+REQUEST = context.REQUEST
+
+d = {}
+#d['co_name'] = co_name
+#d['co_email'] = co_email
+d['co_name'] = 'AAUA'
+d['co_email'] = prop.email_from_address
+d['student_email'] = student_email
+d['probtype'] = probtype
+d['commt'] = commt
+
+message = """
+From: %(co_name)s <%(co_email)s>
+To: %(student_email)s
+Cc: %(co_email)s
+Reply-To: %(co_email)s
+Subject: %(probtype)s
+%(commt)s
+"""
+
+mhost.send(message % d)
+
+args = {}
+psm = "Your message has been sent!"
+args['portal_status_message'] = psm
+if action:
+    url = context.absolute_url() + '/' + action + '?' + urlencode(args)
+else:
+    url = context.absolute_url() +'?' + urlencode(args)
+return REQUEST.RESPONSE.redirect(url)
Index: /WAeUP_SRP/trunk/skins/waeup_ois/main_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/main_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/main_template.pt	(revision 3690)
@@ -0,0 +1,217 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+  
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  base_url here/getBaseUrl;
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${here/getBaseUrl}${static_dir};
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  student_theme python:test(waeup_skin == 'WAeUP_Student',1,0);
+  navigation_slot python:test(student_theme,'student_navigation_slot','navigation_slot');
+  object_tabs python:test(student_theme,'student_object_slot','staff_object_slot');
+  
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}${waeup_skin}/render.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      
+     
+      <table summary="Logo Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0" 
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;"></td>
+            <td style="width: 170px; text-align: center; padding-top: 0.5em;">
+              <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo" />
+            </td>
+            <td padding=0.5em><h1>Olashore International School <br /> Iloko-Ijesa, Nigeria</h1></td>
+            <td style="width: 20px;"></td>
+          </tr>
+        </tbody>
+      </table>
+
+      <table summary="Navigation Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="" valign="top">
+              <div id="navigation_slot" 
+                       style="padding: 0em 0em 1px; text-align: right;"
+                       class="fontColornavigation fontShapenavigation portalTabTabStyle cpsskinsHBox body">
+                 <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot=navigation_slot)"
+                  tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+              </div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+      </table>
+      
+      
+      <table summary="Main Table Block 1"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: center;"
+              valign="top">
+            <div id="portal_session" style="padding: 0.4em 0.4em 0.4em 0.3em;"
+                 class="colorBarAreaColor fontColordefaultnovisitedlinks fontShapeaverage shapeAreaShape9">
+                    <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='portal_session')"
+                               tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="text-align: left; padding: 0.2em 0.2em 0em;" class="colorBarColor" valign="top">
+            <metal:block define-slot="action_slot" />
+            <div id="object_tabs" class="fontColornavigation fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot=object_tabs)">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+            </div>
+          </td>
+          <td tal:condition="not:student_theme"
+              class="colorBarColor" valign="top" style="text-align: right;padding: 0.2em 0.2em 0em; width: 280px;">
+            <div id="status_slot" class="fontColordefaultfontcolors fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot='status_slot')">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="width: 20px;"
+              valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+  
+  
+  
+    <table summary="Main Table Block 2"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="" cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: left;"
+              class="colorBarColor fontColornavigation fontShapeaverage boxShapenavbox cpsskinsBox" valign="top">
+            <div id="staff_actions_slot" class="body" style="padding: 1.5em 0.5em 1.5em 0.5em;">
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='staff_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='global_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='student_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+
+              <span tal:condition="student_theme">
+              <div style="padding: 0em;">
+                <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_workflow')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>
+              </span>
+              
+              <div style="padding-top: 10px;">
+              <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_notice_slot')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>  
+
+
+            </div>
+          </td>
+          <td style="" class="shapeAreaShape5 colorBarAreaColor" valign="top">
+            <div style="padding: 0.5em; text-align: left;" class="fontColordefaultfontcolors fontShapeaverage">
+              <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+              <metal:block define-slot="header" />
+              <metal:block define-slot="main" />
+              <metal:block define-slot="sub" />
+            </div>
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+    
+    
+    <table summary="Copyright Info Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="padding: 0.2em; text-align: right;" valign="top">
+              <div class="fontColordefaultfontcolors fontShapeaverage">
+              Copyright WAeUP Group 2006-2008</div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+    </table>
+    </body>
+  </html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_ois/no_booking_allowed.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/no_booking_allowed.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/no_booking_allowed.pt	(revision 3690)
@@ -0,0 +1,8 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+
+    <h3>You are not eligible to book accommodation!</h3>
+
+  </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/pay_interswitch.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/pay_interswitch.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/pay_interswitch.py	(revision 3690)
@@ -0,0 +1,167 @@
+## Script (Python) "pay_online"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: pay_interswitch.py 2619 2007-11-10 17:39:36Z henrik $
+"""
+pay online
+"""
+from urllib import urlencode
+import logging
+logger = logging.getLogger('Skins.pay_interswitch')
+import DateTime
+
+if context.portal_membership.isAnonymousUser():
+    return None
+
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+request = context.REQUEST
+wftool = context.portal_workflow
+students = context.portal_url.getPortalObject().campus.students
+
+
+student_id = context.getStudentId()
+student = getattr(students,student_id)
+
+student_record = context.students_catalog.getRecordByKey(student_id)
+#amount,description = context.getSchoolFee(student_record.faculty,student_record.session,student_record.course)
+info = {}
+info['student'] = student_record
+info['payment_possible'] = False
+info['amount'] = '0'
+info['bank'] = ''
+info['type_description'] = ''
+info['pay_bill_to'] = ''
+fee_dict = context.getSchoolFee(student_record)
+fulltime = student_record.mode.endswith('_ft')
+
+if not fee_dict:
+    return context.interswitch_form(info=info)
+
+info['site_id'] = '105'
+info['currency_id'] = '566'
+pay_item_id = "10500"
+
+#info['type_code'] = sbrain.course  #type_code is redundant and will be removed soon
+info['bank'] = ''
+info['payment_possible'] = True
+info['type_description'] = fee_dict['description']
+info['pay_bill_to'] = student_record.name
+info['student_id'] = student_id
+info['student_name'] = student_record.name
+info['type'] = 'online'
+info['status'] = 'started'
+info['session_id'] = fee_dict['next_session_id']
+info['item'] = student_record.course
+info['category'] = 'schoolfee'
+info['student_email'] = student_record.email
+now = DateTime.DateTime()
+info['date'] = now
+info['pay_ship_to'] = "Adekunle Ajasin University"
+timestamp = "%d" % int(now.timeTime()*1000)
+info['order_id'] = "%s%s" % (student_id[1:],timestamp)
+p_id = "p%s" % timestamp
+
+
+info['surcharge'] = interswitch_amount = '150'
+info['amount'] = amount = fee_dict['all']
+total_amount = 100*int(amount) + 100*int(interswitch_amount)
+
+
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+
+if True:
+    info['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+else:
+    #pass
+    #return None
+    info['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),p_id)
+
+
+if "payments" not in student.objectIds():
+    student.invokeFactory('PaymentsFolder','payments')
+    payments = getattr(student,'payments')
+    d = {}
+    d['Title'] = 'Payments'
+    payments.getContent().edit(mapping=d)
+    wftool.doActionFor(payments,'open')
+else:
+    payments = getattr(student,'payments')
+if request.has_key('epayment'):
+    return context.interswitch_form(info=info)
+
+
+payments.invokeFactory('Payment', p_id)
+payment = getattr(payments,p_id)
+wftool.doActionFor(payment,'open')
+d = {}
+d.update(info)
+payment.getContent().edit(mapping=d)
+
+
+info['callback_url'] = "%s/payments/%s/interswitch_cb?echo=%s" % (student.absolute_url(),
+                                                                  p_id,
+                                                                  p_id)
+
+logger.info('%(student_id)s initiated online school fee payment with order_id %(order_id)s and callback url %(callback_url)s' % info)
+payment_fields = (('product_id','site_id'),
+                  ('site_redirect_url','callback_url'),
+                  ('Currency','currency_id'),
+                  ('cust_id','student_id'),
+                  ('cust_id_desc','type_description'),
+                  ('cust_name','student_name'),
+                  ('txn_ref','order_id'),
+                  ('Amount','amount'),
+                  )
+args = {}
+for arg,field in payment_fields:
+    args[arg] = info[field]
+
+bt_amount = 4000
+
+aaua_amount = amount - bt_amount
+xmldict = {}
+xmldict['detail_ref'] = args['txn_ref']
+xmldict['department'] = student_record.department
+xmldict['faculty'] = student_record.faculty
+xmldict['aaua_amount'] = "%d" % int(100*aaua_amount)
+xmldict['bt_amount'] = "%d" % int(100*bt_amount)
+if student_record.mode.endswith('_pt'):
+    xmldict['aaua_acct'] = "0321100000000046"
+elif student_record.mode.endswith('_sw'):
+    xmldict['aaua_acct'] = "0321100000000056"
+else:
+    xmldict['aaua_acct'] = "0000000000000000"
+
+
+xmltext = """<payment_item_detail>
+<item_details detail_ref="%(detail_ref)s" college="AAUA" department="%(department)s" faculty="%(faculty)s">
+<item_detail item_id="1" item_name="AAUA" item_amt="%(aaua_amount)s" bank_id="89" acct_num="%(aaua_acct)s" />
+<item_detail item_id="2" item_name="BT" item_amt="%(bt_amount)s" bank_id="117" acct_num="6012015294" />
+</item_details>
+</payment_item_detail>""" % xmldict
+
+info['xml_data'] = """<input type="hidden" name="xml_data" value='%s'  />""" % xmltext
+
+args['Amount'] = "%d" % (total_amount)
+args['site_name'] = "aaua.waeup.org"
+args['cust_name_desc'] = "Student Name"
+args['pay_item_id'] = pay_item_id
+args['pay_item_name'] = "AAUA Tuition Payments"
+args['payment_params'] = 'college_split'
+#args['xml_data'] = ''
+#args['xml_data'] = xmltext   # info['xml_data']can be used instead
+info['args'] = args
+
+return context.goto_interswitch_form(info=info)
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/search_students_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/search_students_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/search_students_form.pt	(revision 3690)
@@ -0,0 +1,128 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="rendered options/rendered;
+              portal_status_message options/psm;
+              students options/students;
+              info options/info|nothing;
+              is_so context/isSectionOfficer;
+              allowed options/allowed|nothing;"
+              >
+    <span tal:condition="not: allowed">
+      <span tal:content="here/illegal_view" />
+    </span>
+    <span tal:condition="allowed" tal:omit-tag="">
+      <strong>
+        <nobr><a href="statistics_simple_view">Basic Student Statistics</a>
+        &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+        <span tal:condition="is_so">
+          <nobr><a href="apply_admission_manage">Application Process</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+          <nobr><a href="view_logs">View Log Files</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="add_student">Add Student Record</a>        
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="deactivate_students">Deactivate Student Record(s)</a></nobr>
+        </span>
+      </strong>
+      <h3> Search Student Section</h3><br />
+      You are logged in as member <span tal:replace="info/member|nothing" /> 
+      <span tal:condition="info/faculties|nothing" tal:omit-tag="">
+        who is ClearanceOfficer for Faculty 
+        <span tal:repeat="faculty info/faculties" tal:content="faculty" />
+      </span>
+      <span tal:condition="info/departments|nothing" tal:omit-tag="">
+        and <span tal:repeat="department info/departments|nothing" tal:content="department"/></span>.
+      <br /><br />
+      <span tal:replace="structure rendered" />
+      <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+      <span tal:condition="students">
+        <span tal:define="items students;
+        columns python:3;
+        items_per_page python:40;
+        max_items python:300;
+        zoom python:0;
+        batches_all python:here.getBatchList(items,columns, items_per_page,zoom,max_items=400);
+        batches python:batches_all[0];
+        batch_info python:batches_all[1];
+        zoomed python:batches_all[2];
+        mq nocall:modules/ZTUtils/make_query;"
+        tal:omit-tag="">
+          <tal:block tal:condition="python: items and batch_info and batch_info['nb_pages'] > 1">
+            <div class="batchLayout" i18n:translate="">
+              Objects:<strong><tal:block replace="batch_info/start"
+                                         i18n:name="batch_start" /> - <tal:block replace="batch_info/limit"
+                                                                                 i18n:name="batch_limit" />
+              </strong> of <tal:block replace="batch_info/length" i18n:name="batch_length" />
+            </div>
+            <br />
+          </tal:block>
+          <table class="contentListing" width="100%">
+            <span tal:repeat="rows batches" tal:omit-tag="">
+              <span tal:repeat="student rows">
+                <tr tal:condition="student" 
+                    tal:attributes="class python:test(repeat['student'].even(), 'even ajaxtd', 'odd ajaxtd')">
+                  <td><a href="id" tal:attributes="href string:${context/portal_url}/campus/students/${student/id}"
+                         tal:content="student/id"></a></td>    
+                  <td>
+                    <span tal:replace="student/name" />
+                  </td>    
+                  <td><span tal:replace="student/matric_no" /></td>   
+                  <td><span tal:replace="student/jamb_reg_no" /></td>
+                  <td tal:condition="options/co_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/clearance/external_clearance_edit_form"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and change state]</a></td>
+                  <td tal:condition="options/ca_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/study_course/${student/level}/external_study_level_view"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and validate course list]</a></td>
+                </tr>
+              </span>
+            </span>
+          </table>
+          <tal:block condition="python:batch_info and batch_info['nb_pages'] > 1">
+            <div class="pageNavigationLayout">
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=0))"
+                 >
+              (&lt;&lt;)</a>
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=previous))"
+                 i18n:translate="batch_previous">Previous</a>
+              <tal:block repeat="page batch_info/pages">
+                <tal:block condition="python:page != batch_info['start'] - 1">
+                  <a tal:attributes="href python:'%s?%s'%(request['URL'],
+                  mq(request.form, b_start=page))"
+                  tal:content="repeat/page/number">1</a>&nbsp;
+                </tal:block>
+                <tal:block condition="python:page == batch_info['start'] - 1">
+                  <span tal:content="string:${repeat/page/number}" />&nbsp;
+                </tal:block>
+              </tal:block>
+              <a tal:define="next batch_info/next"
+                 tal:condition="python:next is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=next))"
+                 i18n:translate="batch_next">Next</a>
+              <a tal:define="next batch_info/next;
+              last_page python:batch_info['pages'][-1]"
+              tal:condition="python:next is not None"
+              tal:attributes="href python:'%s?%s'%(request['URL'],
+              mq(request.form, b_start=last_page))"
+              >
+              (&gt;&gt;)</a>
+            </div>
+          </tal:block>
+        </span>
+      </span>
+    </span>
+  </metal:main>
+</metal:body>
Index: /WAeUP_SRP/trunk/skins/waeup_ois/slip_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/slip_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/slip_template.pt	(revision 3690)
@@ -0,0 +1,109 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  base_url here/getBaseUrl;
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${base_url}${static_dir};    
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+   
+    <table summary="Logo Block"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           class="shapeNoBorder colorTransparent" cellpadding="0"
+           cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td valign="top" style="width: 80px; padding: 0.5em; text-align: right;">
+            <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo"
+                     height="84"  />
+          </td>
+          <td style="padding: 1em 0em 0em 0em; text-align: left;" valign="top">
+             <h2>Olashore International School <br /> Iloko-Ijesa, Nigeria</h2>
+          
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+      
+    <table summary="Main Block" cellpadding="0" cellspacing="0" 
+           style="margin-left:auto;margin-right:auto;width:100%;">
+      <tr>
+        <td valign="top" style="width:700px">
+          <div style="padding:2em; text-align: left;" 
+               class="fontColordefaultfontcolors fontShapeTitleindex shapeAreaShape">
+                  <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+                  <metal:block define-slot="header" />
+                  <metal:block define-slot="main" />
+                  <metal:block define-slot="sub" />
+          </div>
+        </td>
+      </tr>
+    </table>
+  </body>
+</html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_ois/statistics_simple_view.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/statistics_simple_view.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/statistics_simple_view.pt	(revision 3690)
@@ -0,0 +1,125 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+  <metal:block tal:define="faculties context/getSimpleStudentStatistics;
+                        mtool here/portal_membership;
+                        member mtool/getAuthenticatedMember;
+                        session_str python:context.getSessionId()[1]">       
+
+      <span tal:condition="not: faculties">
+        <span tal:content="here/illegal_view" />
+      </span>
+      <span tal:condition="faculties">
+  
+      <strong>
+      <nobr><a href="search_students">Search Students</a>
+      &nbsp;&nbsp;&nbsp;&nbsp;</nobr>        
+   
+      </strong>     
+
+      <h3>Basic Student Statistics <span tal:content="session_str" /></h3>
+      <br />      
+      <span tal:condition="not:isAnon">
+      Student records imported: <span tal:content="python: faculties[0]['total_in_catalog']" />
+      <br />  <br />  
+        <table >  
+
+          <tr>
+            <th>&nbsp;</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">All Students</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">Category A</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">Category B</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">Category C</th>
+
+
+          </tr>
+
+          <tr class="odd ajaxtd">
+            <th >Faculty</th>
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+
+          </tr>
+          <tr tal:repeat="d faculties"
+              tal:attributes="class python:test(repeat['d'].even(), 'even ajaxtd', 'odd ajaxtd')">
+              <td width="80px"> <span tal:content="d/id" /> </td>
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_ft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_pt" />
+              </td>              
+
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Aft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Apt" />
+              </td>              
+
+     
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bpt" />
+              </td>              
+              
+   
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cft" />
+              </td>      
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cpt" />
+              </td>      
+              
+                                        
+
+                                       
+
+          </tr>
+        </table>
+
+        <br />
+        <table   border=0>
+
+        <tr><td>Category A: </td> <td>students who paid their school fee in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category B: </td> <td>students who registered their courses online (A contains B) in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category C: </td> <td>students who 'arrived' in <span tal:content="session_str" /> but have not yet paid their school fee</td></tr>
+        <tr><td>New: </td> <td>students in level 100 or 600</td></tr>
+        <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
+        <tr><td colspan="2"><strong>Remark:</strong> <span tal:content="python: faculties[0]['not_categorized']" /> returning students are not categorized.
+             </td>
+        </tr>
+          
+        </table>
+        
+        
+        
+      </span>
+      </span>
+  </metal:block>      
+  </metal:main>
+</metal:body>
+      
Index: /WAeUP_SRP/trunk/skins/waeup_ois/student_index.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/student_index.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/student_index.py	(revision 3690)
@@ -0,0 +1,58 @@
+## Script (Python) "student_index"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=batch=None,portal_status_message=None
+##title=
+##
+# $Id: student_index.py 2297 2007-10-01 07:26:30Z henrik $
+"""
+return the current student_index
+"""
+
+request = context.REQUEST
+#session = request.SESSION
+response = request.RESPONSE
+redirect = response.redirect
+pm = context.portal_membership
+member = pm.getAuthenticatedMember()
+
+#from Products.zdb import set_trace;set_trace()
+if context.isStaff():
+    if context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.academic_report_view()
+    elif context.portal_type == 'StudentPastoralReport':
+        return context.pastoral_report_view()
+    elif context.portal_type == 'StudentClearance':
+        return context.clearance_view()
+    elif context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Student':
+        if portal_status_message:
+            return redirect("%s/student_view?portal_status_message=%s" % (context.absolute_url(),portal_status_message))
+        else:
+            return redirect("%s/student_view" % context.absolute_url())
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    return redirect("%s/waeup_document_view" % context.absolute_url())
+if context.isStudent():
+    if context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.academic_report_view()
+    elif context.portal_type == 'StudentPastoralReport':
+        return context.pastoral_report_view()        
+    elif context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    students_url = "%s/campus/students" % (context.portal_url())
+    id = str(member)
+    return redirect("%s/%s/student_view" % (students_url, id))
+
+return redirect("%s/srp_anonymous_view" % context.portal_url())
+
Index: /WAeUP_SRP/trunk/skins/waeup_ois/transcript_view.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_ois/transcript_view.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_ois/transcript_view.pt	(revision 3690)
@@ -0,0 +1,106 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+          tal:define="info context/getTranscriptInfo;">
+  <metal:block define-macro="edit_form">   
+              
+    <span tal:condition="not: info">
+      <span tal:content="here/illegal_view" />
+    </span>
+    
+    <span tal:condition="info">
+    <span tal:define= "is_so context/isSectionOfficer;
+                       is_ca context/isCourseAdviser;
+                       is_student info/is_student;
+                       with_score not: info/without_score|nothing;
+                       ">       
+          
+    <a href=""
+       tal:attributes="href string:${here/academicsParent}">
+      <img tal:attributes="src string:${here/portal_url}/arrow_up.gif"/>
+      Up one level
+    </a>
+
+    <h3> 
+      <span tal:condition="python: is_so or is_ca">
+        <span tal:content="info/student_record/name" />:
+      </span>
+      <span tal:condition="is_student">My </span> Transcript     
+      <br />
+    </h3>
+             
+      <span tal:repeat="details info/year_details">
+      <span tal:define="year_courses info/year_courses;
+                        year python:year_courses[details['year']]"
+            tal:condition="python:len(year)">
+      
+      <br />
+      
+      <h3> Year <span tal:replace="details/year" />  (Session <span tal:replace="details/session" />)</h3>
+      
+     
+      
+     
+      <br />
+      
+      <table  class="contentListing" width="100%" id="folder_content">
+        <tr>
+        <th align='center'></th> 
+        <th align='center'>session</th>
+        <th align='center'>level</th>
+        <th align='center'>semester</th>
+        <th align='center'>credits</th>
+        <th tal:condition="with_score" align='center'>score</th>
+        <th align='center'>grade</th>
+        <th align='center'>weight</th>
+        <th align='center'></th>       
+        </tr>  
+                      
+        <tr tal:repeat="row year"
+            tal:attributes="class python:test(repeat['row'].even(), 'even ajaxtd', 'odd ajaxtd')">
+          <td align="center" tal:content="row/code"></td>
+          <td align='center' tal:content="row/session_id"></td>
+          <td align='center' tal:content="row/level_id"></td>                    
+          <td align="center"><span tal:content="row/semester" /></td>
+          <td align="center" tal:content="row/credits"></td>
+          <td tal:condition="with_score" align="center"  tal:content="row/score"></td>
+          <td align="center" tal:content="row/grade"></td>
+          <td align="center" tal:content="row/weight"></td>
+          <td align="center" tal:content="row/coe|nothing"></td>
+        </tr>
+      </table>
+
+        <br />
+        <table>
+          <tr tal:condition="details/total_credits" >
+            <th width='200pt'>Total Credits:</th>
+            <td tal:content="details/total_credits" />
+          </tr>
+          <tr tal:condition="details/gpa">
+            <th>GPA:</th> 
+            <td><span tal:content="details/gpa" /></td>
+          </tr>
+          <tr>
+            <th>Cumulative Total Credits:</th>
+            <td tal:content="details/c_total_credits" />
+          </tr>
+          <tr tal:condition="details/cgpa">
+            <th>CGPA:</th> 
+            <td><span tal:content="details/cgpa" /></td>
+          </tr>          
+        </table>      
+
+      </span>
+      </span>
+
+      
+ 
+               
+
+    <br />
+  </span>
+  </span>        
+  </metal:block>    
+  </metal:main>
+
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/apply_admission_manage_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/apply_admission_manage_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/apply_admission_manage_form.pt	(revision 3690)
@@ -0,0 +1,94 @@
+<tal:block define="rendered_main options/rendered|nothing;
+           portal_status_message options/psm|nothing;
+           reg_no options/reg_no|nothing;
+           ds options/ds|nothing;
+           "
+           >	
+  <metal:block define-macro="edit_form">
+    <metal:block use-macro="here/main_template/macros/master">
+      <metal:block fill-slot="main">
+
+        <form action="" id="editForm" method="post" 
+              enctype="multipart/form-data" class="workflow"
+              tal:attributes="action string:${context/absolute_url}/apply_admission_manage"
+              >
+
+          <span tal:condition="not: rendered_main">
+            <h3>Application Process</h3>
+            <br />
+            
+            <table tal:define="info_applicants context/getApplicantsStatistics">
+            <tr> 
+              <td>PCE Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_pce" /></td>  
+            </tr>
+            <tr> 
+              <td>Pre-NCE Applicants (status submitted):</td> 
+              <td><span tal:replace="info_applicants/submitted_prence" /></td>
+            </tr>
+            <tr> 
+              <td>All Applicants (status admitted):</td> 
+              <td><span tal:replace="info_applicants/admitted" /></td>  
+            </tr>
+            <tr> 
+              <td>All Applicants (status student record created):</td> 
+              <td><span tal:replace="info_applicants/created" /></td>
+            </tr>            
+            <tr> 
+              <td>All Applicants (status not admitted):</td> 
+              <td><span tal:replace="info_applicants/not_admitted" /></td>  
+            </tr>    
+            </table>            
+            
+            <br/>
+            
+            <div class="label">Registration No:</div>
+            <input type="text" name="reg_no" size="15"
+                   />
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search" 
+                   />
+          </span>
+
+          <span tal:condition="rendered_main">
+            <h3>Application Record <span tal:replace="reg_no"/></h3>
+            <br />
+            <div tal:replace="structure rendered_main" />
+                        
+            <input type="hidden" name="reg_no"
+                   tal:attributes="value reg_no|nothing"
+                   />
+            <input type="submit" class="standalone" 
+                   name="reset"
+                   value="Reset" 
+                   tal:condition="python: ds['status'] and 'submitted' in ds['status']"
+                   />
+                   
+                   
+            <input type="submit" class="standalone" 
+                   name="edit"
+                   value="Save" 
+                   />                   
+                   
+            <br /><br />
+            
+
+            <div class="label">Registration No:</div>
+            <input type="text" name="new_reg_no" size="15"
+                   /> &nbsp;
+            <input type="submit" class="standalone" 
+                   name="search"
+                   value="Search next" 
+                   />
+          </span>
+        </form>
+        
+        <br/>
+        
+      
+        
+      </metal:block>
+    </metal:block>
+  </metal:block>
+</tal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getAccommodationInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getAccommodationInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getAccommodationInfo.py	(revision 3690)
@@ -0,0 +1,108 @@
+## Script (Python) "getAccommodationInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_id=None
+##title=
+##
+# $Id: getAccommodationInfo.py 1726 2007-05-02 06:21:50Z henrik $
+"""
+return Info about the current Student
+"""
+import logging
+logger = logging.getLogger('Skins.getAccommodationInfo')
+import DateTime
+
+request = context.REQUEST
+mtool = context.portal_membership
+wf = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+path_info = request.get('PATH_INFO').split('/')
+
+if mtool.isAnonymousUser():
+    return None
+info = {}
+if student_id is None:
+    requested_id = context.getStudentId()
+    if requested_id and not context.isStaff() and member_id != requested_id:
+        logger.info('%s tried to access %s' % (member_id,requested_id))
+        return None
+    elif context.isStaff():
+        student_id = requested_id
+    else:
+        student_id = member_id
+student_record = context.students_catalog.getRecordByKey(student_id)
+if student_record is None:
+    logger.info('%s not found in students_catalog' % student_id)
+    return None
+
+info['error'] = None
+info['matric_no']=student_record.matric_no
+info['jamb_reg_no']=student_record.jamb_reg_no
+info['name']=student_record.name
+info['email']=student_record.email
+info['level']=student_record.level
+info['verdict']=getattr(student_record,'verdict','')
+review_state = info['review_state'] = student_record.review_state
+info['session'] = session = context.getSessionId()
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['student_id'] = student_id
+info['student'] = student
+
+booking_allowed = False
+
+# customize from here
+
+try:
+    level = int(student_record.level)
+except:
+    logger.info('%s has invalid level %s' % (student_id,student_record.level))
+    info['acco'] = None
+    info['booking_allowed'] = False
+    info['student_status'] = ''
+    return info    
+
+if review_state in ('school_fee_paid','courses_registered', 'courses_validated',) and student_record.session == session[0]:
+    info['booking_allowed'] = True
+    info['online_payment'] = True
+else:
+    info['acco'] = None
+    info['booking_allowed'] = False
+    info['student_status'] = ''
+    return info
+
+acco_id = 'accommodation_' + session[0]
+acco = getattr(student,acco_id,None)
+info['acco'] = acco
+info['acco_id'] = acco_id
+
+info['maintenance_paid'] = False
+if acco is not None:
+    info['acco_doc'] = acco.getContent()
+    info['acco_review_state'] = wf.getInfoFor(acco,'review_state',None)
+    info['maintenance_paid'] = info['acco_review_state'] == "maintenance_fee_paid"
+d = {}
+if level >= 300:
+   bt = 'fi'
+if level == 100:
+    bt = 'fr'
+elif level < 100:
+    bt = 'pr'    
+elif level < 300:
+    bt = 're'
+
+d['sex'] = 'male'
+if student_record.sex:
+    d['sex'] = 'female'
+
+
+info['sex']=d['sex']
+d['bt'] = bt
+student_status = "%(sex)s_%(bt)s" % d
+info['student_status'] = student_status
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getApplicantsStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getApplicantsStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getApplicantsStatistics.py	(revision 3690)
@@ -0,0 +1,39 @@
+## Script (Python) "getApplicantsStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getApplicantsStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getApplicantsStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return 'Not allowed'
+
+
+info = {}
+res_submitted_pce = context.applicants_catalog(status = 'submitted', screening_type = 'pce')
+res_not_admitted = context.applicants_catalog(status = 'not admitted')
+res_submitted_prence = context.applicants_catalog(status = 'submitted', screening_type = 'prence')
+res_admitted = context.applicants_catalog(status = 'admitted')
+res_created = context.applicants_catalog(status = 'created')
+
+info['submitted_pce'] = len(res_submitted_pce)
+info['admitted'] = len(res_admitted)
+info['not_admitted'] = len(res_not_admitted)
+info['submitted_prence'] = len(res_submitted_prence)
+info['created'] = len(res_created)
+
+return info
+
+
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getCosCombinedVoc.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getCosCombinedVoc.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getCosCombinedVoc.py	(revision 3690)
@@ -0,0 +1,17 @@
+##parameters=key=None
+# $Id: getCosCombinedVoc.py 2814 2007-11-28 12:26:51Z henrik $
+"""
+Return the combined courses as an vocabulary
+
+"""
+if key is None:
+    l = []
+    for k,v in context.portal_vocabularies.cos.items():
+        l += (k,v),
+    return l
+for voc in (context.portal_vocabularies.cos,):
+    title = voc.get(key,None)
+    if title is not None:
+        return title
+    else:
+        raise KeyError
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getInterswitchParams.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getInterswitchParams.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getInterswitchParams.py	(revision 3690)
@@ -0,0 +1,40 @@
+## Script (Python) "getInterswitchParams"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=paytype,student,payment_id,student_record
+##title=
+##
+# $Id: getInterswitchParams.py 3627 2008-08-17 08:07:44Z henrik $
+
+test = ""
+d = {}
+d['payment_possible'] = True
+d['pay_ship_to'] = "Federal College Okene"
+
+d['site_id'] = '83'
+d['site_name'] = "fceokene.waeup.org"
+d['currency_id'] = '566'
+d['type'] = 'online'
+d['status'] = 'started'
+d['surcharge'] = '150'
+if test == 'simulate':
+    d['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),payment_id) #do not use simulate_callback
+elif test == 'test':
+    d['action'] = "https://webpay.interswitchng.com/test_paydirect/webpay/pay.aspx"
+else:
+    d['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+if paytype in ("HOM",):
+    d['callback_function'] = 'interswitch_cb'
+    d['pay_item_id'] = '8300'
+    d['type_description'] = 'Hostel Maintenance Fee'
+    d['pay_item_name'] = "FCE Okene %(type_description)s" % d
+    d['amount'] = '4000'
+    d['category'] = 'hostel_maintenance'
+    d['item'] = paytype
+    #d['payment_params'] = 'switch_college_split'
+    d['payment_params'] = '0'
+
+return d
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getNextInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getNextInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getNextInfo.py	(revision 3690)
@@ -0,0 +1,62 @@
+## Script (Python) "getNextInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student_brain
+##title=
+##
+# $Id: getNextInfo.py 2678 2007-11-16 13:41:44Z henrik $
+"""
+return the students next info
+"""
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+info = {}
+
+reasons = ''
+
+session_id = student_brain.session
+level_id = student_brain.level
+review_state = student_brain.review_state
+verdict = student_brain.verdict
+
+has_verdict = verdict and verdict != 'N/A'
+has_session = session_id and session_id != 'N/A'
+has_level = level_id and level_id != 'N/A'
+
+info['next_transition'] = None
+info['next_session_id'] = next_session_id = session_id
+info['next_level_id'] = next_level_id = level_id
+info['next_verdict'] = verdict
+info['next_previous_verdict'] = ''
+verdicts_voc = context.portal_vocabularies.verdicts
+if review_state == 'cleared_and_validated':
+    info['next_transition'] = "pay_school_fee"
+    info['next_verdict'] = ''
+elif review_state == 'returning' and has_verdict and has_level and has_session:
+    info['next_session_id'] = next_session_id = "%02d" % (int(session_id)+1)
+    if int(session_id) > 4:
+        info['next_transition'] = "pay_school_fee"
+        info['next_verdict'] = ''
+        info['next_previous_verdict'] = verdict
+        if verdict in ('A','B','G','C','Z',):                                     #customized
+            info['next_level_id'] = "%s" % (int(level_id) + 100)
+        #elif verdict == 'C':
+        #    info['next_level_id'] = "%s" % (int(level_id) + 10)
+        else:
+            info['next_level_id'] = level_id
+    else:
+        info['next_level_id'] = "%s" % (int(level_id) + 100)
+elif review_state == 'returning' and not (has_session and has_level and has_verdict):
+    reasons = "Your data record is incomplete. School fee payment has been disabled, please contact your faculty!"
+
+info['reasons'] = reasons
+info['next_session_str'] = context.getSessionsVoc(next_session_id)
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getPaymentsFolderInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getPaymentsFolderInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getPaymentsFolderInfo.py	(revision 3690)
@@ -0,0 +1,131 @@
+## Script (Python) "getPaymentsFolderInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getPaymentsFolderInfo.py 2480 2007-10-30 15:23:25Z joachim $
+"""
+Info for the PaymentsFolder
+"""
+from Products.AdvancedQuery import Eq, Between, Le,In
+
+mtool = context.portal_membership
+wftool = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+payments_catalog = context.payments_catalog
+aq_payments = payments_catalog.evalAdvancedQuery
+if mtool.isAnonymousUser():
+    return None
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+def cmp_id(a,b):
+    s1 = "%(id)s" % a
+    s2 = "%(id)s" % b
+    if s1 == s2:
+        return 0
+    if s1 > s2:
+        return 1
+    return -1
+
+import DateTime
+request = context.REQUEST
+#students = context.portal_url.getPortalObject().campus.students
+student_id = context.getStudentId()
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+#student = getattr(students,student_id)
+student_record = context.students_catalog.getRecordByKey(student_id)
+
+
+info = {}
+is_so = info['is_so'] = context.isSectionOfficer()
+is_student = info['is_student'] = context.isStudent()
+info['student_name'] = student_record.name
+info['query_url'] = "https://webpay.interswitchng.com/paydirect/services/TransactionQueryURL.aspx"
+review_state = info['review_state'] = student_record.review_state
+parttime = student_record.mode and student_record.mode.endswith('_pt')
+fulltime = student_record.mode and student_record.mode.endswith('_ft')
+
+
+session = student_record.session
+next_info = context.getNextInfo(student_record)
+info['next_session'] = next_info['next_session_id']
+info['next_session_str'] = next_info['next_session_str']
+info['payment_method'] = ""
+info['reasons'] = next_info['reasons']
+
+# begin customization
+
+if review_state == 'cleared_and_validated':
+    info['payment_method'] = "online_payment"
+#elif review_state == 'cleared_and_validated' and session == '07':
+#    info['payment_method'] = "sc_payment"
+elif review_state == 'returning' and info['next_session'] != session:
+    info['payment_method'] = "online_payment"
+info['prod_id'] = '105'
+
+# end customization
+
+info['student_name'] = student_record.name
+payments_path = "%s/campus/students/%s/payments" % (context.portal_url(),student_id)
+payments = []
+payment_records = aq_payments(Eq('student_id',student_id)) # & Eq('session_id',student_record.session))
+vocabularies = context.portal_vocabularies
+paid_fees = []
+for payment in payment_records:
+    if payment.status == "paid":
+        paid_fees += "%s_%s" % (payment.category,payment.session_id),
+#info['pf'] = paid_fees
+for payment in payment_records:
+    row = {}
+    row['id'] = payment.key
+    if payment.status == 'invalid':
+        row['title'] = "Invalid Payment, Naira %s, %s" % (payment.amount,
+                                                          payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    else:
+        row['title'] = "%s for Session %s, Naira %s, %s" % (vocabularies.payment_categories.get(payment.category),
+                                                            vocabularies.sessions.get(payment.session_id),
+                                                            payment.amount,
+                                                            payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    oid = payment.order_id
+    onr = oid.rfind('-')+1
+    if onr > 0:
+        start_pos = onr
+    else:
+        start_pos = 6
+    url = row['url'] = "%s/p%s" % (payments_path,oid[start_pos:])
+    row['is_requeryable'] = "%s_%s" % (payment.category,payment.session_id) not in paid_fees and not payment.resp_desc and payment.type == 'online'# or str(member) in ('admin',)  # customized too
+    row['is_approvable'] = is_so and row['is_requeryable'] and payment.category == 'schoolfee' # does not make sense for maintenance
+    row['resp_desc'] = payment.resp_desc or 'Payment Process Interrupted'
+    row['trans_ref'] = payment.order_id
+    if row['is_requeryable']:
+        row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        if payment.category == 'schoolfee':
+#            row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        elif payment.category == 'hostel_maintenance':
+#            row['callback_url'] = "%(url)s/interswitch_acco_cb" % row
+#        else:
+        href = '%(query_url)s' % info
+        href += '?transRef=%(trans_ref)s' % row
+        href += '&prodID=%(prod_id)s' % info
+        href += '&redirectURL=%(callback_url)s' % row
+        row['href'] = href
+    if payment.status == 'paid':
+        row['confirmed'] = 'active'
+    else:
+        row['confirmed'] = 'unsuccessful'
+    row['is_editable'] = is_so and (row['confirmed'] == 'active')
+    payments.append(row)
+
+payments.sort(cmp_id)
+info['payments'] = payments
+return info
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getSchoolFee.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getSchoolFee.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getSchoolFee.py	(revision 3690)
@@ -0,0 +1,54 @@
+## Script (Python) "getSchoolFee"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None
+##title=
+##
+# $Id: getSchoolFee.py 2534 2007-11-05 06:37:12Z henrik $
+"""
+return SchoolFee
+"""
+
+
+d = {}
+
+if brain.mode == 'ug_sw':  
+    if str(brain.level) == '100':    # both 100 fresh and 100 returning who register for 200
+        d['all'] = 35000
+    else:
+        d['all'] = 30000
+elif brain.mode == 'pg_sw':  
+    d['all'] = 35000
+elif brain.mode == 'dp_pt':  
+    if str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':    # only 100 fresh 
+        d['all'] = 40000
+    else:
+        d['all'] = 35000
+elif brain.mode == 'ug_pt':  
+    if str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':    # only 100 fresh 
+        d['all'] = 50000
+    else:
+        d['all'] = 45000
+elif brain.mode == 'pg_pt':  
+    if str(brain.level) == '600' and brain.review_state == 'cleared_and_validated':    # only 600 fresh 
+        d['all'] = 60000
+    elif str(brain.level) == '600' and brain.verdict == 'C':                           # 600 repeaters
+        d['all'] = 55000
+    elif str(brain.level) == '600':                                                    # going to register for 700
+        d['all'] = 75000        
+    else:
+        d['all'] = 65000
+else:
+    d['all'] = 0
+
+
+next_info = context.getNextInfo(brain)
+next_session_str = next_info['next_session_str']
+d['next_session_id'] = next_info['next_session_id']
+d['description'] = "School Fee for Session %s" % next_session_str
+
+return d
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getSimpleStudentStatistics.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getSimpleStudentStatistics.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getSimpleStudentStatistics.py	(revision 3690)
@@ -0,0 +1,137 @@
+## Script (Python) "getRetStudentStatistics"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getStudentStatistics.py 1277 2007-01-11 21:11:37Z joachim $
+"""
+return Student Statistics
+"""
+
+import logging
+logger = logging.getLogger('Skins.getSimpleStudentStatistics')
+
+logger.info('%s invoked statistics' % context.portal_membership.getAuthenticatedMember())
+if not context.isStaff():
+    return
+
+
+catA =      (      'school_fee_paid',
+                   'courses_registered',
+                   'courses_validated',
+                   )
+
+catB =      (      'courses_registered',
+                   'courses_validated',
+                   )
+
+catC =      (      'student_created',
+                   'returning',
+                   'admitted',
+                   'clearance_pin_entered',
+                   'objection_raised',
+                   'clearance_requested',
+                   'cleared_and_validated',
+                   )
+
+current_session = context.getSessionId()[0]
+
+
+returning =  ('110','120','200','210','220','300','310','320','400','410','420','500','510', '520','500','510','520','610','620','700','710','720','800','810','820',)
+new =        ('100','600')
+
+
+faculties = context.portal_catalog(portal_type="Faculty")
+
+l = []
+
+fac_res = {}
+
+dict = {}
+dict['id'] = 'All Faculties'
+dict['title'] = 'All Faculties'
+
+
+res_ft = context.students_catalog(level = returning)
+dict['total_ft'] = len(res_ft)
+
+res_pt = context.students_catalog(level = new)
+dict['total_pt'] = len(res_pt)
+
+res_Aft = context.students_catalog(review_state = catA, level = returning, session = current_session)
+dict['total_Aft'] = len(res_Aft)
+
+res_Apt = context.students_catalog(review_state = catA, level = new, session = current_session)
+dict['total_Apt'] = len(res_Apt)
+
+
+
+res_Bft = context.students_catalog(review_state = catB, level = returning, session = current_session)
+dict['total_Bft'] = len(res_Bft)
+
+res_Bpt = context.students_catalog(review_state = catB, level = new, session = current_session)
+dict['total_Bpt'] = len(res_Bpt)
+
+
+
+res_Cft = context.students_catalog(review_state = catC, level = returning, session = current_session)
+dict['total_Cft'] = len(res_Cft)
+
+res_Cpt = context.students_catalog(review_state = catC, level = new, session = current_session)
+dict['total_Cpt'] = len(res_Cpt)
+
+
+
+
+res_total = context.students_catalog()
+dict['total_in_catalog'] = len(res_total)
+dict['not_categorized'] = dict['total_in_catalog'] - dict['total_ft'] - dict['total_pt']
+
+l.append(dict)
+
+
+for f in faculties:
+    dict = {}
+    dict['id'] = f.getId
+    dict['title'] = f.Title
+
+    res_ft = context.students_catalog(faculty = f.getId, level = returning)
+    dict['total_ft'] = len(res_ft)
+
+    res_pt = context.students_catalog(faculty = f.getId, level = new)
+    dict['total_pt'] = len(res_pt)
+
+
+    res_Aft = context.students_catalog(faculty = f.getId, review_state = catA, level = returning, session = current_session)
+    dict['total_Aft'] = len(res_Aft)
+
+    res_Apt = context.students_catalog(faculty = f.getId, review_state = catA, level = new, session = current_session)
+    dict['total_Apt'] = len(res_Apt)
+
+
+
+    res_Bft = context.students_catalog(faculty = f.getId, review_state = catB, level = returning, session = current_session)
+    dict['total_Bft'] = len(res_Bft)
+
+    res_Bpt = context.students_catalog(faculty = f.getId, review_state = catB, level = new, session = current_session)
+    dict['total_Bpt'] = len(res_Bpt)
+
+
+
+    res_Cft = context.students_catalog(faculty = f.getId, review_state = catC, level = returning, session = current_session)
+    dict['total_Cft'] = len(res_Cft)
+
+    res_Cpt = context.students_catalog(faculty = f.getId, review_state = catC, level = new, session = current_session)
+    dict['total_Cpt'] = len(res_Cpt)
+
+
+
+
+    l.append(dict)
+
+return l
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getStudyLevelInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getStudyLevelInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getStudyLevelInfo.py	(revision 3690)
@@ -0,0 +1,120 @@
+## Script (Python) "getStudyLevelInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student=None
+##title=
+##
+# $Id: getStudyLevelInfo.py 2760 2007-11-26 07:39:15Z henrik $
+"""
+return Info about the Studylevel
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+"""
+
+info = context.waeup_tool.getAccessInfo(context)
+student_id = info['student_id']
+if student_id is None:
+    return None
+
+mtool = context.portal_membership
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+
+course_results = context.course_results
+request = context.REQUEST
+response = request.RESPONSE
+import logging
+logger = logging.getLogger('Skins.getStudyLevelInfo')
+
+level_id  =  context.getId()
+level_doc = info['doc'] = context.getContent()
+
+info['is_so'] = is_so = info['is_sectionofficer']
+#info['is_student'] = is_student = context.isStudent()
+info['is_ca'] = is_ca = context.isCourseAdviser()
+#info['student'] = student = context.students_catalog(id=student_id)[0]
+info['student'] = student = context.students_catalog.getRecordByKey(student_id)
+info['review_state'] = review_state = student.review_state
+is_current_level = level_id == student.level
+school_fee_paid =  review_state == 'school_fee_paid'
+info['is_current_level'] = is_current_level
+info['has_verdict'] = has_verdict = level_doc.verdict
+
+info['submission_allowed']= school_fee_paid and is_current_level and not has_verdict
+info['validation_allowed']= review_state == 'courses_registered' and is_current_level
+info['rejection_allowed']= review_state in ('courses_registered', 'courses_validated',) and is_current_level
+info['validated'] = review_state == 'courses_validated' and is_current_level
+
+info['show_check_boxes'] =  (is_ca and school_fee_paid and is_current_level and not has_verdict) or\
+                            (info['is_student'] and school_fee_paid and is_current_level and not has_verdict) or\
+                            (is_so and is_current_level and not has_verdict)
+
+info['verdict'] = context.portal_vocabularies.verdicts.get(level_doc.verdict).upper()
+info['session'] = context.portal_vocabularies.sessions.get(level_doc.session)
+info['level_str'] = context.portal_vocabularies.student_levels.get(level_id)
+
+info['choosen_ids'] = request.get('ids',[])
+
+#info['status_info'] = ""
+#if is_student:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Request for course validation pending"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+#elif is_ca:
+#    if review_state == 'courses_registered':
+#        info['status_info'] = "Please validate these courses"
+#    elif review_state == 'courses_validated':
+#        info['status_info'] = "Courses validated"
+
+cert_id = student.course
+info['cert_id'] = cert_id
+total_credits,gpa,carry_overs,normal1,normal2,normal3 = course_results.getCourses(student_id,level_id)
+info['total_credits'] = total_credits
+
+#start customization
+
+max_credits = 58
+info['without_score'] = False
+info['without_cascore'] = False
+
+
+
+
+
+
+
+
+
+#end customization
+
+info['max_credits'] = max_credits
+info['credits_exceeded'] = total_credits > max_credits
+current_session = student.session
+
+info['gpa'] = gpa
+if gpa and total_credits:
+    info['gpa'] = "%4.2f" % (float(gpa)/int(total_credits))
+
+# carry_overs.sort(cmp_semester_id)
+info['carry_overs'] = carry_overs
+# normal.sort(cmp_semester_id)
+info['normal1'] = normal1
+info['normal2'] = normal2
+info['normal3'] = normal3
+
+info['data_missing'] = not info['normal1'] and not info['normal2'] and not info['normal3']
+info['spillover'] = student.level > student.end_level
+
+students_object = context.portal_url.getPortalObject().campus.students
+student = getattr(students_object, student_id)
+info['app'] = student.application
+info['app_doc'] = student.application.getContent()
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/getTranscriptInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/getTranscriptInfo.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/getTranscriptInfo.py	(revision 3690)
@@ -0,0 +1,88 @@
+## Script (Python) "getTranscriptInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student=None
+##title=
+##
+# $Id: getStudyLevelInfo.py 2760 2007-11-26 07:39:15Z henrik $
+"""
+return Info about the Studylevel
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+"""
+
+request = context.REQUEST
+response = request.RESPONSE
+import logging
+logger = logging.getLogger('Skins.getTranscriptInfo')
+info = context.waeup_tool.getAccessInfo(context)
+student_id = info['student_id']
+if student_id is None:
+    return None
+
+mtool = context.portal_membership
+if mtool.isAnonymousUser(): # or not context.isSectionOfficer():
+    return None
+
+mtool = context.portal_membership
+member = mtool.getAuthenticatedMember()
+member_id = str(member)
+
+course_results = context.course_results
+
+
+student_record = context.students_catalog.getRecordByKey(student_id)
+info['student_record'] = context.getFormattedStudentEntry(student_record)
+
+
+year_courses = [[],[],[],[],[],[],[],[],[]]
+year_details = [{'year':0},{'year':1},{'year':2},{'year':3},{'year':4},{'year':5},{'year':6},{'year':7},{'year':8}]
+
+courses = course_results.getAllCourses(student_id)
+
+for course in courses:
+    year = divmod(int(course['level_id']),100)[0]
+    year_courses[year].append(course)
+    if not getattr(year_details[year],'session',None):
+        year_details[year]['session'] = context.portal_vocabularies.sessions.get(course['session_id'])
+
+year_counter = 0
+cgpa = 0
+c_total_credits = 0
+for year in year_courses:
+    gpa = 0
+    total_credits = 0
+    for course in year:
+        if course['weight'] and course['credits']:
+            gpa += int(course['weight']) * int(course['credits'])
+            total_credits += int(course['credits'])
+    cgpa += gpa
+    c_total_credits += total_credits
+    if gpa and total_credits:
+        year_details[year_counter]['total_credits'] = total_credits
+        year_details[year_counter]['gpa'] = "%4.2f" % (float(gpa)/int(total_credits))
+    else:
+        year_details[year_counter]['total_credits'] = 0
+        year_details[year_counter]['gpa'] = 0
+
+    if cgpa and c_total_credits:
+        year_details[year_counter]['c_total_credits'] = c_total_credits
+        year_details[year_counter]['cgpa'] = "%4.2f" % (float(cgpa)/int(c_total_credits))
+    else:
+        year_details[year_counter]['c_total_credits'] = 0
+        year_details[year_counter]['cgpa'] = 0
+
+    year.sort(cmp=lambda x,y: cmp("%(semester)s%(code)s" % x,
+                                         "%(semester)s%(code)s" % y))
+    year_counter += 1
+
+info['year_details'] = year_details
+info['year_courses'] = year_courses
+
+return info
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/goto_interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/goto_interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/goto_interswitch_form.pt	(revision 3690)
@@ -0,0 +1,52 @@
+<metal:body use-macro="here/main_template/macros/master">
+    <metal:main fill-slot="main"
+                tal:define="info options/info">
+                
+        <h3>Authorize Online Payment! </h3>
+        <br />
+                
+      <form method="post" action="pay_online"
+            tal:attributes="action info/action ">
+      <span tal:repeat="arg python:info['args'].items()"
+            tal:omit-tag="">
+          <input type="hidden" tal:attributes="name python:arg[0];value python:arg[1]" />
+      </span>          
+      
+      <span tal:replace = "structure info/xml_data" /> 
+      
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+          <tr>
+            <td >
+            Surcharge:
+            </td>
+            <td> Naira <span tal:content="info/surcharge" /></td>
+          </tr>          
+      
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Proceed to Interswitch Payment Gateway" 
+               />
+      </form>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/interswitch_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/interswitch_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/interswitch_form.pt	(revision 3690)
@@ -0,0 +1,46 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="info options/info">
+    <h3>Confirm Your Payment Data! </h3>
+    <br />
+    <span tal:condition="not: info/payment_possible">
+      No payment information for your course available.
+    </span>
+    <span tal:condition="info/payment_possible">
+      <form method="post" action="pay_interswitch">
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+          <tr>
+            <td >
+            Surcharge:
+            </td>
+            <td> Naira <span tal:content="info/surcharge" /></td>
+          </tr>                  
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Confirm" 
+               />
+      </form>
+    </span>
+    </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/layout_student_acco_view_slip.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/layout_student_acco_view_slip.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/layout_student_acco_view_slip.pt	(revision 3690)
@@ -0,0 +1,34 @@
+<!-- a layout_lib macro -->
+<!-- $Id: layout_student_acco_view_slip.pt 1316 2007-01-17 18:05:49Z henrik $ -->
+<metal:block define-macro="default_view"
+  tal:define="layout options/layout;
+              dm options/datastructure/getDataModel;
+              widgets python:context.getRenderedWidgets(layout);
+              fields python:('bed',
+                              'acco_res_date',
+                                 'acco_maint_pay_id', 
+                                 'acco_maint_fee',
+                                 'acco_maint_date',
+                                 )"
+                                 >
+  <table width="" cellpadding="2" cellspacing="0" summary="Form layout">
+    <tr tal:repeat="field fields">
+      <tal:block tal:define="cell python: widgets[field]">
+        <tal:block define="widget cell/widget">
+          <div tal:attributes="class cell/widget_css_class|string:label;
+            id python:widget.getHtmlWidgetId()+'_widget';">
+            <td width="180px" valign="top">
+             <span class="dlabel"
+                    tal:condition="widget/label"
+                    tal:content="widget/label">label</span>:
+            </td>
+            <td> 
+               <span tal:condition="cell" tal:content="structure cell/widget_rendered"></span>
+               <span tal:condition="not:cell/widget_rendered"> none </span>
+            </td>
+          </div>
+        </tal:block>
+      </tal:block>
+    </tr>
+  </table>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/mail2admin.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/mail2admin.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/mail2admin.py	(revision 3690)
@@ -0,0 +1,44 @@
+## Script (Python) "mail2admin"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=fullname=None,regno=None,email=None,probtype=None,descr=None,commt=None
+##title=
+##
+# $Id: mail2admin.py 2334 2007-10-09 15:01:36Z henrik $
+
+mhost = context.MailHost
+prop = context.portal_properties
+
+d = {}
+d['fullname'] = fullname
+d['email'] = email
+d['email_from'] = prop.email_from_address
+d['regno'] = regno
+d['probtype'] = probtype
+d['descr'] = descr
+
+message = """
+From: %(fullname)s <%(email)s>
+To: %(email_from)s
+Cc: %(email)s
+Bcc: waeup@saoas.org
+Reply-To: %(email)s
+Subject: AAUA Contact
+
+Fullname: %(fullname)s
+Member ID: %(regno)s
+Problem Type: %(probtype)s
+Description: %(descr)s
+"""
+
+mhost.send(message % d)
+
+REQUEST = context.REQUEST
+RESPONSE = REQUEST.RESPONSE
+
+redirect_url = REQUEST.HTTP_REFERER
+redirect_url = '%s/?%s' % (redirect_url,'portal_status_message=Your message has been sent!')
+RESPONSE.redirect(redirect_url)
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/mail2student.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/mail2student.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/mail2student.py	(revision 3690)
@@ -0,0 +1,45 @@
+## Script (Python) "mail2student"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=co_name=None,co_email=None,student_email=None,probtype=None,commt=None, action=None
+##title=
+##
+# $Id: mail2admin.py 869 2006-11-15 13:46:49Z henrik $
+
+from urllib import urlencode
+
+mhost = context.MailHost
+prop = context.portal_properties
+REQUEST = context.REQUEST
+
+d = {}
+#d['co_name'] = co_name
+#d['co_email'] = co_email
+d['co_name'] = 'AAUA'
+d['co_email'] = prop.email_from_address
+d['student_email'] = student_email
+d['probtype'] = probtype
+d['commt'] = commt
+
+message = """
+From: %(co_name)s <%(co_email)s>
+To: %(student_email)s
+Cc: %(co_email)s
+Reply-To: %(co_email)s
+Subject: %(probtype)s
+%(commt)s
+"""
+
+mhost.send(message % d)
+
+args = {}
+psm = "Your message has been sent!"
+args['portal_status_message'] = psm
+if action:
+    url = context.absolute_url() + '/' + action + '?' + urlencode(args)
+else:
+    url = context.absolute_url() +'?' + urlencode(args)
+return REQUEST.RESPONSE.redirect(url)
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/main_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/main_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/main_template.pt	(revision 3690)
@@ -0,0 +1,217 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+  
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  base_url here/getBaseUrl;
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${here/getBaseUrl}${static_dir};
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  student_theme python:test(waeup_skin == 'WAeUP_Student',1,0);
+  navigation_slot python:test(student_theme,'student_navigation_slot','navigation_slot');
+  object_tabs python:test(student_theme,'student_object_slot','staff_object_slot');
+  
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}${waeup_skin}/render.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      
+     
+      <table summary="Logo Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0" 
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;"></td>
+            <td style="width: 170px; text-align: center; padding-top: 0.5em;">
+              <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo" />
+            </td>
+            <td padding=0.5em><h1>University of Ilorin, Ilorin, Nigeria</h1></td>
+            <td style="width: 20px;"></td>
+          </tr>
+        </tbody>
+      </table>
+
+      <table summary="Navigation Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="shapeNoBorder colorTransparent" cellpadding="0"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="" valign="top">
+              <div id="navigation_slot" 
+                       style="padding: 0em 0em 1px; text-align: right;"
+                       class="fontColornavigation fontShapenavigation portalTabTabStyle cpsskinsHBox body">
+                 <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot=navigation_slot)"
+                  tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+              </div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+      </table>
+      
+      
+      <table summary="Main Table Block 1"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: center;"
+              valign="top">
+            <div id="portal_session" style="padding: 0.4em 0.4em 0.4em 0.3em;"
+                 class="colorBarAreaColor fontColordefaultnovisitedlinks fontShapeaverage shapeAreaShape9">
+                    <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='portal_session')"
+                               tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="text-align: left; padding: 0.2em 0.2em 0em;" class="colorBarColor" valign="top">
+            <metal:block define-slot="action_slot" />
+            <div id="object_tabs" class="fontColornavigation fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot=object_tabs)">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet)" />
+            </div>
+          </td>
+          <td tal:condition="not:student_theme"
+              class="colorBarColor" valign="top" style="text-align: right;padding: 0.2em 0.2em 0em; width: 280px;">
+            <div id="status_slot" class="fontColordefaultfontcolors fontShapeaverage cpsskinsHBox body"
+                 tal:define="portlets python:ptool.getPortlets(context=context, slot='status_slot')">
+                <tal:block repeat="portlet portlets"
+                           tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+            </div>
+          </td>
+          <td style="width: 20px;"
+              valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+  
+  
+  
+    <table summary="Main Table Block 2"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             class="" cellpadding="0" cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td style="width: 170px;text-align: left;"
+              class="colorBarColor fontColornavigation fontShapeaverage boxShapenavbox cpsskinsBox" valign="top">
+            <div id="staff_actions_slot" class="body" style="padding: 1.5em 0.5em 1.5em 0.5em;">
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='staff_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="not:student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='global_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              <tal:block tal:condition="student_theme" repeat="portlet python:ptool.getPortlets(context=context, slot='student_actions_slot')"
+                         tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+
+              <span tal:condition="student_theme">
+              <div style="padding: 0em;">
+                <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_workflow')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>
+              </span>
+              
+              <div style="padding-top: 10px;">
+              <tal:block repeat="portlet python:ptool.getPortlets(context=context, slot='student_notice_slot')"
+                             tal:content="structure python:portlet.render_cache(context_obj=context, portlet=portlet, boxedit=None)" />
+              </div>  
+
+
+            </div>
+          </td>
+          <td style="" class="shapeAreaShape5 colorBarAreaColor" valign="top">
+            <div style="padding: 0.5em; text-align: left;" class="fontColordefaultfontcolors fontShapeaverage">
+              <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+              <metal:block define-slot="header" />
+              <metal:block define-slot="main" />
+              <metal:block define-slot="sub" />
+            </div>
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+    
+    
+    <table summary="Copyright Info Block"
+             style="margin-left: auto; margin-right: auto; width: 100%;"
+             cellspacing="0">
+        <tbody>
+          <tr>
+            <td style="width: 20px;" valign="top"></td>
+            <td style="padding: 0.2em; text-align: right;" valign="top">
+              <div class="fontColordefaultfontcolors fontShapeaverage">
+              Copyright WAeUP Group 2006-2008</div>
+            </td>
+            <td style="width: 20px;" valign="top"></td>
+          </tr>
+        </tbody>
+    </table>
+    </body>
+  </html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/no_booking_allowed.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/no_booking_allowed.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/no_booking_allowed.pt	(revision 3690)
@@ -0,0 +1,8 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+
+    <h3>You are not eligible to book accommodation!</h3>
+
+  </metal:main>
+</metal:body>
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/pay_interswitch.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/pay_interswitch.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/pay_interswitch.py	(revision 3690)
@@ -0,0 +1,167 @@
+## Script (Python) "pay_online"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: pay_interswitch.py 2619 2007-11-10 17:39:36Z henrik $
+"""
+pay online
+"""
+from urllib import urlencode
+import logging
+logger = logging.getLogger('Skins.pay_interswitch')
+import DateTime
+
+if context.portal_membership.isAnonymousUser():
+    return None
+
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+request = context.REQUEST
+wftool = context.portal_workflow
+students = context.portal_url.getPortalObject().campus.students
+
+
+student_id = context.getStudentId()
+student = getattr(students,student_id)
+
+student_record = context.students_catalog.getRecordByKey(student_id)
+#amount,description = context.getSchoolFee(student_record.faculty,student_record.session,student_record.course)
+info = {}
+info['student'] = student_record
+info['payment_possible'] = False
+info['amount'] = '0'
+info['bank'] = ''
+info['type_description'] = ''
+info['pay_bill_to'] = ''
+fee_dict = context.getSchoolFee(student_record)
+fulltime = student_record.mode.endswith('_ft')
+
+if not fee_dict:
+    return context.interswitch_form(info=info)
+
+info['site_id'] = '105'
+info['currency_id'] = '566'
+pay_item_id = "10500"
+
+#info['type_code'] = sbrain.course  #type_code is redundant and will be removed soon
+info['bank'] = ''
+info['payment_possible'] = True
+info['type_description'] = fee_dict['description']
+info['pay_bill_to'] = student_record.name
+info['student_id'] = student_id
+info['student_name'] = student_record.name
+info['type'] = 'online'
+info['status'] = 'started'
+info['session_id'] = fee_dict['next_session_id']
+info['item'] = student_record.course
+info['category'] = 'schoolfee'
+info['student_email'] = student_record.email
+now = DateTime.DateTime()
+info['date'] = now
+info['pay_ship_to'] = "Adekunle Ajasin University"
+timestamp = "%d" % int(now.timeTime()*1000)
+info['order_id'] = "%s%s" % (student_id[1:],timestamp)
+p_id = "p%s" % timestamp
+
+
+info['surcharge'] = interswitch_amount = '150'
+info['amount'] = amount = fee_dict['all']
+total_amount = 100*int(amount) + 100*int(interswitch_amount)
+
+
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+
+if True:
+    info['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+else:
+    #pass
+    #return None
+    info['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),p_id)
+
+
+if "payments" not in student.objectIds():
+    student.invokeFactory('PaymentsFolder','payments')
+    payments = getattr(student,'payments')
+    d = {}
+    d['Title'] = 'Payments'
+    payments.getContent().edit(mapping=d)
+    wftool.doActionFor(payments,'open')
+else:
+    payments = getattr(student,'payments')
+if request.has_key('epayment'):
+    return context.interswitch_form(info=info)
+
+
+payments.invokeFactory('Payment', p_id)
+payment = getattr(payments,p_id)
+wftool.doActionFor(payment,'open')
+d = {}
+d.update(info)
+payment.getContent().edit(mapping=d)
+
+
+info['callback_url'] = "%s/payments/%s/interswitch_cb?echo=%s" % (student.absolute_url(),
+                                                                  p_id,
+                                                                  p_id)
+
+logger.info('%(student_id)s initiated online school fee payment with order_id %(order_id)s and callback url %(callback_url)s' % info)
+payment_fields = (('product_id','site_id'),
+                  ('site_redirect_url','callback_url'),
+                  ('Currency','currency_id'),
+                  ('cust_id','student_id'),
+                  ('cust_id_desc','type_description'),
+                  ('cust_name','student_name'),
+                  ('txn_ref','order_id'),
+                  ('Amount','amount'),
+                  )
+args = {}
+for arg,field in payment_fields:
+    args[arg] = info[field]
+
+bt_amount = 4000
+
+aaua_amount = amount - bt_amount
+xmldict = {}
+xmldict['detail_ref'] = args['txn_ref']
+xmldict['department'] = student_record.department
+xmldict['faculty'] = student_record.faculty
+xmldict['aaua_amount'] = "%d" % int(100*aaua_amount)
+xmldict['bt_amount'] = "%d" % int(100*bt_amount)
+if student_record.mode.endswith('_pt'):
+    xmldict['aaua_acct'] = "0321100000000046"
+elif student_record.mode.endswith('_sw'):
+    xmldict['aaua_acct'] = "0321100000000056"
+else:
+    xmldict['aaua_acct'] = "0000000000000000"
+
+
+xmltext = """<payment_item_detail>
+<item_details detail_ref="%(detail_ref)s" college="AAUA" department="%(department)s" faculty="%(faculty)s">
+<item_detail item_id="1" item_name="AAUA" item_amt="%(aaua_amount)s" bank_id="89" acct_num="%(aaua_acct)s" />
+<item_detail item_id="2" item_name="BT" item_amt="%(bt_amount)s" bank_id="117" acct_num="6012015294" />
+</item_details>
+</payment_item_detail>""" % xmldict
+
+info['xml_data'] = """<input type="hidden" name="xml_data" value='%s'  />""" % xmltext
+
+args['Amount'] = "%d" % (total_amount)
+args['site_name'] = "aaua.waeup.org"
+args['cust_name_desc'] = "Student Name"
+args['pay_item_id'] = pay_item_id
+args['pay_item_name'] = "AAUA Tuition Payments"
+args['payment_params'] = 'college_split'
+#args['xml_data'] = ''
+#args['xml_data'] = xmltext   # info['xml_data']can be used instead
+info['args'] = args
+
+return context.goto_interswitch_form(info=info)
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/search_students_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/search_students_form.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/search_students_form.pt	(revision 3690)
@@ -0,0 +1,128 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="rendered options/rendered;
+              portal_status_message options/psm;
+              students options/students;
+              info options/info|nothing;
+              is_so context/isSectionOfficer;
+              allowed options/allowed|nothing;"
+              >
+    <span tal:condition="not: allowed">
+      <span tal:content="here/illegal_view" />
+    </span>
+    <span tal:condition="allowed" tal:omit-tag="">
+      <strong>
+        <nobr><a href="statistics_simple_view">Basic Student Statistics</a>
+        &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+        <span tal:condition="is_so">
+          <nobr><a href="apply_admission_manage">Application Process</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>      
+          <nobr><a href="view_logs">View Log Files</a>
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="add_student">Add Student Record</a>        
+          &nbsp;&nbsp;&nbsp;&nbsp;</nobr>
+          <nobr><a href="deactivate_students">Deactivate Student Record(s)</a></nobr>
+        </span>
+      </strong>
+      <h3> Search Student Section</h3><br />
+      You are logged in as member <span tal:replace="info/member|nothing" /> 
+      <span tal:condition="info/faculties|nothing" tal:omit-tag="">
+        who is ClearanceOfficer for Faculty 
+        <span tal:repeat="faculty info/faculties" tal:content="faculty" />
+      </span>
+      <span tal:condition="info/departments|nothing" tal:omit-tag="">
+        and <span tal:repeat="department info/departments|nothing" tal:content="department"/></span>.
+      <br /><br />
+      <span tal:replace="structure rendered" />
+      <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+      <span tal:condition="students">
+        <span tal:define="items students;
+        columns python:3;
+        items_per_page python:40;
+        max_items python:300;
+        zoom python:0;
+        batches_all python:here.getBatchList(items,columns, items_per_page,zoom,max_items=400);
+        batches python:batches_all[0];
+        batch_info python:batches_all[1];
+        zoomed python:batches_all[2];
+        mq nocall:modules/ZTUtils/make_query;"
+        tal:omit-tag="">
+          <tal:block tal:condition="python: items and batch_info and batch_info['nb_pages'] > 1">
+            <div class="batchLayout" i18n:translate="">
+              Objects:<strong><tal:block replace="batch_info/start"
+                                         i18n:name="batch_start" /> - <tal:block replace="batch_info/limit"
+                                                                                 i18n:name="batch_limit" />
+              </strong> of <tal:block replace="batch_info/length" i18n:name="batch_length" />
+            </div>
+            <br />
+          </tal:block>
+          <table class="contentListing" width="100%">
+            <span tal:repeat="rows batches" tal:omit-tag="">
+              <span tal:repeat="student rows">
+                <tr tal:condition="student" 
+                    tal:attributes="class python:test(repeat['student'].even(), 'even ajaxtd', 'odd ajaxtd')">
+                  <td><a href="id" tal:attributes="href string:${context/portal_url}/campus/students/${student/id}"
+                         tal:content="student/id"></a></td>    
+                  <td>
+                    <span tal:replace="student/name" />
+                  </td>    
+                  <td><span tal:replace="student/matric_no" /></td>   
+                  <td><span tal:replace="student/jamb_reg_no" /></td>
+                  <td tal:condition="options/co_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/clearance/external_clearance_edit_form"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and change state]</a></td>
+                  <td tal:condition="options/ca_view|nothing">
+                    <a href="id" 
+                       tal:attributes="href string:${context/portal_url}/campus/students/${student/id}/study_course/${student/level}/external_study_level_view"
+                       target="edit"
+                       onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                       >[view and validate course list]</a></td>
+                </tr>
+              </span>
+            </span>
+          </table>
+          <tal:block condition="python:batch_info and batch_info['nb_pages'] > 1">
+            <div class="pageNavigationLayout">
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=0))"
+                 >
+              (&lt;&lt;)</a>
+              <a tal:define="previous batch_info/previous"
+                 tal:condition="python:previous is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=previous))"
+                 i18n:translate="batch_previous">Previous</a>
+              <tal:block repeat="page batch_info/pages">
+                <tal:block condition="python:page != batch_info['start'] - 1">
+                  <a tal:attributes="href python:'%s?%s'%(request['URL'],
+                  mq(request.form, b_start=page))"
+                  tal:content="repeat/page/number">1</a>&nbsp;
+                </tal:block>
+                <tal:block condition="python:page == batch_info['start'] - 1">
+                  <span tal:content="string:${repeat/page/number}" />&nbsp;
+                </tal:block>
+              </tal:block>
+              <a tal:define="next batch_info/next"
+                 tal:condition="python:next is not None"
+                 tal:attributes="href python:'%s?%s'%(request['URL'],
+                 mq(request.form, b_start=next))"
+                 i18n:translate="batch_next">Next</a>
+              <a tal:define="next batch_info/next;
+              last_page python:batch_info['pages'][-1]"
+              tal:condition="python:next is not None"
+              tal:attributes="href python:'%s?%s'%(request['URL'],
+              mq(request.form, b_start=last_page))"
+              >
+              (&gt;&gt;)</a>
+            </div>
+          </tal:block>
+        </span>
+      </span>
+    </span>
+  </metal:main>
+</metal:body>
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/slip_template.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/slip_template.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/slip_template.pt	(revision 3690)
@@ -0,0 +1,109 @@
+<metal:block define-macro="master"
+  tal:define="showthirdcol showthirdcol|python:1;
+  emptybody emptybody|request/emptybody|nothing;
+  mtool here/portal_membership;
+
+  utool nocall:here/portal_url;
+  atool here/portal_actions;
+  ttool here/portal_trees;
+  wtool here/portal_workflow;
+  ptool here/portal_cpsportlets;
+  context_url python:here.getContextUrl(utool=utool);
+  here_url here/absolute_url;
+  base_url here/getBaseUrl;
+  static_dir here/portal_properties/static_dir;
+  static_base_url string:${base_url}${static_dir};    
+  member mtool/getAuthenticatedMember;
+  isAnon mtool/isAnonymousUser;
+  isHomeless python:isAnon or member.getProperty('homeless', 0);
+  isHomeless python:(isHomeless == '0' and [0] or [isHomeless])[0];
+  actions python:atool.listFilteredActionsFor(here);
+  wf_state python:wtool.getInfoFor(here,'review_state','');
+  uname python: isAnon and 'Guest' or member.getUserName();
+  checkPerm nocall: mtool/checkPermission;
+  cpsmcat nocall:here/translation_service;
+  locale here/translation_service/getSelectedLanguage;
+  in_ws here/isInWorkspace;
+  waeup_skin here/get_waeup_skin;
+  ">
+  <metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+  </metal:block>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+    <head>
+      <metal:block use-macro="here/header_lib_header/macros/header|here/header_lib/macros/header">
+        <metal:block fill-slot="base">
+          <metal:block define-slot="base">
+            <base href=""
+                  tal:attributes="href string:${here_url}/" />
+          </metal:block>
+        </metal:block>
+        <metal:block fill-slot="head_slot">
+          <metal:block define-slot="head_slot" />
+        </metal:block>
+        <metal:block fill-slot="style_slot">
+          <link rel="stylesheet" type="text/css" media="all"
+                tal:attributes="href string:${static_base_url}common.css" />
+          <metal:block define-slot="style_slot" />
+        </metal:block>
+        <metal:block fill-slot="javascript_head_slot">
+          <metal:block define-slot="javascript_head_slot" />
+        </metal:block>
+      </metal:block>
+      <link rel="icon"
+            href="ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+      <link rel="shortcut icon"
+            href="icons/ng.png"
+            tal:attributes="href string:${static_base_url}ng.png"
+            type="image/png" />
+    </head>
+    <body tal:condition="emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+      <metal:block define-slot="body" />
+      <metal:block define-slot="main" />
+    </body>
+    <body tal:condition="not:emptybody"
+          style="margin: 0px;"
+          tal:attributes="onload here/getOnLoad|string:setFocus();">
+   
+    <table summary="Logo Block"
+           style="margin-left: auto; margin-right: auto; width: 100%;"
+           class="shapeNoBorder colorTransparent" cellpadding="0"
+           cellspacing="0">
+      <tbody>
+        <tr>
+          <td style="width: 20px;" valign="top"></td>
+          <td valign="top" style="width: 80px; padding: 0.5em; text-align: right;">
+            <img tal:attributes="src string:${static_base_url}logo_left.jpg"  alt="Logo"
+                     height="84"  />
+          </td>
+          <td style="padding: 1em 0em 0em 0em; text-align: left;" valign="top">
+             <h2>University of Ilorin, Ilorin, Nigeria</h2>
+          
+          </td>
+          <td style="width: 20px;" valign="top"></td>
+        </tr>
+      </tbody>
+    </table>
+      
+    <table summary="Main Block" cellpadding="0" cellspacing="0" 
+           style="margin-left:auto;margin-right:auto;width:100%;">
+      <tr>
+        <td valign="top" style="width:700px">
+          <div style="padding:2em; text-align: left;" 
+               class="fontColordefaultfontcolors fontShapeTitleindex shapeAreaShape">
+                  <metal:block use-macro="here/generic_lib_portal_message/macros/portal_message" />
+                  <metal:block define-slot="header" />
+                  <metal:block define-slot="main" />
+                  <metal:block define-slot="sub" />
+          </div>
+        </td>
+      </tr>
+    </table>
+  </body>
+</html>
+</metal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/statistics_simple_view.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/statistics_simple_view.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/statistics_simple_view.pt	(revision 3690)
@@ -0,0 +1,125 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+  <metal:block tal:define="faculties context/getSimpleStudentStatistics;
+                        mtool here/portal_membership;
+                        member mtool/getAuthenticatedMember;
+                        session_str python:context.getSessionId()[1]">       
+
+      <span tal:condition="not: faculties">
+        <span tal:content="here/illegal_view" />
+      </span>
+      <span tal:condition="faculties">
+  
+      <strong>
+      <nobr><a href="search_students">Search Students</a>
+      &nbsp;&nbsp;&nbsp;&nbsp;</nobr>        
+   
+      </strong>     
+
+      <h3>Basic Student Statistics <span tal:content="session_str" /></h3>
+      <br />      
+      <span tal:condition="not:isAnon">
+      Student records imported: <span tal:content="python: faculties[0]['total_in_catalog']" />
+      <br />  <br />  
+        <table >  
+
+          <tr>
+            <th>&nbsp;</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">All Students</th>
+            
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">Category A</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">Category B</th>
+
+            <th style="border-style:solid; border-width:1px; border-color:black" align="center" colspan="2">Category C</th>
+
+
+          </tr>
+
+          <tr class="odd ajaxtd">
+            <th >Faculty</th>
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+            <th align="right">Returning</th>
+            <th align="right">New</th>
+
+
+          </tr>
+          <tr tal:repeat="d faculties"
+              tal:attributes="class python:test(repeat['d'].even(), 'even ajaxtd', 'odd ajaxtd')">
+              <td width="80px"> <span tal:content="d/id" /> </td>
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_ft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_pt" />
+              </td>              
+
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Aft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Apt" />
+              </td>              
+
+     
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bft" />
+              </td>              
+
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Bpt" />
+              </td>              
+              
+   
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cft" />
+              </td>      
+              
+              <td width="60px" align="right"> 
+                <span tal:content="d/total_Cpt" />
+              </td>      
+              
+                                        
+
+                                       
+
+          </tr>
+        </table>
+
+        <br />
+        <table   border=0>
+
+        <tr><td>Category A: </td> <td>students who paid their school fee in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category B: </td> <td>students who registered their courses online (A contains B) in <span tal:content="session_str" /></td></tr>
+        <tr><td>Category C: </td> <td>students who 'arrived' in <span tal:content="session_str" /> but have not yet paid their school fee</td></tr>
+        <tr><td>New: </td> <td>students in level 100 or 600</td></tr>
+        <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
+        <tr><td colspan="2"><strong>Remark:</strong> <span tal:content="python: faculties[0]['not_categorized']" /> returning students are not categorized.
+             </td>
+        </tr>
+          
+        </table>
+        
+        
+        
+      </span>
+      </span>
+  </metal:block>      
+  </metal:main>
+</metal:body>
+      
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/student_index.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/student_index.py	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/student_index.py	(revision 3690)
@@ -0,0 +1,54 @@
+## Script (Python) "student_index"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=batch=None,portal_status_message=None
+##title=
+##
+# $Id: student_index.py 2297 2007-10-01 07:26:30Z henrik $
+"""
+return the current student_index
+"""
+
+request = context.REQUEST
+#session = request.SESSION
+response = request.RESPONSE
+redirect = response.redirect
+pm = context.portal_membership
+member = pm.getAuthenticatedMember()
+
+#from Products.zdb import set_trace;set_trace()
+if context.isStaff():
+    if context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.study_level_view()
+    elif context.portal_type == 'StudentClearance':
+        return context.clearance_view()
+    elif context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Student':
+        if portal_status_message:
+            return redirect("%s/student_view?portal_status_message=%s" % (context.absolute_url(),portal_status_message))
+        else:
+            return redirect("%s/student_view" % context.absolute_url())
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    return redirect("%s/waeup_document_view" % context.absolute_url())
+if context.isStudent():
+    if context.portal_type == 'PaymentsFolder':
+        return context.payments_view()
+    elif context.portal_type == 'Payment':
+        return context.payment_receipt()
+    elif context.portal_type == 'StudentStudyLevel':
+        return context.study_level_view()
+    elif context.portal_type == 'StudentStudyCourse':
+        return context.study_course_view()
+    students_url = "%s/campus/students" % (context.portal_url())
+    id = str(member)
+    return redirect("%s/%s/student_view" % (students_url, id))
+
+return redirect("%s/srp_anonymous_view" % context.portal_url())
+
Index: /WAeUP_SRP/trunk/skins/waeup_unilorin/transcript_view.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_unilorin/transcript_view.pt	(revision 3690)
+++ /WAeUP_SRP/trunk/skins/waeup_unilorin/transcript_view.pt	(revision 3690)
@@ -0,0 +1,106 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+          tal:define="info context/getTranscriptInfo;">
+  <metal:block define-macro="edit_form">   
+              
+    <span tal:condition="not: info">
+      <span tal:content="here/illegal_view" />
+    </span>
+    
+    <span tal:condition="info">
+    <span tal:define= "is_so context/isSectionOfficer;
+                       is_ca context/isCourseAdviser;
+                       is_student info/is_student;
+                       with_score not: info/without_score|nothing;
+                       ">       
+          
+    <a href=""
+       tal:attributes="href string:${here/academicsParent}">
+      <img tal:attributes="src string:${here/portal_url}/arrow_up.gif"/>
+      Up one level
+    </a>
+
+    <h3> 
+      <span tal:condition="python: is_so or is_ca">
+        <span tal:content="info/student_record/name" />:
+      </span>
+      <span tal:condition="is_student">My </span> Transcript     
+      <br />
+    </h3>
+             
+      <span tal:repeat="details info/year_details">
+      <span tal:define="year_courses info/year_courses;
+                        year python:year_courses[details['year']]"
+            tal:condition="python:len(year)">
+      
+      <br />
+      
+      <h3> Year <span tal:replace="details/year" />  (Session <span tal:replace="details/session" />)</h3>
+      
+     
+      
+     
+      <br />
+      
+      <table  class="contentListing" width="100%" id="folder_content">
+        <tr>
+        <th align='center'></th> 
+        <th align='center'>session</th>
+        <th align='center'>level</th>
+        <th align='center'>semester</th>
+        <th align='center'>credits</th>
+        <th tal:condition="with_score" align='center'>score</th>
+        <th align='center'>grade</th>
+        <th align='center'>weight</th>
+        <th align='center'></th>       
+        </tr>  
+                      
+        <tr tal:repeat="row year"
+            tal:attributes="class python:test(repeat['row'].even(), 'even ajaxtd', 'odd ajaxtd')">
+          <td align="center" tal:content="row/code"></td>
+          <td align='center' tal:content="row/session_id"></td>
+          <td align='center' tal:content="row/level_id"></td>                    
+          <td align="center"><span tal:content="row/semester" /></td>
+          <td align="center" tal:content="row/credits"></td>
+          <td tal:condition="with_score" align="center"  tal:content="row/score"></td>
+          <td align="center" tal:content="row/grade"></td>
+          <td align="center" tal:content="row/weight"></td>
+          <td align="center" tal:content="row/coe|nothing"></td>
+        </tr>
+      </table>
+
+        <br />
+        <table>
+          <tr tal:condition="details/total_credits" >
+            <th width='200pt'>Total Credits:</th>
+            <td tal:content="details/total_credits" />
+          </tr>
+          <tr tal:condition="details/gpa">
+            <th>GPA:</th> 
+            <td><span tal:content="details/gpa" /></td>
+          </tr>
+          <tr>
+            <th>Cumulative Total Credits:</th>
+            <td tal:content="details/c_total_credits" />
+          </tr>
+          <tr tal:condition="details/cgpa">
+            <th>CGPA:</th> 
+            <td><span tal:content="details/cgpa" /></td>
+          </tr>          
+        </table>      
+
+      </span>
+      </span>
+
+      
+ 
+               
+
+    <br />
+  </span>
+  </span>        
+  </metal:block>    
+  </metal:main>
+
+</metal:body>
+
