{"id":21313,"date":"2022-04-11T13:56:08","date_gmt":"2022-04-11T11:56:08","guid":{"rendered":"https:\/\/help.openbee.com\/open-bee-scan-capture\/knowledge-base\/how-to-guides\/scripts-in-capture\/case-studies\/writing\/export-writes-generate-a-write-file-via-script\/"},"modified":"2026-05-13T09:36:48","modified_gmt":"2026-05-13T07:36:48","slug":"export-writes-generate-a-write-file-via-script","status":"publish","type":"page","link":"https:\/\/help.openbee.com\/en\/open-bee-scan-capture\/knowledge-base\/how-to-guides\/scripts-in-capture\/case-studies\/writing\/export-writes-generate-a-write-file-via-script\/","title":{"rendered":"Export writes: Generate a write file via Script"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"Exportecritures:G&#xE9;n&#xE9;rationd'unfichierd'&#xE9;critureviaScript-Principe\">Principle<\/h1>\n\n<p>The purpose of this script is to generate an accounting entry file when exporting a batch. It contains several functions that can be easily reused.<\/p>\n\n<p>Example of file contents after script interpretation<\/p>\n\n<pre class=\"wp-block-code\"><code>SOCIETE;CODE;ID;NUMERO_LIGNE;SENS;CODE_FACTURE;LIBELLE_ECRITURE;DATE_COMPTABLE;DATE_PIECE;DATE_ECHEANCE;TYPE_TIERS;COMPTE;CENTRALISATEUR;DEBIT;CREDIT;DEVISE;AXE0;TAUX_TVA;BASE_TVA;URL;ID_CAPTURE\n341;ACH;507;2;Facture;1409322;Fact_19122019_867;30\/09\/2014;30\/09\/2014;31\/10\/2014;F;FTIERS10;401000;;55.2;EUR;;;TTC;http:\/\/localhost:8000\/browse\/previewDocument\/idDocument\/507;867;\n341;ACH;507;3;Facture;1409322;Fact_19122019_867;30\/09\/2014;30\/09\/2014;31\/10\/2014;;445616;445616;9.2;;EUR;;20.00;TVA;http:\/\/localhost:8000\/browse\/previewDocument\/idDocument\/507;867;\n341;ACH;507;4;Facture;1409322;Fact_19122019_867;30\/09\/2014;30\/09\/2014;31\/10\/2014;;601100;601100;46;;EUR;;20.00;HT;http:\/\/localhost:8000\/browse\/previewDocument\/idDocument\/507;867;\n341;ACH;512;5;Facture;1410243;Fact_20122019_876;28\/10\/2014;28\/10\/2014;30\/11\/2014;F;FANNECY;40120000;;190.8;EUR;;;TTC;http:\/\/localhost:8000\/browse\/previewDocument\/idDocument\/512;876;\n341;ACH;512;6;Facture;1410243;Fact_20122019_876;28\/10\/2014;28\/10\/2014;30\/11\/2014;;445600;445600;31.8;;EUR;;20.00;TVA;http:\/\/localhost:8000\/browse\/previewDocument\/idDocument\/512;876;\n341;ACH;512;7;Facture;1410243;Fact_20122019_876;28\/10\/2014;28\/10\/2014;30\/11\/2014;;601100;601100;159;;EUR;;20.00;HT;http:\/\/localhost:8000\/browse\/previewDocument\/idDocument\/512;876;\n\n<\/code><\/pre>\n\n<h1 class=\"wp-block-heading\" id=\"Exportecritures:G&#xE9;n&#xE9;rationd'unfichierd'&#xE9;critureviaScript-Script\">Script<\/h1>\n\n<pre class=\"wp-block-code\"><code>var save_Analytic = null;\n\/\/Allow to get index value on &#91;pParameters] list from &#91;idIndex] and &#91;idUnit](number which identify an occurence of index if it has multiple values)\nvar getIndexFromIDAndIDUnit = function(pParameters, idIndex, idUnit){\n\tvar listIndex = getIndexesFromID(pParameters, idIndex);\n\tif(listIndex != null){\n\t\tfor(var i=0;i&lt;listIndex.length;i++){\n\t\t\tif(listIndex&#91;i].idUnit == idUnit)\n\t\t\t\treturn getTextFromIndexInfo(listIndex&#91;i]);\n\t\t}\n\t}\n\treturn \"\";\n};\nvar getAccountType = function(line){\n\tif(line.accountNumber != null &amp;&amp; line.accountNumber != \"\" &amp;&amp; line.genericAccountNumber != null &amp;&amp; line.genericAccountNumber != \"\")\n\t\treturn \"PersonalLine\";\n\tif(line.accountNumber != null &amp;&amp; line.accountNumber != \"\"){\n\t\tif(line.accountNumber.lastIndexOf(\"445\", 0) === 0)\n\t\t\treturn \"VATLine\";\n\t\treturn \"ChargeLine\";\n\t}\n\treturn \"\";\n};\nvar buildSaveAnalytic = function(lines){\n\tsave_Analytic = &#91;];\n\t\n\tfor(var i=0;i&lt;lines.length;i++){\t\n\t\t\n\t\tvar line = lines&#91;i];\n\t\tif(save_Analytic.length == 0 &amp;&amp; getAccountType(line) == \"ChargeLine\" &amp;&amp; line.analyticalBreakdown != null &amp;&amp; line.analyticalBreakdown.ventilatedPlanList != null){\n\t\t\tfor(var p=0;p &lt; line.analyticalBreakdown.ventilatedPlanList.length;p++){\n\t\t\t\tif(line.analyticalBreakdown.ventilatedPlanList&#91;p].lines != null &amp;&amp; line.analyticalBreakdown.ventilatedPlanList&#91;p].lines.length &gt; 0){\n\t\t\t\t\tfor(var l=0;l &lt; line.analyticalBreakdown.ventilatedPlanList&#91;p].lines.length;l++){\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar abLine = line.analyticalBreakdown.ventilatedPlanList&#91;p].lines&#91;l];\n\t\t\t\t\t\tsave_Analytic.push({code : abLine.section.code, percent: (abLine.allocatedAmount * 100 \/ line.amount)});\n\t\t\t\t\t}\n\t\t\t\t\tbreak; \n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\nvar manageABD = function(line, pParameters, countResult){\n\tvar resultAB = \"\";\n\tif(line.analyticalBreakdown != null &amp;&amp; line.analyticalBreakdown.ventilatedPlanList != null){\n\t\tfor(var p=0;p &lt; line.analyticalBreakdown.ventilatedPlanList.length;p++){\n\t\t\tif(line.analyticalBreakdown.ventilatedPlanList&#91;p].lines != null &amp;&amp; line.analyticalBreakdown.ventilatedPlanList&#91;p].lines.length &gt; 0){\n\t\t\t\tfor(var l=0;l &lt; line.analyticalBreakdown.ventilatedPlanList&#91;p].lines.length;l++){\n\t\t\t\t\t\n\t\t\t\t\tvar abLine = line.analyticalBreakdown.ventilatedPlanList&#91;p].lines&#91;l];\n\t\t\t\t\tif(abLine.section != null)\n\t\t\t\t\t\tresultAB += buildLine(line, pParameters, abLine.allocatedAmount, abLine.section.code, countResult);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}else if(save_Analytic != null){\n\t\tvar totalLineHandled = 0.0;\n\t\t\n\t\tfor(var l=0;l &lt; save_Analytic.length;l++){\n\t\t\tvar abLine = save_Analytic&#91;l];\n\t\t\t\n\t\t\tif(abLine.code != null &amp;&amp; abLine.percent != null){\n\t\t\t\tvar calculAmount = 0.0;\n\t\t\t\tif(l &lt; save_Analytic.length -1){\n\t\t\t\t\tcalculAmount = line.amount * (abLine.percent \/ 100);\n\t\t\t\t\ttotalLineHandled += calculAmount;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tcalculAmount = line.amount - totalLineHandled;\n\t\t\t\tresultAB += buildLine(line, pParameters, calculAmount, abLine.code, countResult);\n\t\t\t}\n\t\t}\n\t}\n\treturn resultAB;\n}\nvar buildLineWrapper = function(line, pParameters, countResult){\n\tif(line.amount != null)\n\t\tline.amount = parseFloat(line.amount.replace(',', '.'));\n\telse\n\t\tline.amount = 0.0;\n\tif((line.analyticalBreakdown != null &amp;&amp; line.analyticalBreakdown.ventilatedPlanList != null &amp;&amp; line.analyticalBreakdown.ventilatedPlanList.length &gt; 0) \n\t\t|| (getAccountType(line) == \"ChargeLine\" &amp;&amp; save_Analytic != null &amp;&amp; save_Analytic.length &gt; 0))\n\t\treturn manageABD(line, pParameters, countResult);\n\telse\n\t\treturn buildLine(line, pParameters, line.amount, \"\", countResult);\n};\nvar getVATFromIndex = function(line, pParameters, pIndexID){\n\tvar listIndex = getIndexesFromID(pParameters, pIndexID);\n\tif(listIndex != null){\n\t\tfor(var i=0;i&lt;listIndex.length;i++){\n\t\t\tvar amount = parseFloat(getTextFromIndexInfo(listIndex&#91;i]).replace(',', '.'));\n\t\t\tif(amount == line.amount){\n\t\t\t\tvar vatRateStr = getIndexFromIDAndIDUnit(pParameters, \"VAT_RATE_INDEX\", listIndex&#91;i].idUnit);\n\t\t\t\tif(vatRateStr != null)\n\t\t\t\t\treturn vatRateStr.replace('.', ',');\n\t\t\t}\n\t\t}\n\t}\n\treturn \"\";\n};\nvar buildLine = function(line, pParameters, amount, codeAB, countResult){\n\t\n\tvar result = \"341\";\n\tresult += \";\";\n\t\n\tif(ACCOUNT_ENTRY.ledger != null)\n\t\tresult += ACCOUNT_ENTRY.ledger.code;\n\telse\n\t\tresult += \"\";\n\tresult += \";\";\n\tresult+= ID_DMS;\n\tresult += \";\";\n\tresult += countResult;\n\tresult += \";\";\n\tresult += getTextFromIndexInfo(getFirstIndexFromID(pParameters, \"TYPEDOC_INDEX\"));\n\tresult += \";\";\n\tresult += getTextFromIndexInfo(getFirstIndexFromID(pParameters, \"INVOICE_NUMBER_INDEX\"));\n\tresult += \";\";\n\tresult += line.labelLine;\n\tresult += \";\";\n\tresult += ACCOUNT_ENTRY.date;\n\tresult += \";\";\n\tresult += getTextFromIndexInfo(getFirstIndexFromID(pParameters, \"DATE_INDEX\"));\t\t\n\tresult += \";\";\n\tresult += getTextFromIndexInfo(getFirstIndexFromID(pParameters, \"DUE_DATE_INDEX\"));\n\tresult += \";\";\n\tif(getAccountType(line) == \"PersonalLine\")\n\t\tresult += \"F\";\n\tresult += \";\";\n\tresult += line.accountNumber;\n\tresult += \";\";\n\tif(line.genericAccountNumber != null &amp;&amp; line.genericAccountNumber != \"\")\n\t\tresult += line.genericAccountNumber;\n\telse\n\t\tresult += line.accountNumber;\n\tresult += \";\";\n\tif(line.meaning == \"DEBIT\")\n\t\tresult += amount.toFixed(2).replace('.', ',');\n\telse\n\t\tresult += \"\";\n\tresult += \";\";\n\tif(line.meaning == \"CREDIT\")\n\t\tresult += amount.toFixed(2).replace('.', ',');\n\telse\n\t\tresult += \"\";\n\tresult += \";\";\n\tresult += getTextFromIndexInfo(getFirstIndexFromID(pParameters, \"DEVISE_INDEX\"));\n\tresult += \";\";\n\tresult += codeAB;\n\tresult += \";\";\n\tif(getAccountType(line) == \"PersonalLine\")\n\t\tresult += \"\";\n\telse if(getAccountType(line) == \"VATLine\")\n\t\tresult += getVATFromIndex(line, pParameters, \"VAT_AMOUNT_INDEX\");\n\telse if(getAccountType(line) == \"ChargeLine\")\n\t\tresult += getVATFromIndex(line, pParameters, \"AMOUNT_EX_VAT_INDEX\");\n\tresult += \";\";\n\tif(getAccountType(line) == \"PersonalLine\")\n\t\tresult += \"TTC\";\n\telse if(getAccountType(line) == \"VATLine\")\n\t\tresult += \"TVA\";\n\telse if(getAccountType(line) == \"ChargeLine\")\n\t\tresult += \"HT\";\n\tresult += \";\";\n\tresult += \"http:\/\/localhost:8000\/browse\/previewDocument\/idDocument\/\"+ ID_DMS;\n\tresult += \";\";\n\tresult += ID_INVOICE;\n\tresult += \";\";\n\t\n\tresult +=\"n\";\n\treturn result;\n};\nif(ACCOUNT_ENTRY != null &amp;&amp; ACCOUNT_ENTRY.lines != null){\n\tbuildSaveAnalytic(ACCOUNT_ENTRY.lines);\n\tvar finalPathFile = 'C:DocumentsCapture'+ACCOUNT_ENTRY.bundleId+'.csv';\n\tif(ACCOUNT_ENTRY_NUMBER == 1)\n\t\tJSE_File.writeFile(finalPathFile, \"SOCIETE;CODE;ID;NUMERO_LIGNE;SENS;CODE_FACTURE;LIBELLE_ECRITURE;DATE_COMPTABLE;DATE_PIECE;DATE_ECHEANCE;TYPE_TIERS;COMPTE;CENTRALISATEUR;DEBIT;CREDIT;DEVISE;AXE0;TAUX_TVA;BASE_TVA;URL;ID_CAPTUREn\");\n\tvar result = JSE_File.readFile(finalPathFile);\n\tvar countResult = result.split('n').length - 1;\n\tfor(var i=0;i&lt;ACCOUNT_ENTRY.lines.length;i++){\n\t\tvar line = ACCOUNT_ENTRY.lines&#91;i];\n\t\tresult += buildLineWrapper(line, pParameters, countResult);\n\t\tcountResult++;\n\t}\n\tJSE_File.writeFile(finalPathFile, result);\n\treturn true;\n}\nreturn false;<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Principle The purpose of this script is to generate an accounting entry file when exporting a batch. It contains several functions that can be easily reused. Example of file contents after script interpretation Script<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":21274,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"templates\/ob-help-products.php","meta":{"footnotes":""},"class_list":["post-21313","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/help.openbee.com\/en\/wp-json\/wp\/v2\/pages\/21313","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/help.openbee.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/help.openbee.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/help.openbee.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/help.openbee.com\/en\/wp-json\/wp\/v2\/comments?post=21313"}],"version-history":[{"count":1,"href":"https:\/\/help.openbee.com\/en\/wp-json\/wp\/v2\/pages\/21313\/revisions"}],"predecessor-version":[{"id":21314,"href":"https:\/\/help.openbee.com\/en\/wp-json\/wp\/v2\/pages\/21313\/revisions\/21314"}],"up":[{"embeddable":true,"href":"https:\/\/help.openbee.com\/en\/wp-json\/wp\/v2\/pages\/21274"}],"wp:attachment":[{"href":"https:\/\/help.openbee.com\/en\/wp-json\/wp\/v2\/media?parent=21313"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}