Commit b3cadc6e authored by Sebastien Robin's avatar Sebastien Robin

added a test for a bug, and fixed the bug


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@6129 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 65a6e925
...@@ -49,23 +49,18 @@ from DateTime import DateTime ...@@ -49,23 +49,18 @@ from DateTime import DateTime
from zLOG import LOG from zLOG import LOG
from testPackingList import TestPackingListMixin from testPackingList import TestPackingListMixin
from Products.ERP5Type.tests.Sequence import Sequence, SequenceList from Products.ERP5Type.tests.Sequence import Sequence, SequenceList
from testAccountingRules import TestAccountingRulesMixin
class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): class TestInvoice(TestAccountingRulesMixin,TestPackingListMixin, ERP5TypeTestCase):
"""Test invoice are created from orders then packing lists. """ """Test invoice are created from orders then packing lists. """
# XXX
def playSequence(self, sequence_string) :
sequence_list = SequenceList()
sequence_list.addSequenceString(sequence_string)
sequence_list.play(self)
RUN_ALL_TESTS = 1 RUN_ALL_TESTS = 1
sale_invoice_portal_type = 'Sale Invoice Transaction'
sale_invoice_line_portal_type = 'Sale Invoice Line'
sale_invoice_cell_portal_type = 'Invoice Cell'
default_region = "europe/west/france" default_region = "europe/west/france"
vat_gap = 'fr/pcg/4/44/445/4457/44571'
sale_gap = 'fr/pcg/7/70/707/7071/70712'
customer_gap = 'fr/pcg/4/41/411'
def getTitle(self): def getTitle(self):
return "Invoices" return "Invoices"
...@@ -91,6 +86,8 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -91,6 +86,8 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
portal_type = 'Category', portal_type = 'Category',
id = cat, id = cat,
immediate_reindex = 1 ) immediate_reindex = 1 )
else:
path=path[cat]
# check categories have been created # check categories have been created
for cat_string in self.getNeededCategoryList() : for cat_string in self.getNeededCategoryList() :
self.assertNotEquals(None, self.assertNotEquals(None,
...@@ -99,7 +96,11 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -99,7 +96,11 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
def getNeededCategoryList(self): def getNeededCategoryList(self):
"""return a list of categories that should be created.""" """return a list of categories that should be created."""
return ('region/%s' % self.default_region, ) return ('region/%s' % self.default_region,
'gap/%s' % self.vat_gap,
'gap/%s' % self.sale_gap,
'gap/%s' % self.customer_gap,
)
def getBusinessTemplateList(self): def getBusinessTemplateList(self):
""" """ """ """
...@@ -121,9 +122,12 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -121,9 +122,12 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
def stepCreateCurrency(self, sequence, **kw) : def stepCreateCurrency(self, sequence, **kw) :
"""Create a default currency. """ """Create a default currency. """
currency_module = self.getCurrencyModule()
if len(currency_module.objectValues(id='EUR'))==0:
currency = self.getCurrencyModule().newContent( currency = self.getCurrencyModule().newContent(
portal_type = 'Currency', portal_type = 'Currency',
id = "EUR" ) id = "EUR" )
currency = currency_module.objectValues(id='EUR')[0]
sequence.edit(currency = currency) sequence.edit(currency = currency)
def stepSetOrderPriceCurrency(self, sequence, **kw) : def stepSetOrderPriceCurrency(self, sequence, **kw) :
...@@ -139,6 +143,28 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -139,6 +143,28 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
def stepCreateSaleInvoiceTransactionRule(self, sequence, **kw) : def stepCreateSaleInvoiceTransactionRule(self, sequence, **kw) :
"""Create the rule for accounting. """ """Create the rule for accounting. """
portal = self.getPortal()
account_module = self.getAccountModule()
if not 'receivable_vat' in account_module.objectIds():
vat_account = account_module.newContent(id='receivable_vat')
vat_account.setGap(self.vat_gap)
portal.portal_workflow.doActionFor(vat_account,
'validate_action',wf_id='account_workflow')
vat_account=account_module['receivable_vat']
if not 'sale' in account_module.objectIds():
sale_account = account_module.newContent(id='sale')
sale_account.setGap(self.sale_gap)
portal.portal_workflow.doActionFor(sale_account,
'validate_action',wf_id='account_workflow')
sale_account=account_module['sale']
if not 'customer' in account_module.objectIds():
customer_account = account_module.newContent(id='customer')
customer_account.setGap(self.customer_gap)
portal.portal_workflow.doActionFor(customer_account,
'validate_action',wf_id='account_workflow')
customer_account=account_module['customer']
invoice_rule = self.getPortal().portal_rules.default_invoice_transaction_rule invoice_rule = self.getPortal().portal_rules.default_invoice_transaction_rule
invoice_rule.deleteContent([x.getId() for x in invoice_rule.objectValues()]) invoice_rule.deleteContent([x.getId() for x in invoice_rule.objectValues()])
region_predicate = invoice_rule.newContent(portal_type = 'Predicate') region_predicate = invoice_rule.newContent(portal_type = 'Predicate')
...@@ -157,11 +183,29 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -157,11 +183,29 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
int_index = 1, int_index = 1,
string_index = 'product' string_index = 'product'
) )
invoice_rule.updateMatrix() product_line_predicate.immediateReindexObject()
# TODO create Accounts and cell ? region_predicate.immediateReindexObject()
def modifyPackingListState(self, transition_name, sequence): invoice_rule.updateMatrix()
cell_list = invoice_rule.getCellValueList(base_id='movement')
self.assertEquals(len(cell_list),1)
cell = cell_list[0]
income = cell.newContent(id='income',
portal_type=self.sale_invoice_transaction_portal_type)
income.setQuantity(1.0)
income.setSourceValue(sale_account)
receivable = cell.newContent(id='receivable',
portal_type=self.sale_invoice_transaction_portal_type)
receivable.setQuantity(-1.196)
receivable.setSourceValue(customer_account)
collected_vat = cell.newContent(id='collected_vat',
portal_type=self.sale_invoice_transaction_portal_type)
collected_vat.setQuantity(0.196)
collected_vat.setSourceValue(vat_account)
def modifyPackingListState(self, transition_name, sequence,packing_list=None):
""" calls the workflow for the packing list """ """ calls the workflow for the packing list """
if packing_list is None:
packing_list = sequence.get('packing_list') packing_list = sequence.get('packing_list')
packing_list.portal_workflow.doActionFor(packing_list, packing_list.portal_workflow.doActionFor(packing_list,
transition_name, wf_id='packing_list_workflow') transition_name, wf_id='packing_list_workflow')
...@@ -172,11 +216,24 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -172,11 +216,24 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
packing_list = sequence.get('packing_list') packing_list = sequence.get('packing_list')
self.assertEquals(packing_list.getSimulationState(), 'ready') self.assertEquals(packing_list.getSimulationState(), 'ready')
def stepSetReadyNewPackingList(self, sequence=None, sequence_list=None, **kw):
""" set the Packing List as Ready. This must build the invoice. """
packing_list = sequence.get('new_packing_list')
self.modifyPackingListState('set_ready_action', sequence=sequence,
packing_list=packing_list)
self.assertEquals(packing_list.getSimulationState(), 'ready')
def stepStartPackingList(self, sequence=None, sequence_list=None, **kw): def stepStartPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('start_action', sequence=sequence) self.modifyPackingListState('start_action', sequence=sequence)
packing_list = sequence.get('packing_list') packing_list = sequence.get('packing_list')
self.assertEquals(packing_list.getSimulationState(), 'started') self.assertEquals(packing_list.getSimulationState(), 'started')
def stepStartNewPackingList(self, sequence=None, sequence_list=None, **kw):
packing_list = sequence.get('new_packing_list')
self.modifyPackingListState('start_action', sequence=sequence,
packing_list=packing_list)
self.assertEquals(packing_list.getSimulationState(), 'started')
def stepStopPackingList(self, sequence=None, sequence_list=None, **kw): def stepStopPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('stop_action', sequence=sequence) self.modifyPackingListState('stop_action', sequence=sequence)
packing_list = sequence.get('packing_list') packing_list = sequence.get('packing_list')
...@@ -213,7 +270,7 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -213,7 +270,7 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
related_applied_rule_list = packing_list.getCausalityRelatedValueList( related_applied_rule_list = packing_list.getCausalityRelatedValueList(
portal_type=self.applied_rule_portal_type) portal_type=self.applied_rule_portal_type)
related_invoice_list = packing_list.getCausalityRelatedValueList( related_invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.sale_invoice_portal_type) portal_type=self.sale_invoice_transaction_portal_type)
packing_list_building_state = 'started' packing_list_building_state = 'started'
packing_list_state = packing_list.getSimulationState() packing_list_state = packing_list.getSimulationState()
...@@ -472,6 +529,42 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -472,6 +529,42 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
self.assertEquals(sale_invoice_line.getTotalPrice(), self.total_price1) self.assertEquals(sale_invoice_line.getTotalPrice(), self.total_price1)
self.assertEquals(sale_invoice.getCausalityValue(), packing_list) self.assertEquals(sale_invoice.getCausalityValue(), packing_list)
def stepCheckTwoInvoices(self,sequence=None, sequence_list=None, **kw):
""" checks invoice properties are well set. """
# New we will check that we have two invoices
packing_list = sequence.get('packing_list')
invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.sale_invoice_transaction_portal_type)
self.assertEquals(len(invoice_list),1)
invoice = invoice_list[0]
sequence.edit(invoice=invoice)
new_packing_list = sequence.get('new_packing_list')
new_invoice_list = new_packing_list.getCausalityRelatedValueList(
portal_type=self.sale_invoice_transaction_portal_type)
self.assertEquals(len(new_invoice_list),1)
new_invoice = new_invoice_list[0]
sequence.edit(new_invoice=new_invoice)
def stepConfirmTwoInvoices(self,sequence=None, sequence_list=None, **kw):
""" confirme both invoices. """
portal = self.getPortal()
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
portal.portal_workflow.doActionFor(invoice,
'confirm_action',wf_id='accounting_workflow')
portal.portal_workflow.doActionFor(new_invoice,
'confirm_action',wf_id='accounting_workflow')
def stepCheckTwoInvoicesTransactionLines(self,sequence=None, sequence_list=None, **kw):
""" checks invoice properties are well set. """
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
import pdb;pdb.set_trace()
self.assertEquals(3,len(invoice.objectValues(
portal_type=self.sale_invoice_transaction_line_portal_type)))
self.assertEquals(3,len(new_invoice.objectValues(
portal_type=self.sale_invoice_transaction_line_portal_type)))
def stepRebuildAndCheckNothingIsCreated(self, sequence=None, def stepRebuildAndCheckNothingIsCreated(self, sequence=None,
sequence_list=None, **kw): sequence_list=None, **kw):
"""Rebuilds with sale_invoice_builder and checks nothing more is """Rebuilds with sale_invoice_builder and checks nothing more is
...@@ -480,7 +573,29 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -480,7 +573,29 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
accounting_module = self.getAccountingModule() accounting_module = self.getAccountingModule()
sale_invoice_transaction_list = accounting_module.objectValues() sale_invoice_transaction_list = accounting_module.objectValues()
self.assertEquals(len(sale_invoice_transaction_list), 1) self.assertEquals(len(sale_invoice_transaction_list), 1)
#self.getPortal().
def stepModifyInvoicesDate(self, sequence=None,
sequence_list=None, **kw):
"""Rebuilds with sale_invoice_builder and checks nothing more is
created. """
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
invoice.edit(start_date=self.datetime,
stop_date=self.datetime+1)
new_invoice.edit(start_date=self.datetime,
stop_date=self.datetime+1)
def stepRemoveDateMovementGroupForTransactionBuilder(self, sequence=None,
sequence_list=None,**kw):
"""
Remove DateMovementGroup
"""
portal = self.getPortal()
builder = portal.portal_deliveries.sale_invoice_transaction_builder
previous_list = builder.getDeliveryCollectOrderList()
new_list = [x for x in previous_list if x != 'DateMovementGroup']
new_list.append('ParentExplanationMovementGroup')
builder.setDeliveryCollectOrderList(new_list)
# default sequence for one line of not varianted resource. # default sequence for one line of not varianted resource.
PACKING_LIST_DEFAULT_SEQUENCE = """ PACKING_LIST_DEFAULT_SEQUENCE = """
...@@ -510,6 +625,43 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -510,6 +625,43 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
stepCheckPackingListIsPacked stepCheckPackingListIsPacked
""" """
# default sequence for one line of not varianted resource.
TWO_PACKING_LIST_DEFAULT_SEQUENCE = """
stepCreateSaleInvoiceTransactionRule
stepCreateEntities
stepCreateCurrency
stepCreateOrder
stepSetOrderProfile
stepSetOrderPriceCurrency
stepCreateNotVariatedResource
stepTic
stepCreateOrderLine
stepSetOrderLineResource
stepSetOrderLineDefaultValues
stepOrderOrder
stepTic
stepCheckDeliveryBuilding
stepConfirmOrder
stepTic
stepCheckOrderRule
stepCheckOrderSimulation
stepCheckDeliveryBuilding
DecreasePackingListLineQuantity
CheckPackingListIsCalculating
SplitAndDeferPackingList
Tic
CheckPackingListIsSolved
CheckPackingListSplitted
stepAddPackingListContainer
stepAddPackingListContainerLine
stepSetContainerLineFullQuantity
stepTic
stepCheckPackingListIsPacked
stepDefineNewPackingListContainer
stepTic
stepCheckNewPackingListIsPacked
"""
def test_SimpleInvoice(self, quiet=0, run=RUN_ALL_TESTS): def test_SimpleInvoice(self, quiet=0, run=RUN_ALL_TESTS):
"""Checks that a Simple Invoice is created from a Packing List""" """Checks that a Simple Invoice is created from a Packing List"""
for base_sequence in (TestInvoice.PACKING_LIST_DEFAULT_SEQUENCE, ) : for base_sequence in (TestInvoice.PACKING_LIST_DEFAULT_SEQUENCE, ) :
...@@ -525,6 +677,33 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase): ...@@ -525,6 +677,33 @@ class TestInvoice(TestPackingListMixin, ERP5TypeTestCase):
stepRebuildAndCheckNothingIsCreated stepRebuildAndCheckNothingIsCreated
""") """)
def test_TwoInvoicesFromTwoPackingList(self, quiet=0, run=1):
""" This test was created for the following bug:
- an order is created and confirmed
- the packing list is split
- the 2 packing list are delivered (at different date)
- 2 invoices are built, then we set the same date on both of them
- the accounting rules are generated and put in only one invoice !!,
so we have an invoice with twice the number of accounting rules
and an invoice with no accounting rules. both invoices are wrong
"""
for base_sequence in (TestInvoice.TWO_PACKING_LIST_DEFAULT_SEQUENCE, ) :
self.playSequence(
base_sequence +
"""
stepSetReadyPackingList
stepSetReadyNewPackingList
stepTic
stepStartPackingList
stepStartNewPackingList
stepTic
stepCheckTwoInvoices
stepRemoveDateMovementGroupForTransactionBuilder
stepConfirmTwoInvoices
stepTic
stepCheckTwoInvoicesTransactionLines
""")
def DISABLEDtest_InvoiceEditPackingListLine(self, quiet=0, run=RUN_ALL_TESTS): def DISABLEDtest_InvoiceEditPackingListLine(self, quiet=0, run=RUN_ALL_TESTS):
"""Checks that editing a Packing List Line still creates a correct """Checks that editing a Packing List Line still creates a correct
Invoice""" Invoice"""
......
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