From c9cea662b3e4f38fbefb894282694c5baf921855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Calonne?= <aurel@nexedi.com> Date: Tue, 7 Jul 2015 10:36:11 +0200 Subject: [PATCH] invoicing & order report : run it with searchAndActivate to manage big databases --- ...tingTransactionModule_getInvoiceReport.xml | 70 ++++++++ ...nsactionModule_viewInvoiceReportDialog.xml | 10 +- .../your_deferred_style.xml | 90 ---------- .../your_use_selection.xml | 168 ------------------ .../OrderModule_activateGetOrderStatList.xml | 167 +++++++++++++++++ .../OrderModule_filterOrderStatResul.xml | 69 +++++++ .../erp5_trade/OrderModule_getOrderReport.xml | 70 ++++++++ ...rderModule_getOrderReportParameterDict.xml | 159 +++++++++++++++++ .../OrderModule_getOrderReportSectionList.xml | 93 +--------- .../OrderModule_getOrderStatList.xml | 168 ++++++------------ .../OrderModule_launchOrderReport.xml | 128 +++++++++++++ .../OrderModule_processOrderStat.xml | 156 ++++++++++++++++ .../OrderModule_viewOrderReportDialog.xml | 10 +- .../your_deferred_style.xml | 90 ---------- .../your_use_selection.xml | 90 ---------- 15 files changed, 886 insertions(+), 652 deletions(-) create mode 100644 bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_getInvoiceReport.xml delete mode 100644 bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog/your_deferred_style.xml delete mode 100644 bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog/your_use_selection.xml create mode 100644 bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_activateGetOrderStatList.xml create mode 100644 bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_filterOrderStatResul.xml create mode 100644 bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReport.xml create mode 100644 bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReportParameterDict.xml create mode 100644 bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_launchOrderReport.xml create mode 100644 bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_processOrderStat.xml delete mode 100644 bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog/your_deferred_style.xml delete mode 100644 bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog/your_use_selection.xml diff --git a/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_getInvoiceReport.xml b/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_getInvoiceReport.xml new file mode 100644 index 0000000000..cda0f4da71 --- /dev/null +++ b/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_getInvoiceReport.xml @@ -0,0 +1,70 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="PythonScript" module="Products.PythonScripts.PythonScript"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>Script_magic</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary> + <item> + <key> <string>name_container</string> </key> + <value> <string>container</string> </value> + </item> + <item> + <key> <string>name_context</string> </key> + <value> <string>context</string> </value> + </item> + <item> + <key> <string>name_m_self</string> </key> + <value> <string>script</string> </value> + </item> + <item> + <key> <string>name_subpath</string> </key> + <value> <string>traverse_subpath</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_body</string> </key> + <value> <string>return context.OrderModule_launchOrderReport(\n + report_method_id = "AccountingTransactionModule_viewInvoiceReport",\n + *args,\n + **kw)\n +</string> </value> + </item> + <item> + <key> <string>_params</string> </key> + <value> <string>*args, **kw</string> </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>AccountingTransactionModule_getInvoiceReport</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog.xml b/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog.xml index f1ed120484..76535884c0 100644 --- a/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog.xml +++ b/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog.xml @@ -2,7 +2,7 @@ <ZopeData> <record id="1" aka="AAAAAAAAAAE="> <pickle> - <global name="ERP5Form" module="Products.ERP5Form.Form"/> + <global name="ERP5 Form" module="erp5.portal_type"/> </pickle> <pickle> <dictionary> @@ -35,7 +35,7 @@ </item> <item> <key> <string>action</string> </key> - <value> <string>AccountingTransactionModule_viewInvoiceReport</string> </value> + <value> <string>AccountingTransactionModule_getInvoiceReport</string> </value> </item> <item> <key> <string>description</string> </key> @@ -83,7 +83,6 @@ <list> <string>your_portal_skin</string> <string>your_format</string> - <string>your_deferred_style</string> </list> </value> </item> @@ -104,7 +103,6 @@ <string>your_incoterm</string> <string>your_order_report_document_portal_type</string> <string>your_landscape</string> - <string>your_use_selection</string> </list> </value> </item> @@ -157,6 +155,10 @@ <key> <string>update_action</string> </key> <value> <string></string> </value> </item> + <item> + <key> <string>update_action_title</string> </key> + <value> <string></string> </value> + </item> </dictionary> </pickle> </record> diff --git a/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog/your_deferred_style.xml b/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog/your_deferred_style.xml deleted file mode 100644 index 07ae06026f..0000000000 --- a/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog/your_deferred_style.xml +++ /dev/null @@ -1,90 +0,0 @@ -<?xml version="1.0"?> -<ZopeData> - <record id="1" aka="AAAAAAAAAAE="> - <pickle> - <global name="ProxyField" module="Products.ERP5Form.ProxyField"/> - </pickle> - <pickle> - <dictionary> - <item> - <key> <string>delegated_list</string> </key> - <value> - <list/> - </value> - </item> - <item> - <key> <string>id</string> </key> - <value> <string>your_deferred_style</string> </value> - </item> - <item> - <key> <string>message_values</string> </key> - <value> - <dictionary> - <item> - <key> <string>external_validator_failed</string> </key> - <value> <string>The input failed the external validator.</string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>overrides</string> </key> - <value> - <dictionary> - <item> - <key> <string>field_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>form_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>target</string> </key> - <value> <string></string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>tales</string> </key> - <value> - <dictionary> - <item> - <key> <string>field_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>form_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>target</string> </key> - <value> <string></string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>values</string> </key> - <value> - <dictionary> - <item> - <key> <string>field_id</string> </key> - <value> <string>your_deferred_style</string> </value> - </item> - <item> - <key> <string>form_id</string> </key> - <value> <string>Base_viewDialogFieldLibrary</string> </value> - </item> - <item> - <key> <string>target</string> </key> - <value> <string>Click to edit the target</string> </value> - </item> - </dictionary> - </value> - </item> - </dictionary> - </pickle> - </record> -</ZopeData> diff --git a/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog/your_use_selection.xml b/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog/your_use_selection.xml deleted file mode 100644 index 1d2bed0915..0000000000 --- a/bt5/erp5_invoicing/SkinTemplateItem/portal_skins/erp5_invoicing/AccountingTransactionModule_viewInvoiceReportDialog/your_use_selection.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0"?> -<ZopeData> - <record id="1" aka="AAAAAAAAAAE="> - <pickle> - <global name="CheckBoxField" module="Products.Formulator.StandardFields"/> - </pickle> - <pickle> - <dictionary> - <item> - <key> <string>id</string> </key> - <value> <string>your_use_selection</string> </value> - </item> - <item> - <key> <string>message_values</string> </key> - <value> - <dictionary> - <item> - <key> <string>external_validator_failed</string> </key> - <value> <string>The input failed the external validator.</string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>overrides</string> </key> - <value> - <dictionary> - <item> - <key> <string>alternate_name</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>css_class</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>default</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>description</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>editable</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>enabled</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>external_validator</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>extra</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>hidden</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>title</string> </key> - <value> <string></string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>tales</string> </key> - <value> - <dictionary> - <item> - <key> <string>alternate_name</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>css_class</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>default</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>description</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>editable</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>enabled</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>external_validator</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>extra</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>hidden</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>title</string> </key> - <value> <string></string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>values</string> </key> - <value> - <dictionary> - <item> - <key> <string>alternate_name</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>css_class</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>default</string> </key> - <value> <int>0</int> </value> - </item> - <item> - <key> <string>description</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>editable</string> </key> - <value> <int>1</int> </value> - </item> - <item> - <key> <string>enabled</string> </key> - <value> <int>1</int> </value> - </item> - <item> - <key> <string>external_validator</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>extra</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>hidden</string> </key> - <value> <int>0</int> </value> - </item> - <item> - <key> <string>title</string> </key> - <value> <string>Use Current Selection</string> </value> - </item> - </dictionary> - </value> - </item> - </dictionary> - </pickle> - </record> -</ZopeData> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_activateGetOrderStatList.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_activateGetOrderStatList.xml new file mode 100644 index 0000000000..8f95bee10d --- /dev/null +++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_activateGetOrderStatList.xml @@ -0,0 +1,167 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="PythonScript" module="Products.PythonScripts.PythonScript"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>Script_magic</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary> + <item> + <key> <string>name_container</string> </key> + <value> <string>container</string> </value> + </item> + <item> + <key> <string>name_context</string> </key> + <value> <string>context</string> </value> + </item> + <item> + <key> <string>name_m_self</string> </key> + <value> <string>script</string> </value> + </item> + <item> + <key> <string>name_subpath</string> </key> + <value> <string>traverse_subpath</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_body</string> </key> + <value> <string>from Products.ZSQLCatalog.SQLCatalog import Query\n +\n +portal = context.getPortalObject()\n +category_tool = portal.portal_categories\n +\n +request = container.REQUEST\n +from_date = request.get(\'from_date\', None)\n +to_date = request.get(\'at_date\', None)\n +aggregation_level = request.get(\'aggregation_level\', None)\n +report_group_by = request.get(\'group_by\', None)\n +# get all category\n +incoterm = request.get(\'incoterm\', None)\n +section_category = request.get(\'section_category\', None)\n +order = request.get(\'order\', None)\n +delivery_mode = request.get(\'delivery_mode\', None)\n +\n +catalog_params = {}\n +line_params = {"portal_type" : line_portal_type}\n +# get all organisations for the selected section category\n +if section_category:\n + group_uid = category_tool.getCategoryValue(section_category).getUid()\n + organisation_uid_list = [x.uid for x in portal.portal_catalog(\n + portal_type="Organisation",\n + default_group_uid=group_uid)]\n + if report_type == "sale":\n + catalog_params[\'default_source_section_uid\'] = organisation_uid_list or -1\n + line_params["mirror_section_uid"] = organisation_uid_list or -1\n + elif report_type:\n + catalog_params[\'default_destination_section_uid\'] = organisation_uid_list or -1\n + line_params["section_uid"] = organisation_uid_list or -1\n +else:\n + raise ValueError("Section category must be defined for report")\n +# add category params if defined\n +if incoterm not in (\'\', None):\n + incoterm_uid = category_tool.incoterm.restrictedTraverse(incoterm).getUid()\n + catalog_params[\'default_incoterm_uid\'] = incoterm_uid\n +if order not in (\'\', None):\n + order_uid = category_tool.order.restrictedTraverse(order).getUid()\n + catalog_params[\'default_order_uid\'] = order_uid\n +if delivery_mode not in (\'\', None):\n + delivery_mode_uid = category_tool.delivery_mode.restrictedTraverse(delivery_mode).getUid()\n + catalog_params[\'default_delivery_mode_uid\'] = delivery_mode_uid\n +\n +# compute sql params, we group and order by date and portal type\n +if aggregation_level == "year":\n + date_format = "%Y"\n +elif aggregation_level == "month":\n + date_format = "%Y-%m"\n +elif aggregation_level == "week":\n + date_format = "%Y-%U"\n +elif aggregation_level == "day":\n + date_format = "%Y-%m-%d"\n +\n +params = {"delivery.start_date":(from_date, to_date)}\n +query=None\n +if from_date is not None and to_date is not None:\n + params = {"delivery.start_date":(from_date, to_date)}\n + query = Query(range="minngt", **params)\n +elif from_date is not None:\n + params = {"delivery.start_date":from_date}\n + query = Query(range="min", **params)\n +elif to_date is not None:\n + params = {"delivery.start_date":to_date}\n + query = Query(range="ngt", **params)\n +\n +select_params = {"select_list" : [\'source_section_title\', \'destination_section_title\', \n + \'delivery.start_date\']}\n +\n +# sort_on_list = [ (\'delivery.destination_section_uid\', \'ASC\'), (\'delivery.start_date\',\'ASC\')]\n +\n +active_process_value = portal.portal_activities.newContent(\n + portal_type=\'Active Process\',)\n +catalog_params.update(select_params)\n +portal.portal_catalog.activate(tag=tag).searchAndActivate(\n + method_id="OrderModule_processOrderStat",\n + method_kw = {\'active_process\' : active_process_value.getPath(), \n + \'line_params\' : line_params, \n + \'date_format\' : date_format,\n + \'report_type\' : report_type,\n + \'report_group_by\' : report_group_by},\n + select_method_id = \'OrderModule_filterOrderStatResul\',\n + activate_kw = {\'priority\' : 7,\n + \'tag\' : tag,\n + },\n + # All SQL Params\n + query=query,\n + portal_type=doc_portal_type,\n + simulation_state=simulation_state,\n + packet_size=1000,\n + **catalog_params\n + )\n + \n +return active_process_value\n +</string> </value> + </item> + <item> + <key> <string>_params</string> </key> + <value> <string>tag, period_list, report_type, doc_portal_type, line_portal_type, simulation_state,**kw</string> </value> + </item> + <item> + <key> <string>_proxy_roles</string> </key> + <value> + <tuple> + <string>Manager</string> + </tuple> + </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>OrderModule_activateGetOrderStatList</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_filterOrderStatResul.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_filterOrderStatResul.xml new file mode 100644 index 0000000000..e8baf86b46 --- /dev/null +++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_filterOrderStatResul.xml @@ -0,0 +1,69 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="PythonScript" module="Products.PythonScripts.PythonScript"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>Script_magic</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary> + <item> + <key> <string>name_container</string> </key> + <value> <string>container</string> </value> + </item> + <item> + <key> <string>name_context</string> </key> + <value> <string>context</string> </value> + </item> + <item> + <key> <string>name_m_self</string> </key> + <value> <string>script</string> </value> + </item> + <item> + <key> <string>name_subpath</string> </key> + <value> <string>traverse_subpath</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_body</string> </key> + <value> <string>return [{\'uid\' : x.uid, \'start_date\' : x.start_date, \n + \'source_section_title\' : x.source_section_title, \n + \'destination_section_title\' : x.destination_section_title} for x in row_list]\n +</string> </value> + </item> + <item> + <key> <string>_params</string> </key> + <value> <string>row_list</string> </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>OrderModule_filterOrderStatResul</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReport.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReport.xml new file mode 100644 index 0000000000..2d107cb273 --- /dev/null +++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReport.xml @@ -0,0 +1,70 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="PythonScript" module="Products.PythonScripts.PythonScript"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>Script_magic</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary> + <item> + <key> <string>name_container</string> </key> + <value> <string>container</string> </value> + </item> + <item> + <key> <string>name_context</string> </key> + <value> <string>context</string> </value> + </item> + <item> + <key> <string>name_m_self</string> </key> + <value> <string>script</string> </value> + </item> + <item> + <key> <string>name_subpath</string> </key> + <value> <string>traverse_subpath</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_body</string> </key> + <value> <string>return context.OrderModule_launchOrderReport(\n + report_method_id = "OrderModule_viewOrderReport",\n + *args,\n + **kw)\n +</string> </value> + </item> + <item> + <key> <string>_params</string> </key> + <value> <string>*args, **kw</string> </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>OrderModule_getOrderReport</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReportParameterDict.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReportParameterDict.xml new file mode 100644 index 0000000000..8eb200eef4 --- /dev/null +++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReportParameterDict.xml @@ -0,0 +1,159 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="PythonScript" module="Products.PythonScripts.PythonScript"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>Script_magic</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary> + <item> + <key> <string>name_container</string> </key> + <value> <string>container</string> </value> + </item> + <item> + <key> <string>name_context</string> </key> + <value> <string>context</string> </value> + </item> + <item> + <key> <string>name_m_self</string> </key> + <value> <string>script</string> </value> + </item> + <item> + <key> <string>name_subpath</string> </key> + <value> <string>traverse_subpath</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_body</string> </key> + <value> <string>from Products.ERP5Type.DateUtils import getIntervalListBetweenDates\n +from DateTime import DateTime\n +\n +request = container.REQUEST\n +# list only if user has a login defined\n +aggregation_level = request.get(\'aggregation_level\')\n +from_date = request.get(\'from_date\')\n +to_date = request.get(\'at_date\')\n +group_by = request.get(\'group_by\')\n +simulation_state = request.get(\'simulation_state\', ())\n +\n +# define some parameter dependings on module\n +if "Sale" in context.getPortalType():\n + report_type = "sale"\n + line_portal_type = "Sale Order Line"\n + doc_portal_type = "Sale Order"\n +elif "Purchase" in context.getPortalType():\n + report_type = "purchase"\n + line_portal_type = "Purchase Order Line"\n + doc_portal_type = "Purchase Order"\n +elif request.get(\'order_report_document_portal_type\'):\n + doc_portal_type = request.get(\'order_report_document_portal_type\')\n + if doc_portal_type == \'Purchase Invoice Transaction\':\n + line_portal_type = \'Invoice Line\'\n + report_type = \'purchase\'\n + elif doc_portal_type == \'Sale Invoice Transaction\':\n + line_portal_type = \'Invoice Line\'\n + report_type = \'sale\'\n + else:\n + raise ValueError("unknown document portal type for report %s" % doc_portal_type)\n +else:\n + raise ValueError("unknown type for report")\n +\n +selection_columns = [(\'group_by\', "Group by")]\n +if from_date is None:\n + # get the minimum start date in catalog\n + from Products.ZSQLCatalog.SQLCatalog import Query, NegatedQuery\n + kw = {"delivery.start_date" : None, "key":"DefaultKey"}\n + q = NegatedQuery(Query(**kw))\n + select_expression = "MIN(delivery.start_date)"\n + group_by = "delivery.start_date"\n + from_date = DateTime()\n + result_list = context.portal_catalog(\n + select_expression=select_expression,\n + group_by_expression=group_by,\n + simulation_state=simulation_state,\n + portal_type=doc_portal_type,\n + query=q,\n + limit=1)\n + if result_list:\n + from_date = DateTime(result_list[0][2])\n +\n + \n +# get period list between given date\n +interval_list_dict = getIntervalListBetweenDates(from_date=from_date, to_date=to_date,\n + keys={\'year\':aggregation_level=="year",\n + \'month\':aggregation_level=="month",\n + \'week\' : aggregation_level=="week",\n + \'day\':aggregation_level=="day"})\n +interval_list = interval_list_dict[aggregation_level]\n +\n +# FIXME: translate column names\n +# list columns of the listbox\n +interval_column_list = []\n +if group_by == "client":\n + interval_column_list.extend([("Amount %s" %x,"Amount %s" %x) for x in interval_list])\n + selection_columns = [(\'client\', "Client")]\n + total_column_list = [(\'total amount\', \'Total Amount\'),]\n + stat_columns = [(\'client\', "client")]\n + total_stat_list = [(\'total amount\', \'total amount\'),]\n +else:\n + if group_by == "product":\n + selection_columns = [(\'product\', "Product")]\n + stat_columns = [(\'product\', "product")]\n + else:\n + selection_columns = [(\'client\', "Client"), (\'product\', "Product")]\n + stat_columns = [(\'client\', "client"), (\'product\', "product")]\n + for x in interval_list:\n + interval_column_list.extend([("Amount %s" %x,"Amount %s" %x), ("Quantity %s" %x,"Quantity %s" %x),\n + ("Quantity Unit %s" %x,"Quantity Unit %s" %x)])\n + total_column_list = [(\'total amount\', \'Total Amount\'),(\'total quantity\', \'Total Quantity\')]\n + total_stat_list = [(\'total amount\', \'total amount\'),(\'total quantity\', \'total quantity\')]\n +\n +selection_columns.extend(interval_column_list)\n +selection_columns.extend(total_column_list)\n +\n +params=dict(period_list=interval_list, report_type=report_type,\n + doc_portal_type=doc_portal_type, line_portal_type=line_portal_type,\n + simulation_state=simulation_state)\n + \n +stat_columns = stat_columns + interval_column_list + total_stat_list\n + \n +return params, stat_columns, selection_columns\n +</string> </value> + </item> + <item> + <key> <string>_params</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>OrderModule_getOrderReportParameterDict</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReportSectionList.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReportSectionList.xml index 00f48616a5..9d6afc80a0 100644 --- a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReportSectionList.xml +++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderReportSectionList.xml @@ -51,101 +51,12 @@ <item> <key> <string>_body</string> </key> <value> <string>from Products.ERP5Form.Report import ReportSection\n -from Products.ERP5Type.DateUtils import getIntervalListBetweenDates\n from DateTime import DateTime\n -result=[]\n -\n -request = container.REQUEST\n -# list only if user has a login defined\n -aggregation_level = request.get(\'aggregation_level\')\n -from_date = request.get(\'from_date\')\n -to_date = request.get(\'at_date\')\n -group_by = request.get(\'group_by\')\n -simulation_state = request.get(\'simulation_state\', ())\n -\n -# define some parameter dependings on module\n -if "Sale" in context.getPortalType():\n - report_type = "sale"\n - line_portal_type = "Sale Order Line"\n - doc_portal_type = "Sale Order"\n -elif "Purchase" in context.getPortalType():\n - report_type = "purchase"\n - line_portal_type = "Purchase Order Line"\n - doc_portal_type = "Purchase Order"\n -elif request.get(\'order_report_document_portal_type\'):\n - doc_portal_type = request.get(\'order_report_document_portal_type\')\n - if doc_portal_type == \'Purchase Invoice Transaction\':\n - line_portal_type = \'Invoice Line\'\n - report_type = \'purchase\'\n - elif doc_portal_type == \'Sale Invoice Transaction\':\n - line_portal_type = \'Invoice Line\'\n - report_type = \'sale\'\n - else:\n - raise ValueError, "unknown document portal type for report %s" % doc_portal_type\n -else:\n - raise ValueError, "unknown type for report"\n -\n -selection_columns = [(\'group_by\', "Group by")]\n -if from_date is None:\n - # get the minimum start date in catalog\n - from Products.ZSQLCatalog.SQLCatalog import Query, NegatedQuery\n - kw = {"delivery.start_date" : None, "key":"DefaultKey"}\n - q = NegatedQuery(Query(**kw))\n - select_expression = "MIN(delivery.start_date)"\n - group_by = "delivery.start_date"\n - from_date = DateTime()\n - result_list = context.portal_catalog(\n - select_expression=select_expression,\n - group_by_expression=group_by,\n - simulation_state=simulation_state,\n - portal_type=doc_portal_type,\n - query=q,\n - limit=1)\n - if result_list:\n - from_date = DateTime(result_list[0][2])\n -\n - \n -# get period list between given date\n -interval_list_dict = getIntervalListBetweenDates(from_date=from_date, to_date=to_date,\n - keys={\'year\':aggregation_level=="year",\n - \'month\':aggregation_level=="month",\n - \'week\' : aggregation_level=="week",\n - \'day\':aggregation_level=="day"})\n -interval_list = interval_list_dict[aggregation_level]\n \n -# FIXME: translate column names\n -# list columns of the listbox\n -interval_column_list = []\n -if group_by == "client":\n - interval_column_list.extend([("Amount %s" %x,"Amount %s" %x) for x in interval_list])\n - selection_columns = [(\'client\', "Client")]\n - stat_columns = [(\'client\', "client")]\n - total_column_list = [(\'total amount\', \'Total Amount\'),]\n - total_stat_list = [(\'total amount\', \'total amount\'),]\n -else:\n - if group_by == "product":\n - selection_columns = [(\'product\', "Product")]\n - stat_columns = [(\'product\', "product")]\n - else:\n - selection_columns = [(\'client\', "Client"), (\'product\', "Product")]\n - stat_columns = [(\'client\', "client"), (\'product\', "product")]\n - for x in interval_list:\n - interval_column_list.extend([("Amount %s" %x,"Amount %s" %x), ("Quantity %s" %x,"Quantity %s" %x),\n - ("Quantity Unit %s" %x,"Quantity Unit %s" %x)])\n - total_column_list = [(\'total amount\', \'Total Amount\'),(\'total quantity\', \'Total Quantity\')]\n - total_stat_list = [(\'total amount\', \'total amount\'),(\'total quantity\', \'total quantity\')]\n +params, stat_columns, selection_columns = context.OrderModule_getOrderReportParameterDict()\n \n -selection_columns.extend(interval_column_list)\n -selection_columns.extend(total_column_list)\n -\n -params=dict(period_list=interval_list, report_type=report_type,\n - doc_portal_type=doc_portal_type, line_portal_type=line_portal_type,\n - simulation_state=simulation_state)\n -\n -# stat columns of the listbox\n -stat_columns = stat_columns + interval_column_list + total_stat_list\n context.REQUEST.set(\'stat_columns\', stat_columns)\n -\n +result=[]\n result.append(ReportSection(\n path=context.getPhysicalPath(),\n selection_columns=selection_columns,\n diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderStatList.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderStatList.xml index a6da2f24a7..f5788e0654 100644 --- a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderStatList.xml +++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderStatList.xml @@ -53,132 +53,62 @@ <value> <string encoding="cdata"><![CDATA[ from Products.PythonScripts.standard import Object\n -from Products.ZSQLCatalog.SQLCatalog import Query\n +from json import loads\n \n portal = context.getPortalObject()\n -category_tool = portal.portal_categories\n \n request = container.REQUEST\n -from_date = request.get(\'from_date\', None)\n -to_date = request.get(\'at_date\', None)\n -aggregation_level = request.get(\'aggregation_level\', None)\n report_group_by = request.get(\'group_by\', None)\n -# get all category\n -incoterm = request.get(\'incoterm\', None)\n -section_category = request.get(\'section_category\', None)\n -order = request.get(\'order\', None)\n -delivery_mode = request.get(\'delivery_mode\', None)\n -\n -catalog_params = {}\n -\n -# get all organisations for the selected section category\n -if section_category:\n - group_uid = category_tool.getCategoryValue(section_category).getUid()\n - organisation_uid_list = [x.uid for x in portal.portal_catalog(\n - portal_type="Organisation",\n - default_group_uid=group_uid)]\n - if report_type == "sale":\n - catalog_params[\'default_source_section_uid\'] = organisation_uid_list or -1\n - elif report_type:\n - catalog_params[\'default_destination_section_uid\'] = organisation_uid_list or -1\n -\n -# add category params if defined\n -if incoterm not in (\'\', None):\n - incoterm_uid = category_tool.incoterm.restrictedTraverse(incoterm).getUid()\n - catalog_params[\'default_incoterm_uid\'] = incoterm_uid\n -if order not in (\'\', None):\n - order_uid = category_tool.order.restrictedTraverse(order).getUid()\n - catalog_params[\'default_order_uid\'] = order_uid\n -if delivery_mode not in (\'\', None):\n - delivery_mode_uid = category_tool.delivery_mode.restrictedTraverse(delivery_mode).getUid()\n - catalog_params[\'default_delivery_mode_uid\'] = delivery_mode_uid\n -\n -# compute sql params, we group and order by date and portal type\n -if aggregation_level == "year":\n - date_format = "%Y"\n -elif aggregation_level == "month":\n - date_format = "%Y-%m"\n -elif aggregation_level == "week":\n - date_format = "%Y-%U"\n -elif aggregation_level == "day":\n - date_format = "%Y-%m-%d"\n -\n -params = {"delivery.start_date":(from_date, to_date)}\n -query=None\n -if from_date is not None and to_date is not None:\n - params = {"delivery.start_date":(from_date, to_date)}\n - query = Query(range="minngt", **params)\n -elif from_date is not None:\n - params = {"delivery.start_date":from_date}\n - query = Query(range="min", **params)\n -elif to_date is not None:\n - params = {"delivery.start_date":to_date}\n - query = Query(range="ngt", **params)\n -\n -sort_on_list = [ (\'delivery.destination_section_uid\', \'ASC\'), (\'delivery.start_date\',\'ASC\')]\n -\n -if request.get(\'use_selection\'):\n - selection_name = request[\'selection_name\']\n - result_list = \\\n - context.portal_selections.callSelectionFor(request[\'selection_name\'])\n -else:\n - result_list = context.portal_catalog.searchResults(limit=None,query=query,\n - portal_type=doc_portal_type,\n - simulation_state=simulation_state,\n - sort_on=sort_on_list,\n - **catalog_params)\n +active_process_path = request.get(\'active_process\')\n \n +# We have to sum product_dict and client_dict from the results of active process\n +def _addDict(global_dict, local_dict, only_amount=False):\n + if report_group_by == "both" and not only_amount:\n + # we have client -> product -> period -> amount\n + for local_title, local_product_dict in local_dict.iteritems():\n + product_dict = global_dict.setdefault(local_title, {})\n + for local_product, local_period_dict in local_product_dict.iteritems():\n + period_dict = product_dict.setdefault(local_product, {})\n + for period, local_amount_dict in local_period_dict.iteritems():\n + amount_dict = period_dict.setdefault(period, {\'amount\' : 0, \'quantity\' : 0, \'quantity_unit\' : \'\'})\n + amount_dict[\'amount\'] = amount_dict[\'amount\'] + local_amount_dict[\'amount\']\n + amount_dict[\'quantity\'] = amount_dict[\'quantity\'] + local_amount_dict[\'quantity\']\n + amount_dict[\'quantity_unit\'] = local_amount_dict[\'quantity_unit\']\n + else:\n + # We have client or product -> period -> amount\n + for local_title, local_period_dict in local_dict.iteritems():\n + period_dict = global_dict.setdefault(local_title, {})\n + for period, local_amount_dict in local_period_dict.iteritems():\n + amount_dict = period_dict.setdefault(period, {\'amount\' : 0, \'quantity\' : 0, \'quantity_unit\' : \'\'})\n + amount_dict[\'amount\'] = amount_dict[\'amount\'] + local_amount_dict[\'amount\']\n + if not only_amount:\n + amount_dict[\'quantity\'] = amount_dict[\'quantity\'] + local_amount_dict[\'quantity\']\n + amount_dict[\'quantity_unit\'] = local_amount_dict[\'quantity_unit\']\n \n -# we build two dict, one that store amount per period per client\n -# and another that either store amount per period per product and per client\n -# or only amount per period per product dependings on choosen group by\n -client_dict = {}\n product_dict = {}\n -for result in result_list:\n - result = result.getObject()\n - period = result.getStartDate()\n - if period is not None:\n - period = period.strftime(date_format)\n - if report_group_by in ("client", "both"):\n - # client_title -> period -> amount\n - if report_type == "sale":\n - client_title = result.getDestinationSectionTitle()\n +client_dict = {}\n +if active_process_path:\n + active_process = portal.restrictedTraverse(active_process_path)\n + for result in active_process.getResultList():\n + if result.summary:\n + continue\n + detail = loads(result.detail)\n + if detail[\'type\'] == "result":\n + result_product_dict = detail[\'product_dict\']\n + result_client_dict = detail["client_dict"] \n else:\n - client_title = result.getSourceSectionTitle()\n - # FIXME: if two clients have the same title, do we want to group ?\n - if not client_dict.has_key(client_title):\n - client_dict[client_title] = {}\n - if client_dict[client_title].has_key(period):\n - client_dict[client_title][period][\'amount\'] = client_dict[client_title][period][\'amount\'] + result.getTotalPrice()\n + continue\n + if not len(client_dict) and len(result_client_dict):\n + client_dict = result_client_dict.copy()\n else:\n - client_dict[client_title][period] = {\'amount\' : result.getTotalPrice()}\n - if not product_dict.has_key(client_title):\n - line_dict = product_dict[client_title] = {}\n + _addDict(client_dict, result_client_dict, only_amount=True)\n + \n + if not len(product_dict) and len(result_product_dict):\n + product_dict = result_product_dict.copy()\n else:\n - line_dict = product_dict[client_title]\n - else:\n - line_dict = product_dict\n -\n - if report_group_by != "client":\n - # client_title -> product_title -> period -> amount/quantity...\n - # or product_title -> period -> amount/quantity...\n - for line in result.contentValues(filter = {\'portal_type\':line_portal_type}):\n - # FIXME: if two resources have the same title, do we want to group ?\n - product_title = line.getResourceTitle()\n - if not line_dict.has_key(product_title):\n - line_dict[product_title] = {period :{"amount" : line.getTotalPrice(),\n - "quantity" : line.getTotalQuantity(),\n - "quantity_unit" : line.getQuantityUnitTranslatedTitle()}}\n - else:\n - if not line_dict[product_title].has_key(period):\n - line_dict[product_title][period] = {"amount" : line.getTotalPrice(),\n - "quantity" : line.getTotalQuantity(),\n - "quantity_unit" : line.getQuantityUnitTranslatedTitle()}\n - else:\n - line_dict[product_title][period][\'amount\'] = line_dict[product_title][period][\'amount\'] + line.getTotalPrice()\n - line_dict[product_title][period][\'quantity\'] = line_dict[product_title][period][\'quantity\'] + line.getTotalQuantity()\n -\n -\n + _addDict(product_dict, result_product_dict)\n +else:\n + raise ValueError("No active process found to process report")\n \n def sortProduct(a, b):\n return cmp(a[\'product\'], b[\'product\'])\n @@ -312,6 +242,14 @@ return line_list\n <key> <string>_params</string> </key> <value> <string>period_list, report_type, doc_portal_type, line_portal_type, simulation_state,**kw</string> </value> </item> + <item> + <key> <string>_proxy_roles</string> </key> + <value> + <tuple> + <string>Manager</string> + </tuple> + </value> + </item> <item> <key> <string>id</string> </key> <value> <string>OrderModule_getOrderStatList</string> </value> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_launchOrderReport.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_launchOrderReport.xml new file mode 100644 index 0000000000..2981010879 --- /dev/null +++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_launchOrderReport.xml @@ -0,0 +1,128 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="PythonScript" module="Products.PythonScripts.PythonScript"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>Script_magic</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary> + <item> + <key> <string>name_container</string> </key> + <value> <string>container</string> </value> + </item> + <item> + <key> <string>name_context</string> </key> + <value> <string>context</string> </value> + </item> + <item> + <key> <string>name_m_self</string> </key> + <value> <string>script</string> </value> + </item> + <item> + <key> <string>name_subpath</string> </key> + <value> <string>traverse_subpath</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_body</string> </key> + <value> <string># Run a first batch of calcul in activity\n +# Then call the report in a deferred mode\n +from json import dumps\n +from Products.CMFActivity.ActiveResult import ActiveResult\n +portal = context.getPortalObject()\n +N_ = portal.Base_translateString\n +\n +# Check deferred style is present\n +if not \'Deferred\' in portal.portal_skins.getSkinSelections():\n + return context.Base_redirect(\'view\', keep_items=dict(\n + portal_status_message=N_("Deferred style must be installed to run this report")))\n + \n +person_value = portal.ERP5Site_getAuthenticatedMemberPersonValue()\n +if person_value is None:\n + portal.changeSkin(None)\n + return context.Base_redirect(\'view\', keep_items=dict(\n + portal_status_message=N_("No person found for your user")))\n +\n +if person_value.getDefaultEmailText(\'\') in (\'\', None):\n + portal.changeSkin(None)\n + return context.Base_redirect(\'view\', keep_items=dict(\n + portal_status_message=N_("You haven\'t defined your email address")))\n +\n +parameter_dict, stat_columns, selection_columns = context.OrderModule_getOrderReportParameterDict()\n +\n +active_process = context.OrderModule_activateGetOrderStatList(tag=script.id, **parameter_dict)\n +\n +# Create a result to store computed parameter for later\n +active_process.postResult(ActiveResult(\n + sevrity=1,\n + detail=dumps({\n + \'type\' : \'parameters\',\n + \'params\' : parameter_dict,\n + \'stat_columns\' : stat_columns,\n + \'selection_columns\' : selection_columns,\n + })\n + ))\n +\n +request = context.REQUEST\n +context.getPortalObject().portal_skins.changeSkin("Deferred")\n +request.set(\'portal_skin\', "Deferred")\n +deferred_portal_skin = kw.get(\'portal_skin\')\n +request.set(\'deferred_portal_skin\', deferred_portal_skin)\n +\n +kw[\'deferred_style\'] = 1\n +kw[\'active_process\'] = active_process.getPath()\n +request.set(\'active_process\', active_process.getPath())\n +kw.update(parameter_dict)\n +kw.pop(\'format\',None)\n +return context.Base_activateReport(\n + form = getattr(context, report_method_id),\n + after_tag=script.id,\n + **kw\n + )\n +</string> </value> + </item> + <item> + <key> <string>_params</string> </key> + <value> <string>report_method_id, *args, **kw</string> </value> + </item> + <item> + <key> <string>_proxy_roles</string> </key> + <value> + <tuple> + <string>Manager</string> + </tuple> + </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>OrderModule_launchOrderReport</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_processOrderStat.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_processOrderStat.xml new file mode 100644 index 0000000000..a441cd1260 --- /dev/null +++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_processOrderStat.xml @@ -0,0 +1,156 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="PythonScript" module="Products.PythonScripts.PythonScript"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>Script_magic</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary> + <item> + <key> <string>name_container</string> </key> + <value> <string>container</string> </value> + </item> + <item> + <key> <string>name_context</string> </key> + <value> <string>context</string> </value> + </item> + <item> + <key> <string>name_m_self</string> </key> + <value> <string>script</string> </value> + </item> + <item> + <key> <string>name_subpath</string> </key> + <value> <string>traverse_subpath</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_body</string> </key> + <value> <string encoding="cdata"><![CDATA[ + +from json import dumps\n +from Products.CMFActivity.ActiveResult import ActiveResult\n +\n +# we build two dict, one that store amount per period per lient\n +# and another that either store amount per period per product and per client\n +# or only amount per period per product dependings on choosen group by\n +client_dict = {}\n +product_dict = {}\n +portal = context.getPortalObject()\n +translate = portal.Base_translateString\n +# Retrieve all lines related to documents\n +line_list = portal.portal_catalog(explanation_uid=[x[\'uid\'] for x in document_list],\n + select_list=[\'total_price\', \'quantity\', \'resource_title\', \'strict_quantity_unit_title\', \'explanation_uid\'],\n + **line_params)\n +\n +doc_line_dict = {}\n +for line in line_list:\n + doc_lines = doc_line_dict.setdefault(line.explanation_uid, [])\n + doc_lines.append(line)\n + \n +for result in document_list:\n + try:\n + line_list = doc_line_dict[result[\'uid\']]\n + except KeyError:\n + line_list = []\n + \n + period = result[\'start_date\']\n + if period is not None:\n + period = period.strftime(date_format)\n + if report_group_by in ("client", "both"):\n + total_price = sum([(x.total_price or 0) for x in line_list])\n + # client_title -> period -> amount\n + if report_type == "sale":\n + client_title = result[\'destination_section_title\']\n + else:\n + client_title = result[\'source_section_title\']\n + # FIXME: if two clients have the same title, do we want to group ?\n + if not client_dict.has_key(client_title):\n + client_dict[client_title] = {}\n + if client_dict[client_title].has_key(period):\n + client_dict[client_title][period][\'amount\'] = client_dict[client_title][period][\'amount\'] + (total_price or 0)\n + else:\n + client_dict[client_title][period] = {\'amount\' : total_price or 0}\n + if not product_dict.has_key(client_title):\n + line_dict = product_dict[client_title] = {}\n + else:\n + line_dict = product_dict[client_title]\n + else:\n + line_dict = product_dict\n + \n + if report_group_by != "client":\n + # client_title -> product_title -> period -> amount/quantity...\n + # or product_title -> period -> amount/quantity...\n + for line in line_list: \n + # FIXME: if two resources have the same title, do we want to group ?\n + product_title = line.resource_title\n + if not line_dict.has_key(product_title):\n + line_dict[product_title] = {period :{"amount" : line.total_price or 0,\n + "quantity" : line.quantity or 0,\n + "quantity_unit" : translate(line.strict_quantity_unit_title)}}\n + else:\n + if not line_dict[product_title].has_key(period):\n + line_dict[product_title][period] = {"amount" : line.total_price or 0,\n + "quantity" : line.quantity or 0,\n + "quantity_unit" : translate(line.strict_quantity_unit_title)}\n + else:\n + line_dict[product_title][period][\'amount\'] = line_dict[product_title][period][\'amount\'] + (line.total_price or 0)\n + line_dict[product_title][period][\'quantity\'] = line_dict[product_title][period][\'quantity\'] + (line.quantity or 0)\n +\n +active_process_value = portal.restrictedTraverse(active_process)\n +active_process_value.postResult(ActiveResult(\n + sevrity=1,\n + detail=dumps({\n + \'type\' : "result",\n + \'client_dict\' : client_dict,\n + \'product_dict\' : product_dict,\n + })\n + ))\n + + +]]></string> </value> + </item> + <item> + <key> <string>_params</string> </key> + <value> <string>document_list, active_process, line_params, date_format, report_type, report_group_by</string> </value> + </item> + <item> + <key> <string>_proxy_roles</string> </key> + <value> + <tuple> + <string>Manager</string> + </tuple> + </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>OrderModule_processOrderStat</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog.xml index 110e4afdb2..2d2e4c944c 100644 --- a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog.xml +++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog.xml @@ -2,7 +2,7 @@ <ZopeData> <record id="1" aka="AAAAAAAAAAE="> <pickle> - <global name="ERP5Form" module="Products.ERP5Form.Form"/> + <global name="ERP5 Form" module="erp5.portal_type"/> </pickle> <pickle> <dictionary> @@ -35,7 +35,7 @@ </item> <item> <key> <string>action</string> </key> - <value> <string>OrderModule_viewOrderReport</string> </value> + <value> <string>OrderModule_getOrderReport</string> </value> </item> <item> <key> <string>description</string> </key> @@ -83,7 +83,6 @@ <list> <string>your_portal_skin</string> <string>your_format</string> - <string>your_deferred_style</string> </list> </value> </item> @@ -104,7 +103,6 @@ <string>your_incoterm</string> <string>your_order</string> <string>your_landscape</string> - <string>your_use_selection</string> </list> </value> </item> @@ -157,6 +155,10 @@ <key> <string>update_action</string> </key> <value> <string></string> </value> </item> + <item> + <key> <string>update_action_title</string> </key> + <value> <string></string> </value> + </item> </dictionary> </pickle> </record> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog/your_deferred_style.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog/your_deferred_style.xml deleted file mode 100644 index 8907d71b18..0000000000 --- a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog/your_deferred_style.xml +++ /dev/null @@ -1,90 +0,0 @@ -<?xml version="1.0"?> -<ZopeData> - <record id="1" aka="AAAAAAAAAAE="> - <pickle> - <global name="ProxyField" module="Products.ERP5Form.ProxyField"/> - </pickle> - <pickle> - <dictionary> - <item> - <key> <string>delegated_list</string> </key> - <value> - <list/> - </value> - </item> - <item> - <key> <string>id</string> </key> - <value> <string>your_deferred_style</string> </value> - </item> - <item> - <key> <string>message_values</string> </key> - <value> - <dictionary> - <item> - <key> <string>external_validator_failed</string> </key> - <value> <string>The input failed the external validator.</string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>overrides</string> </key> - <value> - <dictionary> - <item> - <key> <string>field_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>form_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>target</string> </key> - <value> <string></string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>tales</string> </key> - <value> - <dictionary> - <item> - <key> <string>field_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>form_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>target</string> </key> - <value> <string></string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>values</string> </key> - <value> - <dictionary> - <item> - <key> <string>field_id</string> </key> - <value> <string>my_dialog_mode_deferred_style</string> </value> - </item> - <item> - <key> <string>form_id</string> </key> - <value> <string>Base_viewTradeFieldLibrary</string> </value> - </item> - <item> - <key> <string>target</string> </key> - <value> <string>Click to edit the target</string> </value> - </item> - </dictionary> - </value> - </item> - </dictionary> - </pickle> - </record> -</ZopeData> diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog/your_use_selection.xml b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog/your_use_selection.xml deleted file mode 100644 index 4e42ba7a60..0000000000 --- a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_viewOrderReportDialog/your_use_selection.xml +++ /dev/null @@ -1,90 +0,0 @@ -<?xml version="1.0"?> -<ZopeData> - <record id="1" aka="AAAAAAAAAAE="> - <pickle> - <global name="ProxyField" module="Products.ERP5Form.ProxyField"/> - </pickle> - <pickle> - <dictionary> - <item> - <key> <string>delegated_list</string> </key> - <value> - <list/> - </value> - </item> - <item> - <key> <string>id</string> </key> - <value> <string>your_use_selection</string> </value> - </item> - <item> - <key> <string>message_values</string> </key> - <value> - <dictionary> - <item> - <key> <string>external_validator_failed</string> </key> - <value> <string>The input failed the external validator.</string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>overrides</string> </key> - <value> - <dictionary> - <item> - <key> <string>field_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>form_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>target</string> </key> - <value> <string></string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>tales</string> </key> - <value> - <dictionary> - <item> - <key> <string>field_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>form_id</string> </key> - <value> <string></string> </value> - </item> - <item> - <key> <string>target</string> </key> - <value> <string></string> </value> - </item> - </dictionary> - </value> - </item> - <item> - <key> <string>values</string> </key> - <value> - <dictionary> - <item> - <key> <string>field_id</string> </key> - <value> <string>my_dialog_mode_use_selection</string> </value> - </item> - <item> - <key> <string>form_id</string> </key> - <value> <string>Base_viewTradeFieldLibrary</string> </value> - </item> - <item> - <key> <string>target</string> </key> - <value> <string>Click to edit the target</string> </value> - </item> - </dictionary> - </value> - </item> - </dictionary> - </pickle> - </record> -</ZopeData> -- 2.30.9