Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/batching.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/batching.py	(revision 12280)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/batching.py	(revision 12281)
@@ -43,5 +43,5 @@
 from waeup.ikoba.customers.interfaces import (
     ICustomer, ICustomerUpdateByRegNo,
-    ICustomerDocument, IContract, ISampleContract)
+    ICustomerSampleDocument, ISampleContract)
 from waeup.ikoba.customers.workflow import  (
     IMPORTABLE_REGISTRATION_STATES, IMPORTABLE_REGISTRATION_TRANSITIONS)
@@ -366,16 +366,19 @@
         return result
 
-class CustomerDocumentProcessor(CustomerProcessorBase):
-    """A batch processor for ICustomerDocument objects.
+class CustomerDocumentProcessorBase(CustomerProcessorBase):
+    """A batch processor for customer documents.
+
+    This is a baseclass.
     """
     grok.implements(IBatchProcessor)
     grok.provides(IBatchProcessor)
     grok.context(Interface)
-    util_name = 'customerdocumentprocessor'
-    grok.name(util_name)
-
-    name = _('CustomerDocument Processor')
-    iface = ICustomerDocument
-    factory_name = 'waeup.CustomerSampleDocument'
+
+    grok.baseclass()
+
+    util_name = None
+    name = None
+    iface = None
+    factory_name = None
 
     location_fields = []
@@ -384,5 +387,5 @@
 
     def checkHeaders(self, headerfields, mode='ignore'):
-        super(CustomerDocumentProcessor, self).checkHeaders(headerfields)
+        super(CustomerDocumentProcessorBase, self).checkHeaders(headerfields)
         if mode in ('update', 'remove') and not 'document_id' in headerfields:
             raise FatalCSVError(
@@ -412,5 +415,5 @@
         if 'document_id' in row and row['document_id'] in (None, IGNORE_MARKER):
             row.pop('document_id')
-        items_changed = super(CustomerDocumentProcessor, self).updateEntry(
+        items_changed = super(CustomerDocumentProcessorBase, self).updateEntry(
             obj, row, site, filename)
         customer = self.getParent(row, site).__parent__
@@ -440,5 +443,5 @@
         """
         errs, inv_errs, conv_dict = super(
-            CustomerDocumentProcessor, self).checkConversion(row, mode=mode)
+            CustomerDocumentProcessorBase, self).checkConversion(row, mode=mode)
         # We need to check if the class_name corresponds with the
         # processor chosen. This is to avoid accidentally wrong imports.
@@ -450,16 +453,30 @@
 
 
-class ContractProcessor(CustomerProcessorBase):
-    """A batch processor for IContract objects.
+class CustomerSampleDocumentProcessor(CustomerDocumentProcessorBase):
+    """A batch processor for ICustomerSampleDocument objects.
+    """
+    util_name = 'customersampledocumentprocessor'
+    grok.name(util_name)
+
+    name = _('Customer Sample Document Processor')
+    iface = ICustomerSampleDocument
+    factory_name = 'waeup.CustomerSampleDocument'
+
+
+class ContractProcessorBase(CustomerProcessorBase):
+    """A batch processor for contracts.
+
+    This is a baseclass.
     """
     grok.implements(IBatchProcessor)
     grok.provides(IBatchProcessor)
     grok.context(Interface)
-    util_name = 'contractprocessor'
-    grok.name(util_name)
-
-    name = _('Contract Processor')
-    iface = ISampleContract
-    factory_name = 'waeup.SampleContract'
+
+    grok.baseclass()
+
+    util_name = None
+    name = None
+    iface = None
+    factory_name = None
 
     location_fields = []
@@ -468,5 +485,5 @@
 
     def checkHeaders(self, headerfields, mode='ignore'):
-        super(ContractProcessor, self).checkHeaders(headerfields)
+        super(ContractProcessorBase, self).checkHeaders(headerfields)
         if mode in ('update', 'remove') and not 'contract_id' in headerfields:
             raise FatalCSVError(
@@ -499,5 +516,5 @@
         if 'contract_id' in row and row['contract_id'] in (None, IGNORE_MARKER):
             row.pop('contract_id')
-        items_changed = super(ContractProcessor, self).updateEntry(
+        items_changed = super(ContractProcessorBase, self).updateEntry(
             obj, row, site, filename)
         customer = self.getParent(row, site).__parent__
@@ -527,5 +544,5 @@
         """
         errs, inv_errs, conv_dict = super(
-            ContractProcessor, self).checkConversion(row, mode=mode)
+            ContractProcessorBase, self).checkConversion(row, mode=mode)
         # We need to check if the class_name corresponds with the
         # processor chosen. This is to avoid accidentally wrong imports.
@@ -535,2 +552,13 @@
                 errs.append(('class_name','wrong processor'))
         return errs, inv_errs, conv_dict
+
+
+class SampleContractProcessor(ContractProcessorBase):
+    """A batch processor for ISampleContract objects.
+    """
+    util_name = 'samplecontractprocessor'
+    grok.name(util_name)
+
+    name = _('Sample Contract Processor')
+    iface = ISampleContract
+    factory_name = 'waeup.SampleContract'
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_batching.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_batching.py	(revision 12280)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_batching.py	(revision 12281)
@@ -37,5 +37,5 @@
     IBatchProcessor, FatalCSVError, IUserAccount, VERIFIED)
 from waeup.ikoba.customers.batching import (
-    CustomerProcessor, CustomerDocumentProcessor, ContractProcessor)
+    CustomerProcessor, CustomerSampleDocumentProcessor, SampleContractProcessor)
 from waeup.ikoba.customers.customer import Customer
 from waeup.ikoba.customers.documents import CustomerSampleDocument
@@ -274,8 +274,8 @@
         shutil.rmtree(os.path.dirname(fin_file))
 
-class CustomerDocumentProcessorTest(CustomerImportExportSetup):
+class CustomerSampleDocumentProcessorTest(CustomerImportExportSetup):
 
     def setUp(self):
-        super(CustomerDocumentProcessorTest, self).setUp()
+        super(CustomerSampleDocumentProcessorTest, self).setUp()
 
         customer = Customer()
@@ -292,5 +292,5 @@
         shutil.rmtree(os.path.dirname(fin_file))
 
-        self.processor = CustomerDocumentProcessor()
+        self.processor = CustomerSampleDocumentProcessor()
         self.csv_file = os.path.join(
             self.workdir, 'sample_document_data.csv')
@@ -301,5 +301,5 @@
         assert verifyObject(IBatchProcessor, self.processor) is True
         assert verifyClass(
-            IBatchProcessor, CustomerDocumentProcessor) is True
+            IBatchProcessor, CustomerSampleDocumentProcessor) is True
 
     def test_getEntry(self):
@@ -369,5 +369,5 @@
          # Logging message from updateEntry
         self.assertTrue(
-            'INFO - system - CustomerDocument Processor - '
+            'INFO - system - Customer Sample Document Processor - '
             'sample_document_data - X666666 - %s - updated: title=My 4th doc'
             % docid in logcontent)
@@ -404,8 +404,8 @@
 
 
-class ContractProcessorTest(CustomerImportExportSetup):
+class SampleContractProcessorTest(CustomerImportExportSetup):
 
     def setUp(self):
-        super(ContractProcessorTest, self).setUp()
+        super(SampleContractProcessorTest, self).setUp()
 
         customer = Customer()
@@ -422,5 +422,5 @@
         shutil.rmtree(os.path.dirname(fin_file))
 
-        self.processor = ContractProcessor()
+        self.processor = SampleContractProcessor()
         self.csv_file = os.path.join(
             self.workdir, 'sample_contract_data.csv')
@@ -431,5 +431,5 @@
         assert verifyObject(IBatchProcessor, self.processor) is True
         assert verifyClass(
-            IBatchProcessor, ContractProcessor) is True
+            IBatchProcessor, SampleContractProcessor) is True
 
     def test_getEntry(self):
@@ -502,5 +502,5 @@
             if len(i) > 10][0]
         self.assertTrue(
-            'INFO - system - Contract Processor - sample_contract_data - '
+            'INFO - system - Sample Contract Processor - sample_contract_data - '
             'X666666 - %s - updated: title=My 4th contract, '
             'product_object=SAM, document_object=DOC1' % conid
