Commit 0179a72f authored by Łukasz Nowak's avatar Łukasz Nowak

- check for Delivery Rule and Invoice Rule simulation impact in various...

 - check for Delivery Rule and Invoice Rule simulation impact in various simulation states on typical documents related to those rules (Sale & Purchase Packing Lists and Invoices)


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@27004 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 2c1b886d
...@@ -41,7 +41,7 @@ from DateTime import DateTime ...@@ -41,7 +41,7 @@ from DateTime import DateTime
from Acquisition import aq_parent from Acquisition import aq_parent
from zLOG import LOG from zLOG import LOG
from Products.ERP5Type.tests.Sequence import SequenceList from Products.ERP5Type.tests.Sequence import SequenceList
from testPackingList import TestPackingListMixin from testPackingList import TestPackingListMixin, TestDeliveryRule
from testAccountingRules import TestAccountingRulesMixin from testAccountingRules import TestAccountingRulesMixin
class TestInvoiceMixin(TestPackingListMixin, class TestInvoiceMixin(TestPackingListMixin,
...@@ -2121,24 +2121,6 @@ class TestSaleInvoiceMixin(TestInvoiceMixin, ...@@ -2121,24 +2121,6 @@ class TestSaleInvoiceMixin(TestInvoiceMixin,
self.assertEquals(self.default_quantity + last_delta, self.assertEquals(self.default_quantity + last_delta,
line.getQuantity()) line.getQuantity())
def stepAddInvoiceLinesManyTransactions(self, sequence=None, sequence_list=[]):
"""
add some invoice and accounting lines to the invoice
"""
invoice = sequence.get('invoice')
invoice_line = invoice.newContent(portal_type='Invoice Line')
transaction_line_1 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
transaction_line_2 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
transaction.commit()
self.tic()
invoice_line.edit(resource_value=sequence.get('resource'), quantity=3,
price=555)
transaction_line_1.edit(id ='receivable', source='account_module/customer',
destination='account_module/supplier', quantity=-1665)
transaction_line_2.edit(
id='income', source='account_module/sale',
destination='account_module/purchase', quantity=1665)
def stepAddInvoiceLines(self, sequence=None, sequence_list=[]): def stepAddInvoiceLines(self, sequence=None, sequence_list=[]):
""" """
add some invoice and accounting lines to the invoice add some invoice and accounting lines to the invoice
...@@ -2668,6 +2650,58 @@ class TestSaleInvoice(TestSaleInvoiceMixin, TestInvoice, ERP5TypeTestCase): ...@@ -2668,6 +2650,58 @@ class TestSaleInvoice(TestSaleInvoiceMixin, TestInvoice, ERP5TypeTestCase):
sequence_list.addSequenceString(sequence) sequence_list.addSequenceString(sequence)
sequence_list.play(self, quiet=quiet) sequence_list.play(self, quiet=quiet)
def stepAddInvoiceLinesManyTransactions(self, sequence=None, sequence_list=[]):
"""
add some invoice and accounting lines to the invoice
"""
invoice = sequence.get('invoice')
invoice_line = invoice.newContent(portal_type='Invoice Line')
transaction_line_1 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
transaction_line_2 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
transaction.commit()
self.tic()
invoice_line.edit(resource_value=sequence.get('resource'), quantity=3,
price=555)
transaction_line_1.edit(id ='receivable', source='account_module/customer',
destination='account_module/supplier', quantity=-1665)
transaction_line_2.edit(
id='income', source='account_module/sale',
destination='account_module/purchase', quantity=1665)
def test_16a_ManuallyAddedMovementsManyTransactions(self, quiet=quiet):
"""
Checks that adding invoice lines and accounting lines to one invoice
generates correct simulation
In this case checks what is happening, where movements are added in
one transaction and edited in another
"""
if not quiet:
self.logMessage('Invoice with Manually Added Movements in separate transactions')
sequence_list = SequenceList()
for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
sequence_list.addSequenceString(
base_sequence +
"""
stepSetReadyPackingList
stepTic
stepStartPackingList
stepCheckInvoicingRule
stepTic
stepCheckInvoiceBuilding
stepRebuildAndCheckNothingIsCreated
stepCheckInvoicesConsistency
stepAddInvoiceLinesManyTransactions
stepTic
stepCheckInvoiceIsSolved
stepStartInvoice
stepTic
stepCheckSimulationTrees
""")
sequence_list.play(self, quiet=quiet)
def test_11_AcceptDecisionOnPackingListAndInvoice(self, quiet=quiet, def test_11_AcceptDecisionOnPackingListAndInvoice(self, quiet=quiet,
run=RUN_ALL_TESTS): run=RUN_ALL_TESTS):
""" """
...@@ -3059,38 +3093,6 @@ class TestSaleInvoice(TestSaleInvoiceMixin, TestInvoice, ERP5TypeTestCase): ...@@ -3059,38 +3093,6 @@ class TestSaleInvoice(TestSaleInvoiceMixin, TestInvoice, ERP5TypeTestCase):
""") """)
sequence_list.play(self, quiet=quiet) sequence_list.play(self, quiet=quiet)
def test_16a_ManuallyAddedMovementsManyTransactions(self, quiet=quiet):
"""
Checks that adding invoice lines and accounting lines to one invoice
generates correct simulation
In this case checks what is happening, where movements are added in
one transaction and edited in another
"""
if not quiet:
self.logMessage('Invoice with Manually Added Movements in separate transactions')
sequence_list = SequenceList()
for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
sequence_list.addSequenceString(
base_sequence +
"""
stepSetReadyPackingList
stepTic
stepStartPackingList
stepCheckInvoicingRule
stepTic
stepCheckInvoiceBuilding
stepRebuildAndCheckNothingIsCreated
stepCheckInvoicesConsistency
stepAddInvoiceLinesManyTransactions
stepTic
stepCheckInvoiceIsSolved
stepStartInvoice
stepTic
stepCheckSimulationTrees
""")
sequence_list.play(self, quiet=quiet)
def test_17_ManuallyAddedWrongMovements(self, quiet=quiet, run=RUN_ALL_TESTS): def test_17_ManuallyAddedWrongMovements(self, quiet=quiet, run=RUN_ALL_TESTS):
""" """
Checks that adding invoice lines and accounting lines to one invoice Checks that adding invoice lines and accounting lines to one invoice
...@@ -3256,9 +3258,46 @@ class TestPurchaseInvoice(TestInvoice, ERP5TypeTestCase): ...@@ -3256,9 +3258,46 @@ class TestPurchaseInvoice(TestInvoice, ERP5TypeTestCase):
stepTic stepTic
""" """
class TestInvoiceRule(TestDeliveryRule):
rule_portal_type = 'Invoice Rule'
delivery_line_portal_type = 'Invoice Line'
def test_delivery_rule_simulation_ready(self):
# not available on invoice
return
def test_delivery_rule_simulation_confirm(self):
self.createDocuments()
self.delivery.plan()
self.assertEqual('planned', self.delivery.getSimulationState())
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
self.modifyDelivery()
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
class TestInvoiceRuleSaleInvoiceTransaction(TestInvoiceRule):
delivery_portal_type = 'Sale Invoice Transaction'
def getTitle(self):
return "Sale Invoice Transaction Invoice Rule"
class TestInvoiceRulePurchaseInvoiceTransaction(TestInvoiceRule):
delivery_portal_type = 'Purchase Invoice Transaction'
def getTitle(self):
return "Purchase Invoice Transaction Invoice Rule"
import unittest import unittest
def test_suite(): def test_suite():
suite = unittest.TestSuite() suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestSaleInvoice)) suite.addTest(unittest.makeSuite(TestSaleInvoice))
suite.addTest(unittest.makeSuite(TestPurchaseInvoice)) suite.addTest(unittest.makeSuite(TestPurchaseInvoice))
suite.addTest(unittest.makeSuite(TestInvoiceRuleSaleInvoiceTransaction))
suite.addTest(unittest.makeSuite(TestInvoiceRulePurchaseInvoiceTransaction))
return suite return suite
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
############################################################################## ##############################################################################
import unittest import unittest
import transaction import transaction
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
...@@ -42,7 +41,6 @@ class TestPackingListMixin(TestOrderMixin): ...@@ -42,7 +41,6 @@ class TestPackingListMixin(TestOrderMixin):
container_portal_type = 'Container' container_portal_type = 'Container'
container_line_portal_type = 'Container Line' container_line_portal_type = 'Container Line'
container_cell_portal_type = 'Container Cell' container_cell_portal_type = 'Container Cell'
default_order_sequence = '\ default_order_sequence = '\
stepCreateOrganisation1 \ stepCreateOrganisation1 \
stepCreateOrganisation2 \ stepCreateOrganisation2 \
...@@ -1415,9 +1413,219 @@ class TestPurchasePackingList(TestPurchasePackingListMixin, TestPackingList): ...@@ -1415,9 +1413,219 @@ class TestPurchasePackingList(TestPurchasePackingListMixin, TestPackingList):
"""Tests for purchase packing list. """Tests for purchase packing list.
""" """
class TestDeliveryRule(TestPackingListMixin, ERP5TypeTestCase):
applied_rule_portal_type = 'Applied Rule'
def createResource(self, **kw):
module = self.portal.getDefaultModule(portal_type=self.resource_portal_type)
resource = module.newContent(portal_type=self.resource_portal_type, **kw)
return resource
def createOrganisation(self, **kw):
organisation_portal_type = 'Organisation'
module = self.portal.getDefaultModule(portal_type=organisation_portal_type)
organisation = module.newContent(portal_type=organisation_portal_type, **kw)
return organisation
def createDelivery(self, **kw):
module = self.portal.getDefaultModule(portal_type=self.delivery_portal_type)
delivery = module.newContent(portal_type=self.delivery_portal_type, **kw)
return delivery
def checkDeliverySimulation(self):
delivery = self.delivery
delivery_line = self.delivery_line
applied_rule_list = delivery.getCausalityRelatedValueList(
portal_type=self.applied_rule_portal_type)
# delivery shall have one applied rule
self.assertEqual(1, len(applied_rule_list))
applied_rule = applied_rule_list[0]
self.assertEqual(self.rule_portal_type, applied_rule.getSpecialiseValue()
.getPortalType())
simulation_movement_list = applied_rule.contentValues()
# there is one delivery line - so one simulation movement
self.assertEqual(1, len(simulation_movement_list))
simulation_movement = simulation_movement_list[0]
# now check if simulation movement has all properties set correctly
self.assertEqual( self.expected_resource, simulation_movement.getResourceValue())
self.assertEqual( self.expected_quantity, simulation_movement.getQuantity())
self.assertEqual( self.expected_source, simulation_movement.getSourceValue())
self.assertEqual( self.expected_source_section, simulation_movement.getSourceSectionValue())
self.assertEqual( self.expected_destination, simulation_movement.getDestinationValue())
self.assertEqual( self.expected_destination_section,
simulation_movement.getDestinationSectionValue())
self.assertEqual( self.expected_start_date, simulation_movement.getStartDate())
self.assertEqual( self.expected_stop_date, simulation_movement.getStopDate()
)
def createDocuments(self):
self.resource = self.createResource()
self.source = self.createOrganisation()
self.source_section = self.createOrganisation()
self.destination = self.createOrganisation()
self.destination_section = self.createOrganisation()
self.delivery = self.createDelivery(
source_value = self.source,
source_section_value = self.source_section,
destination_value = self.destination,
destination_section_value = self.destination_section,
start_date = self.datetime,
stop_date = self.datetime,
)
self.delivery_line = self.delivery.newContent(
portal_type=self.delivery_line_portal_type)
self.delivery_line.edit(
resource_value = self.resource,
quantity = self.default_quantity
)
self.expected_resource = self.resource
self.expected_quantity = self.default_quantity
self.expected_start_date = self.datetime
self.expected_stop_date = self.datetime
self.expected_source = self.source
self.expected_source_section = self.source_section
self.expected_destination = self.destination
self.expected_destination_section = self.destination_section
def modifyDelivery(self, change_expected=True):
# for now only quantity
new_quantity = self.delivery_line.getQuantity() - 1
self.delivery_line.edit(quantity = new_quantity)
if change_expected:
self.expected_quantity = new_quantity
def test_delivery_rule_simulation_confirm(self):
self.createDocuments()
self.delivery.confirm()
self.assertEqual('confirmed', self.delivery.getSimulationState())
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
self.modifyDelivery()
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
def test_delivery_rule_simulation_ready(self):
self.createDocuments()
self.delivery.confirm()
self.delivery.setReady()
self.assertEqual('ready', self.delivery.getSimulationState())
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
self.modifyDelivery()
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
def test_delivery_rule_simulation_start(self):
self.createDocuments()
self.delivery.confirm()
self.delivery.setReady()
self.delivery.start()
self.assertEqual('started', self.delivery.getSimulationState())
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
self.modifyDelivery()
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
def test_delivery_rule_simulation_stop(self):
self.createDocuments()
self.delivery.confirm()
self.delivery.setReady()
self.delivery.start()
self.delivery.stop()
self.assertEqual('stopped', self.delivery.getSimulationState())
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
# stopped state freezes simulation
self.modifyDelivery(False)
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
def test_delivery_rule_simulation_deliver(self):
self.createDocuments()
self.delivery.confirm()
self.delivery.setReady()
self.delivery.start()
self.delivery.stop()
self.delivery.deliver()
self.assertEqual('delivered', self.delivery.getSimulationState())
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
# delivered state freezes simulation
self.modifyDelivery(False)
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
def test_delivery_rule_simulation_cancel(self):
self.createDocuments()
self.delivery.confirm()
self.delivery.cancel()
self.assertEqual('cancelled', self.delivery.getSimulationState())
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
# cancelled state freezes simulation
self.modifyDelivery(False)
transaction.commit() ; self.tic()
self.checkDeliverySimulation()
class TestDeliveryRuleSalePackingList(TestDeliveryRule):
delivery_portal_type = 'Sale Packing List'
delivery_line_portal_type = 'Sale Packing List Line'
rule_portal_type = 'Delivery Rule'
def getTitle(self):
return "Sale Packing List Delivery Rule"
class TestDeliveryRulePurchasePackingList(TestDeliveryRule):
delivery_portal_type = 'Purchase Packing List'
delivery_line_portal_type = 'Purchase Packing List Line'
rule_portal_type = 'Delivery Rule'
def getTitle(self):
return "Purchase Packing List Delivery Rule"
def test_suite(): def test_suite():
suite = unittest.TestSuite() suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestPackingList)) suite.addTest(unittest.makeSuite(TestPackingList))
suite.addTest(unittest.makeSuite(TestPurchasePackingList)) suite.addTest(unittest.makeSuite(TestPurchasePackingList))
suite.addTest(unittest.makeSuite(TestDeliveryRuleSalePackingList))
suite.addTest(unittest.makeSuite(TestDeliveryRulePurchasePackingList))
return suite return suite
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment