From e8d51e8be445303a67936997fe99f479f6692176 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <jerome@nexedi.com>
Date: Mon, 19 Dec 2005 09:12:40 +0000
Subject: [PATCH] Validate with period. Translate portal status messages here. 
 FIXME: it will be translated again in form_view.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@4750 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 .../scripts/validateBalanceTransaction.xml    |   6 -
 .../scripts/validateTransaction.xml           | 122 +++++++-----
 .../scripts/validateTransactionLines.xml      | 183 ++++++++++--------
 3 files changed, 178 insertions(+), 133 deletions(-)

diff --git a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateBalanceTransaction.xml b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateBalanceTransaction.xml
index 3cae45748c..083b1c7b1f 100755
--- a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateBalanceTransaction.xml
+++ b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateBalanceTransaction.xml
@@ -138,12 +138,6 @@ AAAAU2NyaXB0IChQeXRob24pcwgAAAA8bW9kdWxlPgEAAABzAAAAAA==</string> </value>
             <key> <string>_filepath</string> </key>
             <value> <string>Script (Python):/nexedi/portal_workflow/accounting_workflow/scripts/validateBalanceTransaction</string> </value>
         </item>
-        <item>
-            <key> <string>_owner</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
         <item>
             <key> <string>_params</string> </key>
             <value> <string>state_change</string> </value>
diff --git a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransaction.xml b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransaction.xml
index 6c32097822..20481269fc 100755
--- a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransaction.xml
+++ b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransaction.xml
@@ -73,22 +73,30 @@ from Products.DCWorkflow.DCWorkflow import ValidationFailed\n
 error_message = \'\'\n
 \n
 # Purchase Invoice Transaction or Sale Invoice Transaction.\n
-transaction = state_change.object\n
+transaction = state_change[\'object\']\n
+skip_period_validation = state_change[\'kwargs\'].get(\'skip_period_validation\', 0)\n
 \n
 if transaction.getStopDate() in (None, \'\') : \n
   error_message = \'date is not defined\'\n
 else: \n
-  # check the date is not in a closed period\n
-  for apd in context.portal_catalog(\n
-         portal_type="Accounting Period Delimiter", \n
-         simulation_state="delivered") : \n
-    apd = apd.getObject()\n
-    if apd.getStartDate() < transaction.getStopDate() < apd.getStopDate():\n
-      error_message = \'date is in a closed period\'\n
+  if not skip_period_validation :\n
+    valid_date = 0\n
+    # check the date is in an opened period\n
+    transaction_date = DateTime( transaction.getStopDate().year(),\n
+                                                      transaction.getStopDate().month(),\n
+                                                      transaction.getStopDate().day() ) # we don\'t care about hour:minutes\n
+    for apd in context.portal_catalog(\n
+         portal_type = "Accounting Period", \n
+         simulation_state = "planned") : \n
+      apd = apd.getObject()\n
+      if apd.getStartDate() <= transaction_date <= apd.getStopDate():\n
+        valid_date = 1\n
+    if not valid_date :\n
+      error_message = "Date is not in an openned Accounting Period" \n
 \n
 # Get sections and a currency.\n
-source_section = transaction.getSourceSection(portal_type = [\'Organisation\'])\n
-destination_section = transaction.getDestinationSection(portal_type = [\'Organisation\', \'Person\'])\n
+source_section = transaction.getSourceSection()\n
+destination_section = transaction.getDestinationSection()\n
 currency = transaction.getResource()\n
 \n
 if source_section in (None, \'\'):\n
@@ -96,51 +104,54 @@ if source_section in (None, \'\'):\n
 elif transaction.getPortalType() not in (\'Balance Transaction\', \'Accounting Transaction\'):\n
   if destination_section in (None, \'\'):\n
     error_message = \'destination_section is not defined\'\n
-    if transaction.getDestinationSection() not in (None, \'\'):\n
-      error_message = \'destination_section is not an Organisation or a Person\'\n
   elif currency in (None, \'\'):\n
     error_message = \'currency is not defined\'\n
 \n
 if error_message != \'\':\n
-  raise ValidationFailed, \'Action impossible : \' + error_message\n
+  raise ValidationFailed, \'Action impossible : \'+error_message\n
 
 
 ]]></string> </value>
         </item>
         <item>
             <key> <string>_code</string> </key>
-            <value> <string encoding="base64">YwAAAAAAAAAAAQAAAEAAAABzDQAAAGQBAIQAAFoAAGQAAFMoAgAAAE5jAQAAAA0AAAASAAAAQwAA
-AHPoAQAAZAEAawAAbAEAfQIAAWQCAH0DAHQDAHwAAGQDAIMCAH0FAHQDAHwFAGQEAIMCAIMAAHQG
-AGQCAGYCAGoGAG8KAAFkBQB9AwBujgABeIoAdAcAdAMAdAgAZAYAgwIAZAcAZAgAZAkAZAoAgwAC
-gwEARF1kAH0JAHQDAHwJAGQLAIMCAIMAAH0JAHQDAHwJAGQMAIMCAIMAAHQDAHwFAGQEAIMCAIMA
-AAQDagAAbxYAAXQDAHwJAGQEAIMCAIMAAGoAAG4CAAIBbwoAAWQNAH0DAHFwAAFxcABXdAMAfAUA
-ZA4AgwIAZAcAZA8AZwEAgwABfQoAdAMAfAUAZBAAgwIAZAcAZA8AZBEAZwIAgwABfQsAdAMAfAUA
-ZBIAgwIAgwAAfQwAfAoAdAYAZAIAZgIAagYAbwoAAWQTAH0DAG6HAAF0AwB8BQBkFACDAgCDAABk
-FQBkFgBmAgBqBwBvZwABfAsAdAYAZAIAZgIAagYAbzMAAWQXAH0DAHQDAHwFAGQQAIMCAIMAAHQG
-AGQCAGYCAGoHAG8KAAFkGAB9AwBxwgEBccYBAXwMAHQGAGQCAGYCAGoGAG8KAAFkGQB9AwBxxgEB
-bgEAAXwDAGQCAGoDAG8RAAF8AgBkGgB8AwAXggIAbgEAAWQAAFMoGwAAAE4oAQAAAHMQAAAAVmFs
-aWRhdGlvbkZhaWxlZHMAAAAAcwYAAABvYmplY3RzCwAAAGdldFN0b3BEYXRlcxMAAABkYXRlIGlz
-IG5vdCBkZWZpbmVkcw4AAABwb3J0YWxfY2F0YWxvZ3MLAAAAcG9ydGFsX3R5cGVzGwAAAEFjY291
-bnRpbmcgUGVyaW9kIERlbGltaXRlcnMQAAAAc2ltdWxhdGlvbl9zdGF0ZXMJAAAAZGVsaXZlcmVk
-cwkAAABnZXRPYmplY3RzDAAAAGdldFN0YXJ0RGF0ZXMaAAAAZGF0ZSBpcyBpbiBhIGNsb3NlZCBw
-ZXJpb2RzEAAAAGdldFNvdXJjZVNlY3Rpb25zDAAAAE9yZ2FuaXNhdGlvbnMVAAAAZ2V0RGVzdGlu
-YXRpb25TZWN0aW9ucwYAAABQZXJzb25zCwAAAGdldFJlc291cmNlcx0AAABzb3VyY2Vfc2VjdGlv
-biBpcyBub3QgZGVmaW5lZHMNAAAAZ2V0UG9ydGFsVHlwZXMTAAAAQmFsYW5jZSBUcmFuc2FjdGlv
-bnMWAAAAQWNjb3VudGluZyBUcmFuc2FjdGlvbnMiAAAAZGVzdGluYXRpb25fc2VjdGlvbiBpcyBu
-b3QgZGVmaW5lZHM2AAAAZGVzdGluYXRpb25fc2VjdGlvbiBpcyBub3QgYW4gT3JnYW5pc2F0aW9u
-IG9yIGEgUGVyc29ucxcAAABjdXJyZW5jeSBpcyBub3QgZGVmaW5lZHMUAAAAQWN0aW9uIGltcG9z
-c2libGUgOiAoDQAAAHMeAAAAUHJvZHVjdHMuRENXb3JrZmxvdy5EQ1dvcmtmbG93cxAAAABWYWxp
-ZGF0aW9uRmFpbGVkcw0AAABlcnJvcl9tZXNzYWdlcwkAAABfZ2V0YXR0cl9zDAAAAHN0YXRlX2No
-YW5nZXMLAAAAdHJhbnNhY3Rpb25zBAAAAE5vbmVzCQAAAF9nZXRpdGVyX3MHAAAAY29udGV4dHMD
-AAAAYXBkcw4AAABzb3VyY2Vfc2VjdGlvbnMTAAAAZGVzdGluYXRpb25fc2VjdGlvbnMIAAAAY3Vy
-cmVuY3koDQAAAHMMAAAAc3RhdGVfY2hhbmdlcx4AAABQcm9kdWN0cy5EQ1dvcmtmbG93LkRDV29y
-a2Zsb3dzEAAAAFZhbGlkYXRpb25GYWlsZWRzDQAAAGVycm9yX21lc3NhZ2VzCQAAAF9nZXRhdHRy
-X3MLAAAAdHJhbnNhY3Rpb25zBAAAAE5vbmVzCQAAAF9nZXRpdGVyX3MHAAAAY29udGV4dHMDAAAA
-YXBkcw4AAABzb3VyY2Vfc2VjdGlvbnMTAAAAZGVzdGluYXRpb25fc2VjdGlvbnMIAAAAY3VycmVu
-Y3koAAAAACgAAAAAcw8AAABTY3JpcHQgKFB5dGhvbilzEwAAAHZhbGlkYXRlVHJhbnNhY3Rpb24B
-AAAAcy4AAAANAgYDDwIfAQoDJQAGAxIBQgEOAxsBHgESAhMBCgEfARMBBgEfAQ4BEwEOAg0BKAEA
-AABzEwAAAHZhbGlkYXRlVHJhbnNhY3Rpb24oAQAAAHMTAAAAdmFsaWRhdGVUcmFuc2FjdGlvbigA
-AAAAKAAAAABzDwAAAFNjcmlwdCAoUHl0aG9uKXMIAAAAPG1vZHVsZT4BAAAAcwAAAAA=</string> </value>
+            <value> <string encoding="base64">YwAAAAAAAAAAAQAAAEAAAABzDQAAAGQBAIQAAFoAAGQAAFMoAgAAAE5jAQAAABIAAAAPAAAAQwAA
+AHM9AgAAZAEAawAAbAEAfQIAAWQCAH0DAHQDAHwAAGQDAIMCAH0FAHQGAHQDAHwAAGQEAIMCAGQF
+AIMCAGQGAGQHAIMCAH0HAHQGAHwFAGQIAIMCAIMAAHQIAGQCAGYCAGoGAG8KAAFkCQB9AwBuAAEB
+fAcADG/3AAFkBwB9CQB0CgB0BgB0BgB8BQBkCACDAgCDAABkCgCDAgCDAAB0BgB0BgB8BQBkCACD
+AgCDAABkCwCDAgCDAAB0BgB0BgB8BQBkCACDAgCDAABkDACDAgCDAACDAwB9CwB4fgB0DAB0BgB0
+DQBkDQCDAgBkDgBkDwBkEABkEQCDAAKDAQBEXVgAfQ4AdAYAfA4AZBIAgwIAgwAAfQ4AdAYAfA4A
+ZBMAgwIAgwAAfAsABANqAQBvFgABdAYAfA4AZAgAgwIAgwAAagEAbgIAAgFvCgABZBQAfQkAcfkA
+AXH5AFd8CQAMbwoAAWQVAH0DAHFrAQFuAQABdAYAfAUAZBYAgwIAgwAAfQ8AdAYAfAUAZBcAgwIA
+gwAAfRAAdAYAfAUAZBgAgwIAgwAAfREAfA8AdAgAZAIAZgIAagYAbwoAAWQZAH0DAG5eAAF0BgB8
+BQBkGgCDAgCDAABkGwBkHABmAgBqBwBvPgABfBAAdAgAZAIAZgIAagYAbwoAAWQdAH0DAHEbAgF8
+EQB0CABkAgBmAgBqBgBvCgABZB4AfQMAcRsCAW4BAAF8AwBkAgBqAwBvEQABfAIAZB8AfAMAF4IC
+AG4BAAFkAABTKCAAAABOKAEAAABzEAAAAFZhbGlkYXRpb25GYWlsZWRzAAAAAHMGAAAAb2JqZWN0
+cwYAAABrd2FyZ3NzAwAAAGdldHMWAAAAc2tpcF9wZXJpb2RfdmFsaWRhdGlvbmkAAAAAcwsAAABn
+ZXRTdG9wRGF0ZXMTAAAAZGF0ZSBpcyBub3QgZGVmaW5lZHMEAAAAeWVhcnMFAAAAbW9udGhzAwAA
+AGRheXMOAAAAcG9ydGFsX2NhdGFsb2dzCwAAAHBvcnRhbF90eXBlcxEAAABBY2NvdW50aW5nIFBl
+cmlvZHMQAAAAc2ltdWxhdGlvbl9zdGF0ZXMHAAAAcGxhbm5lZHMJAAAAZ2V0T2JqZWN0cwwAAABn
+ZXRTdGFydERhdGVpAQAAAHMrAAAARGF0ZSBpcyBub3QgaW4gYW4gb3Blbm5lZCBBY2NvdW50aW5n
+IFBlcmlvZHMQAAAAZ2V0U291cmNlU2VjdGlvbnMVAAAAZ2V0RGVzdGluYXRpb25TZWN0aW9ucwsA
+AABnZXRSZXNvdXJjZXMdAAAAc291cmNlX3NlY3Rpb24gaXMgbm90IGRlZmluZWRzDQAAAGdldFBv
+cnRhbFR5cGVzEwAAAEJhbGFuY2UgVHJhbnNhY3Rpb25zFgAAAEFjY291bnRpbmcgVHJhbnNhY3Rp
+b25zIgAAAGRlc3RpbmF0aW9uX3NlY3Rpb24gaXMgbm90IGRlZmluZWRzFwAAAGN1cnJlbmN5IGlz
+IG5vdCBkZWZpbmVkcxQAAABBY3Rpb24gaW1wb3NzaWJsZSA6ICgSAAAAcx4AAABQcm9kdWN0cy5E
+Q1dvcmtmbG93LkRDV29ya2Zsb3dzEAAAAFZhbGlkYXRpb25GYWlsZWRzDQAAAGVycm9yX21lc3Nh
+Z2VzCQAAAF9nZXRpdGVtX3MMAAAAc3RhdGVfY2hhbmdlcwsAAAB0cmFuc2FjdGlvbnMJAAAAX2dl
+dGF0dHJfcxYAAABza2lwX3BlcmlvZF92YWxpZGF0aW9ucwQAAABOb25lcwoAAAB2YWxpZF9kYXRl
+cwgAAABEYXRlVGltZXMQAAAAdHJhbnNhY3Rpb25fZGF0ZXMJAAAAX2dldGl0ZXJfcwcAAABjb250
+ZXh0cwMAAABhcGRzDgAAAHNvdXJjZV9zZWN0aW9ucxMAAABkZXN0aW5hdGlvbl9zZWN0aW9ucwgA
+AABjdXJyZW5jeSgSAAAAcwwAAABzdGF0ZV9jaGFuZ2VzHgAAAFByb2R1Y3RzLkRDV29ya2Zsb3cu
+RENXb3JrZmxvd3MQAAAAVmFsaWRhdGlvbkZhaWxlZHMNAAAAZXJyb3JfbWVzc2FnZXMJAAAAX2dl
+dGl0ZW1fcwsAAAB0cmFuc2FjdGlvbnMJAAAAX2dldGF0dHJfcxYAAABza2lwX3BlcmlvZF92YWxp
+ZGF0aW9ucwQAAABOb25lcwoAAAB2YWxpZF9kYXRlcwgAAABEYXRlVGltZXMQAAAAdHJhbnNhY3Rp
+b25fZGF0ZXMJAAAAX2dldGl0ZXJfcwcAAABjb250ZXh0cwMAAABhcGRzDgAAAHNvdXJjZV9zZWN0
+aW9ucxMAAABkZXN0aW5hdGlvbl9zZWN0aW9ucwgAAABjdXJyZW5jeSgAAAAAKAAAAABzDwAAAFNj
+cmlwdCAoUHl0aG9uKXMTAAAAdmFsaWRhdGVUcmFuc2FjdGlvbgEAAABzOgAAAA0CBgMPASECHwEK
+AggBBgIkARsBGwElAAYDEgE2AQ4BCAEOAxIBEgESAhMBCgEfARMBCgETAQ4CDQEoAQAAAHMTAAAA
+dmFsaWRhdGVUcmFuc2FjdGlvbigBAAAAcxMAAAB2YWxpZGF0ZVRyYW5zYWN0aW9uKAAAAAAoAAAA
+AHMPAAAAU2NyaXB0IChQeXRob24pcwgAAAA8bW9kdWxlPgEAAABzAAAAAA==</string> </value>
         </item>
         <item>
             <key> <string>_dav_writelocks</string> </key>
@@ -159,7 +170,19 @@ AAAAKAAAAABzDwAAAFNjcmlwdCAoUHl0aG9uKXMIAAAAPG1vZHVsZT4BAAAAcwAAAAA=</string> </
         <item>
             <key> <string>_proxy_roles</string> </key>
             <value>
-              <tuple/>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Authenticated</string>
+                <string>Author</string>
+                <string>Manager</string>
+                <string>Member</string>
+                <string>Owner</string>
+                <string>Reviewer</string>
+              </tuple>
             </value>
         </item>
         <item>
@@ -190,9 +213,14 @@ AAAAKAAAAABzDwAAAFNjcmlwdCAoUHl0aG9uKXMIAAAAPG1vZHVsZT4BAAAAcwAAAAA=</string> </
                             <string>Products.DCWorkflow.DCWorkflow</string>
                             <string>ValidationFailed</string>
                             <string>error_message</string>
-                            <string>_getattr_</string>
+                            <string>_getitem_</string>
                             <string>transaction</string>
+                            <string>_getattr_</string>
+                            <string>skip_period_validation</string>
                             <string>None</string>
+                            <string>valid_date</string>
+                            <string>DateTime</string>
+                            <string>transaction_date</string>
                             <string>_getiter_</string>
                             <string>context</string>
                             <string>apd</string>
diff --git a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransactionLines.xml b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransactionLines.xml
index 688fb50dcd..00dd1169a8 100755
--- a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransactionLines.xml
+++ b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransactionLines.xml
@@ -71,15 +71,15 @@
 from Products.DCWorkflow.DCWorkflow import ValidationFailed\n
 \n
 error_message = \'\'\n
-transaction = state_change.object\n
-portal = state_change.getPortal()\n
+transaction = state_change[\'object\']\n
+N_ = transaction.Base_TranslateString\n
 \n
 # first of all, validate the transaction it self\n
 container.validateTransaction(state_change)\n
 \n
 # Get sections.\n
-source_section = transaction.getSourceSection()\n
-destination_section = transaction.getDestinationSection()\n
+source_section = transaction.getSourceSection(portal_type = [\'Person\', \'Organisation\'])\n
+destination_section = transaction.getDestinationSection(portal_type = [\'Person\', \'Organisation\'])\n
 \n
 # Check transaction lines.\n
 if transaction.getPortalType() not in (\'Balance Transaction\',) :\n
@@ -96,85 +96,101 @@ if transaction.getPortalType() not in (\'Balance Transaction\',) :\n
       quantity = transaction_line.getSourceDebit() - transaction_line.getSourceCredit() + \\\n
                  transaction_line.getDestinationDebit() - transaction_line.getDestinationCredit()\n
     sum += int(round(quantity * 100))\n
+\n
     if transaction_line.getSourceValue() is None : continue\n
+\n
+    if transaction_line.getSourceValue().getValidationState() != \'validated\' :\n
+      raise ValidationFailed, N_(\'Action impossible : Account ${account_title} is ${state}\',\n
+                 mapping = {\'account_title\': unicode(transaction_line.getSourceValue().getTranslatedTitle(), \'utf8\'),\n
+                                      \'state\': unicode(transaction_line.getSourceValue().\n
+                                                              getTranslatedValidationStateTitle(), \'utf8\')})\n
+ \n
     if transaction_line.getSourceValue().getAccountTypeId() in ("receivable", "payable") \\\n
-          and transaction_line.getSourceSection() in (None, "") :\n
-       raise ValidationFailed, \'Action impossible : no source section defined for line %s where account type is "%s"\'%\\\n
-                                (transaction_line.getId(), transaction_line.getSource().getAccountTypeId())\n
-    if transaction_line.getSourceValue().getAccountTypeId() == "bank" \\\n
+          and transaction_line.getDestinationSection() in (None, "") :\n
+      raise ValidationFailed, N_(\n
+             \'Action impossible : no Third Party defined for line ${line} where Account Type is ${account_type}.\',\n
+             mapping = { \'line\': transaction_line.getId(),\n
+                                   \'account_type\' : unicode(transaction_line.getSourceValue()\n
+                                                                 .getAccountTypeValue().getTranslatedLogicalPath(), \'utf8\')})\n
+    \n
+    if transaction_line.getSourceValue().isMemberOf("account_type/asset/bank") \\\n
           and transaction_line.getSourcePayment() in (None, "") :\n
-       raise ValidationFailed, \'Action impossible : no source payment defined for line %s where account type is "bank"\'%transaction_line.getId()\n
+       raise ValidationFailed, N_(\n
+            \'Action impossible : no Bank Account defined for line ${line} where Account Type is ${account_type}.\',\n
+            mapping = { \'line\': transaction_line.getId(),\n
+                                   \'account_type\' : unicode(transaction_line.getSourceValue()\n
+                                                       .getAccountTypeValue().getTranslatedLogicalPath(), \'utf8\')})\n
 \n
   if sum > 0:\n
-    raise ValidationFailed, \'Action impossible : credit is greater than debit\' #: sum = %.2f\' % (sum/100.0)\n
+    raise ValidationFailed, N_(\'Action impossible : credit is greater than debit\')\n
   elif sum < 0:\n
-    raise ValidationFailed, \'Action impossible : credit is smaller than debit\' #: sum = %.2f\' % (sum/100.0)\n
-\n
-if portal.portal_templates.getInstalledBusinessTemplate(\'erp5_budget\') is not None :\n
-  container.validateBudget(state_change)\n
+    raise ValidationFailed, N_(\'Action impossible : credit is smaller than debit\')\n
 \n
-# delete empty transaction lines.\n
-DISABLED = 1\n
-if not DISABLED and not transaction.isSimulated() \\\n
-   and transaction.getSimulationState() in ("stopped", ) :\n
-  transaction.AccountingTransaction_deleteEmptyLines(redirect=0)\n
+transaction.AccountingTransaction_deleteEmptyLines(redirect=0)\n
 
 
 ]]></string> </value>
         </item>
         <item>
             <key> <string>_code</string> </key>
-            <value> <string encoding="base64">YwAAAAAAAAAAAQAAAEAAAABzDQAAAGQBAIQAAFoAAGQAAFMoAgAAAE5jAQAAABMAAAAhAAAAQwAA
-AHMtAwAAZAEAawAAbAEAfQIAAWQCAH0DAHQDAHwAAGQDAIMCAH0FAHQDAHwAAGQEAIMCAIMAAH0G
-AHQDAHQHAGQFAIMCAHwAAIMBAAF0AwB8BQBkBgCDAgCDAAB9CAB0AwB8BQBkBwCDAgCDAAB9CQB0
-AwB8BQBkCACDAgCDAABkCQBmAQBqBwBvDgIBdAMAfAUAZAoAgwIAZAsAaAAABGQMAGQNAGQOAGQP
-AGQQAGYEAAM8gwABfQoAZBEAfQsAeKABdAwAfAoAgwEARF2SAX0NAHwIAHwJAGoDAG8dAAF0AwB8
-DQBkEgCDAgCDAABwBAABZBMAfQ4AbkMAAXQDAHwNAGQUAIMCAIMAAHQDAHwNAGQVAIMCAIMAABh0
-AwB8DQBkFgCDAgCDAAAXdAMAfA0AZBcAgwIAgwAAGH0OAHwLAHQPAHQQAHwOAGQYABSDAQCDAQA3
-fQsAdAMAfA0AZBkAgwIAgwAAdBEAaggAbwcAAXHHAG4BAAF0AwB0AwB8DQBkGQCDAgCDAABkGgCD
-AgCDAABkGwBkHABmAgBqBgBvHAABdAMAfA0AZAYAgwIAgwAAdBEAZAIAZgIAagYAbzsAAXwCAGQd
-AHQDAHwNAGQeAIMCAIMAAHQDAHQDAHwNAGQfAIMCAIMAAGQaAIMCAIMAAGYCABaCAgBuAQABdAMA
-dAMAfA0AZBkAgwIAgwAAZBoAgwIAgwAAZCAAagIAbxwAAXQDAHwNAGQhAIMCAIMAAHQRAGQCAGYC
-AGoGAG8dAAF8AgBkIgB0AwB8DQBkHgCDAgCDAAAWggIAcccAAXHHAFd8CwBkEQBqBABvDQABfAIA
-ZCMAggIAcZUCAXwLAGQRAGoAAG8NAAF8AgBkJACCAgBxlQIBbgEAAXQDAHQDAHwGAGQlAIMCAGQm
-AIMCAGQnAIMBAHQRAGoJAG8XAAF0AwB0BwBkKACDAgB8AACDAQABbgEAAWQpAH0SAHwSAAxvLQAB
-dAMAfAUAZCoAgwIAgwAADG8ZAAF0AwB8BQBkKwCDAgCDAABkLABmAQBqBgBvGgABdAMAfAUAZC0A
-gwIAZC4AZBEAgwABAW4BAAFkAABTKC8AAABOKAEAAABzEAAAAFZhbGlkYXRpb25GYWlsZWRzAAAA
-AHMGAAAAb2JqZWN0cwkAAABnZXRQb3J0YWxzEwAAAHZhbGlkYXRlVHJhbnNhY3Rpb25zEAAAAGdl
-dFNvdXJjZVNlY3Rpb25zFQAAAGdldERlc3RpbmF0aW9uU2VjdGlvbnMNAAAAZ2V0UG9ydGFsVHlw
-ZXMTAAAAQmFsYW5jZSBUcmFuc2FjdGlvbnMNAAAAY29udGVudFZhbHVlc3MGAAAAZmlsdGVycwsA
-AABwb3J0YWxfdHlwZXMbAAAAQWNjb3VudGluZyBUcmFuc2FjdGlvbiBMaW5lcx0AAABTYWxlIElu
-dm9pY2UgVHJhbnNhY3Rpb24gTGluZXMaAAAAUGF5IFNoZWV0IFRyYW5zYWN0aW9uIExpbmVzIQAA
-AFB1cmNoYXNlIEludm9pY2UgVHJhbnNhY3Rpb24gTGluZWkAAAAAcwsAAABnZXRRdWFudGl0eWYD
-MC4wcw4AAABnZXRTb3VyY2VEZWJpdHMPAAAAZ2V0U291cmNlQ3JlZGl0cxMAAABnZXREZXN0aW5h
-dGlvbkRlYml0cxQAAABnZXREZXN0aW5hdGlvbkNyZWRpdGlkAAAAcw4AAABnZXRTb3VyY2VWYWx1
-ZXMQAAAAZ2V0QWNjb3VudFR5cGVJZHMKAAAAcmVjZWl2YWJsZXMHAAAAcGF5YWJsZXNUAAAAQWN0
-aW9uIGltcG9zc2libGUgOiBubyBzb3VyY2Ugc2VjdGlvbiBkZWZpbmVkIGZvciBsaW5lICVzIHdo
-ZXJlIGFjY291bnQgdHlwZSBpcyAiJXMicwUAAABnZXRJZHMJAAAAZ2V0U291cmNlcwQAAABiYW5r
-cxAAAABnZXRTb3VyY2VQYXltZW50c1YAAABBY3Rpb24gaW1wb3NzaWJsZSA6IG5vIHNvdXJjZSBw
-YXltZW50IGRlZmluZWQgZm9yIGxpbmUgJXMgd2hlcmUgYWNjb3VudCB0eXBlIGlzICJiYW5rInMw
-AAAAQWN0aW9uIGltcG9zc2libGUgOiBjcmVkaXQgaXMgZ3JlYXRlciB0aGFuIGRlYml0czAAAABB
-Y3Rpb24gaW1wb3NzaWJsZSA6IGNyZWRpdCBpcyBzbWFsbGVyIHRoYW4gZGViaXRzEAAAAHBvcnRh
-bF90ZW1wbGF0ZXNzHAAAAGdldEluc3RhbGxlZEJ1c2luZXNzVGVtcGxhdGVzCwAAAGVycDVfYnVk
-Z2V0cw4AAAB2YWxpZGF0ZUJ1ZGdldGkBAAAAcwsAAABpc1NpbXVsYXRlZHMSAAAAZ2V0U2ltdWxh
-dGlvblN0YXRlcwcAAABzdG9wcGVkcyYAAABBY2NvdW50aW5nVHJhbnNhY3Rpb25fZGVsZXRlRW1w
-dHlMaW5lc3MIAAAAcmVkaXJlY3QoEwAAAHMeAAAAUHJvZHVjdHMuRENXb3JrZmxvdy5EQ1dvcmtm
-bG93cxAAAABWYWxpZGF0aW9uRmFpbGVkcw0AAABlcnJvcl9tZXNzYWdlcwkAAABfZ2V0YXR0cl9z
-DAAAAHN0YXRlX2NoYW5nZXMLAAAAdHJhbnNhY3Rpb25zBgAAAHBvcnRhbHMJAAAAY29udGFpbmVy
-cw4AAABzb3VyY2Vfc2VjdGlvbnMTAAAAZGVzdGluYXRpb25fc2VjdGlvbnMdAAAAYWNjb3VudGlu
-Z1RyYW5zYWN0aW9uTGluZUxpc3RzAwAAAHN1bXMJAAAAX2dldGl0ZXJfcxAAAAB0cmFuc2FjdGlv
-bl9saW5lcwgAAABxdWFudGl0eXMDAAAAaW50cwUAAAByb3VuZHMEAAAATm9uZXMIAAAARElTQUJM
-RUQoEwAAAHMMAAAAc3RhdGVfY2hhbmdlcx4AAABQcm9kdWN0cy5EQ1dvcmtmbG93LkRDV29ya2Zs
-b3dzEAAAAFZhbGlkYXRpb25GYWlsZWRzDQAAAGVycm9yX21lc3NhZ2VzCQAAAF9nZXRhdHRyX3ML
-AAAAdHJhbnNhY3Rpb25zBgAAAHBvcnRhbHMJAAAAY29udGFpbmVycw4AAABzb3VyY2Vfc2VjdGlv
-bnMTAAAAZGVzdGluYXRpb25fc2VjdGlvbnMdAAAAYWNjb3VudGluZ1RyYW5zYWN0aW9uTGluZUxp
-c3RzAwAAAHN1bXMJAAAAX2dldGl0ZXJfcxAAAAB0cmFuc2FjdGlvbl9saW5lcwgAAABxdWFudGl0
-eXMDAAAAaW50cwUAAAByb3VuZHMEAAAATm9uZXMIAAAARElTQUJMRUQoAAAAACgAAAAAcw8AAABT
-Y3JpcHQgKFB5dGhvbilzGAAAAHZhbGlkYXRlVHJhbnNhY3Rpb25MaW5lcwEAAABzRgAAAA0CBgEP
-ARUDEAMSARIDHAEPAR4EBgENAAYBDQEdAiIBIAEaASYBKAEcAQYBOwEiARwBIQINAQ0BDQERAigB
-FAMGAR8BHAEoAQAAAHMYAAAAdmFsaWRhdGVUcmFuc2FjdGlvbkxpbmVzKAEAAABzGAAAAHZhbGlk
-YXRlVHJhbnNhY3Rpb25MaW5lcygAAAAAKAAAAABzDwAAAFNjcmlwdCAoUHl0aG9uKXMIAAAAPG1v
-ZHVsZT4BAAAAcwAAAAA=</string> </value>
+            <value> <string encoding="base64">YwAAAAAAAAAAAQAAAEAAAABzDQAAAGQBAIQAAFoAAGQAAFMoAgAAAE5jAQAAABQAAAAuAAAAQwAA
+AHPPAwAAZAEAawAAbAEAfQIAAWQCAH0DAHQDAHwAAGQDAIMCAH0FAHQGAHwFAGQEAIMCAH0HAHQG
+AHQIAGQFAIMCAHwAAIMBAAF0BgB8BQBkBgCDAgBkBwBkCABkCQBnAgCDAAF9CQB0BgB8BQBkCgCD
+AgBkBwBkCABkCQBnAgCDAAF9CgB0BgB8BQBkCwCDAgCDAABkDABmAQBqBwBvGQMBdAYAfAUAZA0A
+gwIAZA4AaAAABGQHAGQPAGQQAGQRAGQSAGYEAAM8gwABfQsAZBMAfQwAeJ8CdA0AfAsAgwEARF2R
+An0OAHwJAHwKAGoDAG8dAAF0BgB8DgBkFACDAgCDAABwBAABZBUAfQ8AbkMAAXQGAHwOAGQWAIMC
+AIMAAHQGAHwOAGQXAIMCAIMAABh0BgB8DgBkGACDAgCDAAAXdAYAfA4AZBkAgwIAgwAAGH0PAHwM
+AHQQAHQRAHwPAGQaABSDAQCDAQA3fQwAdAYAfA4AZBsAgwIAgwAAdBIAaggAbwcAAXHcAG4BAAF0
+BgB0BgB8DgBkGwCDAgCDAABkHACDAgCDAABkHQBqAwBvbQABfAIAfAcAZB4AZB8AaAAABGQgAHQT
+AHQGAHQGAHwOAGQbAIMCAIMAAGQhAIMCAIMAAGQiAIMCAAM8BGQjAHQTAHQGAHQGAHwOAGQbAIMC
+AIMAAGQkAIMCAIMAAGQiAIMCAAM8gwEBggIAbgEAAXQGAHQGAHwOAGQbAIMCAIMAAGQlAIMCAIMA
+AGQmAGQnAGYCAGoGAG8cAAF0BgB8DgBkCgCDAgCDAAB0EgBkAgBmAgBqBgBvZAABfAIAfAcAZCgA
+ZB8AaAAABGQpAHQGAHwOAGQqAIMCAIMAAAM8BGQrAHQTAHQGAHQGAHQGAHwOAGQbAIMCAIMAAGQs
+AIMCAIMAAGQtAIMCAIMAAGQiAIMCAAM8gwEBggIAbgEAAXQGAHQGAHwOAGQbAIMCAIMAAGQuAIMC
+AGQvAIMBAG8cAAF0BgB8DgBkMACDAgCDAAB0EgBkAgBmAgBqBgBvZAABfAIAfAcAZDEAZB8AaAAA
+BGQpAHQGAHwOAGQqAIMCAIMAAAM8BGQrAHQTAHQGAHQGAHQGAHwOAGQbAIMCAIMAAGQsAIMCAIMA
+AGQtAIMCAIMAAGQiAIMCAAM8gwEBggIAcdwAAXHcAFd8DABkEwBqBABvEwABfAIAfAcAZDIAgwEA
+ggIAcbUDAXwMAGQTAGoAAG8TAAF8AgB8BwBkMwCDAQCCAgBxtQMBbgEAAXQGAHwFAGQ0AIMCAGQ1
+AGQTAIMAAQFkAABTKDYAAABOKAEAAABzEAAAAFZhbGlkYXRpb25GYWlsZWRzAAAAAHMGAAAAb2Jq
+ZWN0cxQAAABCYXNlX1RyYW5zbGF0ZVN0cmluZ3MTAAAAdmFsaWRhdGVUcmFuc2FjdGlvbnMQAAAA
+Z2V0U291cmNlU2VjdGlvbnMLAAAAcG9ydGFsX3R5cGVzBgAAAFBlcnNvbnMMAAAAT3JnYW5pc2F0
+aW9ucxUAAABnZXREZXN0aW5hdGlvblNlY3Rpb25zDQAAAGdldFBvcnRhbFR5cGVzEwAAAEJhbGFu
+Y2UgVHJhbnNhY3Rpb25zDQAAAGNvbnRlbnRWYWx1ZXNzBgAAAGZpbHRlcnMbAAAAQWNjb3VudGlu
+ZyBUcmFuc2FjdGlvbiBMaW5lcx0AAABTYWxlIEludm9pY2UgVHJhbnNhY3Rpb24gTGluZXMaAAAA
+UGF5IFNoZWV0IFRyYW5zYWN0aW9uIExpbmVzIQAAAFB1cmNoYXNlIEludm9pY2UgVHJhbnNhY3Rp
+b24gTGluZWkAAAAAcwsAAABnZXRRdWFudGl0eWYDMC4wcw4AAABnZXRTb3VyY2VEZWJpdHMPAAAA
+Z2V0U291cmNlQ3JlZGl0cxMAAABnZXREZXN0aW5hdGlvbkRlYml0cxQAAABnZXREZXN0aW5hdGlv
+bkNyZWRpdGlkAAAAcw4AAABnZXRTb3VyY2VWYWx1ZXMSAAAAZ2V0VmFsaWRhdGlvblN0YXRlcwkA
+AAB2YWxpZGF0ZWRzOAAAAEFjdGlvbiBpbXBvc3NpYmxlIDogQWNjb3VudCAke2FjY291bnRfdGl0
+bGV9IGlzICR7c3RhdGV9cwcAAABtYXBwaW5ncw0AAABhY2NvdW50X3RpdGxlcxIAAABnZXRUcmFu
+c2xhdGVkVGl0bGVzBAAAAHV0ZjhzBQAAAHN0YXRlcyEAAABnZXRUcmFuc2xhdGVkVmFsaWRhdGlv
+blN0YXRlVGl0bGVzEAAAAGdldEFjY291bnRUeXBlSWRzCgAAAHJlY2VpdmFibGVzBwAAAHBheWFi
+bGVzYgAAAEFjdGlvbiBpbXBvc3NpYmxlIDogbm8gVGhpcmQgUGFydHkgZGVmaW5lZCBmb3IgbGlu
+ZSAke2xpbmV9IHdoZXJlIEFjY291bnQgVHlwZSBpcyAke2FjY291bnRfdHlwZX0ucwQAAABsaW5l
+cwUAAABnZXRJZHMMAAAAYWNjb3VudF90eXBlcxMAAABnZXRBY2NvdW50VHlwZVZhbHVlcxgAAABn
+ZXRUcmFuc2xhdGVkTG9naWNhbFBhdGhzCgAAAGlzTWVtYmVyT2ZzFwAAAGFjY291bnRfdHlwZS9h
+c3NldC9iYW5rcxAAAABnZXRTb3VyY2VQYXltZW50c2MAAABBY3Rpb24gaW1wb3NzaWJsZSA6IG5v
+IEJhbmsgQWNjb3VudCBkZWZpbmVkIGZvciBsaW5lICR7bGluZX0gd2hlcmUgQWNjb3VudCBUeXBl
+IGlzICR7YWNjb3VudF90eXBlfS5zMAAAAEFjdGlvbiBpbXBvc3NpYmxlIDogY3JlZGl0IGlzIGdy
+ZWF0ZXIgdGhhbiBkZWJpdHMwAAAAQWN0aW9uIGltcG9zc2libGUgOiBjcmVkaXQgaXMgc21hbGxl
+ciB0aGFuIGRlYml0cyYAAABBY2NvdW50aW5nVHJhbnNhY3Rpb25fZGVsZXRlRW1wdHlMaW5lc3MI
+AAAAcmVkaXJlY3QoFAAAAHMeAAAAUHJvZHVjdHMuRENXb3JrZmxvdy5EQ1dvcmtmbG93cxAAAABW
+YWxpZGF0aW9uRmFpbGVkcw0AAABlcnJvcl9tZXNzYWdlcwkAAABfZ2V0aXRlbV9zDAAAAHN0YXRl
+X2NoYW5nZXMLAAAAdHJhbnNhY3Rpb25zCQAAAF9nZXRhdHRyX3MCAAAATl9zCQAAAGNvbnRhaW5l
+cnMOAAAAc291cmNlX3NlY3Rpb25zEwAAAGRlc3RpbmF0aW9uX3NlY3Rpb25zHQAAAGFjY291bnRp
+bmdUcmFuc2FjdGlvbkxpbmVMaXN0cwMAAABzdW1zCQAAAF9nZXRpdGVyX3MQAAAAdHJhbnNhY3Rp
+b25fbGluZXMIAAAAcXVhbnRpdHlzAwAAAGludHMFAAAAcm91bmRzBAAAAE5vbmVzBwAAAHVuaWNv
+ZGUoFAAAAHMMAAAAc3RhdGVfY2hhbmdlcx4AAABQcm9kdWN0cy5EQ1dvcmtmbG93LkRDV29ya2Zs
+b3dzEAAAAFZhbGlkYXRpb25GYWlsZWRzDQAAAGVycm9yX21lc3NhZ2VzCQAAAF9nZXRpdGVtX3ML
+AAAAdHJhbnNhY3Rpb25zCQAAAF9nZXRhdHRyX3MCAAAATl9zCQAAAGNvbnRhaW5lcnMOAAAAc291
+cmNlX3NlY3Rpb25zEwAAAGRlc3RpbmF0aW9uX3NlY3Rpb25zHQAAAGFjY291bnRpbmdUcmFuc2Fj
+dGlvbkxpbmVMaXN0cwMAAABzdW1zCQAAAF9nZXRpdGVyX3MQAAAAdHJhbnNhY3Rpb25fbGluZXMI
+AAAAcXVhbnRpdHlzAwAAAGludHMFAAAAcm91bmRzBAAAAE5vbmVzBwAAAHVuaWNvZGUoAAAAACgA
+AAAAcw8AAABTY3JpcHQgKFB5dGhvbilzGAAAAHZhbGlkYXRlVHJhbnNhY3Rpb25MaW5lcwEAAABz
+SgAAAA0CBgEPARIDEAMeAR4DHAEPAR4EBgENAAYBDQEdAiIBIAEaAiACJQEMATEBNgMoARwBDAIc
+AUIDHwEcAQwCHAFAAw0BEwENARoCKAEAAABzGAAAAHZhbGlkYXRlVHJhbnNhY3Rpb25MaW5lcygB
+AAAAcxgAAAB2YWxpZGF0ZVRyYW5zYWN0aW9uTGluZXMoAAAAACgAAAAAcw8AAABTY3JpcHQgKFB5
+dGhvbilzCAAAADxtb2R1bGU+AQAAAHMAAAAA</string> </value>
         </item>
         <item>
             <key> <string>_dav_writelocks</string> </key>
@@ -186,12 +202,6 @@ ZHVsZT4BAAAAcwAAAAA=</string> </value>
             <key> <string>_filepath</string> </key>
             <value> <string>Script (Python):/nexedi/portal_workflow/accounting_workflow/scripts/validateTransactionLines</string> </value>
         </item>
-        <item>
-            <key> <string>_owner</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
         <item>
             <key> <string>_params</string> </key>
             <value> <string>state_change</string> </value>
@@ -199,7 +209,19 @@ ZHVsZT4BAAAAcwAAAAA=</string> </value>
         <item>
             <key> <string>_proxy_roles</string> </key>
             <value>
-              <tuple/>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Authenticated</string>
+                <string>Author</string>
+                <string>Manager</string>
+                <string>Member</string>
+                <string>Owner</string>
+                <string>Reviewer</string>
+              </tuple>
             </value>
         </item>
         <item>
@@ -230,9 +252,10 @@ ZHVsZT4BAAAAcwAAAAA=</string> </value>
                             <string>Products.DCWorkflow.DCWorkflow</string>
                             <string>ValidationFailed</string>
                             <string>error_message</string>
-                            <string>_getattr_</string>
+                            <string>_getitem_</string>
                             <string>transaction</string>
-                            <string>portal</string>
+                            <string>_getattr_</string>
+                            <string>N_</string>
                             <string>container</string>
                             <string>source_section</string>
                             <string>destination_section</string>
@@ -244,7 +267,7 @@ ZHVsZT4BAAAAcwAAAAA=</string> </value>
                             <string>int</string>
                             <string>round</string>
                             <string>None</string>
-                            <string>DISABLED</string>
+                            <string>unicode</string>
                           </tuple>
                         </value>
                     </item>
-- 
2.30.9