Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12498)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/batching.py	(revision 12499)
@@ -26,5 +26,6 @@
     IPCNCustomerJPGDocument,
     IPCNCustomerPDFDocument,
-    IRONContract)
+    IRONContract,
+    IROPContract)
 from ikobacustom.pcn.interfaces import MessageFactory as _
 
@@ -62,5 +63,14 @@
     util_name = 'roncontractprocessor'
     grok.name(util_name)
-    name = _('PCN Customer Contract Processor')
+    name = _('Retention of Name Contract Processor')
     iface = IRONContract
     factory_name = 'waeup.RONContract'
+
+class ROPContractProcessor(ContractProcessorBase):
+    """A batch processor for IROPContract objects.
+    """
+    util_name = 'ropcontractprocessor'
+    grok.name(util_name)
+    name = _('Registration of Premises Contract Processor')
+    iface = IROPContract
+    factory_name = 'waeup.ROPContract'
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py	(revision 12498)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/contracts.py	(revision 12499)
@@ -28,5 +28,6 @@
 from ikobacustom.pcn.interfaces import MessageFactory as _
 from ikobacustom.pcn.customers.interfaces import (
-    IRONContract, IRONContractEdit, IRONContractProcess)
+    IRONContract, IRONContractEdit, IRONContractProcess,
+    IROPContract, IROPContractEdit, IROPContractProcess)
 
 
@@ -52,5 +53,4 @@
 
 
-# Contracts must be importable. So we might need a factory.
 class RONContractFactory(grok.GlobalUtility):
     """A factory for contracts.
@@ -59,5 +59,5 @@
     grok.name(u'waeup.RONContract')
     title = u"Create a new license contract.",
-    description = u"This factory instantiates new license contract instances."
+    description = u"This factory instantiates new contract instances."
 
     def __call__(self, *args, **kw):
@@ -66,2 +66,38 @@
     def getInterfaces(self):
         return implementedBy(RONContract)
+
+
+class ROPContract(ContractBase):
+    """This is a sample contract.
+    """
+
+    grok.implements(
+        IROPContractProcess,
+        IROPContract,
+        IROPContractEdit,
+        ICustomerNavigation)
+
+    contract_category = 'rop'
+
+    form_fields_interface = IROPContract
+
+    edit_form_fields_interface = IROPContractEdit
+
+    check_docs_interface = IROPContract
+
+ROPContract = attrs_to_fields(ROPContract)
+
+
+class ROPContractFactory(grok.GlobalUtility):
+    """A factory for contracts.
+    """
+    grok.implements(IFactory)
+    grok.name(u'waeup.ROPContract')
+    title = u"Create a new license contract.",
+    description = u"This factory instantiates new contract instances."
+
+    def __call__(self, *args, **kw):
+        return ROPContract(*args, **kw)
+
+    def getInterfaces(self):
+        return implementedBy(ROPContract)
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12498)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/export.py	(revision 12499)
@@ -23,5 +23,5 @@
 from ikobacustom.pcn.customers.interfaces import (
     IPCNCustomer, IPCNCustomerJPGDocument,
-    IPCNCustomerPDFDocument, IRONContract)
+    IPCNCustomerPDFDocument, IRONContract, IROPContract)
 from ikobacustom.pcn.interfaces import MessageFactory as _
 
@@ -55,4 +55,13 @@
     grok.name('roncontracts')
     iface = IRONContract
-    title = _(u'PCN Customer License Contracts')
+    title = _(u'Retention of Name Contracts')
     class_name = 'RONContract'
+
+
+class ROPContractExporter(ContractExporterBase):
+    """Exporter for Contract instances.
+    """
+    grok.name('ropcontracts')
+    iface = IROPContract
+    title = _(u'Registration of Premises Contracts')
+    class_name = 'ROPContract'
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12498)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/interfaces.py	(revision 12499)
@@ -54,5 +54,5 @@
 
 class IRONContract(IContract):
-    """A Retention Of Name  contract.
+    """A Retention of Name contract.
 
     """
@@ -149,2 +149,100 @@
     #    required = True,
     #    )
+
+
+class IROPContract(IContract):
+    """A Registration of Premises contract.
+
+    """
+
+    date_of_birth = FormattedDate(
+        title = _(u'Date of Birth'),
+        required = True,
+        show_year = True,
+        )
+
+    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 = True,
+        )
+
+    year_qualification = schema.Choice(
+        title = _(u'Year of Qualification'),
+        required = True,
+        values = year_range(),
+        )
+
+    res_address = schema.Text(
+        title = _(u'Residential Address'),
+        required = True,
+        )
+
+    res_address = schema.Text(
+        title = _(u'Residential Address'),
+        required = False,
+        )
+
+    work_address = schema.Text(
+        title = _(u'Work Address'),
+        required = False,
+        )
+
+    work_email = schema.ASCIILine(
+        title = _(u'Work Email Address'),
+        required = False,
+        constraint=validate_email,
+        )
+
+    work_phone = PhoneNumber(
+        title = _(u'Work Phone'),
+        description = u'',
+        required = False,
+        )
+
+    category_practice = schema.TextLine(
+        title = _(u'Category of Practice'),
+        description = _(u'academic, retail and dispensing, hospital, administrative, wholesale, importation, manufacturing, etc.'),
+        required = False,
+        )
+
+    superintendent = schema.Bool(
+        title= _('Superintendent'),
+        description= _('Tick box if you are a superintendent pharamcist.'),
+        required = False,
+        )
+
+    #document_object = schema.Choice(
+    #    title = _(u'Document'),
+    #    source = CustomerDocumentSource(),
+    #    required = False,
+    #    )
+
+class IROPContractProcess(IROPContract):
+    """Interface for processing RON data.
+    """
+
+    product_options = schema.List(
+        title = _(u'Options/Fees'),
+        value_type = ProductOptionField(),
+        required = False,
+        readonly = False,
+        default = [],
+        )
+
+class IROPContractEdit(IROPContract):
+    """Interface for editing RON data by customers.
+
+    """
+
+    #document_object = schema.Choice(
+    #    title = _(u'Document'),
+    #    source = CustomerDocumentSource(),
+    #    required = True,
+    #    )
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_browser.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_browser.py	(revision 12498)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_browser.py	(revision 12499)
@@ -34,10 +34,12 @@
     PCNCustomerPDFDocumentExporter,
     PCNCustomerJPGDocumentExporter,
-    RONContractExporter)
+    RONContractExporter,
+    ROPContractExporter)
 from ikobacustom.pcn.customers.batching import (
     PCNCustomerProcessor,
     PCNCustomerPDFDocumentProcessor,
     PCNCustomerJPGDocumentProcessor,
-    RONContractProcessor)
+    RONContractProcessor,
+    ROPContractProcessor)
 from ikobacustom.pcn.testing import FunctionalLayer, samples_dir
 
@@ -68,11 +70,15 @@
         customer['documents'].addDocument(document1)
         customer['documents'].addDocument(document2)
-        contract = createObject(u'waeup.RONContract')
-        contract.tc_dict = {'en':u'Hello World'}
-        customer['contracts'].addContract(contract)
+        contract1 = createObject(u'waeup.RONContract')
+        contract1.tc_dict = {'en':u'Hello World'}
+        customer['contracts'].addContract(contract1)
+        contract2 = createObject(u'waeup.ROPContract')
+        contract2.tc_dict = {'en':u'Hello World'}
+        customer['contracts'].addContract(contract2)
         self.customer = customer
         self.document1 = document1
         self.document2 = document2
-        self.contract = contract
+        self.contract1 = contract1
+        self.contract2 = contract2
         self.outfile = os.path.join(self.workdir, 'myoutput.csv')
         return
@@ -206,5 +212,5 @@
         return
 
-    def test_export_reimport_contracts(self):
+    def test_export_reimport_roncontracts(self):
         # we can export all contracts in a portal
         # set values we can expect in export file
@@ -222,5 +228,5 @@
             '[u\'2015-01-18 16:40:01 WAT - Contract created by system\'],,,,'
             '[],,created,,,{\'en\': u\'Hello World\'},,K1000000,,,,\r\n'
-            % self.contract.contract_id)
+            % self.contract1.contract_id)
         # We can reimport the file if we change the header
         # (user_id -> customer_id). Not all columns are necessary.
@@ -233,5 +239,5 @@
             '[u\'2014-12-21 22:26:00 WAT - Contract created by system\']'
             ',,,[],created,{\'en\': u\'Hello World\'},,K1000000\r\n'
-            % self.contract.contract_id)
+            % self.contract1.contract_id)
         result = processor.doImport(
             self.outfile,
@@ -244,5 +250,64 @@
         self.assertEqual(num_fail,1)
         # We remove the original contract.
-        del self.customer['contracts'][self.contract.contract_id]
+        del self.customer['contracts'][self.contract1.contract_id]
+        result = processor.doImport(
+            self.outfile,
+            ['class_name','contract_category','contract_id','document_object',
+            'history','last_product_id','product_object','product_options',
+            'state','tc_dict','title','customer_id'],
+            mode='create')
+        num_succ, num_fail, finished_path, failed_path = result
+        self.assertEqual(num_fail,0)
+        # We can import the same file in update mode.
+        result = processor.doImport(
+            self.outfile,
+            ['class_name','contract_category','contract_id','document_object',
+            'history','last_product_id','product_object','product_options',
+            'state','tc_dict','title','customer_id'],
+            mode='update')
+        num_succ, num_fail, finished_path, failed_path = result
+        self.assertEqual(num_succ,1)
+        self.assertEqual(num_fail,0)
+        return
+
+    def test_export_reimport_ropcontracts(self):
+        # we can export all contracts in a portal
+        # set values we can expect in export file
+        self.setup_for_export()
+        exporter = ROPContractExporter()
+        exporter.export_all(self.app, self.outfile)
+        result = open(self.outfile, 'rb').read()
+        self.assertMatches(result,
+            'category_practice,class_name,contract_category,contract_id,'
+            'date_of_birth,history,last_product_id,lga,product_object,'
+            'product_options,res_address,state,state_of_origin,superintendent,'
+            'tc_dict,title,user_id,work_address,work_email,work_phone,'
+            'year_qualification\r\n'
+            ',ROPContract,rop,%s,,'
+            '[u\'2015-01-18 16:40:01 WAT - Contract created by system\'],,,,'
+            '[],,created,,,{\'en\': u\'Hello World\'},,K1000000,,,,\r\n'
+            % self.contract2.contract_id)
+        # We can reimport the file if we change the header
+        # (user_id -> customer_id). Not all columns are necessary.
+        processor = ROPContractProcessor()
+        open(self.outfile, 'wb').write(
+            'class_name,contract_category,contract_id,document_object,'
+            'history,last_product_id,product_object,product_options,'
+            'state,tc_dict,title,user_id\r\n'
+            'ROPContract,rop,%s,,'
+            '[u\'2014-12-21 22:26:00 WAT - Contract created by system\']'
+            ',,,[],created,{\'en\': u\'Hello World\'},,K1000000\r\n'
+            % self.contract2.contract_id)
+        result = processor.doImport(
+            self.outfile,
+            ['class_name','contract_category','contract_id','document_object',
+            'history','last_product_id','product_object','product_options',
+            'state','tc_dict','title','customer_id'],
+            mode='create')
+        num, num_fail, finished_path, failed_path = result
+        # The object exists.
+        self.assertEqual(num_fail,1)
+        # We remove the original contract.
+        del self.customer['contracts'][self.contract2.contract_id]
         result = processor.doImport(
             self.outfile,
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 12498)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_contract.py	(revision 12499)
@@ -29,6 +29,6 @@
 
 from ikobacustom.pcn.testing import (FunctionalLayer, FunctionalTestCase)
-from ikobacustom.pcn.customers.contracts import RONContract
-from ikobacustom.pcn.customers.interfaces import IRONContract
+from ikobacustom.pcn.customers.contracts import RONContract, ROPContract
+from ikobacustom.pcn.customers.interfaces import IRONContract, IROPContract
 
 
@@ -42,13 +42,22 @@
         verify.verifyObject(IRONContract, RONContract())
         verify.verifyObject(ICustomerNavigation, RONContract())
+        verify.verifyObject(IROPContract, ROPContract())
+        verify.verifyObject(ICustomerNavigation, ROPContract())
         return
 
     def test_addContract(self):
         container = ContractsContainer()
-        contract = createObject(u'waeup.RONContract')
-        id = contract.contract_id
-        container.addContract(contract)
-        self.assertEqual(container[id], contract)
+        contract1 = createObject(u'waeup.RONContract')
+        id1 = contract1.contract_id
+        container.addContract(contract1)
+        self.assertEqual(container[id1], contract1)
         self.assertRaises(TypeError, container.addContract, object())
-        self.assertEqual(contract.class_name, 'RONContract')
+        self.assertEqual(contract1.class_name, 'RONContract')
+
+        contract2 = createObject(u'waeup.ROPContract')
+        id2 = contract2.contract_id
+        container.addContract(contract2)
+        self.assertEqual(container[id2], contract2)
+        self.assertRaises(TypeError, container.addContract, object())
+        self.assertEqual(contract2.class_name, 'ROPContract')
         return
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12498)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/utils.py	(revision 12499)
@@ -55,4 +55,5 @@
 
         'RONContract': _('Retention of Name on the Registrar'),
+        'ROPContract': _('Registration of Premises'),
         }
 
@@ -65,3 +66,4 @@
         'pcncustomerjpgdocuments',
         'pcncustomerpdfdocuments',
-        'roncontracts')
+        'roncontracts',
+        'ropcontracts')
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12498)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/utils/utils.py	(revision 12499)
@@ -47,4 +47,5 @@
     CON_CATS_DICT = {
         'ron': 'Retention of Name',
+        'rop': 'Registration of Premises',
         'no': 'no contract',
         }
@@ -68,5 +69,6 @@
         'pcncustomerjpgdocuments',
         'pcncustomerpdfdocuments',
-        'roncontracts')
+        'roncontracts',
+        'ropcontracts')
 
     BATCH_PROCESSOR_NAMES = (
@@ -75,4 +77,5 @@
         'pcncustomerpdfdocumentprocessor',
         'roncontractprocessor',
+        'ropcontractprocessor',
         'pcnproductprocessor',
         'pdfdocumentprocessor',
