Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12610)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12611)
@@ -31,5 +31,7 @@
     IRPCContract,
     IIPPMVLContract,
-    IRPPMVLContract)
+    IRPPMVLContract,
+    IAPPITContract
+    )
 from ikobacustom.pcn.interfaces import MessageFactory as _
 
@@ -115,2 +117,11 @@
     iface = IRPPMVLContract
     factory_name = 'waeup.RPPMVLContract'
+
+class APPITContractProcessor(ContractProcessorBase):
+    """A batch processor for IRPPMVLContract objects.
+    """
+    util_name = 'appitcontractprocessor'
+    grok.name(util_name)
+    name = _('Accepting Pupil Pharmacist for Internship Training (Contract) Processor')
+    iface = IAPPITContract
+    factory_name = 'waeup.APPITContract'
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/browser.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/browser.py	(revision 12610)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/browser.py	(revision 12611)
@@ -23,5 +23,5 @@
     PDFContractSlipPage, CustomerBaseEditFormPage)
 from ikobacustom.pcn.interfaces import MessageFactory as _
-from ikobacustom.pcn.customers.interfaces import IRPCContract
+from ikobacustom.pcn.customers.interfaces import IRPCContract, IAPPITContract
 
 class PDFContractSlipPage(PDFContractSlipPage):
@@ -51,4 +51,15 @@
                 )
 
+class PDFAPPITContractSlipPage(PDFContractSlipPage):
+    """Deliver pdf file including metadata.
+    """
+
+    grok.context(IAPPITContract)
+
+    def _sigsInFooter(self):
+        return (_('Date, Signature of Internee'),
+                _('Date, Signature of Supervisor'),
+                )
+
 class CustomerBaseEditFormPage(CustomerBaseEditFormPage):
     """ View to edit customer base data
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py	(revision 12610)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py	(revision 12611)
@@ -52,4 +52,8 @@
     IRPPMVLContractProcess,
     IRPPMVLContractOfficialUse,
+    IAPPITContract,
+    IAPPITContractEdit,
+    IAPPITContractProcess,
+    IAPPITContractOfficialUse,
     )
 
@@ -244,4 +248,5 @@
         return implementedBy(IPPMVLContract)
 
+
 class RPPMVLContract(ContractBase):
     """Renewal of Patent and Proprietary Medicines Vendors License contract.
@@ -281,2 +286,40 @@
         return implementedBy(RPPMVLContract)
 
+
+class APPITContract(ContractBase):
+    """Accepting Pupil Pharmacist for Internship Training contract.
+    """
+
+    grok.implements(
+        IAPPITContractProcess,
+        IAPPITContract,
+        IAPPITContractEdit,
+        ICustomerNavigation)
+
+    contract_category = 'appit'
+
+    form_fields_interface = IAPPITContract
+
+    edit_form_fields_interface = IAPPITContractEdit
+
+    ou_form_fields_interface = IAPPITContractOfficialUse
+
+    check_docs_interface = IAPPITContract
+
+APPITContract = attrs_to_fields(APPITContract)
+
+
+class APPITContractFactory(grok.GlobalUtility):
+    """A factory for contracts.
+    """
+    grok.implements(IFactory)
+    grok.name(u'waeup.APPITContract')
+    title = u"Create a new license contract.",
+    description = u"This factory instantiates new contract instances."
+
+    def __call__(self, *args, **kw):
+        return APPITContract(*args, **kw)
+
+    def getInterfaces(self):
+        return implementedBy(APPITContract)
+
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12610)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12611)
@@ -29,5 +29,6 @@
     IRPCContractProcess,
     IIPPMVLContractProcess,
-    IRPPMVLContractProcess)
+    IRPPMVLContractProcess,
+    IAPPITContractProcess)
 from ikobacustom.pcn.interfaces import MessageFactory as _
 
@@ -104,2 +105,10 @@
     title = _(u'Renewal of Patent and Proprietary Medicines Vendors Licenses')
     class_name = 'RPPMVLContract'
+
+class APPITContractExporter(ContractExporterBase):
+    """Exporter for Contract instances.
+    """
+    grok.name('appitcontracts')
+    iface = IAPPITContractProcess
+    title = _(u'Accepting Pupil Pharmacist for Internship Training Contracts')
+    class_name = 'APPITContract'
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12610)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12611)
@@ -47,4 +47,6 @@
             'manufacturing',
             'retail and dispensing',
+            'research and training',
+            'hospital practice',
             'wholesale',
             ]
@@ -110,5 +112,5 @@
         )
 
-    work_email = schema.ASCIILine(
+    work_email = schema.TextLine(
         title = _(u'Work Email Address'),
         required = False,
@@ -563,4 +565,10 @@
         )
 
+    occupation = schema.TextLine(
+        title = _(u'Occupation'),
+        required = False,
+        readonly = False,
+        )
+
     qualifications = schema.Text(
         title = _(u'Educational Qualifications'),
@@ -600,5 +608,5 @@
         )
 
-    shop_email = schema.ASCIILine(
+    shop_email = schema.TextLine(
         title = _(u'Shop Email Address'),
         required = False,
@@ -736,4 +744,17 @@
         )
 
+    occupation = schema.TextLine(
+        title = _(u'Occupation'),
+        required = False,
+        readonly = False,
+        )
+
+    qualifications = schema.Text(
+        title = _(u'Educational Qualifications'),
+        description = u'Enter a list of certificates obtained.',
+        required = False,
+        readonly = False,
+        )
+
     shop_address = schema.Text(
         title = _(u'Patent Vendor\'s Shop'),
@@ -742,4 +763,10 @@
         )
 
+    ppmv_signpost = schema.TextLine(
+        title = _(u'PPMV Sign-post Number'),
+        required = False,
+        readonly = False,
+        )
+
     shop_lga = schema.Choice(
         source = LGASource(),
@@ -748,5 +775,5 @@
         )
 
-    shop_email = schema.ASCIILine(
+    shop_email = schema.TextLine(
         title = _(u'Shop Email Address'),
         required = False,
@@ -843,2 +870,145 @@
 
     """
+
+class IAPPITContract(IContract):
+    """A Accepting Pupil Pharmacist for Internship Training contract.
+
+    """
+
+    institution_address = schema.Text(
+        title = _(u'Institution'),
+        description= _('Enter name and address of institution.'),
+        required = False,
+        )
+
+    approved = schema.Bool(
+        title= _('Institution Approved'),
+        description= _('Tick box if the institution is approved for internship.'),
+        required = False,
+        )
+
+    inst_certificate = schema.TextLine(
+        title = _(u'Institution Certificate'),
+        description= _('Enter the institutions certificate number and date.'),
+        required = False,
+        readonly = False,
+        )
+
+    employer_address = schema.Text(
+        title = _(u'Employer'),
+        description= _('Enter name and address of employer.'),
+        required = False,
+        )
+
+    internee_name = schema.TextLine(
+        title = _(u'Internee Name'),
+        required = False,
+        readonly = False,
+        )
+
+    internee_address = schema.Text(
+        title = _(u'Internee Address'),
+        required = False,
+        )
+
+    provisional_registration = schema.TextLine(
+        title = _(u'Provisional Registration'),
+        description= _('Enter number and date of certificate of '
+                       'provisional regsitration of the internee.'),
+        required = False,
+        readonly = False,
+        )
+
+    educational_institution = schema.Text(
+        title = _(u'Educational Institution Attended'),
+        description= _('Enter name, address of institution and period of attendance.'),
+        required = False,
+        readonly = False,
+        )
+
+    educational_period = schema.TextLine(
+        title = _(u'Period'),
+        description= _('Enter period of attendance.'),
+        required = False,
+        readonly = False,
+        )
+
+    educational_qualification = schema.TextLine(
+        title = _(u'Qualification'),
+        description= _('Enter qualification obtained.'),
+        required = False,
+        readonly = False,
+        )
+
+    supervisor = schema.TextLine(
+        title = _(u'Supervising Pharmacist'),
+        required = False,
+        readonly = False,
+        )
+
+    supervisor_designation = schema.TextLine(
+        title = _(u'Designation'),
+        description= _('Enter designation of supervisor.'),
+        required = False,
+        readonly = False,
+        )
+
+    supervisor_year = schema.TextLine(
+        title = _(u'Year of Qualification'),
+        description= _('Enter year of qualification of supervisor.'),
+        required = False,
+        readonly = False,
+        )
+
+    supervisor_regnumber = schema.TextLine(
+        title = _(u'Registration Number'),
+        description= _('Enter registration number of supervisor.'),
+        required = False,
+        readonly = False,
+        )
+
+    license_regnumber = schema.TextLine(
+        title = _(u'Annual License to Practice'),
+        description= _('Enter number and date of annual license to practice '
+                       'of supervisor.'),
+        required = False,
+        readonly = False,
+        )
+
+
+    scope_practice = schema.List(
+        title = _(u'Scope of Practice'),
+        value_type = schema.Choice(source=PracticeSource()),
+        description= _('Select scopes of pharmaceutical practice currently '
+                       'undertaken at the institution.'),
+        required = False,
+        default = [],
+        )
+
+class IAPPITContractOfficialUse(IIkobaObject):
+    """Interface for editing APPIT official use data.
+
+    """
+
+    comment = schema.Text(
+        title= _('Reason for rejection'),
+        required = False,
+        )
+
+
+class IAPPITContractProcess(IAPPITContract, IAPPITContractOfficialUse):
+    """Interface for processing APPIT data.
+    """
+
+    product_options = schema.List(
+        title = _(u'Options/Fees'),
+        value_type = ProductOptionField(),
+        required = False,
+        readonly = False,
+        default = [],
+        )
+
+class IAPPITContractEdit(IAPPITContract):
+    """Interface for editing APPIT data by customers.
+
+    """
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_contract.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_contract.py	(revision 12610)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_contract.py	(revision 12611)
@@ -36,4 +36,5 @@
     IPPMVLContract,
     RPPMVLContract,
+    APPITContract,
     )
 from ikobacustom.pcn.customers.interfaces import (
@@ -44,4 +45,5 @@
     IIPPMVLContract,
     IRPPMVLContract,
+    IAPPITContract,
     )
 
@@ -64,4 +66,6 @@
         verify.verifyObject(IIPPMVLContract, IPPMVLContract())
         verify.verifyObject(ICustomerNavigation, IPPMVLContract())
+        verify.verifyObject(IAPPITContract, APPITContract())
+        verify.verifyObject(ICustomerNavigation, APPITContract())
         return
 
@@ -104,3 +108,9 @@
         self.assertEqual(container[id6], contract6)
         self.assertEqual(contract6.class_name, 'RPPMVLContract')
+
+        contract7= createObject(u'waeup.APPITContract')
+        id7 = contract7.contract_id
+        container.addContract(contract7)
+        self.assertEqual(container[id7], contract7)
+        self.assertEqual(contract7.class_name, 'APPITContract')
         return
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12610)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12611)
@@ -62,5 +62,10 @@
         'RPPMVLContract': _(
             'Renewal of Patent and Proprietary Medicines Vendors License'),
+        'APPITContract': _(
+            'Accepting Pupil Pharmacist for Internship Training'),
         }
+
+
+
 
     SELECTABLE_DOCTYPES_DICT = deepcopy(DOCTYPES_DICT)
@@ -77,3 +82,4 @@
         'rpccontracts',
         'ippmvlcontracts',
-        'rppmvlcontracts')
+        'rppmvlcontracts',
+        'appitcontracts')
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12610)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12611)
@@ -52,4 +52,5 @@
         'ippmvl': 'Issuance of Patent and Proprietary Medicines Vendors License',
         'rppmvl': 'Renewal of Patent and Proprietary Medicines Vendors License',
+        'appit': 'Accepting Pupil Pharmacist for Internship Training',
         'no': 'no license',
         }
@@ -78,5 +79,6 @@
         'rpccontracts',
         'ippmvlcontracts',
-        'rppmvlcontracts')
+        'rppmvlcontracts',
+        'appitcontracts')
 
     BATCH_PROCESSOR_NAMES = (
@@ -90,4 +92,5 @@
         'ippmvlcontractprocessor',
         'rppmvlcontractprocessor',
+        'appitcontractprocessor'
         'pcnproductprocessor',
         'pdfdocumentprocessor',
