From 9bbd285c3a800111ae793f4791f8c1816a016e18 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Sat, 2 Dec 2023 15:53:22 +0100 Subject: [PATCH 01/12] fix: feature MAIN_MAIL_ADD_INLINE_IMAGES_IF_IN_MEDIAS was broken --- htdocs/core/class/CMailFile.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/CMailFile.class.php b/htdocs/core/class/CMailFile.class.php index d05854d3435..166ae74e28f 100644 --- a/htdocs/core/class/CMailFile.class.php +++ b/htdocs/core/class/CMailFile.class.php @@ -268,7 +268,7 @@ class CMailFile if (!empty($conf->global->MAIN_MAIL_ADD_INLINE_IMAGES_IF_DATA)) { // Search into the body for findHtmlImages($dolibarr_main_data_root.'/medias'); + if ($findimg<0) { + dol_syslog("CMailFile::CMailfile: Error on findHtmlImages"); + $this->error = 'ErrorInAddAttachementsImageBAseOnMedia'; + return; + } } if (!empty($conf->global->MAIN_MAIL_ADD_INLINE_IMAGES_IF_DATA)) { // Search into the body for error = 'ErrorInAddAttachementsImageBAseOnMedia'; + return; + } + $findimg += $resultImageData; } // Set atleastoneimage if there is at least one embedded file (into ->html_images) @@ -1847,7 +1858,7 @@ class CMailFile // We search (into mail body this->html), if we find some strings like "... file=xxx.img" // For example when: - // + // $matches = array(); preg_match_all('/src="data:image\/('.implode('|', $extensions).');base64,([^"]+)"/Ui', $this->html, $matches); // If "xxx.ext" or 'xxx.ext' found diff --git a/test/phpunit/CMailFileTest.php b/test/phpunit/CMailFileTest.php index 729aa4b4c7f..9d270901dc2 100644 --- a/test/phpunit/CMailFileTest.php +++ b/test/phpunit/CMailFileTest.php @@ -23,18 +23,19 @@ * \remarks To run this script as CLI: phpunit filename.php */ -global $conf,$user,$langs,$db; +global $conf, $user, $langs, $db; //define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver //require_once 'PHPUnit/Autoload.php'; require_once dirname(__FILE__).'/../../htdocs/master.inc.php'; require_once dirname(__FILE__).'/../../htdocs/core/class/CMailFile.class.php'; +require_once dirname(__FILE__).'/../../htdocs/core/lib/files.lib.php'; if (empty($user->id)) { print "Load permissions for admin user nb 1\n"; $user->fetch(1); $user->getrights(); } -$conf->global->MAIN_DISABLE_ALL_MAILS=1; +$conf->global->MAIN_DISABLE_ALL_MAILS = 1; /** @@ -42,7 +43,7 @@ $conf->global->MAIN_DISABLE_ALL_MAILS=1; * * @backupGlobals disabled * @backupStaticAttributes enabled - * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased. + * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased. */ class CMailFileTest extends PHPUnit\Framework\TestCase { @@ -62,13 +63,13 @@ class CMailFileTest extends PHPUnit\Framework\TestCase parent::__construct(); //$this->sharedFixture - global $conf,$user,$langs,$db; - $this->savconf=$conf; - $this->savuser=$user; - $this->savlangs=$langs; - $this->savdb=$db; + global $conf, $user, $langs, $db; + $this->savconf = $conf; + $this->savuser = $user; + $this->savlangs = $langs; + $this->savdb = $db; - print __METHOD__." db->type=".$db->type." user->id=".$user->id; + print __METHOD__ . " db->type=" . $db->type . " user->id=" . $user->id; //print " - db ".$db->db; print "\n"; } @@ -80,23 +81,23 @@ class CMailFileTest extends PHPUnit\Framework\TestCase */ public static function setUpBeforeClass(): void { - global $conf,$user,$langs,$db; + global $conf, $user, $langs, $db; $db->begin(); // This is to have all actions inside a transaction even if test launched without suite. - print __METHOD__."\n"; + print __METHOD__ . "\n"; } /** * tearDownAfterClass * - * @return void + * @return void */ public static function tearDownAfterClass(): void { - global $conf,$user,$langs,$db; + global $conf, $user, $langs, $db; $db->rollback(); - print __METHOD__."\n"; + print __METHOD__ . "\n"; } /** @@ -106,24 +107,25 @@ class CMailFileTest extends PHPUnit\Framework\TestCase */ protected function setUp(): void { - global $conf,$user,$langs,$db; - $conf=$this->savconf; - $user=$this->savuser; - $langs=$this->savlangs; - $db=$this->savdb; + global $conf, $user, $langs, $db; + $conf = $this->savconf; + $user = $this->savuser; + $langs = $this->savlangs; + $db = $this->savdb; - $conf->global->MAIN_DISABLE_ALL_MAILS=1; // If I comment/remove this lien, unit test still works alone but failed when ran from AllTest. Don't know why. + $conf->global->MAIN_DISABLE_ALL_MAILS = 1; // If I comment/remove this lien, unit test still works alone but failed when ran from AllTest. Don't know why. - print __METHOD__."\n"; + print __METHOD__ . "\n"; } + /** * End phpunit tests * - * @return void + * @return void */ protected function tearDown(): void { - print __METHOD__."\n"; + print __METHOD__ . "\n"; } /** @@ -133,16 +135,16 @@ class CMailFileTest extends PHPUnit\Framework\TestCase */ public function testCMailFileText() { - global $conf,$user,$langs,$db; - $conf=$this->savconf; - $user=$this->savuser; - $langs=$this->savlangs; - $db=$this->savdb; + global $conf, $user, $langs, $db; + $conf = $this->savconf; + $user = $this->savuser; + $langs = $this->savlangs; + $db = $this->savdb; - $localobject=new CMailFile('Test', 'test@test.com', 'from@from.com', 'Message txt', array(), array(), array(), '', '', 1, 0); + $localobject = new CMailFile('Test', 'test@test.com', 'from@from.com', 'Message txt', array(), array(), array(), '', '', 1, 0); - $result=$localobject->sendfile(); - print __METHOD__." result=".$result."\n"; + $result = $localobject->sendfile(); + print __METHOD__ . " result=" . $result . "\n"; $this->assertFalse($result); // False because mail send disabled return $result; @@ -155,54 +157,112 @@ class CMailFileTest extends PHPUnit\Framework\TestCase */ public function testCMailFileStatic() { - global $conf,$user,$langs,$db; - $conf=$this->savconf; - $user=$this->savuser; - $langs=$this->savlangs; - $db=$this->savdb; + global $conf, $user, $langs, $db; + $conf = $this->savconf; + $user = $this->savuser; + $langs = $this->savlangs; + $db = $this->savdb; - $localobject=new CMailFile('', '', '', ''); + $localobject = new CMailFile('', '', '', ''); - $src='John Doe '; - $result=$localobject->getValidAddress($src, 0); - print __METHOD__." result=".$result."\n"; + $src = 'John Doe '; + $result = $localobject->getValidAddress($src, 0); + print __METHOD__ . " result=" . $result . "\n"; $this->assertEquals($result, 'John Doe '); - $src='John Doe '; - $result=$localobject->getValidAddress($src, 1); - print __METHOD__." result=".$result."\n"; + $src = 'John Doe '; + $result = $localobject->getValidAddress($src, 1); + print __METHOD__ . " result=" . $result . "\n"; $this->assertEquals($result, ''); - $src='John Doe '; - $result=$localobject->getValidAddress($src, 2); - print __METHOD__." result=".$result."\n"; + $src = 'John Doe '; + $result = $localobject->getValidAddress($src, 2); + print __METHOD__ . " result=" . $result . "\n"; $this->assertEquals($result, 'john@doe.com'); - $src='John Doe '; - $result=$localobject->getValidAddress($src, 3, 0); - print __METHOD__." result=".$result."\n"; + $src = 'John Doe '; + $result = $localobject->getValidAddress($src, 3, 0); + print __METHOD__ . " result=" . $result . "\n"; $this->assertEquals($result, '"John Doe" '); - $src='John Doe '; - $result=$localobject->getValidAddress($src, 3, 1); - print __METHOD__." result=".$result."\n"; + $src = 'John Doe '; + $result = $localobject->getValidAddress($src, 3, 1); + print __METHOD__ . " result=" . $result . "\n"; $this->assertEquals($result, '"=?UTF-8?B?Sm9obiBEb2U=?=" '); - $src='John Doe '; - $result=$localobject->getValidAddress($src, 4); - print __METHOD__." result=".$result."\n"; + $src = 'John Doe '; + $result = $localobject->getValidAddress($src, 4); + print __METHOD__ . " result=" . $result . "\n"; $this->assertEquals($result, 'John Doe'); - $src='John Doe , John Doe2 , John Doe3 '; - $result=$localobject->getValidAddress($src, 4); - print __METHOD__." result=".$result."\n"; + $src = 'John Doe , John Doe2 , John Doe3 '; + $result = $localobject->getValidAddress($src, 4); + print __METHOD__ . " result=" . $result . "\n"; $this->assertEquals($result, 'John Doe,John Doe2,John Doe3'); - $src='John Doe , John Doe2 , John Doe3 '; - $result=$localobject->getValidAddress($src, 4, 0, 2); - print __METHOD__." result=".$result."\n"; + $src = 'John Doe , John Doe2 , John Doe3 '; + $result = $localobject->getValidAddress($src, 4, 0, 2); + print __METHOD__ . " result=" . $result . "\n"; $this->assertEquals($result, 'John Doe,John Doe2...'); return $result; } + + public function testCMailFileHTMLWithImage() + { + + global $conf, $user, $langs, $db; + $conf = $this->savconf; + $user = $this->savuser; + $langs = $this->savlangs; + $db = $this->savdb; + $conf->global->MAIN_MAIL_ADD_INLINE_IMAGES_IF_IN_MEDIAS = 1; + $conf->global->MAIN_MAIL_ADD_INLINE_IMAGES_IF_DATA = 1; + + dol_delete_dir_recursive(DOL_DATA_ROOT . '/medias/image'); + dol_mkdir(DOL_DATA_ROOT . '/medias/image'); + dol_copy(dirname(__FILE__) . '/img250x20.png', DOL_DATA_ROOT . '/medias/image/img250x20.png'); + + $msg = ''; + $msg .= ''; + $msg .= '

From wikipedia

Red dot'; + $msg .= ''; + + + $localobject = new CMailFile('Test', 'test@test.com', 'from@from.com', $msg, array(), array(), array(), '', '', 0, -1,'','','','','standard','','/tmp'); + + $result = count($localobject->html_images); + print __METHOD__ . " result count image detected in the mail=" . $result . "\n"; + $this->assertEquals($result, 2); + + + foreach ($localobject->html_images as $i => $val) + if ($localobject->html_images[$i]) { + if ($localobject->html_images[$i]['type'] == 'cidfromdata') { + if (preg_match('/img250x20\.png/i',$localobject->html_images[$i]['fullpath'])) { + print __METHOD__ . " content type must be image png =" . $localobject->html_images[$i]['content_type'] . "\n"; + $this->assertEquals($localobject->html_images[$i]['content_type'], 'image/png'); + + print __METHOD__ . " type must be cidfromurl =" . $localobject->html_images[$i]['type'] . "\n"; + $this->assertEquals($localobject->html_images[$i]['type'], 'cidfromurl'); + + $fileSize=9744; + print __METHOD__ . " File size must be =" . $fileSize . "\n"; + $this->assertEquals(dol_filesize($localobject->html_images[$i]['fullpath']), $fileSize); + } elseif (preg_match('/\.png/i',$localobject->html_images[$i]['fullpath'])) { + print __METHOD__ . " content type must be image png =" . $localobject->html_images[$i]['content_type'] . "\n"; + $this->assertEquals($localobject->html_images[$i]['content_type'], 'image/png'); + + print __METHOD__ . " type must be cidfromdata =" . $localobject->html_images[$i]['type'] . "\n"; + $this->assertEquals($localobject->html_images[$i]['type'], 'cidfromdata'); + + $fileSize=85; + print __METHOD__ . " File size must be =" . $fileSize . "\n"; + $this->assertEquals(dol_filesize($localobject->html_images[$i]['fullpath']), $fileSize); + } + } + } + + return $result; + } } From 6bb952bf9a98aa427a8772b3af26a4520e360fd9 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 13 Dec 2023 11:32:48 +0100 Subject: [PATCH 03/12] typo --- htdocs/core/class/CMailFile.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/CMailFile.class.php b/htdocs/core/class/CMailFile.class.php index cf4a893fee0..7c0a7c400ad 100644 --- a/htdocs/core/class/CMailFile.class.php +++ b/htdocs/core/class/CMailFile.class.php @@ -265,7 +265,7 @@ class CMailFile $findimg = $this->findHtmlImages($dolibarr_main_data_root.'/medias'); if ($findimg<0) { dol_syslog("CMailFile::CMailfile: Error on findHtmlImages"); - $this->error = 'ErrorInAddAttachementsImageBAseOnMedia'; + $this->error = 'ErrorInAddAttachementsImageBaseOnMedia'; return; } } From 67ad440381f4fb6996211efefefde65021b7ed2e Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 13 Dec 2023 11:33:18 +0100 Subject: [PATCH 04/12] typo --- htdocs/core/class/CMailFile.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/CMailFile.class.php b/htdocs/core/class/CMailFile.class.php index 7c0a7c400ad..7b0af81a62c 100644 --- a/htdocs/core/class/CMailFile.class.php +++ b/htdocs/core/class/CMailFile.class.php @@ -276,7 +276,7 @@ class CMailFile $resultImageData = $this->findHtmlImagesIsSrcData($upload_dir_tmp); if ($resultImageData<0) { dol_syslog("CMailFile::CMailfile: Error on findHtmlImagesInSrcData"); - $this->error = 'ErrorInAddAttachementsImageBAseOnMedia'; + $this->error = 'ErrorInAddAttachementsImageBaseOnMedia'; return; } $findimg += $resultImageData; From 8be0970a0c04622846643d174f793606e801df14 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 13 Dec 2023 11:47:25 +0100 Subject: [PATCH 05/12] review test --- test/phpunit/CMailFileTest.php | 42 ++++++++++++++++------------------ 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/test/phpunit/CMailFileTest.php b/test/phpunit/CMailFileTest.php index 9d270901dc2..96d6e195b41 100644 --- a/test/phpunit/CMailFileTest.php +++ b/test/phpunit/CMailFileTest.php @@ -26,9 +26,9 @@ global $conf, $user, $langs, $db; //define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver //require_once 'PHPUnit/Autoload.php'; -require_once dirname(__FILE__).'/../../htdocs/master.inc.php'; -require_once dirname(__FILE__).'/../../htdocs/core/class/CMailFile.class.php'; -require_once dirname(__FILE__).'/../../htdocs/core/lib/files.lib.php'; +require_once dirname(__FILE__) . '/../../htdocs/master.inc.php'; +require_once dirname(__FILE__) . '/../../htdocs/core/class/CMailFile.class.php'; +require_once dirname(__FILE__) . '/../../htdocs/core/lib/files.lib.php'; if (empty($user->id)) { print "Load permissions for admin user nb 1\n"; @@ -229,7 +229,7 @@ class CMailFileTest extends PHPUnit\Framework\TestCase $msg .= ''; - $localobject = new CMailFile('Test', 'test@test.com', 'from@from.com', $msg, array(), array(), array(), '', '', 0, -1,'','','','','standard','','/tmp'); + $localobject = new CMailFile('Test', 'test@test.com', 'from@from.com', $msg, array(), array(), array(), '', '', 0, -1, '', '', '', '', 'standard', '', '/tmp'); $result = count($localobject->html_images); print __METHOD__ . " result count image detected in the mail=" . $result . "\n"; @@ -238,28 +238,26 @@ class CMailFileTest extends PHPUnit\Framework\TestCase foreach ($localobject->html_images as $i => $val) if ($localobject->html_images[$i]) { - if ($localobject->html_images[$i]['type'] == 'cidfromdata') { - if (preg_match('/img250x20\.png/i',$localobject->html_images[$i]['fullpath'])) { - print __METHOD__ . " content type must be image png =" . $localobject->html_images[$i]['content_type'] . "\n"; - $this->assertEquals($localobject->html_images[$i]['content_type'], 'image/png'); + if (preg_match('/img250x20\.png/i', $localobject->html_images[$i]['fullpath'])) { + print __METHOD__ . " content type must be image png =" . $localobject->html_images[$i]['content_type'] . "\n"; + $this->assertEquals($localobject->html_images[$i]['content_type'], 'image/png'); - print __METHOD__ . " type must be cidfromurl =" . $localobject->html_images[$i]['type'] . "\n"; - $this->assertEquals($localobject->html_images[$i]['type'], 'cidfromurl'); + print __METHOD__ . " type must be cidfromurl =" . $localobject->html_images[$i]['type'] . "\n"; + $this->assertEquals($localobject->html_images[$i]['type'], 'cidfromurl'); - $fileSize=9744; - print __METHOD__ . " File size must be =" . $fileSize . "\n"; - $this->assertEquals(dol_filesize($localobject->html_images[$i]['fullpath']), $fileSize); - } elseif (preg_match('/\.png/i',$localobject->html_images[$i]['fullpath'])) { - print __METHOD__ . " content type must be image png =" . $localobject->html_images[$i]['content_type'] . "\n"; - $this->assertEquals($localobject->html_images[$i]['content_type'], 'image/png'); + $fileSize = 9744; + print __METHOD__ . " File size must be =" . $fileSize . "\n"; + $this->assertEquals(dol_filesize($localobject->html_images[$i]['fullpath']), $fileSize); + } elseif (preg_match('/\.png/i', $localobject->html_images[$i]['fullpath'])) { + print __METHOD__ . " content type must be image png =" . $localobject->html_images[$i]['content_type'] . "\n"; + $this->assertEquals($localobject->html_images[$i]['content_type'], 'image/png'); - print __METHOD__ . " type must be cidfromdata =" . $localobject->html_images[$i]['type'] . "\n"; - $this->assertEquals($localobject->html_images[$i]['type'], 'cidfromdata'); + print __METHOD__ . " type must be cidfromdata =" . $localobject->html_images[$i]['type'] . "\n"; + $this->assertEquals($localobject->html_images[$i]['type'], 'cidfromdata'); - $fileSize=85; - print __METHOD__ . " File size must be =" . $fileSize . "\n"; - $this->assertEquals(dol_filesize($localobject->html_images[$i]['fullpath']), $fileSize); - } + $fileSize = 85; + print __METHOD__ . " File size must be =" . $fileSize . "\n"; + $this->assertEquals(dol_filesize($localobject->html_images[$i]['fullpath']), $fileSize); } } From 734de118f071e8c428f1342efd4ce3cb00cccb02 Mon Sep 17 00:00:00 2001 From: atm-florian Date: Wed, 13 Dec 2023 16:38:25 +0100 Subject: [PATCH 06/12] FIX: disable pointer events on jQuery-UI tooltips to prevent a glitch (fast-blinking tooltip) --- htdocs/theme/eldy/global.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 4af0c6366f1..290ff4691c9 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -5058,6 +5058,7 @@ div.ui-tooltip.mytooltip { color: var(--tooltipfontcolor); line-height: 1.6em; min-width: 550px; + pointer-events: none; } Date: Tue, 19 Dec 2023 08:51:02 +0100 Subject: [PATCH 07/12] search by thirdparty in don list --- htdocs/don/list.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/htdocs/don/list.php b/htdocs/don/list.php index 891f7e6877b..fa9c1a2547c 100644 --- a/htdocs/don/list.php +++ b/htdocs/don/list.php @@ -57,6 +57,7 @@ $search_status = (GETPOST("search_status", 'intcomma') != '') ? GETPOST("search_ $search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ?GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml')); $search_ref = GETPOST('search_ref', 'alpha'); $search_company = GETPOST('search_company', 'alpha'); +$search_thirdparty = GETPOST('search_thirdparty', 'alpha'); $search_name = GETPOST('search_name', 'alpha'); $search_amount = GETPOST('search_amount', 'alpha'); $optioncss = GETPOST('optioncss', 'alpha'); @@ -69,6 +70,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' $search_all = ""; $search_ref = ""; $search_company = ""; + $search_thirdparty = ""; $search_name = ""; $search_amount = ""; $search_status = ''; @@ -106,7 +108,10 @@ $sql = "SELECT d.rowid, d.datedon, d.fk_soc as socid, d.firstname, d.lastname, d $sql .= " d.amount, d.fk_statut as status,"; $sql .= " p.rowid as pid, p.ref, p.title, p.public"; $sql .= " FROM ".MAIN_DB_PREFIX."don as d LEFT JOIN ".MAIN_DB_PREFIX."projet AS p"; -$sql .= " ON p.rowid = d.fk_projet WHERE d.entity IN (".getEntity('donation').")"; +$sql .= " ON p.rowid = d.fk_projet"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe AS s ON s.rowid = d.fk_soc"; +$sql .= " WHERE d.entity IN (". getEntity('donation') . ")"; + if ($search_status != '' && $search_status != '-4') { $sql .= " AND d.fk_statut IN (".$db->sanitize($search_status).")"; } @@ -119,6 +124,9 @@ if (trim($search_all) != '') { if (trim($search_company) != '') { $sql .= natural_search('d.societe', $search_company); } +if (trim($search_thirdparty) != '') { + $sql .= " AND s.nom LIKE '%" . $db->escape($search_thirdparty) . "%'"; +} if (trim($search_name) != '') { $sql .= natural_search(array('d.lastname', 'd.firstname'), $search_name); } From 87695c931e7929dac7f7b24d3c7468fcad08255d Mon Sep 17 00:00:00 2001 From: Thomas905 Date: Tue, 19 Dec 2023 17:14:41 +0100 Subject: [PATCH 08/12] fix --- htdocs/don/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/don/list.php b/htdocs/don/list.php index fa9c1a2547c..b50c6710877 100644 --- a/htdocs/don/list.php +++ b/htdocs/don/list.php @@ -125,7 +125,7 @@ if (trim($search_company) != '') { $sql .= natural_search('d.societe', $search_company); } if (trim($search_thirdparty) != '') { - $sql .= " AND s.nom LIKE '%" . $db->escape($search_thirdparty) . "%'"; + $sql .= natural_search("s.nom", $search_thirdparty); } if (trim($search_name) != '') { $sql .= natural_search(array('d.lastname', 'd.firstname'), $search_name); From 2ad52d9fc976af1204e8e586b2c7d892738cfbd2 Mon Sep 17 00:00:00 2001 From: atm-adrien Date: Wed, 20 Dec 2023 14:22:37 +0100 Subject: [PATCH 09/12] FIX : Adding the $encode parrameter to recursive _replaceHtmlWithOdtTag() utilisation --- htdocs/includes/odtphp/odf.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/includes/odtphp/odf.php b/htdocs/includes/odtphp/odf.php index 2f6f0dbea0b..445bdf46a5a 100644 --- a/htdocs/includes/odtphp/odf.php +++ b/htdocs/includes/odtphp/odf.php @@ -246,23 +246,23 @@ class Odf break; case 'strong': case 'b': - $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; + $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations, $encode) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; break; case 'i': case 'em': - $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; + $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations, $encode) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; break; case 'u': - $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; + $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations, $encode) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; break; case 's': - $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; + $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations, $encode) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; break; case 'sub': - $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; + $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations, $encode) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; break; case 'sup': - $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; + $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations, $encode) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; break; case 'span': if (isset($tag['attributes']['style'])) { @@ -299,12 +299,12 @@ class Odf // Generate a unique id for the style (using microtime and random because some CPUs are really fast...) $key = floatval(str_replace('.', '', microtime(true))) + rand(0, 10); $customStyles[$key] = $odtStyles; - $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; + $odtResult .= '' . ($tag['children'] != null ? $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations, $encode) : $this->encode_chars($tag['innerText'], $encode, $charset)) . ''; } } break; default: - $odtResult .= $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations); + $odtResult .= $this->_replaceHtmlWithOdtTag($tag['children'], $customStyles, $fontDeclarations, $encode); break; } } From 377ec642293e7e615e746c9c2fb13daf19fababe Mon Sep 17 00:00:00 2001 From: atm-florian Date: Thu, 21 Dec 2023 17:02:34 +0100 Subject: [PATCH 10/12] FIX 17.0: deprecated field should only be a fallback --- htdocs/compta/facture/class/facture.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 7232137ae1c..9d96dce5088 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -695,7 +695,7 @@ class Facture extends CommonInvoice $sql .= ", ".(empty($this->date_pointoftax) ? "null" : "'".$this->db->idate($this->date_pointoftax)."'"); $sql .= ", ".($this->note_private ? "'".$this->db->escape($this->note_private)."'" : "null"); $sql .= ", ".($this->note_public ? "'".$this->db->escape($this->note_public)."'" : "null"); - $sql .= ", ".($this->ref_client ? "'".$this->db->escape($this->ref_client)."'" : "null"); + $sql .= ", ".($this->ref_customer ? "'".$this->db->escape($this->ref_customer)."'" : ($this->ref_client ? "'".$this->db->escape($this->ref_client)."'" : "null")); $sql .= ", ".($this->fk_account > 0 ? $this->fk_account : 'NULL'); $sql .= ", ".($this->module_source ? "'".$this->db->escape($this->module_source)."'" : "null"); $sql .= ", ".($this->pos_source != '' ? "'".$this->db->escape($this->pos_source)."'" : "null"); From 3d23322556a9c3f8bee1d5080e3a7f6e2bf852ff Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 28 Dec 2023 08:59:44 +0100 Subject: [PATCH 11/12] FIX: bad accountancy code autoselection for supplier ventilation --- htdocs/accountancy/class/accountingaccount.class.php | 2 +- htdocs/accountancy/supplier/list.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php index 8e5f7690dd1..22713357ff8 100644 --- a/htdocs/accountancy/class/accountingaccount.class.php +++ b/htdocs/accountancy/class/accountingaccount.class.php @@ -839,7 +839,7 @@ class AccountingAccount extends CommonObject } $suggestedid = $accountingAccount['dom']; // There is a doubt for this case. Is it an error on vat or we just forgot to fill vat number ? $suggestedaccountingaccountfor = 'eecwithoutvatnumber'; - } elseif ($isSellerInEEC && $isBuyerInEEC && !empty($product->accountancy_code_sell_intra)) { + } elseif ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale if ($type == 'customer' && !empty($product->accountancy_code_sell_intra)) { $code_p = $product->accountancy_code_sell_intra; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index aae34a51e03..85f64242c64 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -623,6 +623,7 @@ if ($result) { $code_buy_t=$return['code_t']; } //var_dump($return); + //exit; if (!empty($code_buy_p)) { // Value was defined previously From 39d986ae591d64b892ce44c7d3bff2534229271f Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 28 Dec 2023 09:00:39 +0100 Subject: [PATCH 12/12] FIX: bad accountancy code autoselection for supplier ventilation --- htdocs/accountancy/supplier/list.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index 85f64242c64..aae34a51e03 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -623,7 +623,6 @@ if ($result) { $code_buy_t=$return['code_t']; } //var_dump($return); - //exit; if (!empty($code_buy_p)) { // Value was defined previously