Bug #2416: Balise <<SOLDE>> dans les documents

This commit is contained in:
sparkyx 2025-06-19 13:44:42 +02:00
parent 871df2a9de
commit f4bf55bff7
3 changed files with 362 additions and 188 deletions

View file

@ -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);

View file

@ -0,0 +1,341 @@
<?php
use PHPUnit\Framework\TestCase;
/*
* This file is part of NOALYSS.
*
* PhpCompta is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* PhpCompta is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PhpCompta; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
/**
* @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 = "N<ew file name (21-01-01).odt";
$new_filename = $document->compute_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';
}
}

View file

@ -1,185 +0,0 @@
<?php
use PHPUnit\Framework\TestCase;
/*
* This file is part of NOALYSS.
*
* PhpCompta is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* PhpCompta is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PhpCompta; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
/**
* @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="N<ew file name (21-01-01).odt";
$new_filename=$document->compute_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");
}
}