diff --git a/product/ERP5Banking/tests/testERP5BankingAccountIncident.py b/product/ERP5Banking/tests/testERP5BankingAccountIncident.py index 2e07978be0c64d15faa50c1308246aa30ea8e25c..f99ef249bcb5b73d0651d5dac3bb6221c352c06f 100755 --- a/product/ERP5Banking/tests/testERP5BankingAccountIncident.py +++ b/product/ERP5Banking/tests/testERP5BankingAccountIncident.py @@ -31,7 +31,6 @@ import os from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase from Products.ERP5Type.tests.Sequence import SequenceList -from Products.DCWorkflow.DCWorkflow import Unauthorized, ValidationFailed from Testing.ZopeTestCase.PortalTestCase import PortalTestCase from Products.ERP5Banking.tests.TestERP5BankingMixin import TestERP5BankingMixin @@ -127,11 +126,30 @@ class TestERP5BankingAccountIncident(TestERP5BankingMixin, ERP5TypeTestCase): 'variation_id': ('emission_letter', 'cash_status', 'variation'), 'variation_value': ('emission_letter/p', 'cash_status/valid') + self.variation_list, 'quantity': self.quantity_200} + + # Overload the default usd quantity to have a measurable amount in the end (exchange rate is extremely low). + + inventory_dict_line_3 = {'id': 'inventory_line_3', + 'resource': self.usd_billet_100, + 'variation_id': ('emission_letter', 'cash_status', 'variation'), + 'variation_value': ('emission_letter/not_defined', 'cash_status/not_defined') + self.usd_variation_list, + 'variation_list': self.usd_variation_list, + 'quantity': self.quantity_usd_100} + + inventory_dict_line_4 = {'id': 'inventory_line_4', + 'resource': self.usd_billet_50, + 'variation_id': ('emission_letter', 'cash_status', 'variation'), + 'variation_value': ('emission_letter/not_defined', 'cash_status/not_defined') + self.usd_variation_list, + 'variation_list': self.usd_variation_list, + 'quantity': self.quantity_usd_50} line_list = [inventory_dict_line_1, inventory_dict_line_2] self.vault = self.paris.surface.caisse_courante.encaisse_des_billets_et_monnaies self.createCashInventory(source=None, destination=self.vault, currency=self.currency_1, line_list=line_list) + self.foreign_vault = self.paris.surface.caisse_courante.encaisse_des_devises.usd + self.createCashInventory(source=None, destination=self.foreign_vault, currency=self.currency_2, + line_list=[inventory_dict_line_3, inventory_dict_line_4]) # create a person and a bank account self.person_1 = self.createPerson(id='person_1', @@ -197,7 +215,7 @@ class TestERP5BankingAccountIncident(TestERP5BankingMixin, ERP5TypeTestCase): self.assertEqual(self.simulation_tool.getFutureInventory(payment=self.bank_account_1.getRelativeUrl()), 100000) - def stepCreateAccountIncident(self, sequence=None, sequence_list=None, **kwd): + def createAccountIncident(self, resource_value, source_total_asset_price): """ Create a cash transfer document and check it """ @@ -205,10 +223,10 @@ class TestERP5BankingAccountIncident(TestERP5BankingMixin, ERP5TypeTestCase): self.account_incident = self.account_incident_module.newContent( id='account_incident_1', portal_type='Account Incident', - source_total_asset_price=52400.0, + source_total_asset_price=source_total_asset_price, description='test', destination_payment_value=self.bank_account_1, - resource_value=self.currency_1) + resource_value=resource_value) # execute tic self.stepTic() # set source reference @@ -226,7 +244,18 @@ class TestERP5BankingAccountIncident(TestERP5BankingMixin, ERP5TypeTestCase): # check source reference self.assertNotEqual(self.account_incident.getSourceReference(), '') self.assertNotEqual(self.account_incident.getSourceReference(), None) - + + def stepCreateAccountIncident(self, sequence=None, sequence_list=None, **kwd): + """ + Create an account incident document with site default currency. + """ + self.createAccountIncident(resource_value=self.currency_1, source_total_asset_price=52400.0) + + def stepCreateForeignCurrencyAccountIncident(self, sequence=None, sequence_list=None, **kwd): + """ + Create an account incident with a forreign currency. + """ + self.createAccountIncident(resource_value=self.currency_2, source_total_asset_price=sum(self.quantity_usd_100.values()) * 100) def stepCreateIncomingLine(self, sequence=None, sequence_list=None, **kwd): """ @@ -274,6 +303,49 @@ class TestERP5BankingAccountIncident(TestERP5BankingMixin, ERP5TypeTestCase): else: self.fail('Wrong cell created : %s' % cell.getId()) + def stepCreateForeignIncomingLine(self, sequence=None, sequence_list=None, **kwd): + """ + Create the cash transfer line 1 with banknotes of 100 and check it has been well created + """ + # create the cash transfer line + self.addCashLineToDelivery(self.account_incident, + 'valid_line_1', + 'Incoming Account Incident Line', + self.usd_billet_100, + ('emission_letter', 'cash_status', 'variation'), + ('emission_letter/not_defined', 'cash_status/not_defined') + self.usd_variation_list, + self.quantity_usd_100, + variation_list = self.usd_variation_list) + # execute tic + self.stepTic() + # check there is only one line created + self.assertEqual(len(self.account_incident.objectValues( + portal_type='Incoming Account Incident Line')), 1) + # get the cash transfer line + self.valid_line_1 = getattr(self.account_incident, 'valid_line_1') + # check its portal type + self.assertEqual(self.valid_line_1.getPortalType(), 'Incoming Account Incident Line') + # check the resource is banknotes of 10000 + self.assertEqual(self.valid_line_1.getResourceValue(), self.usd_billet_100) + # chek the value of the banknote + #banknote_quantity = sum(self.quantity_usd_100.values()) + self.assertEqual(self.valid_line_1.getPrice(), 100) + # check the unit of banknote + self.assertEqual(self.valid_line_1.getQuantityUnit(), 'unit') + # check we have one delivery cell: + self.assertEqual(len(self.valid_line_1.objectValues()), 1) + # get the delivery cell + banknote_quantity = sum(self.quantity_usd_100.values()) + cell = self.valid_line_1.movement_0_0_0 + # chek portal types + self.assertEqual(cell.getPortalType(), 'Cash Delivery Cell') + # check the source vault is usual_cash + self.assertEqual(cell.getBaobabSourceValue(), None) + # check the destination vault is counter + self.assertEqual(cell.getBaobabDestination(), self.foreign_vault.getRelativeUrl()) + # check the banknote of the cell is banknote of 100 + self.assertEqual(cell.getResourceValue(), self.usd_billet_100) + self.assertEqual(cell.getQuantity(), banknote_quantity) def stepCheckSubTotal(self, sequence=None, sequence_list=None, **kwd): """ @@ -284,6 +356,15 @@ class TestERP5BankingAccountIncident(TestERP5BankingMixin, ERP5TypeTestCase): # Check the total price self.assertEqual(self.account_incident.getTotalPrice(), 10000 * 5.0) + def stepCheckForeignSubTotal(self, sequence=None, sequence_list=None, **kwd): + """ + Check the amount after the creation of cash transfer line 1 + """ + banknote_quantity = sum(self.quantity_usd_100.values()) + # Check quantity of banknotes + self.assertEqual(self.account_incident.getTotalQuantity(), banknote_quantity) + # Check the total price + self.assertEqual(self.account_incident.getTotalPrice(), 100 * banknote_quantity) def stepCreateOutgoingLine(self, sequence=None, sequence_list=None, **kwd): """ @@ -385,6 +466,15 @@ class TestERP5BankingAccountIncident(TestERP5BankingMixin, ERP5TypeTestCase): # check state is confirmed self.assertEqual(self.account_incident.getSimulationState(), 'confirmed') + def stepConfirmForeignAccountIncident(self, sequence=None, sequence_list=None, **kwd): + """ + Confirm the cash transfer and check it + """ + # do the Workflow action + self.workflow_tool.doActionFor(self.account_incident, 'confirm_action', wf_id='account_incident_workflow') + # check state is confirmed + self.assertEqual(self.account_incident.getSimulationState(), 'confirmed') + def stepDeliverAccountIncident(self, sequence=None, sequence_list=None, **kwd): """ Deliver the cash transfer with a good user @@ -411,6 +501,37 @@ class TestERP5BankingAccountIncident(TestERP5BankingMixin, ERP5TypeTestCase): self.assertEqual(self.simulation_tool.getCurrentInventory(payment=self.bank_account_1.getRelativeUrl(),resource=self.currency_1.getRelativeUrl()), 150000) self.assertEqual(self.simulation_tool.getFutureInventory(payment=self.bank_account_1.getRelativeUrl(),resource=self.currency_1.getRelativeUrl()), 150000) + def stepCheckInitialForeignCurrencyInventory(self, sequence=None, sequence_list=None, **kwd): + """ + Check the initial inventory before any operations + """ + self.simulation_tool = self.getSimulationTool() + quantity_of_100 = sum(self.quantity_usd_100.values()) + quantity_of_50 = sum(self.quantity_usd_50.values()) + # check we have USD banknotes of 100 in forreign vault + self.assertEqual(self.simulation_tool.getCurrentInventory(node=self.foreign_vault.getRelativeUrl(), resource=self.usd_billet_100.getRelativeUrl()), quantity_of_100) + self.assertEqual(self.simulation_tool.getFutureInventory(node=self.foreign_vault.getRelativeUrl(), resource=self.usd_billet_100.getRelativeUrl()), quantity_of_100) + # check we have USD banknotes of 50 in forreign vault + self.assertEqual(self.simulation_tool.getCurrentInventory(node=self.foreign_vault.getRelativeUrl(), resource=self.usd_billet_50.getRelativeUrl()), quantity_of_50) + self.assertEqual(self.simulation_tool.getFutureInventory(node=self.foreign_vault.getRelativeUrl(), resource=self.usd_billet_50.getRelativeUrl()), quantity_of_50) + # check the inventory of the bank account + self.assertEqual(self.simulation_tool.getCurrentInventory(payment=self.bank_account_1.getRelativeUrl()), 100000) + self.assertEqual(self.simulation_tool.getFutureInventory(payment=self.bank_account_1.getRelativeUrl()), 100000) + + def stepCheckFinalForeignCurrencyInventory(self, sequence=None, sequence_list=None, **kwd): + self.simulation_tool = self.getSimulationTool() + quantity_of_100 = sum(self.quantity_usd_100.values()) + added_quantity_of_100 = quantity_of_100 # We received the same amount as what was originaly in stock + quantity_of_50 = sum(self.quantity_usd_50.values()) + # check the number of banknotes of 100 + self.assertEqual(self.simulation_tool.getCurrentInventory(node=self.foreign_vault.getRelativeUrl(), resource = self.usd_billet_100.getRelativeUrl()), quantity_of_100 + added_quantity_of_100) + self.assertEqual(self.simulation_tool.getFutureInventory(node=self.foreign_vault.getRelativeUrl(), resource = self.usd_billet_100.getRelativeUrl()), quantity_of_100 + added_quantity_of_100) + # check the number of banknotes of 50 + self.assertEqual(self.simulation_tool.getCurrentInventory(node=self.foreign_vault.getRelativeUrl(), resource = self.usd_billet_50.getRelativeUrl()), quantity_of_50) + self.assertEqual(self.simulation_tool.getFutureInventory(node=self.foreign_vault.getRelativeUrl(), resource = self.usd_billet_50.getRelativeUrl()), quantity_of_50) + # check the inventory of the bank account in the default currency, not in the foreign one ! + self.assertEqual(self.simulation_tool.getCurrentInventory(payment=self.bank_account_1.getRelativeUrl(), resource=self.currency_1.getRelativeUrl()), 100000.0 + (added_quantity_of_100 * 100.0 * 650.0)) # XXX: hardcoded exchange rate, extracted from createCurrency. + self.assertEqual(self.simulation_tool.getFutureInventory(payment=self.bank_account_1.getRelativeUrl(), resource=self.currency_1.getRelativeUrl()), 100000.0 + (added_quantity_of_100 * 100.0 * 650.0)) # XXX: hardcoded exchange rate, extracted from createCurrency. ################################## ## Tests @@ -433,8 +554,17 @@ class TestERP5BankingAccountIncident(TestERP5BankingMixin, ERP5TypeTestCase): + 'Tic CheckTotal ' \ + 'ConfirmAccountIncident Tic ' \ + 'DeliverAccountIncident Tic ' \ - + 'CheckFinalInventory ' + + 'CheckFinalInventory ' \ + 'CleanupObjects' + sequence_string_2 = 'Tic CheckObjects Tic CheckInitialForeignCurrencyInventory ' \ + 'CreateForeignCurrencyAccountIncident ' \ + 'CreateForeignIncomingLine CheckForeignSubTotal ' \ + 'ConfirmForeignAccountIncident Tic ' \ + 'DeliverAccountIncident Tic ' \ + 'CheckFinalForeignCurrencyInventory ' \ + 'CleanupObjects' sequence_list.addSequenceString(sequence_string) + sequence_list.addSequenceString(sequence_string_2) # play the sequence sequence_list.play(self)