From 6e5c996bf22efb5ff0e32c2f0f36d648c06efc5a Mon Sep 17 00:00:00 2001
From: Yoshinori Okuji <yo@nexedi.com>
Date: Wed, 8 Sep 2004 14:36:29 +0000
Subject: [PATCH] Initial import.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@1734 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 .../AccountModule_getAccountList.py           |  21 ++
 ...untModule_getAccountingTransactionCount.py |  35 +++
 ...countModule_getCreditTransactionListUrl.py |  46 ++++
 .../AccountModule_getCurrencyUrl.py           |  20 ++
 ...ccountModule_getDebitTransactionListUrl.py |  46 ++++
 .../AccountModule_getMirrorAccountUrl.py      |  19 ++
 .../AccountModule_getTransactionListUrl.py    |  45 ++++
 ...ntModule_statAccountingTransactionCount.py |  35 +++
 .../AccountModule_statTotalSourceCredit.py    |  36 +++
 .../AccountModule_statTotalSourceDebit.py     |  40 +++
 .../AccountModule_viewSearchDialog.form       | 227 ++++++++++++++++
 ...tionModule_getAccountingTransactionList.py |  24 ++
 ...nsactionModule_getDestinationSectionUrl.py |  22 ++
 ...untingTransactionModule_getSourceCredit.py |  19 ++
 ...ountingTransactionModule_getSourceDebit.py |  19 ++
 ...ntingTransactionModule_statSourceCredit.py |  17 ++
 ...untingTransactionModule_statSourceDebit.py |  17 ++
 ...ingTransactionModule_viewSearchDialog.form | 255 ++++++++++++++++++
 ...nModule_zGetAccountingTransactionList.zsql |  95 +++++++
 ...ountingTransactionModule_zGetQuantity.zsql | 102 +++++++
 .../Entity_viewAccountingTransactionList.form |  92 +++++++
 .../Entity_zGetAccountingTransactionList.zsql |  90 +++++++
 22 files changed, 1322 insertions(+)
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_getAccountList.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_getAccountingTransactionCount.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_getCreditTransactionListUrl.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_getCurrencyUrl.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_getDebitTransactionListUrl.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_getMirrorAccountUrl.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_getTransactionListUrl.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_statAccountingTransactionCount.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_statTotalSourceCredit.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_statTotalSourceDebit.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountModule_viewSearchDialog.form
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getAccountingTransactionList.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getDestinationSectionUrl.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getSourceCredit.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getSourceDebit.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountingTransactionModule_statSourceCredit.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountingTransactionModule_statSourceDebit.py
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountingTransactionModule_viewSearchDialog.form
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountingTransactionModule_zGetAccountingTransactionList.zsql
 create mode 100755 product/ERP5/skins/erp5_accounting/AccountingTransactionModule_zGetQuantity.zsql
 create mode 100755 product/ERP5/skins/erp5_accounting/Entity_viewAccountingTransactionList.form
 create mode 100755 product/ERP5/skins/erp5_accounting/Entity_zGetAccountingTransactionList.zsql

diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_getAccountList.py b/product/ERP5/skins/erp5_accounting/AccountModule_getAccountList.py
new file mode 100755
index 00000000000..07ccec8f26c
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_getAccountList.py
@@ -0,0 +1,21 @@
+## Script (Python) "AccountModule_getAccountList"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=**kwd
+##title=
+##
+try:
+  currency = kwd['accounting_transaction_line_currency']
+  id = currency.split('/')[-1]
+except:
+  id = ''
+
+if not id:
+  id = '&nbsp;'
+
+kwd['select_expression'] = "'%s' AS accounting_transaction_line_currency" % id
+
+return context.portal_catalog(**kwd)
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_getAccountingTransactionCount.py b/product/ERP5/skins/erp5_accounting/AccountModule_getAccountingTransactionCount.py
new file mode 100755
index 00000000000..a81f9dfe825
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_getAccountingTransactionCount.py
@@ -0,0 +1,35 @@
+## Script (Python) "AccountModule_getAccountingTransactionCount"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain, selection, **kw
+##title=
+##
+params = selection.getParams()
+
+url = params.get('accounting_transaction_line_currency') # XXX This should be called resource
+if url:
+  currency = context.restrictedTraverse(url) # XXX portal_categories.resolveCategory(resource)
+else:
+  currency = None
+
+kwd = {}
+
+if params.get('from_date'): 
+  kwd['from_date'] = params['from_date']
+if params.get('to_date'):
+  kwd['to_date'] = params['to_date']
+if currency is not None:
+  kwd['resource_uid'] = [currency.getUid()]
+kwd['simulation_state'] = params.get('transaction_simulation_state', ('delivered', 'stopped')) # XXX Why not simulation_state ? choice of state should be in ERP5Globals or equiv.
+kwd['section_category'] = params.get('transaction_section_category', 'group/nexedi') # XXX Why not section_category ? also, default value should be defined for now in ERP5Globals and later through ERP5Site method
+
+inventory = context.Resource_zGetInventory(node_uid=context.getUid(), omit_simulation=1,
+                                           **kwd) 
+inventory = inventory[0]
+return str(inventory.stock_uid)
+
+# XXX should be return currency.getInventoryCount(from_date = params.get('from_date'), to_date=params.get('to_date'),  )
+# XXX should be actually return currency.getInventoryCount(**params  )
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_getCreditTransactionListUrl.py b/product/ERP5/skins/erp5_accounting/AccountModule_getCreditTransactionListUrl.py
new file mode 100755
index 00000000000..b1cee75a9dc
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_getCreditTransactionListUrl.py
@@ -0,0 +1,46 @@
+## Script (Python) "AccountModule_getCreditTransactionListUrl"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None, selection=None, **kwd
+##title=
+##
+from ZTUtils import make_query
+
+index = selection.getIndex()
+name = selection.getName()
+object = brain.getObject()
+
+url = object.absolute_url()
+method = 'Account_viewAccountingTransactionList'
+kw = { 'selection_index': str(index),
+       'selection_name' : name, 
+       'reset' : '1', 
+       'omit_output' : '1',
+     }
+
+params = selection.getParams()
+
+try:
+  path = params.get('accounting_transaction_line_currency')
+  if path:
+    currency = context.restrictedTraverse(path)
+  else:
+    currency = None
+except:
+  currency = None
+
+if params.get('from_date'):
+  kw['from_date'] = params['from_date']
+if params.get('to_date'):
+  kw['to_date'] = params['to_date']
+if currency is not None:
+  kw['resource_uid'] = [currency.getUid()]
+if params.get('transaction_simulation_state'):
+  kw['transaction_simulation_state'] = params['transaction_simulation_state']
+if params.get('transaction_section_category'):
+  kw['transaction_section_category'] = params['transaction_section_category']
+
+return url + '/' + method + '?' + make_query(kw)
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_getCurrencyUrl.py b/product/ERP5/skins/erp5_accounting/AccountModule_getCurrencyUrl.py
new file mode 100755
index 00000000000..01dfde18cd9
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_getCurrencyUrl.py
@@ -0,0 +1,20 @@
+## Script (Python) "AccountModule_getCurrencyUrl"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None, selection=None
+##title=
+##
+from ZTUtils import make_query
+
+params = selection.getParams()
+object = context.restrictedTraverse(params['accounting_transaction_line_currency'])
+url = object.absolute_url()
+method = 'view'
+kw = { 
+       'reset' : '1', 
+     }
+
+return url + '/' + method + '?' + make_query(kw)
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_getDebitTransactionListUrl.py b/product/ERP5/skins/erp5_accounting/AccountModule_getDebitTransactionListUrl.py
new file mode 100755
index 00000000000..4648e910285
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_getDebitTransactionListUrl.py
@@ -0,0 +1,46 @@
+## Script (Python) "AccountModule_getDebitTransactionListUrl"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None, selection=None
+##title=
+##
+from ZTUtils import make_query
+
+index = selection.getIndex()
+name = selection.getName()
+object = brain.getObject()
+
+url = object.absolute_url()
+method = 'Account_viewAccountingTransactionList'
+kw = { 'selection_index': str(index),
+       'selection_name' : name, 
+       'reset' : '1', 
+       'omit_input' : '1',
+     }
+
+params = selection.getParams()
+
+try:
+  path = params.get('accounting_transaction_line_currency')
+  if path:
+    currency = context.restrictedTraverse(path)
+  else:
+    currency = None
+except:
+  currency = None
+
+if params.get('from_date'):
+  kw['from_date'] = params['from_date']
+if params.get('to_date'):
+  kw['to_date'] = params['to_date']
+if currency is not None:
+  kw['resource_uid'] = [currency.getUid()]
+if params.get('transaction_simulation_state'):
+  kw['transaction_simulation_state'] = params['transaction_simulation_state']
+if params.get('transaction_section_category'):
+  kw['transaction_section_category'] = params['transaction_section_category']
+
+return url + '/' + method + '?' + make_query(kw)
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_getMirrorAccountUrl.py b/product/ERP5/skins/erp5_accounting/AccountModule_getMirrorAccountUrl.py
new file mode 100755
index 00000000000..8286cff2d97
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_getMirrorAccountUrl.py
@@ -0,0 +1,19 @@
+## Script (Python) "AccountModule_getMirrorAccountUrl"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None, selection=None
+##title=
+##
+index = selection.getIndex()
+name = selection.getName()
+object = brain.getObject()
+object = object.getDestinationValue()
+if object is None:
+  url = None
+else:
+  url = object.absolute_url() + '/view?selection_index=%s&selection_name=%s&reset=1' % (index, name)
+
+return url
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_getTransactionListUrl.py b/product/ERP5/skins/erp5_accounting/AccountModule_getTransactionListUrl.py
new file mode 100755
index 00000000000..30423f1c781
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_getTransactionListUrl.py
@@ -0,0 +1,45 @@
+## Script (Python) "AccountModule_getTransactionListUrl"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None, selection=None, **kwd
+##title=
+##
+from ZTUtils import make_query
+
+index = selection.getIndex()
+name = selection.getName()
+object = brain.getObject()
+
+url = object.absolute_url()
+method = 'Account_viewAccountingTransactionList'
+kw = { 'selection_index': str(index),
+       'selection_name' : name, 
+       'reset' : '1', 
+     }
+
+params = selection.getParams()
+
+try:
+  path = params.get('accounting_transaction_line_currency')
+  if path:
+    currency = context.restrictedTraverse(path)
+  else:
+    currency = None
+except:
+  currency = None
+
+if params.get('from_date'):
+  kw['from_date'] = params['from_date']
+if params.get('to_date'):
+  kw['to_date'] = params['to_date']
+if currency is not None:
+  kw['resource_uid'] = [currency.getUid()]
+if params.get('transaction_simulation_state'):
+  kw['transaction_simulation_state'] = params['transaction_simulation_state']
+if params.get('transaction_section_category'):
+  kw['transaction_section_category'] = params['transaction_section_category']
+
+return url + '/' + method + '?' + make_query(kw)
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_statAccountingTransactionCount.py b/product/ERP5/skins/erp5_accounting/AccountModule_statAccountingTransactionCount.py
new file mode 100755
index 00000000000..1bd00232b14
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_statAccountingTransactionCount.py
@@ -0,0 +1,35 @@
+## Script (Python) "AccountModule_statAccountingTransactionCount"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=**kw
+##title=
+##
+try:
+  url = kw['accounting_transaction_line_currency']
+  if url:
+    currency = context.restrictedTraverse(url)
+  else:
+    currency = None
+except:
+  currency = None
+
+params = {}
+if kw.get('query'):
+  params['query'] = kw['query']
+if kw.get('from_date'):
+  params['from_date'] = kw['from_date']
+if kw.get('to_date'):
+  params['to_date'] = kw['to_date']
+if currency is not None:
+  params['resource_uid'] = [currency.getUid()]
+params['simulation_state'] = kw.get('transaction_simulation_state', ('delivered', 'stopped'))
+params['section_category'] = kw.get('transaction_section_category', 'group/nexedi')
+
+result = context.Resource_zStatInventory(omit_simulation=1,
+                                         **params)
+
+row = result[0]
+return str(row.count or 0.0)
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_statTotalSourceCredit.py b/product/ERP5/skins/erp5_accounting/AccountModule_statTotalSourceCredit.py
new file mode 100755
index 00000000000..341f583a509
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_statTotalSourceCredit.py
@@ -0,0 +1,36 @@
+## Script (Python) "AccountModule_statTotalSourceCredit"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=**kw
+##title=
+##
+try:
+  url = kw['accounting_transaction_line_currency']
+  if url:
+    currency = context.restrictedTraverse(url)
+  else:
+    currency = None
+except:
+  currency = None
+
+params = {}
+if kw.get('where_expression'):
+  params['where_expression'] = kw['where_expression']
+if kw.get('from_date'):
+  params['from_date'] = kw['from_date']
+if kw.get('to_date'):
+  params['to_date'] = kw['to_date']
+if currency is not None:
+  params['resource_uid'] = [currency.getUid()]
+params['simulation_state'] = kw.get('transaction_simulation_state', ('delivered', 'stopped'))
+params['section_category'] = kw.get('transaction_section_category', 'group/nexedi')
+
+result = context.Resource_zStatInventory(omit_simulation=1,
+                                         omit_output=1,
+                                         **params)
+
+row = result[0]
+return '%.02f' % (row.quantity or 0.0)
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_statTotalSourceDebit.py b/product/ERP5/skins/erp5_accounting/AccountModule_statTotalSourceDebit.py
new file mode 100755
index 00000000000..14f548d2922
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_statTotalSourceDebit.py
@@ -0,0 +1,40 @@
+## Script (Python) "AccountModule_statTotalSourceDebit"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=**kw
+##title=
+##
+try:
+  url = kw['accounting_transaction_line_currency']
+  if url:
+    currency = context.restrictedTraverse(url)
+  else:
+    currency = None
+except:
+  currency = None
+
+params = {}
+if kw.get('query'):
+  params['query'] = kw['query']
+if kw.get('from_date'):
+  params['from_date'] = kw['from_date']
+if kw.get('to_date'):
+  params['to_date'] = kw['to_date']
+if currency is not None:
+  params['resource_uid'] = [currency.getUid()]
+params['simulation_state'] = kw.get('transaction_simulation_state', ('delivered', 'stopped'))
+params['section_category'] = kw.get('transaction_section_category', 'group/nexedi')
+
+result = context.Resource_zStatInventory(omit_simulation=1,
+                                         omit_input=1,
+                                         **params)
+
+row = result[0]
+try:
+  quantity = - row.quantity
+except:
+  quantity = 0.0
+return '%.02f' % quantity
diff --git a/product/ERP5/skins/erp5_accounting/AccountModule_viewSearchDialog.form b/product/ERP5/skins/erp5_accounting/AccountModule_viewSearchDialog.form
new file mode 100755
index 00000000000..71efaeae779
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountModule_viewSearchDialog.form
@@ -0,0 +1,227 @@
+<?xml version="1.0"?>
+
+<form>
+  <title>Search</title>
+  <row_length>4</row_length>
+  <name>AccountModule_viewSearchDialog</name>
+  <pt>form_dialog</pt>
+  <action>AccountModule_viewAccountList</action>
+  <update_action></update_action>
+  <method>POST</method>
+  <enctype></enctype>
+  <encoding>UTF-8</encoding>
+  <stored_encoding>UTF-8</stored_encoding>
+  <unicode_mode>false</unicode_mode>
+  <groups>
+    <group>
+      <title>left</title>
+      <fields>
+
+      <field><id>my_id</id> <type>StringField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default>%</default>
+          <description></description>
+          <display_maxwidth></display_maxwidth>
+          <display_width type="int">20</display_width>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <hidden type="int">0</hidden>
+          <max_length></max_length>
+          <required type="int">1</required>
+          <title>Id</title>
+          <truncate type="int">0</truncate>
+          <unicode type="int">0</unicode>
+          <whitespace_preserve type="int">0</whitespace_preserve>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="too_long">Too much input was given.</message>
+        </messages>
+      </field>
+      <field><id>my_title</id> <type>StringField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default>%</default>
+          <description></description>
+          <display_maxwidth></display_maxwidth>
+          <display_width type="int">20</display_width>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <hidden type="int">0</hidden>
+          <max_length></max_length>
+          <required type="int">1</required>
+          <title>Title</title>
+          <truncate type="int">0</truncate>
+          <unicode type="int">0</unicode>
+          <whitespace_preserve type="int">0</whitespace_preserve>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="too_long">Too much input was given.</message>
+        </messages>
+      </field>
+      <field><id>my_transaction_simulation_state</id> <type>MultiListField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default type="list">['stopped', 'delivered']</default>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <extra_item></extra_item>
+          <hidden type="int">0</hidden>
+          <items type="list">[('cancelled', 'cancelled'), ('confirmed', 'confirmed'), ('delivered', 'delivered'), ('draft', 'draft'), ('planned', 'planned'), ('stopped', 'stopped')]</items>
+          <required type="int">0</required>
+          <size type="int">5</size>
+          <title>State</title>
+          <unicode type="int">0</unicode>
+          <view_separator>&lt;br /&gt;</view_separator>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="unknown_selection">You selected an item that was not in the list.</message>
+        </messages>
+      </field>
+      </fields>
+    </group>
+    <group>
+      <title>right</title>
+      <fields>
+
+      <field><id>my_from_date</id> <type>DateTimeField</type>
+        <values>
+          <allow_empty_time type="int">0</allow_empty_time>
+          <alternate_name></alternate_name>
+          <ampm_time_style type="int">0</ampm_time_style>
+          <css_class></css_class>
+          <date_only type="int">1</date_only>
+          <date_separator>/</date_separator>
+          <default_now type="int">0</default_now>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <hidden type="int">0</hidden>
+          <input_order>ymd</input_order>
+          <input_style>text</input_style>
+          <required type="int">0</required>
+          <time_separator>:</time_separator>
+          <title>From</title>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="not_datetime">You did not enter a valid date and time.</message>
+          <message name="datetime_out_of_range">The date and time you entered were out of range.</message>
+        </messages>
+      </field>
+      <field><id>my_to_date</id> <type>DateTimeField</type>
+        <values>
+          <allow_empty_time type="int">0</allow_empty_time>
+          <alternate_name></alternate_name>
+          <ampm_time_style type="int">0</ampm_time_style>
+          <css_class></css_class>
+          <date_only type="int">1</date_only>
+          <date_separator>/</date_separator>
+          <default_now type="int">0</default_now>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <hidden type="int">0</hidden>
+          <input_order>ymd</input_order>
+          <input_style>text</input_style>
+          <required type="int">0</required>
+          <time_separator>:</time_separator>
+          <title>To</title>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="not_datetime">You did not enter a valid date and time.</message>
+          <message name="datetime_out_of_range">The date and time you entered were out of range.</message>
+        </messages>
+      </field>
+      <field><id>my_accounting_transaction_line_currency</id> <type>ListField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default></default>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <extra_item></extra_item>
+          <first_item type="int">0</first_item>
+          <hidden type="int">0</hidden>
+          <items type="list">[]</items>
+          <required type="int">0</required>
+          <size type="int">1</size>
+          <title>Currency</title>
+          <unicode type="int">0</unicode>
+          <whitespace_preserve type="int">0</whitespace_preserve>
+        </values>
+        <tales>
+          <items>python:[['', '']]+map(lambda x:(x.id,'currency/%s' %x.id),here.currency.objectValues())</items>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="unknown_selection">You selected an item that was not in the list.</message>
+        </messages>
+      </field>
+      <field><id>my_transaction_section_category</id> <type>ListField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default></default>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <extra_item></extra_item>
+          <first_item type="int">0</first_item>
+          <hidden type="int">0</hidden>
+          <items type="list">[('Nexedi', 'group/nexedi')]</items>
+          <required type="int">0</required>
+          <size type="int">1</size>
+          <title>Section</title>
+          <unicode type="int">0</unicode>
+          <whitespace_preserve type="int">0</whitespace_preserve>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="unknown_selection">You selected an item that was not in the list.</message>
+        </messages>
+      </field>
+      </fields>
+    </group>
+  </groups>
+</form>
\ No newline at end of file
diff --git a/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getAccountingTransactionList.py b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getAccountingTransactionList.py
new file mode 100755
index 00000000000..821f8c4179f
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getAccountingTransactionList.py
@@ -0,0 +1,24 @@
+## Script (Python) "AccountingTransactionModule_getAccountingTransactionList"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=**params
+##title=
+##
+# XXX workarounds for DTML limitation
+# Because DTML cannot do <dtml-if node or resource or...>
+# If Python is used, it does not check the existence of a variable automatically
+if 'node' not in params:
+  params['node'] = []
+if 'resource' not in params:
+  params['resource'] = []
+if 'from_date' not in params:
+  params['from_date'] = ''
+if 'to_date' not in params:
+  params['to_date'] = ''
+if 'section_category' not in params:
+  params['section_category'] = ''
+
+return context.AccountingTransactionModule_zGetAccountingTransactionList(**params)
diff --git a/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getDestinationSectionUrl.py b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getDestinationSectionUrl.py
new file mode 100755
index 00000000000..165e1ff4fc9
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getDestinationSectionUrl.py
@@ -0,0 +1,22 @@
+## Script (Python) "AccountingTransactionModule_getDestinationSectionUrl"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None, selection=None, **kwd
+##title=
+##
+from ZTUtils import make_query
+
+index = selection.getIndex()
+name = selection.getName()
+object = brain.getObject()
+
+url = object.getDestinationSectionValue().absolute_url()
+method = 'Entity_viewAccountingTransactionList'
+kw = { 
+       'reset' : '1', 
+     }
+
+return url + '/' + method + '?' + make_query(kw)
diff --git a/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getSourceCredit.py b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getSourceCredit.py
new file mode 100755
index 00000000000..3e629a615a5
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getSourceCredit.py
@@ -0,0 +1,19 @@
+## Script (Python) "AccountingTransactionModule_getSourceCredit"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None, selection=None, **kw
+##title=
+##
+params = selection.getParams()
+kw = {}
+kw['section_category'] = params.get('section_category', 'group/nexedi')
+kw['stat'] = 1
+kw['omit_output'] = 1
+kw['transaction'] = context.getUid()
+
+result = context.AccountingTransactionModule_zGetAccountingTransactionList(selection=selection, **kw)
+row = result[0]
+return '%.02f' % (row.quantity or 0.0)
diff --git a/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getSourceDebit.py b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getSourceDebit.py
new file mode 100755
index 00000000000..5d2483849d2
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_getSourceDebit.py
@@ -0,0 +1,19 @@
+## Script (Python) "AccountingTransactionModule_getSourceDebit"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None, selection=None, **kw
+##title=
+##
+params = selection.getParams()
+kw = {}
+kw['section_category'] = params.get('section_category', 'group/nexedi')
+kw['stat'] = 1
+kw['omit_input'] = 1
+kw['transaction'] = context.getUid()
+
+result = context.AccountingTransactionModule_zGetAccountingTransactionList(selection=selection, **kw)
+row = result[0]
+return '%.02f' % (row.quantity and - row.quantity or 0.0)
diff --git a/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_statSourceCredit.py b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_statSourceCredit.py
new file mode 100755
index 00000000000..9285751a63a
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_statSourceCredit.py
@@ -0,0 +1,17 @@
+## Script (Python) "AccountingTransactionModule_statSourceCredit"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=**kw
+##title=
+##
+kw['selection_params'] = kw
+kw['section_category'] = kw.get('section_category', 'group/nexedi')
+kw['stat'] = 1
+kw['omit_output'] = 1
+
+result = context.AccountingTransactionModule_zGetAccountingTransactionList(**kw)
+row = result[0]
+return '%.02f' % (row.quantity or 0.0)
diff --git a/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_statSourceDebit.py b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_statSourceDebit.py
new file mode 100755
index 00000000000..df0026274d5
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_statSourceDebit.py
@@ -0,0 +1,17 @@
+## Script (Python) "AccountingTransactionModule_statSourceDebit"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=**kw
+##title=
+##
+kw['selection_params'] = kw
+kw['section_category'] = kw.get('section_category', 'group/nexedi')
+kw['stat'] = 1
+kw['omit_input'] = 1
+
+result = context.AccountingTransactionModule_zGetAccountingTransactionList(**kw)
+row = result[0]
+return '%.02f' % (row.quantity and - row.quantity or 0.0)
diff --git a/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_viewSearchDialog.form b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_viewSearchDialog.form
new file mode 100755
index 00000000000..7b7a07e9062
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_viewSearchDialog.form
@@ -0,0 +1,255 @@
+<?xml version="1.0"?>
+
+<form>
+  <title>Search</title>
+  <row_length>4</row_length>
+  <name>AccountingTransactionModule_viewSearchDialog</name>
+  <pt>form_dialog</pt>
+  <action>AccountingTransactionModule_viewAccountingTransactionList</action>
+  <update_action></update_action>
+  <method>POST</method>
+  <enctype></enctype>
+  <encoding>UTF-8</encoding>
+  <stored_encoding>UTF-8</stored_encoding>
+  <unicode_mode>false</unicode_mode>
+  <groups>
+    <group>
+      <title>left</title>
+      <fields>
+
+      <field><id>my_id</id> <type>StringField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default>%</default>
+          <description></description>
+          <display_maxwidth></display_maxwidth>
+          <display_width type="int">20</display_width>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <hidden type="int">0</hidden>
+          <max_length></max_length>
+          <required type="int">1</required>
+          <title>Id</title>
+          <truncate type="int">0</truncate>
+          <unicode type="int">0</unicode>
+          <whitespace_preserve type="int">0</whitespace_preserve>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="too_long">Too much input was given.</message>
+        </messages>
+      </field>
+      <field><id>my_Title</id> <type>StringField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default>%</default>
+          <description></description>
+          <display_maxwidth></display_maxwidth>
+          <display_width type="int">20</display_width>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <hidden type="int">0</hidden>
+          <max_length></max_length>
+          <required type="int">1</required>
+          <title>Title</title>
+          <truncate type="int">0</truncate>
+          <unicode type="int">0</unicode>
+          <whitespace_preserve type="int">0</whitespace_preserve>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="too_long">Too much input was given.</message>
+        </messages>
+      </field>
+      <field><id>my_simulation_state</id> <type>MultiListField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default type="list">[]</default>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <extra_item></extra_item>
+          <hidden type="int">0</hidden>
+          <items type="list">[('cancelled', 'cancelled'), ('confirmed', 'confirmed'), ('delivered', 'delivered'), ('draft', 'draft'), ('planned', 'planned'), ('stopped', 'stopped')]</items>
+          <required type="int">0</required>
+          <size type="int">5</size>
+          <title>State</title>
+          <unicode type="int">0</unicode>
+          <view_separator>&lt;br /&gt;</view_separator>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="unknown_selection">You selected an item that was not in the list.</message>
+        </messages>
+      </field>
+      <field><id>my_node</id> <type>MultiListField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default type="list">[]</default>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <extra_item></extra_item>
+          <hidden type="int">0</hidden>
+          <items type="list">[]</items>
+          <required type="int">0</required>
+          <size type="int">5</size>
+          <title>Account</title>
+          <unicode type="int">0</unicode>
+          <view_separator>&lt;br /&gt;</view_separator>
+        </values>
+        <tales>
+          <items>python: here.InvoiceTransactionLine_getSourceItemList()</items>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="unknown_selection">You selected an item that was not in the list.</message>
+        </messages>
+      </field>
+      </fields>
+    </group>
+    <group>
+      <title>right</title>
+      <fields>
+
+      <field><id>my_from_date</id> <type>DateTimeField</type>
+        <values>
+          <allow_empty_time type="int">0</allow_empty_time>
+          <alternate_name></alternate_name>
+          <ampm_time_style type="int">0</ampm_time_style>
+          <css_class></css_class>
+          <date_only type="int">1</date_only>
+          <date_separator>/</date_separator>
+          <default_now type="int">0</default_now>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <hidden type="int">0</hidden>
+          <input_order>ymd</input_order>
+          <input_style>text</input_style>
+          <required type="int">0</required>
+          <time_separator>:</time_separator>
+          <title>From</title>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="not_datetime">You did not enter a valid date and time.</message>
+          <message name="datetime_out_of_range">The date and time you entered were out of range.</message>
+        </messages>
+      </field>
+      <field><id>my_to_date</id> <type>DateTimeField</type>
+        <values>
+          <allow_empty_time type="int">0</allow_empty_time>
+          <alternate_name></alternate_name>
+          <ampm_time_style type="int">0</ampm_time_style>
+          <css_class></css_class>
+          <date_only type="int">1</date_only>
+          <date_separator>/</date_separator>
+          <default_now type="int">0</default_now>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <hidden type="int">0</hidden>
+          <input_order>ymd</input_order>
+          <input_style>text</input_style>
+          <required type="int">0</required>
+          <time_separator>:</time_separator>
+          <title>To</title>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="not_datetime">You did not enter a valid date and time.</message>
+          <message name="datetime_out_of_range">The date and time you entered were out of range.</message>
+        </messages>
+      </field>
+      <field><id>my_resource</id> <type>ListField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default></default>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <extra_item></extra_item>
+          <first_item type="int">0</first_item>
+          <hidden type="int">0</hidden>
+          <items type="list">[]</items>
+          <required type="int">0</required>
+          <size type="int">1</size>
+          <title>Currency</title>
+          <unicode type="int">0</unicode>
+          <whitespace_preserve type="int">0</whitespace_preserve>
+        </values>
+        <tales>
+          <items>python:[['', '']]+map(lambda x:(x.id,'currency/%s' %x.id),here.currency.objectValues())</items>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="unknown_selection">You selected an item that was not in the list.</message>
+        </messages>
+      </field>
+      <field><id>my_section_category</id> <type>ListField</type>
+        <values>
+          <alternate_name></alternate_name>
+          <css_class></css_class>
+          <default></default>
+          <description></description>
+          <editable type="int">1</editable>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <extra></extra>
+          <extra_item></extra_item>
+          <first_item type="int">0</first_item>
+          <hidden type="int">0</hidden>
+          <items type="list">[('Nexedi', 'group/nexedi')]</items>
+          <required type="int">0</required>
+          <size type="int">1</size>
+          <title>Section</title>
+          <unicode type="int">0</unicode>
+          <whitespace_preserve type="int">0</whitespace_preserve>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+          <message name="required_not_found">Input is required but no input given.</message>
+          <message name="unknown_selection">You selected an item that was not in the list.</message>
+        </messages>
+      </field>
+      </fields>
+    </group>
+  </groups>
+</form>
\ No newline at end of file
diff --git a/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_zGetAccountingTransactionList.zsql b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_zGetAccountingTransactionList.zsql
new file mode 100755
index 00000000000..41056a9479f
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_zGetAccountingTransactionList.zsql
@@ -0,0 +1,95 @@
+<dtml-comment>
+title:
+connection_id:MySQL
+max_rows:1000
+max_cache:100
+cache_time:0
+class_name:ZSQLBrain
+class_file:zsqlbrain.py
+</dtml-comment>
+<params>selection=""
+selection_params=""
+selection_domain
+selection_report
+select_expression
+from_date=""
+to_date=""
+node=""
+resource=""
+entity=""
+stat=""
+omit_input
+omit_output
+transaction=""
+section_category=""</params>
+<dtml-let params="selection and selection.getParams() or selection_params">
+<dtml-let allowed_roles_and_users="portal_catalog.getAllowedRolesAndUsers(**params)">
+
+<dtml-comment>do something to have a query without RolesAndUsers security for global stats</dtml-comment>
+<dtml-let query="(stat and not transaction) and portal_catalog.buildSQLQuery(**params) or portal_catalog.buildSQLQuery(allowedRolesAndUsers=allowed_roles_and_users, **params)">
+
+<dtml-comment>do something to prevent having entity and section_category set at the same time</dtml-comment>
+<dtml-let section_category="not entity and section_category or ''">
+
+SELECT
+  <dtml-if stat>
+    SUM(stock.quantity) AS quantity
+  <dtml-else>
+    DISTINCT
+    <dtml-in "portal_catalog.getCatalogSearchResultKeys()"> <dtml-var sequence-item> <dtml-unless sequence-end>,</dtml-unless> </dtml-in>
+    <dtml-if select_expression>, <dtml-var select_expression> </dtml-if>
+  </dtml-if>
+
+FROM
+  <dtml-var "','.join(query['from_table_list'])">
+  <dtml-if selection_domain>, <dtml-var "selection_domain.asSqlJoinExpression()"> </dtml-if>
+  <dtml-if selection_report>, <dtml-var "selection_report.asSqlJoinExpression()"> </dtml-if>
+
+  <dtml-if "from_date or to_date or node or resource or entity or stat or section_category">, catalog AS child </dtml-if>
+  <dtml-if "from_date or to_date or node or resource or stat">, movement </dtml-if>
+  <dtml-if "entity or stat or section_category">, stock </dtml-if>
+  <dtml-if node>, catalog AS source_account </dtml-if>
+  <dtml-if resource>, catalog AS currency </dtml-if>
+  <dtml-if entity>, catalog AS related_entity </dtml-if>
+  <dtml-if section_category>, category, catalog AS section_c </dtml-if>
+
+WHERE
+  1 = 1
+  <dtml-in "query['from_table_list']"><dtml-if "_['sequence-item']=='roles_and_users'">AND catalog.security_uid = <dtml-var sequence-item>.uid <dtml-else> AND catalog.uid = <dtml-var sequence-item>.uid </dtml-if> </dtml-in>
+  <dtml-if "query['where_expression']">
+    AND <dtml-var "query['where_expression']">
+  </dtml-if>
+  <dtml-if selection_domain>
+    AND <dtml-var "selection_domain.asSqlExpression()">
+  </dtml-if>
+  <dtml-if selection_report>
+    AND <dtml-var "selection_report.asSqlExpression(strict_membership=1)">
+  </dtml-if>
+
+  <dtml-if "from_date or to_date or node or resource or entity or stat or section_category"> AND child.parent_uid = catalog.uid </dtml-if>
+  <dtml-if "from_date or to_date or node or resource or stat"> AND movement.uid = child.uid </dtml-if>
+  <dtml-if "entity or stat or section_category"> AND stock.uid = child.uid </dtml-if>
+  <dtml-if node> AND source_account.uid = movement.source_uid </dtml-if>
+  <dtml-if resource> AND currency.uid = movement.resource_uid </dtml-if>
+  <dtml-if entity> AND related_entity.uid = stock.section_uid </dtml-if>
+  <dtml-if section_category> AND category.uid = stock.section_uid AND section_c.uid = category.category_uid </dtml-if>
+
+  <dtml-if from_date> AND movement.stop_date >= <dtml-sqlvar from_date type="string"> </dtml-if>
+  <dtml-if to_date> AND movement.stop_date <= <dtml-sqlvar to_date type="string"> </dtml-if>
+  <dtml-if node> AND ( <dtml-in node> <dtml-unless sequence-start>OR</dtml-unless> source_account.relative_url = '<dtml-var sequence-item>' </dtml-in> ) </dtml-if>
+  <dtml-if resource> AND currency.relative_url = '<dtml-var resource>' </dtml-if>
+  <dtml-if entity> AND related_entity.relative_url = '<dtml-var entity>' </dtml-if>
+  <dtml-if stat> AND movement.is_accountable = 1 </dtml-if>
+  <dtml-if omit_input> AND stock.quantity < 0 </dtml-if>
+  <dtml-if omit_output> AND stock.quantity > 0 </dtml-if>
+  <dtml-if transaction> AND catalog.uid = '<dtml-var transaction>' </dtml-if>
+  <dtml-if section_category> AND section_c.relative_url = '<dtml-var section_category>' </dtml-if>
+
+<dtml-if "query['order_by_expression']">
+  ORDER BY <dtml-var "query['order_by_expression']">
+</dtml-if>
+
+</dtml-let>
+</dtml-let>
+</dtml-let>
+</dtml-let>
\ No newline at end of file
diff --git a/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_zGetQuantity.zsql b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_zGetQuantity.zsql
new file mode 100755
index 00000000000..e0d012e9f1b
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/AccountingTransactionModule_zGetQuantity.zsql
@@ -0,0 +1,102 @@
+<dtml-comment>
+title:
+connection_id:MySQL
+max_rows:1000
+max_cache:100
+cache_time:0
+class_name:
+class_file:
+</dtml-comment>
+<params>query
+node:list
+simulation_state:list
+from_date
+to_date
+resource:list
+section_category
+transaction
+omit_input
+omit_output</params>
+SELECT
+  SUM(stock.quantity) AS quantity
+FROM
+  catalog
+  , catalog AS child
+  , movement
+  , stock
+<dtml-if resource>
+  , catalog AS resource
+</dtml-if>
+<dtml-if node>
+  , catalog AS node
+</dtml-if>
+<dtml-if section_category>
+  , catalog AS section_c
+  , catalog AS section_bc
+  , category AS section_membership
+  , catalog AS section
+</dtml-if>
+<dtml-if query>
+  , category
+  , roles_and_users
+  , subject
+</dtml-if>
+WHERE
+  catalog.uid = child.parent_uid
+  AND child.uid = stock.uid
+  AND child.uid = movement.uid
+  AND movement.is_accountable = 1
+<dtml-if transaction>
+  AND catalog.uid = <dtml-sqlvar transaction type="int">
+</dtml-if>
+<dtml-if resource>
+  AND movement.resource_uid = resource.uid
+  AND (
+  <dtml-in resource>
+    resource.relative_url = <dtml-sqlvar sequence-item type="string"><dtml-if sequence-end><dtml-else> OR </dtml-if>
+  </dtml-in>
+  )
+</dtml-if>
+<dtml-if node>
+  AND stock.node_uid = node.uid
+  AND (
+  <dtml-in node>
+    node.relative_url = <dtml-sqlvar sequence-item type="string"><dtml-if sequence-end><dtml-else> OR </dtml-if>
+  </dtml-in>
+  )
+</dtml-if>
+<dtml-if from_date>
+  AND movement.stop_date >= <dtml-sqlvar from_date type="string">
+</dtml-if>
+<dtml-if to_date>
+  AND movement.stop_date < <dtml-sqlvar to_date type="string">
+</dtml-if>
+<dtml-if simulation_state>
+  AND (
+  <dtml-in simulation_state>
+    catalog.simulation_state = <dtml-sqlvar sequence-item type="string"><dtml-if sequence-end><dtml-else> OR </dtml-if>
+  </dtml-in>
+  )
+</dtml-if>
+<dtml-if section_category>
+  AND section.uid = stock.section_uid
+  AND section_c.relative_url = <dtml-sqlvar section_category type="string">
+  AND section_membership.category_uid =  section_c.uid
+  AND section_membership.base_category_uid = section_bc.uid
+  AND section_membership.uid = section.uid
+</dtml-if>
+<dtml-if omit_input>
+  AND stock.quantity < 0
+</dtml-if>
+<dtml-if omit_output>
+  AND stock.quantity > 0
+</dtml-if>
+<dtml-if query>
+  AND catalog.uid = category.uid
+  AND catalog.uid = roles_and_users.uid
+  AND catalog.uid = subject.uid
+  AND <dtml-var query>
+</dtml-if>
+<dtml-if sort_on>
+  ORDER BY <dtml-var sort_on>
+</dtml-if>
\ No newline at end of file
diff --git a/product/ERP5/skins/erp5_accounting/Entity_viewAccountingTransactionList.form b/product/ERP5/skins/erp5_accounting/Entity_viewAccountingTransactionList.form
new file mode 100755
index 00000000000..f27c2d83975
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/Entity_viewAccountingTransactionList.form
@@ -0,0 +1,92 @@
+<?xml version="1.0"?>
+
+<form>
+  <title>Transactions</title>
+  <row_length>4</row_length>
+  <name>Entity_viewAccountingTransactionList</name>
+  <pt>form_view</pt>
+  <action>Base_edit</action>
+  <update_action></update_action>
+  <method>POST</method>
+  <enctype></enctype>
+  <encoding>UTF-8</encoding>
+  <stored_encoding>UTF-8</stored_encoding>
+  <unicode_mode>false</unicode_mode>
+  <groups>
+    <group>
+      <title>left</title>
+      <fields>
+
+      </fields>
+    </group>
+    <group>
+      <title>right</title>
+      <fields>
+
+      </fields>
+    </group>
+    <group>
+      <title>center</title>
+      <fields>
+
+      </fields>
+    </group>
+    <group>
+      <title>bottom</title>
+      <fields>
+
+      <field><id>listbox</id> <type>ListBox</type>
+        <values>
+          <Base_viewSearchResultList type="int">0</Base_viewSearchResultList>
+          <all_columns type="list">[]</all_columns>
+          <all_editable_columns type="list">[]</all_editable_columns>
+          <alternate_name></alternate_name>
+          <columns type="list">[('Title', 'Title'), ('default_source_section_title', 'Section'), ('getStopDate', 'Date'), ('Type', 'Type'), ('reference', 'Invoice Number'), ('simulation_state', 'State'), ('source_debit', 'Debit'), ('source_credit', 'Credit')]</columns>
+          <css_class></css_class>
+          <default></default>
+          <default_params type="list">[]</default_params>
+          <description></description>
+          <domain_root_list type="list">[('portal_categories/group', 'Group'), ('portal_categories/region', 'Region')]</domain_root_list>
+          <domain_tree type="int">0</domain_tree>
+          <editable type="int">1</editable>
+          <editable_columns type="list">[]</editable_columns>
+          <editable_expression></editable_expression>
+          <editable_permission type="list">[]</editable_permission>
+          <editable_role type="list">[]</editable_role>
+          <enabled type="int">1</enabled>
+          <external_validator></external_validator>
+          <global_attributes type="list">[]</global_attributes>
+          <hidden type="int">0</hidden>
+          <lines type="int">25</lines>
+          <list_action>Base_jumpToAccountingTransaction?from_entity=1</list_action>
+          <list_method type="method">Entity_zGetAccountingTransactionList</list_method>
+          <meta_types type="list">[]</meta_types>
+          <not_viewable type="int">0</not_viewable>
+          <portal_types type="list">[('Accounting Transaction', 'Accounting Transaction'), ('Purchase Invoice Transaction', 'Purchase Invoice Transaction'), ('Sale Invoice Transaction', 'Sale Invoice Transaction'), ('Balance Transaction', 'Balance Transaction')]</portal_types>
+          <read_only type="int">0</read_only>
+          <report_root_list type="list">[]</report_root_list>
+          <report_tree type="int">0</report_tree>
+          <search></search>
+          <search_columns type="list">[]</search_columns>
+          <select type="int">0</select>
+          <selection_name>entity_transaction_selection</selection_name>
+          <sort type="list">[]</sort>
+          <sort_columns type="list">[]</sort_columns>
+          <stat_columns type="list">[('source_debit', 'Entity_statSourceDebit'), ('source_credit', 'Entity_statSourceCredit')]</stat_columns>
+          <stat_method></stat_method>
+          <title>Transactions related to this entity</title>
+          <url_columns type="list">[]</url_columns>
+          <viewable_expression></viewable_expression>
+          <viewable_permission type="list">[]</viewable_permission>
+          <viewable_role type="list">[]</viewable_role>
+        </values>
+        <tales>
+        </tales>
+        <messages>
+          <message name="external_validator_failed">The input failed the external validator.</message>
+        </messages>
+      </field>
+      </fields>
+    </group>
+  </groups>
+</form>
\ No newline at end of file
diff --git a/product/ERP5/skins/erp5_accounting/Entity_zGetAccountingTransactionList.zsql b/product/ERP5/skins/erp5_accounting/Entity_zGetAccountingTransactionList.zsql
new file mode 100755
index 00000000000..53277bbc218
--- /dev/null
+++ b/product/ERP5/skins/erp5_accounting/Entity_zGetAccountingTransactionList.zsql
@@ -0,0 +1,90 @@
+<dtml-comment>
+title:
+connection_id:MySQL
+max_rows:1000
+max_cache:100
+cache_time:0
+class_name:ZSQLBrain
+class_file:zsqlbrain.py
+</dtml-comment>
+<params>getUid
+query
+omit_input
+omit_output
+resource_uid:list
+from_date
+to_date
+transaction_simulation_state:list
+transaction_section_category
+node_uid:list
+stat</params>
+<dtml-if getUid>
+SELECT
+<dtml-if stat>
+  SUM(stock.quantity) AS quantity
+<dtml-else>
+  DISTINCT catalog.*
+  , IFNULL(SUM(IF(stock.quantity > 0, stock.quantity, 0)), 0) AS source_credit
+  , IFNULL(SUM(IF(stock.quantity < 0, - stock.quantity, 0)), 0) AS source_debit
+</dtml-if>
+FROM
+  movement
+  , stock
+  , catalog AS child
+  , catalog
+  , catalog AS node
+  , category AS node_category
+<dtml-if query>
+  , category
+</dtml-if>
+WHERE stock.mirror_section_uid = <dtml-var getUid>
+  AND child.uid = stock.uid 
+  AND child.parent_uid = catalog.uid
+  AND movement.uid = stock.uid
+  AND movement.is_accountable = 1
+  AND node.uid = stock.node_uid
+  AND node.uid = node_category.uid
+  AND (node_category.category_uid = <dtml-sqlvar "portal_categories.account_type.asset.receivable.getUid()"  type="int">
+    OR node_category.category_uid = <dtml-sqlvar "portal_categories.account_type.liability.payable.getUid()"  type="int">
+  )
+<dtml-if node_uid>
+  AND (
+  <dtml-in node_uid>
+    stock.node_uid = <dtml-sqlvar sequence-item type="int"><dtml-if sequence-end><dtml-else> OR </dtml-if>
+  </dtml-in>
+  )
+</dtml-if>
+<dtml-if resource_uid>
+  AND (
+  <dtml-in resource_uid>
+    movement.resource_uid = <dtml-sqlvar sequence-item type="int"><dtml-if sequence-end><dtml-else> OR </dtml-if>
+  </dtml-in>
+  )
+</dtml-if>
+<dtml-if from_date>
+  AND movement.stop_date >= <dtml-sqlvar from_date type="string">
+</dtml-if>
+<dtml-if to_date>
+  AND movement.stop_date < <dtml-sqlvar to_date type="string">
+</dtml-if>
+<dtml-if omit_input>
+  AND stock.quantity < 0
+</dtml-if>
+<dtml-if omit_output>
+  AND stock.quantity > 0
+</dtml-if>
+<dtml-if transaction_simulation_state>
+  AND (
+  <dtml-in transaction_simulation_state>
+    catalog.simulation_state = <dtml-sqlvar sequence-item type="string"><dtml-if sequence-end><dtml-else> OR </dtml-if>
+  </dtml-in>
+  )
+</dtml-if>
+<dtml-if query>
+  AND category.uid = stock.section_uid
+AND <dtml-var query>
+</dtml-if>
+<dtml-unless stat>
+GROUP BY catalog.uid
+</dtml-unless>
+</dtml-if>
\ No newline at end of file
-- 
2.30.9