[Erp5-report] r6698 - /erp5/trunk/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_ac...
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Apr 14 23:05:42 CEST 2006
Author: kevin
Date: Fri Apr 14 23:05:36 2006
New Revision: 6698
URL: http://svn.erp5.org?rev=6698&view=rev
Log:
Remove 'transaction_' prefix.
Handle gap_list parameter.
Use the new centralized rounding method.
Use where_expression instead of my hack.
Support multi gap selection.
Better account sorting to support non-integer id (I suppose it is the work of Fabien).
Attempt to include sumarized line of same level accounts are commented.
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=6698&r1=6697&r2=6698&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 Apr 14 23:05:36 2006
@@ -73,52 +73,56 @@
\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
+# 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
+from_date = kw.get(\'from_date\', None)\n
at_date = kw[\'at_date\']\n
-simulation_state = kw[\'transaction_simulation_state\']\n
+simulation_state = kw[\'simulation_state\']\n
\n
# Get Precision\n
precision = context.Base_getPreferredPrecision()\n
-\n
-# extra arguments for getInventory :\n
+r_ = lambda x: context.Base_getRoundValue(x, precision)\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
+# Get a list of section uids\n
+section_category = kw[\'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
-# (payable & receivable with other parties / bank with bank account)\n
-expand_accounts = kw.get("expand_accounts", True)\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["expand_accounts"]\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
+show_parent_accounts = kw["show_parent_accounts"]\n
+\n
+# The gap tree to use\n
+# TODO: Be sure that gap_list and gap_root are consistent (nothing prevent this in the dialog UI)\n
gap_root = kw["gap_root"]\n
-\n
-# inventory methods\n
+gap_list = kw["gap_list"]\n
+\n
+# Inventory methods\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
+# Shall we display a summary line for expanded accounts ?\n
display_summary_account_line = True\n
\n
\n
-def formatValues(dict) :\n
+def formatValues(dict):\n
+ # TODO: use Base_getPreferredPrecision() to centralize code\n
for k, v in dict.items():\n
- if not(same_type(v, "") or same_type(v, u"")) :\n
- if round(v) == 0.00 :\n
+ if not(same_type(v, "") or same_type(v, u"")):\n
+ if r_(v) == 0.00:\n
dict[k] = ""\n
- else :\n
+ else:\n
negative = v < 0\n
if k in (\'opening_balance\', \'closing_balance\') and negative :\n
v = - v\n
@@ -133,36 +137,37 @@
i += 3\n
value = \'%s.%s\'%(value, str(value_list[1])[:2])\n
dict[k] = value\n
- if k in (\'opening_balance\', \'closing_balance\') :\n
+ if k in (\'opening_balance\', \'closing_balance\'):\n
if negative:\n
- dict[k] = \'%s CR\'%(value)\n
- else :\n
- dict[k] = \'%s \'%(value)\n
+ dict[k] = \'%s CR\' % (value)\n
+ else:\n
+ dict[k] = \'%s \' % (value)\n
dict[k]\n
return dict\n
\n
\n
def getDefaultColumnValues(node_uid=0, **kw):\n
"""\n
- returns then opening balance, debit movements sum, credit movements\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
- get_inventory_kw[\'section_portal_type_list\'] = [\'Organisation\']\n
- get_inventory_kw[\'simulation_state\'] = simulation_state\n
- get_inventory_kw[\'omit_simulation\'] = True\n
+ get_inventory_kw[\'where_expression\'] = " section.portal_type = \'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
+ # TODO: use getInventory\n
if kw.has_key(\'bank_account_alt\') and kw[\'bank_account_alt\']:\n
# Adapt parameters for the custom zSQLMethod\n
- new_kw = { \'getParentUid\' : organisation_list[0].getUid()\n
- , \'getUid\' : get_inventory_kw[\'payment_uid\']\n
- , \'stat\' : 1\n
+ new_kw = { \'getParentUid\': organisation_list[0].getUid()\n
+ , \'getUid\' : get_inventory_kw[\'payment_uid\']\n
+ , \'stat\' : True\n
}\n
del get_inventory_kw[\'node_uid\']\n
get_inventory_kw.update(new_kw)\n
@@ -176,7 +181,7 @@
else:\n
amount = 0.0\n
# Round the result to avoid float bad precision\n
- return context.Base_getRoundValue(amount, precision)\n
+ return r_(amount)\n
\n
values[\'opening_balance\'] = getBalance( to_date = from_date\n
, **get_inventory_kw\n
@@ -209,7 +214,7 @@
\n
# Calculate the closing balance\n
values[\'closing_balance\'] = values[\'opening_balance\'] + \\\n
- values[\'debit_movement\'] - \\\n
+ values[\'debit_movement\'] - \\\n
values[\'credit_movement\']\n
return values\n
\n
@@ -222,33 +227,37 @@
\n
for orga, bank in orga_and_banks:\n
this_tmp_account = {\n
- \'uid\' : account.getUid(),\n
- \'id\' : \'%s-%s-%s\' % ( account.getGapId(),\n
- orga.getTitle().decode(\'utf8\')[:8].upper(),\n
- bank.getTitle().decode(\'utf8\')[:8].upper() ),\n
- \'title\' : \'%s (%s / %s)\' % ( account.getTitle(),\n
- orga.getTitle(), bank.getTitle()),\n
- }\n
+ \'uid\' : account.getUid()\n
+ , \'id\' : \'%s-%s-%s\' % ( account.getGapId()\n
+ , orga.getTitle().decode(\'utf8\')[:8].upper()\n
+ , bank.getTitle().decode(\'utf8\')[:8].upper()\n
+ )\n
+ , \'title\': \'%s (%s / %s)\' % ( account.getTitle()\n
+ , orga.getTitle()\n
+ , bank.getTitle()\n
+ )\n
+ }\n
this_tmp_account.update(\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[\'closing_balance\'] != 0 ) :\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[\'closing_balance\'] != 0 ):\n
tmp_accounts.append( account.asContext(**formatValues(this_tmp_account) ) )\n
return tmp_accounts\n
\n
\n
-def expandThirdPartiesForAccount(account, **kw) :\n
+def expandThirdPartiesForAccount(account, **kw):\n
tmp_accounts = []\n
# get all entities that are destination section related to this account.\n
entities = [o.getObject() for o in \\\n
- context.Account_zDistinctSectionList( node_uid = account.getUid(),\n
- at_date = at_date,\n
- simulation_state = simulation_state)]\n
+ context.Account_zDistinctSectionList( node_uid = account.getUid()\n
+ , at_date = at_date\n
+ , simulation_state = simulation_state\n
+ )]\n
for entity in entities :\n
this_tmp_account = { \'uid\' : account.getUid()\n
, \'id\' : \'%s-%s\' % ( account.getGapId()\n
@@ -261,39 +270,53 @@
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
- tmp_accounts.append( account.asContext(\n
- **formatValues(this_tmp_account) ) )\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
+ tmp_accounts.append(account.asContext(**formatValues(this_tmp_account)))\n
return tmp_accounts\n
\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
-accounts_to_expand_by_third_parties = context.portal_categories\\\n
- .account_type.asset.receivable.getAccountTypeRelatedValueList(\n
- portal_type=\'Account\', strict_membership=1) + \\\n
+\n
+### Get the account list composed of real Account object only\n
+# If a list of GAP category was selected, get the account list from that selection and above\n
+accounts = []\n
+if len(gap_list) > 0:\n
+ for gap_cat in gap_list:\n
+ gap_object = context.portal_categories.restrictedTraverse("gap/" + gap_cat)\n
+ # We don\'t need strict membership to let us "dive" into the gap tree\n
+ account_list = gap_object.getGapRelatedValueList( portal_type = \'Account\'\n
+ , strict_membership = False\n
+ )\n
+ for account in account_list:\n
+ if account not in accounts:\n
+ accounts.append(account)\n
+# Get all existing accounts from the account module\n
+else:\n
+ accounts = [ o.getObject() for o in\n
+ context.account_module.objectValues(portal_type=\'Account\') ]\n
+# Delete from the list accounts without a GAP category\n
+accounts = filter(lambda account: account.getGapId() is not None, accounts)\n
+\n
+### Find accounts that can be expanded\n
+asset_cat = context.portal_categories.account_type.asset\n
+accounts_to_expand_by_third_parties = asset_cat.receivable.getAccountTypeRelatedValueList(\n
+ portal_type=\'Account\', strict_membership=True) + \\\n
context.portal_categories.account_type.liability.payable\\\n
.getAccountTypeRelatedValueList(\n
# we use strict_membership because we do not want VAT\n
- portal_type=\'Account\', strict_membership=1)\n
-\n
-# use a dict for faster lookup\n
+ portal_type=\'Account\', strict_membership=True)\n
+# Use a dict for faster lookup\n
accounts_to_expand_by_third_parties_dict = {}\n
-for account in accounts_to_expand_by_third_parties :\n
+for account in accounts_to_expand_by_third_parties:\n
accounts_to_expand_by_third_parties_dict[account.getId()] = 1\n
-\n
-accounts_to_expand_by_bank_accounts = context.portal_categories\\\n
- .account_type.asset.cash.getAccountTypeRelatedValueList(\n
+accounts_to_expand_by_bank_accounts = asset_cat.cash.getAccountTypeRelatedValueList(\n
portal_type=\'Account\')\n
accounts_to_expand_by_bank_accounts_dict = {}\n
-for account in accounts_to_expand_by_bank_accounts :\n
+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
+### Get virtual intermediate accounts and merged them with real accounts\n
account_dict = {}\n
for account in accounts:\n
gap_path = account.getGap()\n
@@ -302,9 +325,20 @@
account_dict[gap_path] = account_list + [account]\n
# Add all parent accounts\n
if show_parent_accounts:\n
+ # MUST BE FIXED:\n
+# # Add a virtual account of the same level if there is more than one real account at this level\n
+# add_current_level = False\n
+# if len(account_dict[gap_path]) > 1:\n
+# add_current_level = True\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
+ # MUST BE FIXED:\n
+# # Keep the current level if necessary\n
+# if add_current_level:\n
+# parent_path_item = gap_path_item[:-i]\n
+# else:\n
+# parent_path_item = gap_path_item\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
@@ -324,18 +358,17 @@
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
+ compare = cmp(a_gap,b_gap)\n
+ if compare != 0 :\n
+ return compare\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
+ try:\n
+ compare = cmp(int(a_gap_id),int(b_gap_id))\n
+ except ValueError:\n
+ compare = cmp(a_gap_id,b_gap_id)\n
+ if compare != 0:\n
+ return compare\n
else:\n
# gap are the same, sort by portal type\n
a_type = a[\'account\'].getPortalType()\n
@@ -347,7 +380,7 @@
elif b_type == "Account":\n
return -1\n
\n
-# Sorted the account list by gap\n
+# Sort the account list by gap\n
account_list = []\n
for (gap_path, accounts) in account_dict.items():\n
for account in accounts:\n
@@ -358,26 +391,27 @@
\n
## Generate all report items\n
report_items = []\n
-results = []\n
+item_list = []\n
+results = []\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
+ item = { \'title\' : account.getTitle()\n
+ , \'opening_balance\': 0\n
+ , \'credit_movement\': 0\n
+ , \'debit_movement\' : 0\n
+ }\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[\'id\'] = "%s **" % account.getId()\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
- report_items.append( account.asContext( **formatValues(item) ) )\n
\n
# Handle real Account Objects\n
else:\n
@@ -388,25 +422,22 @@
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
+ if len(virtual_accounts):\n
item[\'id\'] = "%s ** (total)" % account.getGapId()\n
- else :\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
@@ -417,17 +448,29 @@
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[\'id\'] = account.getGapId()\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
+ 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
+# MUST BE FIXED:\n
+# virtual_account_list = []\n
+# real_account_list = []\n
+# if account_type == "Category":\n
+# item_dict[account_gap] = item_dict[account_gap] + [item]\n
+#\n
+# # Some virtual account are now useless because their childrens where not\n
+# # included in the last report because of null balance.\n
+# for gap_path in item_dict.keys():\n
+# if len(item_dict[gap_path]) > 1:\n
+# report_items.append(account.asContext(**formatValues(item)))\n
+#\n
+# context.log("kev test >", repr( report_items))\n
\n
return report_items\n
@@ -484,12 +527,14 @@
<string>math</string>
<string>LOG</string>
<string>_getattr_</string>
+ <string>None</string>
<string>from_date</string>
<string>_getitem_</string>
<string>at_date</string>
<string>simulation_state</string>
<string>context</string>
<string>precision</string>
+ <string>r_</string>
<string>extra_kw</string>
<string>section_category</string>
<string>section_object</string>
@@ -500,37 +545,43 @@
<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>gap_list</string>
<string>getInventory</string>
<string>getInventoryList</string>
+ <string>True</string>
<string>display_summary_account_line</string>
<string>formatValues</string>
<string>getDefaultColumnValues</string>
<string>expandBankAccountsForAccount</string>
<string>expandThirdPartiesForAccount</string>
+ <string>accounts</string>
+ <string>len</string>
+ <string>gap_cat</string>
+ <string>gap_object</string>
+ <string>False</string>
+ <string>account_list</string>
+ <string>account</string>
<string>o</string>
- <string>accounts</string>
<string>filter</string>
+ <string>asset_cat</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>item_list</string>
<string>results</string>
<string>account_gap</string>
<string>account_type</string>
More information about the Erp5-report
mailing list