Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12600)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12601)
@@ -29,5 +29,6 @@
     IROPContract,
     IRPRContract,
-    IRPCContract)
+    IRPCContract,
+    IIPPMVLContract)
 from ikobacustom.pcn.interfaces import MessageFactory as _
 
@@ -95,2 +96,11 @@
     iface = IRPCContract
     factory_name = 'waeup.RPCContract'
+
+class IPPMVLContractProcessor(ContractProcessorBase):
+    """A batch processor for IIPPMVLContract objects.
+    """
+    util_name = 'ippmvlcontractprocessor'
+    grok.name(util_name)
+    name = _('Issuance of Patent and Proprietary Medicines Vendors License (Contract) Processor')
+    iface = IIPPMVLContract
+    factory_name = 'waeup.IPPMVLContract'
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py	(revision 12600)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py	(revision 12601)
@@ -44,4 +44,8 @@
     IRPCContractProcess,
     IRPCContractOfficialUse,
+    IIPPMVLContract,
+    IIPPMVLContractEdit,
+    IIPPMVLContractProcess,
+    IIPPMVLContractOfficialUse,
     )
 
@@ -198,2 +202,40 @@
         return implementedBy(RPCContract)
 
+
+class IPPMVLContract(ContractBase):
+    """Issuance of Patent and Proprietary Medicines Vendors License contract.
+    """
+
+    grok.implements(
+        IIPPMVLContractProcess,
+        IIPPMVLContract,
+        IIPPMVLContractEdit,
+        ICustomerNavigation)
+
+    contract_category = 'ippmvl'
+
+    form_fields_interface = IIPPMVLContract
+
+    edit_form_fields_interface = IIPPMVLContractEdit
+
+    ou_form_fields_interface = IIPPMVLContractOfficialUse
+
+    check_docs_interface = IIPPMVLContract
+
+IPPMVLContract = attrs_to_fields(IPPMVLContract)
+
+
+class IPPMVLContractFactory(grok.GlobalUtility):
+    """A factory for contracts.
+    """
+    grok.implements(IFactory)
+    grok.name(u'waeup.IPPMVLContract')
+    title = u"Create a new license contract.",
+    description = u"This factory instantiates new contract instances."
+
+    def __call__(self, *args, **kw):
+        return IPPMVLContract(*args, **kw)
+
+    def getInterfaces(self):
+        return implementedBy(IPPMVLContract)
+
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12600)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12601)
@@ -27,5 +27,6 @@
     IROPContractProcess,
     IRPRContractProcess,
-    IRPCContractProcess)
+    IRPCContractProcess,
+    IIPPMVLContractProcess)
 from ikobacustom.pcn.interfaces import MessageFactory as _
 
@@ -86,2 +87,10 @@
     title = _(u'Registration as Pharmaceutical Chemist Contracts')
     class_name = 'RPCContract'
+
+class IPPMVLContractExporter(ContractExporterBase):
+    """Exporter for Contract instances.
+    """
+    grok.name('ippmvlcontracts')
+    iface = IIPPMVLContractProcess
+    title = _(u'Issuance of Patent and Proprietary Medicines Vendors Licenses')
+    class_name = 'IPPMVLContract'
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12600)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12601)
@@ -416,5 +416,5 @@
 
 class IRPCContract(IContract):
-    """A Registration as Pharmaceutical Chemist.
+    """A Registration as Pharmaceutical Chemist contract.
 
     """
@@ -552,2 +552,163 @@
 IRPCContractEdit['certificates_object'].order = IRPCContract[
     'certificates_object'].order
+
+class IIPPMVLContract(IContract):
+    """A Issuance of Patent and Proprietary Medicines Vendors License.
+
+    """
+
+    res_address = schema.Text(
+        title = _(u'Residential Address'),
+        required = False,
+        )
+
+    qualifications = schema.Text(
+        title = _(u'Educational Qualifications'),
+        description = u'Enter a list of certificates obtained.',
+        required = False,
+        readonly = False,
+        )
+
+    certificates_object = schema.Choice(
+        title = _(u'Certificates/Credentials'),
+        description = u'Select the pdf document which contains scanned copies '
+                      u'of your certificates. You must create such a '
+                      u'document first.',
+        source = CustomerDocumentSource(),
+        required = False,
+        )
+
+    incometax_object = schema.Choice(
+        title = _(u'Income Tax Clearance'),
+        description = u'Select the pdf document which contains scanned copies '
+                      u'of your income tax clearance for the past three years. '
+                      u'You must create such a document first.',
+        source = CustomerDocumentSource(),
+        required = False,
+        )
+
+    shop_address = schema.Text(
+        title = _(u'Patent Vendor\'s Shop'),
+        description = u'Enter name and address of patent vendor\'s shop.',
+        required = False,
+        )
+
+    shop_lga = schema.Choice(
+        source = LGASource(),
+        title = _(u'State / LGA'),
+        required = True,
+        )
+
+    shop_email = schema.ASCIILine(
+        title = _(u'Shop Email Address'),
+        required = False,
+        constraint=validate_email,
+        )
+
+    shop_phone = PhoneNumber(
+        title = _(u'Shop Phone'),
+        description = u'',
+        required = False,
+        )
+
+    old_or_new = schema.Choice(
+        values=[_(u'old'), _(u'new')],
+        title = _(u'Old or New Shop'),
+        required = False,
+        )
+
+    PPMVL_number = schema.TextLine(
+        title = _(u'PPMVL Data'),
+        description = u'If an old store, state PPMVL number and date of issue.',
+        required = False,
+        readonly = False,
+        )
+
+    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,
+        )
+
+    referee1_license = schema.TextLine(
+        title = _(u'First Referee License Number'),
+        required = False,
+        readonly = False,
+        )
+
+    referee1_occupation = schema.Text(
+        title = _(u'First Referee Occupation'),
+        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,
+        )
+
+    referee2_license = schema.TextLine(
+        title = _(u'Second Referee License Number'),
+        required = False,
+        readonly = False,
+        )
+
+    referee2_occupation = schema.Text(
+        title = _(u'Second Referee Occupation'),
+        required = False,
+        readonly = False,
+        )
+
+
+class IIPPMVLContractOfficialUse(IIkobaObject):
+    """Interface for editing IPPMVL official use data.
+
+    """
+
+    comment = schema.Text(
+        title= _('Reason for rejection'),
+        required = False,
+        )
+
+
+class IIPPMVLContractProcess(IIPPMVLContract, IIPPMVLContractOfficialUse):
+    """Interface for processing IPPMVL data.
+    """
+
+    product_options = schema.List(
+        title = _(u'Options/Fees'),
+        value_type = ProductOptionField(),
+        required = False,
+        readonly = False,
+        default = [],
+        )
+
+class IIPPMVLContractEdit(IIPPMVLContract):
+    """Interface for editing IPPMVL data by customers.
+
+    """
+
+    certificates_object = schema.Choice(
+        title = _(u'Certificates'),
+        description = u'Select the document which contains scanned copies '
+                      u'of your certificates. You must create such a '
+                      u'document first.',
+        source = CustomerDocumentSource(),
+        required = True,
+        )
+
+IIPPMVLContractEdit['certificates_object'].order = IIPPMVLContract[
+    'certificates_object'].order
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 12600)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_contract.py	(revision 12601)
@@ -34,4 +34,5 @@
     RPRContract,
     RPCContract,
+    IPPMVLContract,
     )
 from ikobacustom.pcn.customers.interfaces import (
@@ -40,4 +41,5 @@
     IRPRContract,
     IRPCContract,
+    IIPPMVLContract,
     )
 
@@ -58,4 +60,6 @@
         verify.verifyObject(IRPCContract, RPCContract())
         verify.verifyObject(ICustomerNavigation, RPCContract())
+        verify.verifyObject(IIPPMVLContract, IPPMVLContract())
+        verify.verifyObject(ICustomerNavigation, IPPMVLContract())
         return
 
@@ -86,3 +90,9 @@
         self.assertEqual(container[id4], contract4)
         self.assertEqual(contract4.class_name, 'RPCContract')
+
+        contract5 = createObject(u'waeup.IPPMVLContract')
+        id5 = contract5.contract_id
+        container.addContract(contract5)
+        self.assertEqual(container[id5], contract5)
+        self.assertEqual(contract5.class_name, 'IPPMVLContract')
         return
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12600)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12601)
@@ -58,4 +58,6 @@
         'RPRContract': _('Registration in the Provisional Register'),
         'RPCContract': _('Registration as Pharmaceutical Chemist'),
+        'IPPMVLContract': _(
+            'Issuance of Patent and Proprietary Medicines Vendors License'),
         }
 
@@ -71,3 +73,4 @@
         'ropcontracts',
         'rprcontracts',
-        'rpccontracts')
+        'rpccontracts',
+        'ippmvlcontracts')
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/lgas.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/lgas.py	(revision 12600)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/lgas.py	(revision 12601)
@@ -68,5 +68,5 @@
     ('akwa_ibom_itu','Akwa Ibom / Itu'),
     ('akwa_ibom_mbo','Akwa Ibom / Mbo'),
-    ('akwa_ibom_mkpat-enin','Akwa Ibom / Mkpat-Enin'),
+    ('akwa_ibom_mkpat-enin','Akwa Ibom / Mpat-Enin'),
     ('akwa_ibom_nsit-atai','Akwa Ibom / Nsit-Atai'),
     ('akwa_ibom_nsit-ibom','Akwa Ibom / Nsit-Ibom'),
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12600)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12601)
@@ -50,4 +50,5 @@
         'rpr': 'Registration in the Provisional Register',
         'rpc': 'Registration as Pharmaceutical Chemist',
+        'ippmvl': 'Issuance of Patent and Proprietary Medicines Vendors License',
         'no': 'no license',
         }
@@ -74,5 +75,6 @@
         'ropcontracts',
         'rprcontracts',
-        'rpccontracts')
+        'rpccontracts',
+        'ippmvlcontracts')
 
     BATCH_PROCESSOR_NAMES = (
@@ -84,4 +86,5 @@
         'rprcontractprocessor',
         'rpccontractprocessor',
+        'ippmvlcontractprocessor',
         'pcnproductprocessor',
         'pdfdocumentprocessor',
