[Erp5-report] r10058 - /erp5/trunk/products/ERP5/tests/testAccounting.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Sun Sep 17 19:39:47 CEST 2006
Author: jerome
Date: Sun Sep 17 19:39:42 2006
New Revision: 10058
URL: http://svn.erp5.org?rev=10058&view=rev
Log:
better check for payment: if source & dest. are in the same group, usage of a
bank account should be checked on both sides, otherwise only check for section.
use class atributes rather than storing in sequence.
Modified:
erp5/trunk/products/ERP5/tests/testAccounting.py
Modified: erp5/trunk/products/ERP5/tests/testAccounting.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testAccounting.py?rev=10058&r1=10057&r2=10058&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testAccounting.py (original)
+++ erp5/trunk/products/ERP5/tests/testAccounting.py Sun Sep 17 19:39:42 2006
@@ -94,6 +94,9 @@
def afterSetUp(self):
"""Prepare the test."""
self.createCategories()
+ self.createCurrencies()
+ self.createEntities()
+ self.createAccounts()
self.login()
def login(self) :
@@ -127,7 +130,7 @@
def getNeededCategoryList(self):
"""Returns a list of categories that should be created."""
- return ('group/client', 'group/vendor',
+ return ('group/client', 'group/vendor/sub1', 'group/vendor/sub2',
'region/%s'%self.default_region, )
def getBusinessTemplateList(self):
@@ -137,25 +140,35 @@
def stepTic(self, **kw):
"""Flush activity queue. """
self.tic()
-
- def stepCreateEntities(self, sequence, **kw) :
- """Create a vendor and a client. """
- client = self.getOrganisationModule().newContent(
+
+ def createEntities(self):
+ """Create entities. """
+ self.client = self.getOrganisationModule().newContent(
portal_type = self.organisation_portal_type,
group = "group/client",
price_currency = "currency_module/USD")
- vendor = self.getOrganisationModule().newContent(
+ self.vendor = self.getOrganisationModule().newContent(
portal_type = self.organisation_portal_type,
- group = "group/vendor",
+ group = "group/vendor/sub1",
+ price_currency = "currency_module/EUR")
+ self.other_vendor = self.getOrganisationModule().newContent(
+ portal_type = self.organisation_portal_type,
+ group = "group/vendor/sub2",
price_currency = "currency_module/EUR")
# validate entities
- for entity in (client, vendor):
+ for entity in (self.client, self.vendor, self.other_vendor):
entity.setRegion(self.default_region)
self.getWorkflowTool().doActionFor(entity, 'validate_action')
-
- sequence.edit( client = client,
- vendor = vendor,
- organisation = vendor )
+ get_transaction().commit()
+ self.tic()
+
+ def stepCreateEntities(self, sequence, **kw) :
+ """Create entities. """
+ # TODO: remove this method
+ sequence.edit( client=self.client,
+ vendor=self.vendor,
+ other_vendor=self.other_vendor,
+ organisation=self.vendor )
def stepCreateAccountingPeriod(self, sequence, **kw):
"""Creates an Accounting Period for the Organisation."""
@@ -217,57 +230,64 @@
self.assertEquals(accounting_period.getSimulationState(),
'delivered')
-
+ def createCurrencies(self):
+ """Create some currencies.
+ This script will reuse existing currencies, because we want currency ids to
+ be stable, as we use them as categories.
+ """
+ currency_module = self.getCurrencyModule()
+ if not hasattr(currency_module, 'EUR'):
+ self.EUR = currency_module.newContent(
+ portal_type = self.currency_portal_type,
+ reference = "EUR", id = "EUR" )
+ self.USD = currency_module.newContent(
+ portal_type = self.currency_portal_type,
+ reference = "USD", id = "USD" )
+ self.YEN = currency_module.newContent(
+ portal_type = self.currency_portal_type,
+ reference = "YEN", id = "YEN" )
+ get_transaction().commit()
+ self.tic()
+ else:
+ self.EUR = currency_module.EUR
+ self.USD = currency_module.USD
+ self.YEN = currency_module.YEN
+
def stepCreateCurrencies(self, sequence, **kw) :
- """Create a some currencies. """
- if hasattr(self.getCurrencyModule(), 'EUR'):
- sequence.edit(
- EUR = self.getCurrencyModule()['EUR'],
- USD = self.getCurrencyModule()['USD'],
- YEN = self.getCurrencyModule()['YEN'],
- )
- return
- EUR = self.getCurrencyModule().newContent(
- portal_type = self.currency_portal_type,
- reference = "EUR",
- id = "EUR" )
- USD = self.getCurrencyModule().newContent(
- portal_type = self.currency_portal_type,
- reference = "USD",
- id = "USD" )
- YEN = self.getCurrencyModule().newContent(
- portal_type = self.currency_portal_type,
- reference = "YEN",
- id = "YEN" )
- sequence.edit( EUR = EUR, USD = USD, YEN = YEN )
-
- def stepCreateAccounts(self, sequence, **kw) :
- """Create necessary accounts. """
- receivable = self.getAccountModule().newContent(
+ """Create some currencies. """
+ # TODO: remove
+ sequence.edit(EUR=self.EUR, USD=self.USD, YEN=self.YEN)
+
+ def createAccounts(self):
+ """Create some accounts.
+ """
+ receivable = self.receivable_account = self.getAccountModule().newContent(
title = 'receivable',
portal_type = self.account_portal_type,
account_type = 'asset/receivable' )
- payable = self.getAccountModule().newContent(
+ payable = self.payable_account = self.getAccountModule().newContent(
title = 'payable',
portal_type = self.account_portal_type,
account_type = 'liability/payable' )
- expense = self.getAccountModule().newContent(
+ expense = self.expense_account = self.getAccountModule().newContent(
title = 'expense',
portal_type = self.account_portal_type,
account_type = 'expense' )
- income = self.getAccountModule().newContent(
+ income = self.income_account = self.getAccountModule().newContent(
title = 'income',
portal_type = self.account_portal_type,
account_type = 'income' )
- collected_vat = self.getAccountModule().newContent(
+ collected_vat = self.collected_vat_account = self\
+ .getAccountModule().newContent(
title = 'collected_vat',
portal_type = self.account_portal_type,
account_type = 'liability/payable/collected_vat' )
- refundable_vat = self.getAccountModule().newContent(
+ refundable_vat = self.refundable_vat_account = self\
+ .getAccountModule().newContent(
title = 'refundable_vat',
portal_type = self.account_portal_type,
account_type = 'asset/receivable/refundable_vat' )
- bank = self.getAccountModule().newContent(
+ bank = self.bank_account = self.getAccountModule().newContent(
title = 'bank',
portal_type = self.account_portal_type,
account_type = 'asset/cash/bank')
@@ -281,28 +301,32 @@
refundable_vat.setDestinationValue(collected_vat)
bank.setDestinationValue(bank)
- account_list = [ receivable,
- payable,
- expense,
- income,
- collected_vat,
- refundable_vat,
- bank ]
-
- for account in account_list :
+ self.account_list = [ receivable,
+ payable,
+ expense,
+ income,
+ collected_vat,
+ refundable_vat,
+ bank ]
+
+ for account in self.account_list :
account.validate()
self.failUnless('Site Error' not in account.view())
self.assertEquals(account.getValidationState(), 'validated')
-
- sequence.edit( receivable_account = receivable,
- payable_account = payable,
- expense_account = expense,
- income_account = income,
- collected_vat_account = collected_vat,
- refundable_vat_account = refundable_vat,
- bank_account = bank,
- account_list = account_list )
-
+ get_transaction().commit()
+ self.tic()
+
+ def stepCreateAccounts(self, sequence, **kw) :
+ """Create necessary accounts. """
+ # XXX remove me !
+ sequence.edit( receivable_account=self.receivable_account,
+ payable_account=self.payable_account,
+ expense_account=self.expense_account,
+ income_account=self.income_account,
+ collected_vat_account=self.collected_vat_account,
+ refundable_vat_account=self.refundable_vat_account,
+ bank_account=self.bank_account,
+ account_list=self.account_list )
def stepCreateAccountingTransactionAndCheckMirrorAccount(self,
sequence, **kw):
@@ -655,61 +679,95 @@
accounting_transaction.getPortalType(),
allowed_content_types ))
- def stepCreateValidAccountingTransaction(self, sequence,
- sequence_list=None, **kw) :
- """Creates a valide accounting transaction and put it in
- the sequence as `transaction` key. """
- resource_value = sequence.get('EUR')
- source_section_value = sequence.get('vendor')
- destination_section_value = sequence.get('client')
- start_date = DateTime(2000,01,01)
- stop_date = DateTime(2000,02,02)
- # get a date inside openned period, if any
- for openned_source_section_period in\
- source_section_value.searchFolder(
- portal_type = self.accounting_period_portal_type,
- simulation_state = 'planned' ):
- start_date = openned_source_section_period.getStartDate() + 1
- for openned_destination_section_period in\
- destination_section_value.searchFolder(
- portal_type = self.accounting_period_portal_type,
- simulation_state = 'planned' ):
- stop_date = openned_destination_section_period.getStartDate() + 1
-
+ def createAccountingTransaction(self,
+ portal_type=accounting_transaction_portal_type,
+ line_portal_type=accounting_transaction_line_portal_type,
+ quantity=100, reindex=1, check_consistency=1, **kw):
+ """Creates an accounting transaction.
+ By default, this transaction contains 2 lines, income and receivable.
+ quantity - The quantity property on created lines.
+ reindex - The transaction will be reindexed.
+ check_consistency - a consistency check will be performed on the
+ transaction.
+ """
+ kw.setdefault('resource_value', self.EUR)
+ kw.setdefault('source_section_value', self.vendor)
+ kw.setdefault('destination_section_value', self.client)
+ if 'start_date' not in kw:
+ start_date = DateTime(2000, 01, 01)
+ # get a valid date for source section
+ for openned_source_section_period in\
+ kw['source_section_value'].searchFolder(
+ portal_type=self.accounting_period_portal_type,
+ simulation_state='planned' ):
+ start_date = openned_source_section_period.getStartDate() + 1
+ kw['start_date'] = start_date
+
+ if 'stop_date' not in kw:
+ # get a valid date for destination section
+ stop_date = DateTime(2000, 02, 02)
+ for openned_destination_section_period in\
+ kw['destination_section_value'].searchFolder(
+ portal_type=self.accounting_period_portal_type,
+ simulation_state='planned' ):
+ stop_date = openned_destination_section_period.getStartDate() + 1
+ kw['stop_date'] = stop_date
+
+ # create the transaction.
transaction = self.getAccountingModule().newContent(
- portal_type = self.accounting_transaction_portal_type,
- start_date = start_date,
- stop_date = stop_date,
- resource_value = resource_value,
- source_section_value = source_section_value,
- destination_section_value = destination_section_value,
- created_by_builder = 1 # XXX prevent the init script from
+ portal_type=portal_type,
+ start_date=kw['start_date'],
+ stop_date=kw['stop_date'],
+ resource_value=kw['resource_value'],
+ source_section_value=kw['source_section_value'],
+ destination_section_value=kw['destination_section_value'],
+ created_by_builder = 1 # prevent the init script from
# creating lines.
)
income = transaction.newContent(
- portal_type = self.accounting_transaction_line_portal_type,
- quantity = 100,
- source_value = sequence.get('income_account'),
- destination_value = sequence.get('expense_account'),
- )
+ id='income',
+ portal_type=line_portal_type,
+ quantity=quantity,
+ source_value=kw.get('income_account', self.income_account),
+ destination_value=kw.get('expense_account',
+ self.expense_account), )
self.failUnless(income.getSource() != None)
self.failUnless(income.getDestination() != None)
receivable = transaction.newContent(
- portal_type = self.accounting_transaction_line_portal_type,
- quantity = -100,
- source_value = sequence.get('receivable_account'),
- destination_value = sequence.get('payable_account'),
- )
+ id='receivable',
+ portal_type=line_portal_type,
+ quantity=-quantity,
+ source_value=kw.get('receivable_account',
+ self.receivable_account),
+ destination_value=kw.get('payable_account',
+ self.payable_account), )
self.failUnless(receivable.getSource() != None)
self.failUnless(receivable.getDestination() != None)
-
- self.failUnless(len(transaction.checkConsistency()) == 0,
- "Check consistency failed : %s" % transaction.checkConsistency())
+ if reindex:
+ get_transaction().commit()
+ self.tic()
+ if check_consistency:
+ self.failUnless(len(transaction.checkConsistency()) == 0,
+ "Check consistency failed : %s" % transaction.checkConsistency())
+ return transaction
+
+ def stepCreateValidAccountingTransaction(self, sequence,
+ sequence_list=None, **kw) :
+ """Creates a valid accounting transaction and put it in
+ the sequence as `transaction` key. """
+ transaction = self.createAccountingTransaction(
+ resource_value=sequence.get('EUR'),
+ source_section_value=sequence.get('vendor'),
+ destination_section_value=sequence.get('client'),
+ income_account=sequence.get('income_account'),
+ expense_account=sequence.get('expense_account'),
+ receivable_account=sequence.get('receivable_account'),
+ payable_account=sequence.get('payable_account'), )
sequence.edit(
transaction = transaction,
- income = income,
- receivable = receivable
+ income = transaction.income,
+ receivable = transaction.receivable
)
def stepValidateNoDate(self, sequence, sequence_list=None, **kw) :
@@ -960,7 +1018,7 @@
line.edit( source_value = sequence.get('bank_account'),
destination_value = sequence.get('bank_account') )
self.failUnless(income_account_found)
-
+ # XXX
transaction = sequence.get('transaction')
useBankAccount(transaction)
self.assertRaises(ValidationFailed,
@@ -975,11 +1033,12 @@
portal_type = ptype, )
destination_payment_value = destination_section_value.newContent(
portal_type = ptype, )
- self.stepCreateValidAccountingTransaction(sequence)
- transaction = sequence.get('transaction')
+ transaction = self.createAccountingTransaction(
+ destination_section_value=self.other_vendor)
useBankAccount(transaction)
- # payment node have to be set on both sides
+ # payment node have to be set on both sides if both sides are member of
+ # the same group.
transaction.setSourcePaymentValue(source_payment_value)
transaction.setDestinationPaymentValue(None)
self.assertRaises(ValidationFailed,
@@ -998,8 +1057,22 @@
self.getWorkflowTool().doActionFor(transaction, 'stop_action')
self.assertEquals(transaction.getSimulationState(), 'stopped')
except ValidationFailed, err :
- self.assert_(0, "Validation failed : %s" % err.msg)
-
+ self.fail("Validation failed : %s" % err.msg)
+
+ # if we are not interested in the accounting for the third party, no need
+ # to have a destination_payment
+ transaction = self.createAccountingTransaction()
+ useBankAccount(transaction)
+ # only set payment for source
+ transaction.setSourcePaymentValue(source_payment_value)
+ transaction.setDestinationPaymentValue(None)
+ # then we should be able to validate.
+ try:
+ self.getWorkflowTool().doActionFor(transaction, 'stop_action')
+ self.assertEquals(transaction.getSimulationState(), 'stopped')
+ except ValidationFailed, err:
+ self.fail("Validation failed : %s" % err.msg)
+
def stepValidateRemoveEmptyLines(self, sequence, sequence_list=None, **kw):
"""Check validating a transaction remove empty lines. """
transaction = sequence.get('transaction')
More information about the Erp5-report
mailing list