From d661750ac19d857280b2ca27d0ffae421964ac88 Mon Sep 17 00:00:00 2001
From: Arnaud Fontaine <arnaud.fontaine@nexedi.com>
Date: Fri, 21 Sep 2018 12:53:18 +0900
Subject: [PATCH] erp5_accounting_l10n_fr: Make sure that FEC XML output is
 always the same given the same data.

---
 ...ansactionModule_aggregateFrenchAccountingTransactionFile.py | 3 ++-
 .../AccountingTransactionModule_viewComptabiliteAsFECXML.zpt   | 2 +-
 .../AccountingTransaction_viewAsDestinationFECXML.zpt          | 2 +-
 .../AccountingTransaction_viewAsSourceFECXML.zpt               | 2 +-
 4 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransactionModule_aggregateFrenchAccountingTransactionFile.py b/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransactionModule_aggregateFrenchAccountingTransactionFile.py
index 09d6b04a20..9304ca0dcb 100644
--- a/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransactionModule_aggregateFrenchAccountingTransactionFile.py
+++ b/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransactionModule_aggregateFrenchAccountingTransactionFile.py
@@ -6,7 +6,8 @@ portal = context.getPortalObject()
 active_process = portal.restrictedTraverse(active_process)
 
 # XXX we need proxy role for this
-result_list = active_process.getResultList()
+result_list = [ result.detail.decode('zlib') for result in active_process.getResultList() ]
+result_list.sort()
 
 fec_file = context.AccountingTransactionModule_viewComptabiliteAsFECXML(
       at_date=at_date,
diff --git a/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransactionModule_viewComptabiliteAsFECXML.zpt b/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransactionModule_viewComptabiliteAsFECXML.zpt
index fb1e3961ca..efe329cd3d 100644
--- a/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransactionModule_viewComptabiliteAsFECXML.zpt
+++ b/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransactionModule_viewComptabiliteAsFECXML.zpt
@@ -2,6 +2,6 @@
 <comptabilite xmlns:tal="http://xml.zope.org/namespaces/tal">
   <exercice>
     <DateCloture tal:content="python: options['at_date'].strftime('%Y-%m-%d')">20141231</DateCloture>
-    <tal:block tal:repeat="result options/result_list"><tal:block tal:replace="structure python: result.detail.decode('zlib')"/></tal:block>
+    <tal:block tal:repeat="result options/result_list"><tal:block tal:replace="structure python: result"/></tal:block>
   </exercice>
 </comptabilite>
\ No newline at end of file
diff --git a/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransaction_viewAsDestinationFECXML.zpt b/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransaction_viewAsDestinationFECXML.zpt
index e7aa6e2682..d8f1895179 100644
--- a/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransaction_viewAsDestinationFECXML.zpt
+++ b/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransaction_viewAsDestinationFECXML.zpt
@@ -7,7 +7,7 @@
   <tal:block tal:replace="nothing"><EcritureLet></EcritureLet>
   <DateLet></DateLet></tal:block>
   <ValidDate tal:content="python: context.AccountingTransaction_getDeliverDate().strftime('%Y-%m-%d')">Modification Date</ValidDate>
-  <tal:block tal:repeat="line python:context.contentValues(portal_type=context.getPortalAccountingMovementTypeList())"><ligne
+  <tal:block tal:repeat="line python:sorted(context.contentValues(portal_type=context.getPortalAccountingMovementTypeList()), key=lambda x: (x.getDestination(), x.getQuantity()))"><ligne
     tal:define="account python:line.getDestinationValue(portal_type='Account')" tal:condition="python: account is not None">
       <CompteNum tal:content="account/Account_getGapId">Reference Compte (Account_getGapId)</CompteNum>
       <CompteLib tal:content="line/Movement_getDestinationCompteLib">Translated Title Compte</CompteLib>
diff --git a/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransaction_viewAsSourceFECXML.zpt b/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransaction_viewAsSourceFECXML.zpt
index 7cbe9f686b..6e3e6de275 100644
--- a/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransaction_viewAsSourceFECXML.zpt
+++ b/bt5/erp5_accounting_l10n_fr/SkinTemplateItem/portal_skins/erp5_accounting_l10n_fr/AccountingTransaction_viewAsSourceFECXML.zpt
@@ -7,7 +7,7 @@
   <tal:block tal:replace="nothing"><EcritureLet></EcritureLet>
   <DateLet></DateLet></tal:block>
   <ValidDate tal:content="python: context.AccountingTransaction_getDeliverDate().strftime('%Y-%m-%d')">Modification Date</ValidDate>
-  <tal:block tal:repeat="line python:context.contentValues(portal_type=context.getPortalAccountingMovementTypeList())"><ligne
+  <tal:block tal:repeat="line python:sorted(context.contentValues(portal_type=context.getPortalAccountingMovementTypeList()), key=lambda x: (x.getSource(), x.getQuantity()))"><ligne
     tal:define="account python:line.getSourceValue(portal_type='Account')" tal:condition="python: account is not None">
       <CompteNum tal:content="account/Account_getGapId">Reference Compte (Account_getGapId)</CompteNum>
       <CompteLib tal:content="line/Movement_getSourceCompteLib">Translated Title Compte</CompteLib>
-- 
2.30.9