From 6e57263e833d9386be4fe938184b4aab15acf94f Mon Sep 17 00:00:00 2001 From: sparkyx Date: Thu, 19 Jun 2025 19:11:16 +0200 Subject: [PATCH] Bug #2416: Balise <> dans les documents --- include/class/document.class.php | 24 +- unit-test/include/class/DocumentTest.php | 341 ++++++++++++++++++++++ unit-test/include/class/document.Test.php | 185 ------------ 3 files changed, 362 insertions(+), 188 deletions(-) create mode 100644 unit-test/include/class/DocumentTest.php delete mode 100644 unit-test/include/class/document.Test.php diff --git a/include/class/document.class.php b/include/class/document.class.php index 6a109d3c9..ba2da5f14 100644 --- a/include/class/document.class.php +++ b/include/class/document.class.php @@ -711,7 +711,7 @@ class Document function replace($p_tag, $p_array) { - global $g_parameter; + global $g_parameter,$g_user; $p_tag=strtoupper($p_tag); $p_tag=noalyss_str_replace('=', '', $p_tag); $r="Tag inconnu"; @@ -798,8 +798,26 @@ class Document $qcode=isset($p_array['qcode_dest'])?$p_array['qcode_dest']:$p_array['e_client']; $tiers->get_by_qcode($qcode, false); $p=$tiers->strAttribut(ATTR_DEF_ACCOUNT,0); - $poste=new Acc_Account_Ledger($this->db, $p); - $r=$poste->get_solde(' true'); + // if exercice is open with a report, 1 day is 1st exercice's day + if ( $g_parameter->MY_REPORT == 'Y') { + // var $user_exercice (int) current user exercice (from his preference) + $user_exercice=$g_user->get_exercice(); + // var $start_date (text) First day of this exercice + $start_date=$this->db->get_value(" + select to_char(min(p_start),'YYYYMMDD') first_day + from parm_periode where p_exercice=$1" + ,[$user_exercice]); + // var $end_date (text) last day of this exercice + $end_date =$this->db->get_value(" + select to_char(max(p_end),'YYYYMMDD') last_day + from parm_periode where p_exercice=$1" + ,[$user_exercice]); + $a=$tiers->get_solde_detail(" to_char(jrnx.j_date,'YYYYMMDD')>='{$start_date}' and to_char(jrnx.j_date,'YYYYMMDD') <= '{$end_date}' "); + $r = round($a['solde'],4); + }else { + $a=$tiers->get_solde_detail(); + $r = round($a['solde'],4); + } break; case 'CUST_NAME': $tiers=new Fiche($this->db); diff --git a/unit-test/include/class/DocumentTest.php b/unit-test/include/class/DocumentTest.php new file mode 100644 index 000000000..ea7248510 --- /dev/null +++ b/unit-test/include/class/DocumentTest.php @@ -0,0 +1,341 @@ + + +/** + * @file + * @brief test \Document + */ +require DIRTEST . '/global.php'; + +class DocumentTest extends TestCase { + + /** + * Document + */ + private $document; + + static function get_variable() { + $request = array( + "ac" => "GESTION/FOLLOW", + "gDossier" => 25, + "ag_ref" => "FACTUR4-25", + "dt_id" => 4, + "qcode_dest" => "CLIENT1", + "ag_timestamp" => "19.06.2025", + "ag_hour" => "", + "ag_remind_date" => "", + "ag_state" => 2, + "ag_priority" => 2, + "ag_dest" => 1, + "operation" => "", + "action" => "", + "ag_title" => "Facture", + "ag_description" => "", + "nb_item" => 5, + "e_march0" => "DOCUME", + "e_march0_label" => "Documentation", + "e_march0_price" => 121, + "e_quant0" => 1, + "e_march0_tva_id" => 6, + "e_march0_tva_amount" => 0, + "tvac_march0" => 121, + "tva_march0" => 0, + "htva_march0" => 121, + "ad_id0" => 0, + "e_march1" => "", + "e_march1_label" => "", + "e_march1_price" => "", + "e_quant1" => 1, + "e_march1_tva_id" => "", + "e_march1_tva_amount" => 0, + "tvac_march1" => 0, + "tva_march1" => 0, + "htva_march1" => 0, + "ad_id1" => 0, + "e_march2" => "", + "e_march2_label" => "", + "e_march2_price" => "", + "e_quant2" => 1, + "e_march2_tva_id" => "", + "e_march2_tva_amount" => 0, + "tvac_march2" => 0, + "tva_march2" => 0, + "htva_march2" => 0, + "ad_id2" => 0, + "e_march3" => "", + "e_march3_label" => "", + "e_march3_price" => "", + "e_quant3" => 1, + "e_march3_tva_id" => "", + "e_march3_tva_amount" => 0, + "tvac_march3" => 0, + "tva_march3" => 0, + "htva_march3" => 0, + "ad_id3" => 0, + "e_march4" => "", + "e_march4_label" => "", + "e_march4_price" => "", + "e_quant4" => 1, + "e_march4_tva_id" => "", + "e_march4_tva_amount" => 0, + "tvac_march4" => 0, + "tva_march4" => 0, + "htva_march4" => 0, + "ad_id4" => 0, + "6853eaa02e5af_ledger" => "O", + "6853eaa02e5af" => 1, + "d_id" => 0, + "ag_id" => 3, + "f_id_dest" => "", + "sa" => "save_action_st2", + "save_action_st2" => "Enregistrer" + ); + return $request; + } + + public static function setUpBeforeClass(): void { + // insert a document_modele + $cn = Dossier::connect(); + $cn->start(); + $md_id = $cn->get_next_seq('document_modele_md_id_seq'); + $sql = "insert into document_modele(md_id,md_name,md_filename,md_mimetype,md_type,md_affect) + values ($1,$2,$3,$4,$5,$6)"; + $cn->exec_sql($sql, array($md_id, "Balise", "all-tags.odt", "application/vnd.oasis.opendocument.text", "4", "GES")); + $oid = $cn->lo_import(__DIR__ . "/data/all_tags.odt"); + $cn->exec_sql("update document_modele set md_lob = $1 where md_id=$2", [$oid, $md_id]); + $cn->exec_sql("update parameter set pr_value='Dossier Test' where pr_id=$1", + ['MY_NAME']); + $cn->exec_sql("update parameter set pr_value='BE00112233' where pr_id=$1", + ['MY_TVA']); + $cn->exec_sql("update parameter set pr_value='My street' where pr_id=$1", + ['MY_STREET']); + + $cn->commit(); + } + + public static function tearDownAfterClass(): void { + // clean database + $cn = Dossier::connect(); + $cn->start(); + $md_id = $cn->get_value("select max(md_id) from document_modele where md_name='Balise'"); + $oid = $cn->get_value("select md_lob from document_modele where md_id=$1", [$md_id]); + if ($oid != "") { + $cn->lo_unlink($oid); + } + $cn->exec_sql("delete from document_modele where md_id=$1", [$md_id]); + $cn->exec_sql("delete from document where ag_id=1"); + $cn->commit(); + } + + /** + * Sets up the fixture, for example, opens a network connection. + * This method is called before a test is executed. + */ + protected function setUp(): void { + + } + + /** + * Tears down the fixture, for example, closes a network connection. + * This method is called after a test is executed. + */ + protected function tearDown(): void { + + } + + function testBlank() { + $cn = Dossier::connect(); + $document = new Document($cn); + $document->ag_id = 1; + $document->md_type = 4; + $document->blank(); + $this->assertTrue($document->d_id > -1, "Document inserted"); + $this->assertTrue(isset($document->d_number) && ($document->d_number > 0), "Document inserted"); + } + + function testCompute_filename() { + $cn = Dossier::connect(); + $document = new Document($cn); + $filename = "Ncompute_filename("ACH'->42", $filename); + $this->assertEquals("n-ew-file-name-21-01-01-ach-42.odt", $new_filename, "Sanitize filename"); + } + + function testReplace() { + $cn = Dossier::connect(); + global $g_parameter; + $g_parameter = new Noalyss_Parameter_Folder($cn); + $document = new Document($cn); + $array = []; + $array['e_client'] = 'CLIENT'; + + $this->assertTrue($document->replace('MY_NAME', array()) == 'Dossier Test', 'MY_NAME'); + $this->assertTrue($document->replace('MY_TVA', array()) == 'BE00112233', 'MY_TVA'); + $this->assertTrue($document->replace('MY_STREET', array()) == 'My street', 'MY_STREET'); + $this->assertTrue($document->replace('CUST_NAME', $array) == 'Client 1', 'CUST_NAME'); + } + + /** + * @testdox Generate Document::generate(), Document::parseDocument(),Document::replace(); require unoconv -l in another session + * @covers Document::generate(), Document::parseDocument(),Document::replace(); + */ + function testGenerate() { + require_once 'global.php'; + $cn = Dossier::connect(); + $md_id = $cn->get_value('select max(md_id) md_id from document_modele where md_name=$1', ['Balise']); + $array['e_client'] = 'CLIENT'; + $array['e_date'] = '21.03.2020'; + $document = new Document($cn, $md_id); + $document->ag_id = 2; + $document->md_id = $md_id; + $cnt_before = $cn->get_value("select count(*) from document"); + $document->generate($array); + + $this->assertEquals($document->d_filename, 'all-tags.odt', 'Generated File '); + $cnt_after = $cn->get_value("select count(*) from document"); + $this->assertTrue($cnt_after == $cnt_before + 1, "One file generated"); + } + + /** + * @testdox test $_ENV['TMP'] + */ + function testGenerateTmp() { + $cn = Dossier::connect(); + $md_id = $cn->get_value('select max(md_id) md_id from document_modele where md_name=$1', ['Balise']); + $array['e_client'] = 'CLIENT'; + $array['e_date'] = '21.03.2020'; + $document = new Document($cn, $md_id); + $document->ag_id = 2; + $document->md_id = $md_id; + $cnt_before = $cn->get_value("select count(*) from document"); + $tEnv = $_ENV['TMP']; + $_ENV['TMP'] = '/not.exist'; + $this->assertStringContainsString('échoué', $document->generate($array)); + $_ENV['TMP'] = $tEnv; + } + + /** + * @testdox ExtractPdf export PDF tests Document::export_pdf, Document::transform2pdf() + * + */ + function testExtractPdf() { + require "global.php"; + $cn = Dossier::connect(); + $d_id = $cn->get_value('select max(d_id) d_id from document'); + $document = new Document($cn); + $document->d_id = $d_id; + $document->get(); + $this->assertEquals($document->d_filename, 'all-tags.odt', 'get document row'); + $file = $document->transform2pdf(); + echo "Please check $file "; + $this->assertTrue(file_exists($file), "File exist"); + } + + function build_document() { + static $document = null; + if ($document == null) { + require "global.php"; + $cn = Dossier::connect(); + $d_id = $cn->get_value('select max(d_id) d_id from document'); + $document = new Document($cn); + $document->d_id = $d_id; + $document->get(); + } + return $document; + } + + function dataReplace() { + return array( + ["CUST_NAME", "Client 2"], + ["SOLDE", 27.29], + ["VEN_ART_NAME", "Documentation"], + ["VEN_ART_PRICE", "121"], + ["VEN_ART_QUANT", 1], + ["VEN_ART_LABEL", "Documentation"] + ); + } + + /** + * @testdox replace tag + * @backupGlobals enabled + * @dataProvider dataReplace + */ + function testReplace2($tag_name, $value) { + require "global.php"; + static $request = null; + static $parameter = null; + $document = $this->build_document(); + if ($request == null) { + $request = DocumentTest::get_variable(); + } + if ( $parameter == null ){ + $parameter=new \Noalyss_Parameter_Folder($document->db); + } + global $g_parameter; + $g_parameter=$parameter; + $g_parameter->MY_REPORT='Y'; + $name = $document->replace($tag_name, $request); + $this->assertEquals($name, $value, $tag_name." fails"); + } + + function dataBalance() + { + return array( + ['CLIENT1',27.29, 4204.14], + ['CLIENT',183.48, 3684.26], + ['BANQUE',0, 3500.53] + ); + } + /** + * @testdox test balance + * @backupGlobals enabled + * @dataProvider dataBalance + */ + function testBalance($quickcode,$balance_report,$balance_noreport) + { + require "global.php"; + require "global.php"; + static $request = null; + static $parameter = null; + $document = $this->build_document(); + if ($request == null) { + $request = DocumentTest::get_variable(); + } + if ( $parameter == null ){ + $parameter=new \Noalyss_Parameter_Folder($document->db); + } + global $g_parameter; + $g_parameter=$parameter; + $g_parameter->MY_REPORT='Y'; + + $request['qcode_dest']=$quickcode; + + $this->assertEquals($document->replace('SOLDE',$request),$balance_report,"{$quickcode} balance_report fails"); + $g_parameter->MY_REPORT='N'; + + $this->assertEquals($document->replace('SOLDE',$request),$balance_noreport,"{$quickcode} balance_noreport fails"); + + $g_parameter->MY_REPORT='Y'; + + } +} diff --git a/unit-test/include/class/document.Test.php b/unit-test/include/class/document.Test.php deleted file mode 100644 index 36248f277..000000000 --- a/unit-test/include/class/document.Test.php +++ /dev/null @@ -1,185 +0,0 @@ - - -/** - * @file - * @brief test \Document - */ -require DIRTEST.'/global.php'; - -class DocumentTest extends TestCase -{ - - /** - * Document - */ - private $document; - - public static function setUpBeforeClass():void - { - // insert a document_modele - $cn=Dossier::connect(); - $cn->start(); - $md_id=$cn->get_next_seq('document_modele_md_id_seq'); - $sql="insert into document_modele(md_id,md_name,md_filename,md_mimetype,md_type,md_affect) - values ($1,$2,$3,$4,$5,$6)"; - $cn->exec_sql($sql, array($md_id, "Balise", "all-tags.odt", "application/vnd.oasis.opendocument.text", "4", "GES")); - $oid=$cn->lo_import(__DIR__."/data/all_tags.odt"); - $cn->exec_sql("update document_modele set md_lob = $1 where md_id=$2", [$oid, $md_id]); - $cn->exec_sql("update parameter set pr_value='Dossier Test' where pr_id=$1", - ['MY_NAME']); - $cn->exec_sql("update parameter set pr_value='BE00112233' where pr_id=$1", - ['MY_TVA']); - $cn->exec_sql("update parameter set pr_value='My street' where pr_id=$1", - ['MY_STREET']); - - $cn->commit(); - } - - public static function tearDownAfterClass():void - { - // clean database - $cn=Dossier::connect(); - $cn->start(); - $md_id=$cn->get_value("select max(md_id) from document_modele where md_name='Balise'"); - $oid=$cn->get_value("select md_lob from document_modele where md_id=$1", [$md_id]); - if ($oid!="") - { - $cn->lo_unlink($oid); - } - $cn->exec_sql("delete from document_modele where md_id=$1", [$md_id]); - $cn->exec_sql("delete from document where ag_id=1"); - $cn->commit(); - } - - /** - * Sets up the fixture, for example, opens a network connection. - * This method is called before a test is executed. - */ - protected function setUp():void - { - - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown():void - { - - } - function testBlank() - { - $cn=Dossier::connect(); - $document=new Document($cn); - $document->ag_id=1; - $document->md_type=4; - $document->blank(); - $this->assertTrue($document->d_id>-1,"Document inserted") ; - $this->assertTrue(isset($document->d_number) &&($document->d_number>0),"Document inserted") ; - - } - function testCompute_filename() - { - $cn=Dossier::connect(); - $document=new Document($cn); - $filename="Ncompute_filename("ACH'->42", $filename); - $this->assertEquals("n-ew-file-name-21-01-01-ach-42.odt",$new_filename,"Sanitize filename"); - } - function testReplace() - { - $cn=Dossier::connect(); - global $g_parameter; - $g_parameter=new Noalyss_Parameter_Folder($cn); - $document=new Document($cn); - $array=[]; - $array['e_client']='CLIENT'; - - $this->assertTrue ( $document->replace('MY_NAME',array()) == 'Dossier Test','MY_NAME'); - $this->assertTrue ( $document->replace('MY_TVA',array()) == 'BE00112233','MY_TVA'); - $this->assertTrue ( $document->replace('MY_STREET',array()) == 'My street','MY_STREET'); - $this->assertTrue ( $document->replace('CUST_NAME',$array) == 'Client 1','CUST_NAME'); - } - /** - * @testdox Generate Document::generate(), Document::parseDocument(),Document::replace(); require unoconv -l in another session - * @covers Document::generate(), Document::parseDocument(),Document::replace(); - */ - function testGenerate() - { - require_once 'global.php'; - $cn=Dossier::connect(); - $md_id=$cn->get_value('select max(md_id) md_id from document_modele where md_name=$1',['Balise']); - $array['e_client']='CLIENT'; - $array['e_date']='21.03.2020'; - $document=new Document($cn,$md_id); - $document->ag_id=2; - $document->md_id=$md_id; - $cnt_before=$cn->get_value("select count(*) from document"); - $document->generate($array); - - $this->assertEquals($document->d_filename ,'all-tags.odt','Generated File '); - $cnt_after=$cn->get_value("select count(*) from document"); - $this->assertTrue ($cnt_after == $cnt_before+1,"One file generated"); - } - - /** - * @testdox test $_ENV['TMP'] - */ - function testGenerateTmp() - { - $cn=Dossier::connect(); - $md_id=$cn->get_value('select max(md_id) md_id from document_modele where md_name=$1',['Balise']); - $array['e_client']='CLIENT'; - $array['e_date']='21.03.2020'; - $document=new Document($cn,$md_id); - $document->ag_id=2; - $document->md_id=$md_id; - $cnt_before=$cn->get_value("select count(*) from document"); - $tEnv=$_ENV['TMP']; - $_ENV['TMP']='/not.exist'; - $this->assertStringContainsString ('échoué',$document->generate($array)); - $_ENV['TMP']= $tEnv; - } - - - /** - * @testdox ExtractPdf export PDF tests Document::export_pdf, Document::transform2pdf() - * - */ - function testExtractPdf() - { - require "global.php"; - $cn=Dossier::connect(); - $d_id=$cn->get_value('select max(d_id) d_id from document'); - $document=new Document($cn); - $document->d_id=$d_id; - $document->get(); - $this->assertEquals($document->d_filename,'all-tags.odt','get document row'); - $file=$document->transform2pdf(); - echo "Please check $file "; - $this->assertTrue (file_exists($file),"File exist"); - - } -}