Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12612)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12615)
@@ -32,5 +32,6 @@
     IIPPMVLContract,
     IRPPMVLContract,
-    IAPPITContract
+    IAPPITContract,
+    IRPTContract
     )
 from ikobacustom.pcn.interfaces import MessageFactory as _
@@ -119,5 +120,5 @@
 
 class APPITContractProcessor(ContractProcessorBase):
-    """A batch processor for IRPPMVLContract objects.
+    """A batch processor for IAPPITContract objects.
     """
     util_name = 'appitcontractprocessor'
@@ -126,2 +127,11 @@
     iface = IAPPITContract
     factory_name = 'waeup.APPITContract'
+
+class RPTContractProcessor(ContractProcessorBase):
+    """A batch processor for IRPTContract objects.
+    """
+    util_name = 'rptcontractprocessor'
+    grok.name(util_name)
+    name = _('Registration as a Pharmacy Technician (Contract) Processor')
+    iface = IRPTContract
+    factory_name = 'waeup.RPTContract'
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py	(revision 12612)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py	(revision 12615)
@@ -56,4 +56,8 @@
     IAPPITContractProcess,
     IAPPITContractOfficialUse,
+    IRPTContract,
+    IRPTContractEdit,
+    IRPTContractProcess,
+    IRPTContractOfficialUse,
     )
 
@@ -324,2 +328,40 @@
         return implementedBy(APPITContract)
 
+
+class RPTContract(ContractBase):
+    """Registration as a Pharmacy Technician contract.
+    """
+
+    grok.implements(
+        IRPTContractProcess,
+        IRPTContract,
+        IRPTContractEdit,
+        ICustomerNavigation)
+
+    contract_category = 'rpt'
+
+    form_fields_interface = IRPTContract
+
+    edit_form_fields_interface = IRPTContractEdit
+
+    ou_form_fields_interface = IRPTContractOfficialUse
+
+    check_docs_interface = IRPTContract
+
+RPTContract = attrs_to_fields(RPTContract)
+
+
+class RPTContractFactory(grok.GlobalUtility):
+    """A factory for contracts.
+    """
+    grok.implements(IFactory)
+    grok.name(u'waeup.RPTContract')
+    title = u"Create a new license contract.",
+    description = u"This factory instantiates new contract instances."
+
+    def __call__(self, *args, **kw):
+        return RPTContract(*args, **kw)
+
+    def getInterfaces(self):
+        return implementedBy(RPTContract)
+
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12612)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12615)
@@ -30,5 +30,6 @@
     IIPPMVLContractProcess,
     IRPPMVLContractProcess,
-    IAPPITContractProcess)
+    IAPPITContractProcess,
+    IRPTContractProcess)
 from ikobacustom.pcn.interfaces import MessageFactory as _
 
@@ -113,2 +114,10 @@
     title = _(u'Accepting Pupil Pharmacist for Internship Training Contracts')
     class_name = 'APPITContract'
+
+class RPTContractExporter(ContractExporterBase):
+    """Exporter for Contract instances.
+    """
+    grok.name('rptcontracts')
+    iface = IRPTContractProcess
+    title = _(u'Registration as a Pharmacy Technician Contracts')
+    class_name = 'RPTContract'
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12612)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12615)
@@ -1014,2 +1014,116 @@
 
     """
+
+class IRPTContract(IContract):
+    """A Registration as a Pharmacy Technician contract.
+
+    """
+
+    state_of_origin = schema.Choice(
+        vocabulary = nats_vocab,
+        title = _(u'State of Origin'),
+        required = False,
+        )
+
+    nationality = schema.Choice(
+        vocabulary = nats_vocab,
+        title = _(u'Nationality'),
+        required = False,
+        )
+
+    nationality_aquired = schema.Choice(
+        values=[_(u'birth'), _(u'naturalization')],
+        title = _(u'Nationality acquired by'),
+        required = False,
+        )
+
+    lga = schema.Choice(
+        source = LGASource(),
+        title = _(u'State / LGA'),
+        required = False,
+        )
+
+    office_address = schema.Text(
+        title = _(u'Offices or Business Address'),
+        required = False,
+        )
+
+    home_address = schema.Text(
+        title = _(u'Permanent Home Address'),
+        required = False,
+        )
+
+    res_address = schema.Text(
+        title = _(u'Residential Address'),
+        required = False,
+        )
+
+    schools_attended = schema.Text(
+        title = _(u'Schools Attended'),
+        description = _('Enter:<br />'
+                        '(1) name of primary school, period of attendance<br />'
+                        '(2) name of secondary school, period of attendance<br />'
+                        '(3) name of post-secondary school, period of attendance'),
+        required = False,
+        )
+
+    subjects = schema.List(
+        title = _(u'Subjects'),
+        value_type = ResultEntryField(),
+        required = False,
+        readonly = False,
+        default = [],
+        )
+
+    referee1_name = schema.TextLine(
+        title = _(u'First Referee Name'),
+        required = False,
+        readonly = False,
+        )
+
+    referee1_address = schema.Text(
+        title = _(u'First Referee Address'),
+        required = False,
+        readonly = False,
+        )
+
+    referee2_name = schema.TextLine(
+        title = _(u'Second Referee Name'),
+        required = False,
+        readonly = False,
+        )
+
+    referee2_address = schema.Text(
+        title = _(u'Second Referee Address'),
+        required = False,
+        readonly = False,
+        )
+
+
+class IRPTContractOfficialUse(IIkobaObject):
+    """Interface for editing RPT official use data.
+
+    """
+
+    comment = schema.Text(
+        title= _('Reason for rejection'),
+        required = False,
+        )
+
+
+class IRPTContractProcess(IRPTContract, IRPTContractOfficialUse):
+    """Interface for processing RPT data.
+    """
+
+    product_options = schema.List(
+        title = _(u'Options/Fees'),
+        value_type = ProductOptionField(),
+        required = False,
+        readonly = False,
+        default = [],
+        )
+
+class IRPTContractEdit(IRPTContract):
+    """Interface for editing RPT 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 12612)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_contract.py	(revision 12615)
@@ -37,4 +37,5 @@
     RPPMVLContract,
     APPITContract,
+    RPTContract,
     )
 from ikobacustom.pcn.customers.interfaces import (
@@ -46,4 +47,5 @@
     IRPPMVLContract,
     IAPPITContract,
+    IRPTContract,
     )
 
@@ -68,4 +70,6 @@
         verify.verifyObject(IAPPITContract, APPITContract())
         verify.verifyObject(ICustomerNavigation, APPITContract())
+        verify.verifyObject(IRPTContract, RPTContract())
+        verify.verifyObject(ICustomerNavigation, RPTContract())
         return
 
@@ -114,3 +118,9 @@
         self.assertEqual(container[id7], contract7)
         self.assertEqual(contract7.class_name, 'APPITContract')
+
+        contract8= createObject(u'waeup.RPTContract')
+        id8 = contract8.contract_id
+        container.addContract(contract8)
+        self.assertEqual(container[id8], contract8)
+        self.assertEqual(contract8.class_name, 'RPTContract')
         return
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12612)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12615)
@@ -64,4 +64,6 @@
         'APPITContract': _(
             'Accepting Pupil Pharmacist for Internship Training'),
+        'RPTContract': _(
+            'Registration as a Pharmacy Technician'),
         }
 
@@ -83,3 +85,4 @@
         'ippmvlcontracts',
         'rppmvlcontracts',
-        'appitcontracts')
+        'appitcontracts',
+        'rptcontracts')
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12612)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12615)
@@ -53,4 +53,5 @@
         'rppmvl': 'Renewal of Patent and Proprietary Medicines Vendors License',
         'appit': 'Accepting Pupil Pharmacist for Internship Training',
+        'rpt': 'Registration as a Pharmacy Technician',
         'no': 'no license',
         }
@@ -80,5 +81,6 @@
         'ippmvlcontracts',
         'rppmvlcontracts',
-        'appitcontracts')
+        'appitcontracts',
+        'rptcontracts',)
 
     BATCH_PROCESSOR_NAMES = (
@@ -92,5 +94,6 @@
         'ippmvlcontractprocessor',
         'rppmvlcontractprocessor',
-        'appitcontractprocessor'
+        'appitcontractprocessor',
+        'rptcontractprocessor',
         'pcnproductprocessor',
         'pdfdocumentprocessor',
