From aac4d6e43017e0c6314e5578e523572131ae2783 Mon Sep 17 00:00:00 2001
From: Vincent Pelletier <vincent@nexedi.com>
Date: Thu, 5 Apr 2007 12:05:27 +0000
Subject: [PATCH] Remove unused import. Create initial inventory of foreign
 banknotes. Factorise createAccountIncident to use the same code when using
 local and foreign currencies. Create specific methods for foreign currency
 steps. Call cleanup step. Add new sequence for foreign currency.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@13974 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 .../tests/testERP5BankingAccountIncident.py   | 142 +++++++++++++++++-
 1 file changed, 136 insertions(+), 6 deletions(-)

diff --git a/product/ERP5Banking/tests/testERP5BankingAccountIncident.py b/product/ERP5Banking/tests/testERP5BankingAccountIncident.py
index 2e07978be0..f99ef249bc 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)
 
-- 
2.30.9