Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12616)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12617)
@@ -33,5 +33,6 @@
     IRPPMVLContract,
     IAPPITContract,
-    IRPTContract
+    IRPTContract,
+    IAPPTContract
     )
 from ikobacustom.pcn.interfaces import MessageFactory as _
@@ -136,2 +137,11 @@
     iface = IRPTContract
     factory_name = 'waeup.RPTContract'
+
+class APPTContractProcessor(ContractProcessorBase):
+    """A batch processor for IAPPTContract objects.
+    """
+    util_name = 'apptcontractprocessor'
+    grok.name(util_name)
+    name = _('License Processor: Annual Permit for Pharmacy Technician')
+    iface = IAPPTContract
+    factory_name = 'waeup.APPTContract'
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/browser.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/browser.py	(revision 12616)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/browser.py	(revision 12617)
@@ -23,5 +23,6 @@
     PDFContractSlipPage, CustomerBaseEditFormPage)
 from ikobacustom.pcn.interfaces import MessageFactory as _
-from ikobacustom.pcn.customers.interfaces import IRPCContract, IAPPITContract
+from ikobacustom.pcn.customers.interfaces import (
+    IRPCContract, IAPPITContract, IAPPTContract)
 
 class PDFContractSlipPage(PDFContractSlipPage):
@@ -62,4 +63,15 @@
                 )
 
+class PDFAPPTContractSlipPage(PDFContractSlipPage):
+    """Deliver pdf file including metadata.
+    """
+
+    grok.context(IAPPTContract)
+
+    def _sigsInFooter(self):
+        return (_('Date, Signature of Applicant'),
+                _('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 12616)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py	(revision 12617)
@@ -60,4 +60,8 @@
     IRPTContractProcess,
     IRPTContractOfficialUse,
+    IAPPTContract,
+    IAPPTContractEdit,
+    IAPPTContractProcess,
+    IAPPTContractOfficialUse,
     )
 
@@ -366,2 +370,40 @@
         return implementedBy(RPTContract)
 
+
+class APPTContract(ContractBase):
+    """Annual Permit for Pharmacy Technician contract.
+    """
+
+    grok.implements(
+        IAPPTContractProcess,
+        IAPPTContract,
+        IAPPTContractEdit,
+        ICustomerNavigation)
+
+    contract_category = 'appt'
+
+    form_fields_interface = IAPPTContract
+
+    edit_form_fields_interface = IAPPTContractEdit
+
+    ou_form_fields_interface = IAPPTContractOfficialUse
+
+    check_docs_interface = IAPPTContract
+
+APPTContract = attrs_to_fields(APPTContract)
+
+
+class APPTContractFactory(grok.GlobalUtility):
+    """A factory for contracts.
+    """
+    grok.implements(IFactory)
+    grok.name(u'waeup.APPTContract')
+    title = u"Create a new license contract.",
+    description = u"This factory instantiates new contract instances."
+
+    def __call__(self, *args, **kw):
+        return APPTContract(*args, **kw)
+
+    def getInterfaces(self):
+        return implementedBy(APPTContract)
+
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12616)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12617)
@@ -31,5 +31,6 @@
     IRPPMVLContractProcess,
     IAPPITContractProcess,
-    IRPTContractProcess)
+    IRPTContractProcess,
+    IAPPTContractProcess)
 from ikobacustom.pcn.interfaces import MessageFactory as _
 
@@ -122,2 +123,10 @@
     title = _(u'Licenses: Registration as a Pharmacy Technician')
     class_name = 'RPTContract'
+
+class APPTContractExporter(ContractExporterBase):
+    """Exporter for Contract instances.
+    """
+    grok.name('apptcontracts')
+    iface = IAPPTContractProcess
+    title = _(u'Licenses: Annual Permit for Pharmacy Technician')
+    class_name = 'APPTContract'
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12616)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12617)
@@ -1128,2 +1128,92 @@
 
     """
+
+class IAPPTContract(IContract):
+    """An Annual Permit for Pharmacy Technician contract.
+
+    """
+
+    state_of_origin = schema.Choice(
+        vocabulary = nats_vocab,
+        title = _(u'State of Origin'),
+        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,
+        )
+
+    res_address = schema.Text(
+        title = _(u'Residential Address'),
+        required = False,
+        )
+
+    employed = schema.Bool(
+        title= _('Employment'),
+        description= _('Tick box if you were employed last year.'),
+        required = False,
+        )
+
+    supervisor = schema.TextLine(
+        title = _(u'Supervisor'),
+        description= _('Enter name of supervisor.'),
+        required = False,
+        readonly = False,
+        )
+
+    supervisor_licensenumber = schema.TextLine(
+        title = _(u'Supervisor License Number'),
+        required = False,
+        readonly = False,
+        )
+
+    reason_leaving = schema.Text(
+        title = _(u'Reason for Leaving'),
+        description= _('Tell the reason for leaving emplayment last '
+                       'year (if applicable)'),
+        required = False,
+        readonly = False,
+        )
+
+
+    courses_attended = schema.Text(
+        title = _(u'Courses, Workshops etc. Attended'),
+        required = False,
+        readonly = False,
+        )
+
+
+class IAPPTContractOfficialUse(IIkobaObject):
+    """Interface for editing APPT official use data.
+
+    """
+
+    comment = schema.Text(
+        title= _('Reason for rejection'),
+        required = False,
+        )
+
+
+class IAPPTContractProcess(IAPPTContract, IAPPTContractOfficialUse):
+    """Interface for processing APPT data.
+    """
+
+    product_options = schema.List(
+        title = _(u'Options/Fees'),
+        value_type = ProductOptionField(),
+        required = False,
+        readonly = False,
+        default = [],
+        )
+
+class IAPPTContractEdit(IAPPTContract):
+    """Interface for editing APPT 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 12616)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_contract.py	(revision 12617)
@@ -38,4 +38,5 @@
     APPITContract,
     RPTContract,
+    APPTContract,
     )
 from ikobacustom.pcn.customers.interfaces import (
@@ -48,4 +49,5 @@
     IAPPITContract,
     IRPTContract,
+    IAPPTContract,
     )
 
@@ -124,3 +126,9 @@
         self.assertEqual(container[id8], contract8)
         self.assertEqual(contract8.class_name, 'RPTContract')
+
+        contract9= createObject(u'waeup.APPTContract')
+        id9 = contract9.contract_id
+        container.addContract(contract9)
+        self.assertEqual(container[id9], contract9)
+        self.assertEqual(contract9.class_name, 'APPTContract')
         return
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12616)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12617)
@@ -64,6 +64,6 @@
         'APPITContract': _(
             'Accepting Pupil Pharmacist for Internship Training'),
-        'RPTContract': _(
-            'Registration as a Pharmacy Technician'),
+        'RPTContract': _('Registration as a Pharmacy Technician'),
+        'APPTContract': _('Annual Permit for Pharmacy Technician'),
         }
 
@@ -86,3 +86,4 @@
         'rppmvlcontracts',
         'appitcontracts',
-        'rptcontracts')
+        'rptcontracts',
+        'apptcontracts')
Index: /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py
===================================================================
--- /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12616)
+++ /main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12617)
@@ -54,4 +54,5 @@
         'appit': 'Accepting Pupil Pharmacist for Internship Training',
         'rpt': 'Registration as a Pharmacy Technician',
+        'appt': 'Annual Permit for Pharmacy Technician',
         'no': 'no license',
         }
@@ -82,5 +83,6 @@
         'rppmvlcontracts',
         'appitcontracts',
-        'rptcontracts',)
+        'rptcontracts',
+        'apptcontracts')
 
     BATCH_PROCESSOR_NAMES = (
@@ -96,4 +98,5 @@
         'appitcontractprocessor',
         'rptcontractprocessor',
+        'apptcontractprocessor',
         'pcnproductprocessor',
         'pdfdocumentprocessor',
