diff --git a/product/ERP5/Document/BalanceTransaction.py b/product/ERP5/Document/BalanceTransaction.py index 1714b9b80dad0b59aa18eaf2af3c5687db4b548f..7daf13c7b09f780e765b79c0d9edb69ca216ec42 100644 --- a/product/ERP5/Document/BalanceTransaction.py +++ b/product/ERP5/Document/BalanceTransaction.py @@ -164,12 +164,14 @@ class BalanceTransaction(AccountingTransaction, Inventory): node_uid = movement.getDestinationUid() if not node_uid: raise ValueError, "No destination uid for %s" % movement + resource_uid = movement.getResourceUid() stock_list = current_stock.setdefault( InventoryKey(node_uid=node_uid, section_uid=section_uid), []) for inventory in getInventoryList( node_uid=node_uid, + resource_uid=resource_uid, group_by_node=1, group_by_resource=1, **default_inventory_params): @@ -177,7 +179,7 @@ class BalanceTransaction(AccountingTransaction, Inventory): stock_list.append( dict(destination_uid=node_uid, destination_section_uid=section_uid, - resource_uid=inventory.resource_uid, + resource_uid=resource_uid, quantity=inventory.total_quantity, total_price=inventory.total_price, )) @@ -187,6 +189,7 @@ class BalanceTransaction(AccountingTransaction, Inventory): if not node_uid: raise ValueError, "No destination uid for %s" % movement mirror_section_uid = movement.getSourceSectionUid() + resource_uid = movement.getResourceUid() stock_list = current_stock.setdefault( InventoryKey(node_uid=node_uid, @@ -195,6 +198,7 @@ class BalanceTransaction(AccountingTransaction, Inventory): for inventory in getInventoryList( node_uid=node_uid, mirror_section_uid=mirror_section_uid, + resource_uid=resource_uid, group_by_node=1, group_by_mirror_section=1, group_by_resource=1, @@ -204,7 +208,7 @@ class BalanceTransaction(AccountingTransaction, Inventory): dict(destination_uid=node_uid, destination_section_uid=section_uid, source_section_uid=mirror_section_uid, - resource_uid=inventory.resource_uid, + resource_uid=resource_uid, quantity=inventory.total_quantity, total_price=inventory.total_price, )) @@ -214,6 +218,7 @@ class BalanceTransaction(AccountingTransaction, Inventory): if not node_uid: raise ValueError, "No destination uid for %s" % movement payment_uid = movement.getDestinationPaymentUid() + resource_uid = movement.getResourceUid() stock_list = current_stock.setdefault( InventoryKey(node_uid=node_uid, @@ -222,6 +227,7 @@ class BalanceTransaction(AccountingTransaction, Inventory): for inventory in getInventoryList( node_uid=node_uid, payment_uid=payment_uid, + resource_uid=resource_uid, group_by_node=1, group_by_payment=1, group_by_resource=1, @@ -231,7 +237,7 @@ class BalanceTransaction(AccountingTransaction, Inventory): dict(destination_uid=node_uid, destination_section_uid=section_uid, destination_payment_uid=payment_uid, - resource_uid=inventory.resource_uid, + resource_uid=resource_uid, quantity=inventory.total_quantity, total_price=inventory.total_price, )) diff --git a/product/ERP5/tests/testAccounting.py b/product/ERP5/tests/testAccounting.py index 3277b443877f2e11f6ae21a315122932ba3e6fa3..b14f4cd1cdff2d491d9392f8776029816f29f159 100644 --- a/product/ERP5/tests/testAccounting.py +++ b/product/ERP5/tests/testAccounting.py @@ -895,6 +895,138 @@ class TestClosingPeriod(AccountingTestCase): accounting_currency_precision) + def test_createBalanceOnMirrorSectionMultiCurrencySameMirrorSection(self): + pl = self.portal.account_module.newContent( + portal_type='Account', + account_type='equity') + organisation_module = self.organisation_module + period = self.section.newContent(portal_type='Accounting Period') + period.setStartDate(DateTime(2006, 1, 1)) + period.setStopDate(DateTime(2006, 12, 31)) + + transaction1 = self._makeOne( + start_date=DateTime(2006, 1, 1), + title='Yen', + resource='currency_module/yen', + destination_section_value=organisation_module.client_1, + portal_type='Sale Invoice Transaction', + simulation_state='delivered', + lines=(dict(source_value=self.account_module.goods_sales, + source_asset_debit=1.1, + source_debit=100), + dict(source_value=self.account_module.receivable, + source_asset_credit=1.1, + source_credit=100))) + + transaction2 = self._makeOne( + start_date=DateTime(2006, 1, 2), + title='Dollar', + resource='currency_module/usd', + destination_section_value=organisation_module.client_1, + portal_type='Sale Invoice Transaction', + simulation_state='delivered', + lines=(dict(source_value=self.account_module.goods_sales, + source_asset_debit=2.2, + source_debit=200), + dict(source_value=self.account_module.receivable, + source_asset_credit=2.2, + source_credit=200))) + get_transaction().commit() + self.tic() + + period.AccountingPeriod_createBalanceTransaction( + profit_and_loss_account=pl.getRelativeUrl()) + accounting_transaction_list = self.accounting_module.contentValues() + self.assertEquals(3, len(accounting_transaction_list)) + balance_transaction_list = self.accounting_module.contentValues( + portal_type='Balance Transaction') + self.assertEquals(1, len(balance_transaction_list)) + balance_transaction = balance_transaction_list[0] + + self.assertEquals(self.section, + balance_transaction.getDestinationSectionValue()) + self.assertEquals(None, balance_transaction.getSourceSection()) + self.assertEquals(DateTime(2007, 1, 1), + balance_transaction.getStartDate()) + self.assertEquals('currency_module/euro', + balance_transaction.getResource()) + + # this should create a balance with 3 lines, + # pl = 3.3 D ( resource acquired ) + # receivable/client1 = 1.1 C ( resource yen ) qty=100 + # receivable/client1 = 2.2 C ( resource usd ) qyt=200 + + accounting_currency_precision = \ + self.portal.currency_module.euro.getQuantityPrecision() + self.assertEquals(accounting_currency_precision, 2) + + movement_list = balance_transaction.getMovementList() + self.assertEquals(3, len(movement_list)) + client1_movement_list = [m for m in movement_list + if m.getSourceSectionValue() == organisation_module.client_1] + self.assertEquals(2, len(client1_movement_list)) + yen_movement = [x for x in client1_movement_list if + x.getResource() == 'currency_module/yen'][0] + self.assertEquals([], yen_movement.getValueList('destination_section')) + self.assertEquals(None, yen_movement.getSource()) + self.assertEquals(self.account_module.receivable, + yen_movement.getDestinationValue()) + self.assertEquals(organisation_module.client_1, + yen_movement.getSourceSectionValue()) + self.assertAlmostEquals(1.1, + yen_movement.getDestinationInventoriatedTotalAssetCredit(), + accounting_currency_precision) + self.assertEquals(None, yen_movement.getSourceTotalAssetPrice()) + self.assertEquals(100, yen_movement.getDestinationCredit()) + + dollar_movement = [x for x in client1_movement_list if + x.getResource() == 'currency_module/usd'][0] + self.assertEquals([], dollar_movement.getValueList('destination_section')) + self.assertEquals(None, dollar_movement.getSource()) + self.assertEquals(self.account_module.receivable, + dollar_movement.getDestinationValue()) + self.assertEquals(organisation_module.client_1, + dollar_movement.getSourceSectionValue()) + self.assertAlmostEquals(2.2, + dollar_movement.getDestinationInventoriatedTotalAssetCredit(), + accounting_currency_precision) + self.assertEquals(None, dollar_movement.getSourceTotalAssetPrice()) + self.assertEquals(200, dollar_movement.getDestinationCredit()) + + get_transaction().commit() + self.tic() + + # now check content of stock table + q = self.portal.erp5_sql_connection.manage_test + self.assertEquals(1, q( + "SELECT count(*) FROM stock WHERE portal_type=" + "'Balance Transaction Line'")[0][0]) + self.assertEquals(3.3, q( + "SELECT total_price FROM stock WHERE portal_type=" + "'Balance Transaction Line'")[0][0]) + self.assertEquals(3.3, q( + "SELECT quantity FROM stock WHERE portal_type=" + "'Balance Transaction Line'")[0][0]) + self.assertEquals(self.portal.currency_module.euro.getUid(), q( + "SELECT resource_uid FROM stock WHERE portal_type=" + "'Balance Transaction Line'")[0][0]) + self.assertEquals(self.section.getUid(), q( + "SELECT section_uid FROM stock WHERE portal_type=" + "'Balance Transaction Line'")[0][0]) + self.assertEquals(None, q( + "SELECT mirror_section_uid FROM stock WHERE portal_type=" + "'Balance Transaction Line'")[0][0]) + self.assertEquals(pl.getUid(), q( + "SELECT node_uid FROM stock WHERE portal_type=" + "'Balance Transaction Line'")[0][0]) + self.assertEquals(None, q( + "SELECT mirror_node_uid FROM stock WHERE portal_type=" + "'Balance Transaction Line'")[0][0]) + self.assertEquals(DateTime(2007, 1, 1), q( + "SELECT date FROM stock WHERE portal_type=" + "'Balance Transaction Line'")[0][0]) + + def test_AccountingPeriodWorkflow(self): """Tests that accounting_period_workflow creates a balance transaction. """