[Erp5-report] r6374 - /erp5/trunk/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_ac...
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Mar 31 01:42:31 CEST 2006
Author: kevin
Date: Fri Mar 31 01:42:29 2006
New Revision: 6374
URL: http://svn.erp5.org?rev=6374&view=rev
Log:
* Use preferred precision to get round values.
* Added parent accounts displaying as optionnal parameter.
* Clean up code (supress old-school 80-character limitation, regroup similar statement together for easy human-eye parsing).
* Use common dict for sql query.
* Use custom zsql method for Bank Account related balance.
* Use better gap sorting method to take care of trailing zero and type of account (true account or 'virtual' one).
* Mark virtual account with 2 stars.
* Mark total of expended account with "** (total)" string.
* Use section_portal_type_list to break acquisition of 'group' property from Person to Organisation.
Modified:
erp5/trunk/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_accounting/AccountModule_getAccountListForTrialBalance.xml
Modified: erp5/trunk/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_accounting/AccountModule_getAccountListForTrialBalance.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_accounting/AccountModule_getAccountListForTrialBalance.xml?rev=6374&r1=6373&r2=6374&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_accounting/AccountModule_getAccountListForTrialBalance.xml (original)
+++ erp5/trunk/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_accounting/AccountModule_getAccountListForTrialBalance.xml Fri Mar 31 01:42:29 2006
@@ -68,48 +68,50 @@
<key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[
-#\n
-# This method returns a list of accounts virtually expanded, ie. payable and receivable accounts\n
-# are split by \'destination_section\' categories and bank accounts are split by \'source_payment\'\n
-#\n
-\n
from DateTime import DateTime\n
import math\n
\n
-LOG = lambda msg : context.getPortalObject().log(\n
- "AccountModule_getAccountListForTrialBalance", msg)\n
-\n
-from_date = kw.get(\'from_date\', DateTime(\'1970/01/01\'))\n
+##########\n
+# This method returns a list of accounts virtually expanded, ie. payable and receivable accounts\n
+# are split by \'destination_section\' categories and bank accounts are split by \'source_payment\'.\n
+##########\n
+\n
+LOG = lambda msg: context.getPortalObject().log("AccountModule_getAccountListForTrialBalance", msg)\n
+\n
+from_date = kw.get(\'from_date\', DateTime(\'1970/01/01\'))\n
+at_date = kw[\'at_date\']\n
simulation_state = kw[\'transaction_simulation_state\']\n
-at_date = kw[\'at_date\']\n
+\n
+# Get Precision\n
+precision = context.Base_getPreferredPrecision()\n
\n
# extra arguments for getInventory :\n
extra_kw = {}\n
\n
-# get a list of section uids. \n
-section_category = kw[\'transaction_section_category\']\n
-section_object = context.portal_categories.restrictedTraverse(\n
- section_category )\n
-organisation_list = section_object.getGroupRelatedValueList(\n
- portal_type=\'Organisation\')\n
-section_uid_list = [section_object.getUid()] + [\n
- x.getUid() for x in organisation_list]\n
+# get a list of section uids.\n
+section_category = kw[\'transaction_section_category\']\n
+section_object = context.portal_categories.restrictedTraverse(section_category)\n
+organisation_list = section_object.getGroupRelatedValueList(portal_type=\'Organisation\')\n
+section_uid_list = [section_object.getUid()] + [x.getUid() for x in organisation_list]\n
extra_kw[\'stock.section_uid\'] = section_uid_list\n
\n
-# wether we should or not expand accounts into virtual accounts \n
+# wether we should or not expand accounts into virtual accounts\n
# (payable & receivable with other parties / bank with bank account)\n
-expand_accounts = kw.get("expand_accounts", 1)\n
+expand_accounts = kw.get("expand_accounts", True)\n
+\n
+# Show the upper parents account of the real accounts objects\n
+show_parent_accounts = kw.get("show_parent_accounts", True)\n
\n
# the gap tree to use\n
gap_root = kw["gap_root"]\n
\n
# inventory methods\n
-getInventory = context.getPortalObject().portal_simulation\\\n
- .getInventoryAssetPrice\n
+getInventory = context.getPortalObject().portal_simulation.getInventoryAssetPrice\n
getInventoryList = context.getPortalObject().portal_simulation.getInventoryList\n
\n
# shall we display a summary line for expanded accounts ?\n
-display_summary_account_line = 0\n
+display_summary_account_line = True\n
+\n
\n
def formatValues(dict) :\n
for k, v in dict.items():\n
@@ -137,47 +139,90 @@
else :\n
dict[k] = \'%s \'%(value)\n
dict[k]\n
- return dict \n
-\n
-def getDefaultColumnValues(node_uid = 0, **kw):\n
- """ returns then opening balance, debit movements sum, credit movements\n
- sum and closing balance using defaults categories. """\n
+ return dict\n
+\n
+\n
+def getDefaultColumnValues(node_uid=0, **kw):\n
+ """\n
+ returns then opening balance, debit movements sum, credit movements\n
+ sum and closing balance using defaults categories.\n
+ """\n
values = {}\n
get_inventory_kw = extra_kw.copy()\n
get_inventory_kw.update(kw)\n
-\n
- values[\'opening_balance\'] = getInventory( node_uid = node_uid,\n
- to_date = from_date,\n
- simulation_state = simulation_state,\n
- omit_simulation = 1,\n
- **get_inventory_kw )\n
- \n
- values[\'debit_movement\'] = getInventory( node_uid = node_uid,\n
- from_date = from_date,\n
- at_date = at_date,\n
- simulation_state = simulation_state,\n
- omit_simulation = 1,\n
- omit_output = 1,\n
- **get_inventory_kw )\n
- values[\'credit_movement\'] = - getInventory( node_uid = node_uid,\n
- from_date = from_date,\n
- at_date = at_date,\n
- simulation_state = simulation_state,\n
- omit_simulation = 1,\n
- omit_input = 1,\n
- **get_inventory_kw )\n
+ get_inventory_kw[\'section_portal_type_list\'] = [\'Organisation\']\n
+ get_inventory_kw[\'simulation_state\'] = simulation_state\n
+ get_inventory_kw[\'omit_simulation\'] = True\n
+\n
+ if node_uid != 0:\n
+ get_inventory_kw[\'node_uid\'] = node_uid\n
+\n
+ # Use custom SQL query to get Bank Account Balance (because standard getInventory doesn\'t work)\n
+ if kw.has_key(\'bank_account_alt\') and kw[\'bank_account_alt\']:\n
+ # Adapt parameters for the custom zSQLMethod\n
+ new_kw = { \'transaction_simulation_state\': get_inventory_kw[\'simulation_state\']\n
+ , \'getParentUid\' : organisation_list[0].getUid()\n
+ , \'getUid\' : get_inventory_kw[\'payment_uid\']\n
+ , \'stat\' : 1\n
+ }\n
+ del get_inventory_kw[\'node_uid\']\n
+ del get_inventory_kw[\'simulation_state\']\n
+ get_inventory_kw.update(new_kw)\n
+\n
+ # Helpfull method to get the balance\n
+ def getBalance(**kw):\n
+ result = context.BankAccount_zGetAccountingTransactionList(**kw)\n
+ row = result[0]\n
+ if getattr(row, \'quantity\', None):\n
+ amount = row.quantity\n
+ else:\n
+ amount = 0.0\n
+ # Round the result to avoid float bad precision\n
+ return context.Base_getRoundValue(amount, precision)\n
+\n
+ values[\'opening_balance\'] = getBalance( to_date = from_date\n
+ , **get_inventory_kw\n
+ )\n
+ values[\'debit_movement\'] = getBalance( from_date = from_date\n
+ , at_date = at_date\n
+ , omit_input = True\n
+ , **get_inventory_kw\n
+ )\n
+ values[\'credit_movement\'] = - getBalance( from_date = from_date\n
+ , at_date = at_date\n
+ , omit_output = True\n
+ , **get_inventory_kw\n
+ )\n
+ else:\n
+ # Use standard methods\n
+ values[\'opening_balance\'] = getInventory( to_date = from_date\n
+ , **get_inventory_kw\n
+ )\n
+ values[\'debit_movement\'] = getInventory( from_date = from_date\n
+ , at_date = at_date\n
+ , omit_output = True\n
+ , **get_inventory_kw\n
+ )\n
+ values[\'credit_movement\'] = - getInventory( from_date = from_date\n
+ , at_date = at_date\n
+ , omit_input = True\n
+ , **get_inventory_kw\n
+ )\n
+\n
+ # Calculate the closing balance\n
values[\'closing_balance\'] = values[\'opening_balance\'] + \\\n
values[\'debit_movement\'] - \\\n
values[\'credit_movement\']\n
return values\n
\n
-def expandBankAccountsForAccount(account, **kw) :\n
- tmp_accounts = []\n
+\n
+def expandBankAccountsForAccount(account, **kw):\n
+ tmp_accounts = []\n
orga_and_banks = []\n
- for orga in organisation_list :\n
- orga_and_banks += [(orga, o.getObject()) for o in \\\n
- orga.searchFolder(portal_type=context.getPortalPaymentNodeTypeList())]\n
- for orga ,bank in orga_and_banks :\n
+ for orga in organisation_list:\n
+ orga_and_banks += [(orga, o.getObject()) for o in orga.searchFolder(portal_type=context.getPortalPaymentNodeTypeList())]\n
+\n
+ for orga, bank in orga_and_banks:\n
this_tmp_account = {\n
\'uid\' : account.getUid(),\n
\'id\' : \'%s-%s-%s\' % ( account.getGapId(),\n
@@ -187,15 +232,17 @@
orga.getTitle(), bank.getTitle()),\n
}\n
this_tmp_account.update(\n
- getDefaultColumnValues( node_uid = account.getUid(),\n
- payment_uid = bank.getUid() ) )\n
+ getDefaultColumnValues( node_uid = account.getUid()\n
+ , payment_uid = bank.getUid()\n
+ , bank_account_alt = 1\n
+ ))\n
if ( this_tmp_account[\'opening_balance\'] != 0 or\n
- this_tmp_account[\'credit_movement\'] != 0 or \n
- this_tmp_account[\'debit_movement\'] != 0 or\n
+ this_tmp_account[\'credit_movement\'] != 0 or\n
+ this_tmp_account[\'debit_movement\'] != 0 or\n
this_tmp_account[\'closing_balance\'] != 0 ) :\n
- tmp_accounts.append( account.asContext(\n
- **formatValues(this_tmp_account) ) )\n
+ tmp_accounts.append( account.asContext(**formatValues(this_tmp_account) ) )\n
return tmp_accounts\n
+\n
\n
def expandThirdPartiesForAccount(account, **kw) :\n
tmp_accounts = []\n
@@ -205,38 +252,27 @@
at_date = at_date,\n
simulation_state = simulation_state)]\n
for entity in entities :\n
- this_tmp_account = {\n
- \'uid\' : account.getUid(),\n
- \'id\' : \'%s-%s\'%(account.getGapId(),\n
- entity.getTitle().decode(\'utf8\')[:12].upper()),\n
- \'title\' : \'%s (%s)\'%(account.getTitle(),\n
- entity.getTitle()),\n
- }\n
+ this_tmp_account = { \'uid\' : account.getUid()\n
+ , \'id\' : \'%s-%s\' % ( account.getGapId()\n
+ , entity.getTitle().decode(\'utf8\')[:12].upper()\n
+ )\n
+ , \'title\': \'%s (%s)\' % ( account.getTitle()\n
+ , entity.getTitle()\n
+ )\n
+ }\n
this_tmp_account.update(\n
getDefaultColumnValues( node_uid = account.getUid(),\n
mirror_section_uid = entity.getUid() ) )\n
if ( this_tmp_account[\'opening_balance\'] != 0 or\n
- this_tmp_account[\'credit_movement\'] != 0 or \n
- this_tmp_account[\'debit_movement\'] != 0 ) :\n
+ this_tmp_account[\'credit_movement\'] != 0 or\n
+ this_tmp_account[\'debit_movement\'] != 0 ):\n
tmp_accounts.append( account.asContext(\n
**formatValues(this_tmp_account) ) )\n
return tmp_accounts\n
\n
-accounts = [ o.getObject() for o in \n
+accounts = [ o.getObject() for o in\n
context.account_module.objectValues(portal_type=\'Account\') ]\n
accounts = filter(lambda account: account.getGapId() is not None, accounts )\n
-\n
-def gap_sort_func(a, b) :\n
- """ simple function to sort accounts. """\n
- a_gap = a.Account_getGapId()\n
- b_gap = b.Account_getGapId()\n
- while len(a_gap) < 7 :\n
- a_gap += \'0\'\n
- while len(b_gap) < 7 :\n
- b_gap += \'0\'\n
- return cmp(a_gap, b_gap)\n
-\n
-accounts.sort(gap_sort_func)\n
\n
accounts_to_expand_by_third_parties = context.portal_categories\\\n
.account_type.asset.receivable.getAccountTypeRelatedValueList(\n
@@ -258,63 +294,144 @@
for account in accounts_to_expand_by_bank_accounts :\n
accounts_to_expand_by_bank_accounts_dict[account.getId()] = 1\n
\n
+\n
+### Get virtual intermediate accounts merged with real accounts\n
+account_dict = {}\n
+for account in accounts:\n
+ gap_path = account.getGap()\n
+ # Add the current account\n
+ account_list = account_dict.has_key(gap_path) and account_dict[gap_path] or []\n
+ account_dict[gap_path] = account_list + [account]\n
+ # Add all parent accounts\n
+ if show_parent_accounts:\n
+ gap_path_item = gap_path.split(\'/\')\n
+ for i in range(len(gap_path_item)):\n
+ parent_path_item = gap_path_item[:-i]\n
+ # Don\'t care of "/fr/pcg" path\n
+ if len(parent_path_item) > 2:\n
+ parent_gap_path = "gap/" + \'/\'.join(parent_path_item)\n
+ parent_gap = context.portal_categories.resolveCategory(parent_gap_path)\n
+ account_list = account_dict.has_key(parent_gap_path) and account_dict[parent_gap_path] or []\n
+ if parent_gap not in account_list:\n
+ account_dict[parent_gap_path] = account_list + [parent_gap]\n
+\n
+## Sort accounts\n
+def gap_sort_func(a, b):\n
+ """\n
+ Simple function to sort accounts.\n
+ """\n
+ a_gap_id = a[\'gap\'].split(\'/\')[-1]\n
+ b_gap_id = b[\'gap\'].split(\'/\')[-1]\n
+ a_gap = a_gap_id\n
+ b_gap = b_gap_id\n
+ while len(a_gap) < 7: a_gap += \'0\'\n
+ while len(b_gap) < 7: b_gap += \'0\'\n
+ if a_gap < b_gap:\n
+ return -1\n
+ elif a_gap > b_gap:\n
+ return 1\n
+ # gap string are the same, sort by gap integer\n
+ else: # a_gap == b_gap\n
+ a_gap_id = int(a_gap_id)\n
+ b_gap_id = int(b_gap_id)\n
+ if a_gap_id < b_gap_id:\n
+ return -1\n
+ elif a_gap_id > b_gap_id:\n
+ return 1\n
+ else:\n
+ # gap are the same, sort by portal type\n
+ a_type = a[\'account\'].getPortalType()\n
+ b_type = b[\'account\'].getPortalType()\n
+ if a_type == b_type:\n
+ return 0\n
+ elif a_type == "Account":\n
+ return 1\n
+ elif b_type == "Account":\n
+ return -1\n
+\n
+# Sorted the account list by gap\n
+account_list = []\n
+for (gap_path, accounts) in account_dict.items():\n
+ for account in accounts:\n
+ account_list.append({ \'gap\' : gap_path\n
+ , \'account\': account\n
+ })\n
+account_list.sort(gap_sort_func)\n
+\n
+## Generate all report items\n
report_items = []\n
results = []\n
-for account in accounts :\n
- if expand_accounts and account.getId() \\\n
- in accounts_to_expand_by_third_parties_dict :\n
- # get all organisations with this account\n
- # and create a "virtual-Account" for each organisation\n
- virtual_accounts = expandThirdPartiesForAccount(account, **kw)\n
- report_items += virtual_accounts\n
- if display_summary_account_line or not len(virtual_accounts) :\n
- # then display the aggregate account\n
- item = { \'title\': account.getTitle(), }\n
- item.update( getDefaultColumnValues( node_uid = account.getUid() ) )\n
-\n
- # provide a clearly different display when it is a summary account \n
- # (TODO: it should be in itallic ?).\n
- if len(virtual_accounts) :\n
- item[\'id\'] = " %s **TOTAL**" % account.getGapId()\n
- else :\n
- item[\'id\'] = account.getGapId()\n
- item[\'closing_balance\'] = item[\'opening_balance\'] + \\\n
- item[\'debit_movement\'] - \\\n
- item[\'credit_movement\']\n
-\n
- report_items.append( account.asContext( **formatValues(item) ) )\n
-\n
- elif expand_accounts and account.getId()\\\n
- in accounts_to_expand_by_bank_accounts_dict :\n
- virtual_accounts = expandBankAccountsForAccount(account, **kw)\n
- report_items += virtual_accounts\n
- if display_summary_account_line or not len(virtual_accounts) :\n
- # then display the aggregate account\n
- item = { \'title\': account.getTitle(), }\n
- item.update( getDefaultColumnValues( node_uid = account.getUid() ) )\n
-\n
- # provide a clearly different display when it is a summary account \n
- # (TODO: it should be in itallic ?).\n
- if len(virtual_accounts) :\n
- item[\'id\'] = " %s **TOTAL**" % account.getGapId()\n
- else :\n
- item[\'id\'] = account.getGapId()\n
- item[\'closing_balance\'] = item[\'opening_balance\'] + \\\n
- item[\'debit_movement\'] - \\\n
- item[\'credit_movement\']\n
-\n
- report_items.append(account.asContext(**formatValues(item)))\n
- else :\n
- item = { \'id\' : account.getGapId(),\n
- \'title\': account.getTitle(), }\n
- item.update( getDefaultColumnValues( node_uid = account.getUid() ) )\n
+\n
+for account_dict in account_list:\n
+\n
+ account_gap = account_dict[\'gap\']\n
+ account = account_dict[\'account\']\n
+ account_type = account.getPortalType()\n
+\n
+ # Handle intermediate non-existent account\n
+ if account_type == "Category":\n
+ # provide a clearly different display when it is a summary account\n
+ # (TODO: it should be in itallic ?).\n
+ item = { \'id\' : "%s **" % account.getId()\n
+ , \'title\': account.getTitle()\n
+ }\n
+ item.update(getDefaultColumnValues(node_category = account_gap))\n
if ( item[\'opening_balance\'] != 0 or\n
item[\'credit_movement\'] != 0 or\n
- item[\'debit_movement\'] != 0 ) :\n
+ item[\'debit_movement\'] != 0 ):\n
report_items.append( account.asContext( **formatValues(item) ) )\n
\n
+ # Handle real Account Objects\n
+ else:\n
+ if expand_accounts and account.getId() in accounts_to_expand_by_third_parties_dict:\n
+ # get all organisations with this account\n
+ # and create a "virtual-Account" for each organisation\n
+ virtual_accounts = expandThirdPartiesForAccount(account, **kw)\n
+ report_items += virtual_accounts\n
+ if display_summary_account_line or not len(virtual_accounts) :\n
+ # then display the aggregate account\n
+ item = { \'title\': account.getTitle(), }\n
+ item.update( getDefaultColumnValues( node_uid = account.getUid() ) )\n
+ # provide a clearly different display when it is a summary account\n
+ # (TODO: it should be in itallic ?).\n
+ if len(virtual_accounts) :\n
+ item[\'id\'] = "%s ** (total)" % account.getGapId()\n
+ else :\n
+ item[\'id\'] = account.getGapId()\n
+ item[\'closing_balance\'] = item[\'opening_balance\'] + \\\n
+ item[\'debit_movement\'] - \\\n
+ item[\'credit_movement\']\n
+ report_items.append( account.asContext( **formatValues(item) ) )\n
+\n
+ elif expand_accounts and account.getId() in accounts_to_expand_by_bank_accounts_dict:\n
+ virtual_accounts = expandBankAccountsForAccount(account, **kw)\n
+ report_items += virtual_accounts\n
+ if display_summary_account_line or not len(virtual_accounts):\n
+ # then display the aggregate account\n
+ item = {\'title\': account.getTitle()}\n
+ item.update(getDefaultColumnValues(node_uid = account.getUid()))\n
+ # provide a clearly different display when it is a summary account\n
+ # (TODO: it should be in itallic ?).\n
+ if len(virtual_accounts):\n
+ item[\'id\'] = "%s ** (total)" % account.getGapId()\n
+ else:\n
+ item[\'id\'] = account.getGapId()\n
+ item[\'closing_balance\'] = item[\'opening_balance\'] + \\\n
+ item[\'debit_movement\'] - \\\n
+ item[\'credit_movement\']\n
+ report_items.append(account.asContext(**formatValues(item)))\n
+\n
+ else:\n
+ item = { \'id\' : account.getGapId()\n
+ , \'title\': account.getTitle()\n
+ }\n
+ item.update(getDefaultColumnValues(node_uid = account.getUid()))\n
+ if ( item[\'opening_balance\'] != 0 or\n
+ item[\'credit_movement\'] != 0 or\n
+ item[\'debit_movement\'] != 0 ):\n
+ report_items.append(account.asContext(**formatValues(item)))\n
+\n
return report_items\n
-# vim: syntax=python\n
]]></string> </value>
@@ -337,7 +454,7 @@
</item>
<item>
<key> <string>_params</string> </key>
- <value> <string>selection, **kw</string> </value>
+ <value> <string>src__=0, **kw</string> </value>
</item>
<item>
<key> <string>errors</string> </key>
@@ -363,7 +480,7 @@
<key> <string>co_varnames</string> </key>
<value>
<tuple>
- <string>selection</string>
+ <string>src__</string>
<string>kw</string>
<string>DateTime</string>
<string>math</string>
@@ -371,11 +488,12 @@
<string>_getattr_</string>
<string>from_date</string>
<string>_getitem_</string>
+ <string>at_date</string>
<string>simulation_state</string>
- <string>at_date</string>
+ <string>context</string>
+ <string>precision</string>
<string>extra_kw</string>
<string>section_category</string>
- <string>context</string>
<string>section_object</string>
<string>organisation_list</string>
<string>append</string>
@@ -384,7 +502,9 @@
<string>x</string>
<string>section_uid_list</string>
<string>_write_</string>
+ <string>True</string>
<string>expand_accounts</string>
+ <string>show_parent_accounts</string>
<string>gap_root</string>
<string>getInventory</string>
<string>getInventoryList</string>
@@ -396,18 +516,29 @@
<string>o</string>
<string>accounts</string>
<string>filter</string>
- <string>gap_sort_func</string>
<string>accounts_to_expand_by_third_parties</string>
<string>accounts_to_expand_by_third_parties_dict</string>
<string>account</string>
<string>accounts_to_expand_by_bank_accounts</string>
<string>accounts_to_expand_by_bank_accounts_dict</string>
+ <string>account_dict</string>
+ <string>gap_path</string>
+ <string>account_list</string>
+ <string>gap_path_item</string>
+ <string>range</string>
+ <string>len</string>
+ <string>i</string>
+ <string>parent_path_item</string>
+ <string>parent_gap_path</string>
+ <string>parent_gap</string>
+ <string>gap_sort_func</string>
<string>report_items</string>
<string>results</string>
+ <string>account_gap</string>
+ <string>account_type</string>
+ <string>item</string>
<string>_apply_</string>
<string>virtual_accounts</string>
- <string>len</string>
- <string>item</string>
</tuple>
</value>
</item>
@@ -419,7 +550,9 @@
<item>
<key> <string>func_defaults</string> </key>
<value>
- <none/>
+ <tuple>
+ <int>0</int>
+ </tuple>
</value>
</item>
<item>
More information about the Erp5-report
mailing list