2008-06-20 21:10:24 +00:00
< ? php
2015-08-31 15:42:08 +00:00
/* Copyright ( C ) 2008 - 2011 Laurent Destailleur < eldy @ users . sourceforge . net >
2018-10-27 12:43:12 +00:00
* Copyright ( C ) 2008 - 2012 Regis Houssin < regis . houssin @ inodbox . com >
2015-08-31 15:42:08 +00:00
* Copyright ( C ) 2008 Raphael Bertrand ( Resultic ) < raphael . bertrand @ resultic . fr >
2016-07-23 14:37:21 +00:00
* Copyright ( C ) 2014 - 2016 Marcos García < marcosgdf @ gmail . com >
2015-05-04 07:22:55 +00:00
* Copyright ( C ) 2015 Ferran Marcet < fmarcet @ 2 byte . es >
2016-02-11 19:01:51 +00:00
* Copyright ( C ) 2015 - 2016 Raphaël Doursenaud < rdoursenaud @ gpcsolutions . fr >
2017-04-15 18:04:45 +00:00
* Copyright ( C ) 2017 Juanjo Menent < jmenent @ 2 byte . es >
2026-05-10 21:12:12 +00:00
* Copyright ( C ) 2024 - 2026 MDW < mdeweerd @ users . noreply . github . com >
2026-06-28 11:43:41 +00:00
* Copyright ( C ) 2024 - 2026 Frédéric France < frederic . france @ free . fr >
2009-01-15 00:32:10 +00:00
*
2008-06-20 21:10:24 +00:00
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 14:36:08 +00:00
* the Free Software Foundation ; either version 3 of the License , or
2008-06-20 21:10:24 +00:00
* ( at your option ) any later version .
*
* This program 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
2019-09-23 19:55:30 +00:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
* or see https :// www . gnu . org /
2008-06-20 21:10:24 +00:00
*/
/**
2011-10-24 08:45:06 +00:00
* \file htdocs / core / lib / functions2 . lib . php
2008-11-16 01:09:04 +00:00
* \brief A set of functions for Dolibarr
* This file contains all rare functions .
2008-06-20 21:10:24 +00:00
*/
2013-06-16 21:15:20 +00:00
// Enable this line to trace path when function is called.
//print xdebug_print_function_stack('Functions2.lib was called');exit;
2012-06-24 17:32:19 +00:00
/**
* Same function than javascript unescape () function but in PHP .
*
2012-07-25 09:37:43 +00:00
* @ param string $source String to decode
* @ return string Unescaped string
2012-06-24 17:32:19 +00:00
*/
function jsUnEscape ( $source )
{
2020-09-07 08:18:17 +00:00
$decodedStr = " " ;
$pos = 0 ;
$len = strlen ( $source );
while ( $pos < $len ) {
$charAt = substr ( $source , $pos , 1 );
if ( $charAt == '%' ) {
$pos ++ ;
$charAt = substr ( $source , $pos , 1 );
if ( $charAt == 'u' ) {
// we got a unicode character
$pos ++ ;
$unicodeHexVal = substr ( $source , $pos , 4 );
$unicode = hexdec ( $unicodeHexVal );
$entity = " &# " . $unicode . ';' ;
2023-12-07 02:37:05 +00:00
$decodedStr .= mb_convert_encoding ( $entity , 'UTF-8' , 'ISO-8859-1' );
2020-09-07 08:18:17 +00:00
$pos += 4 ;
} else {
// we have an escaped ascii character
$hexVal = substr ( $source , $pos , 2 );
$decodedStr .= chr ( hexdec ( $hexVal ));
$pos += 2 ;
}
} else {
$decodedStr .= $charAt ;
$pos ++ ;
}
}
2020-10-31 13:32:18 +00:00
return dol_html_entity_decode ( $decodedStr , ENT_COMPAT | ENT_HTML5 );
2012-06-24 17:32:19 +00:00
}
2008-06-20 21:10:24 +00:00
2012-05-08 20:49:03 +00:00
/**
2024-02-18 14:09:01 +00:00
* Return list of directories that contain modules .
2012-05-08 20:49:03 +00:00
*
2024-02-18 14:09:01 +00:00
* Detects directories that contain a subdirectory / core / modules .
* Modules that contains 'disabled' in their name are excluded .
*
* @ param string $subdir Sub directory ( Example : '/mailings' will look for / core / modules / mailings / )
* @ return array < string , string > Array of directories that can contain module descriptors ( $key == value )
2012-05-08 20:49:03 +00:00
*/
2019-01-27 14:20:16 +00:00
function dolGetModulesDirs ( $subdir = '' )
2012-05-08 20:49:03 +00:00
{
2020-09-07 08:18:17 +00:00
global $conf ;
$modulesdir = array ();
2021-02-23 21:03:23 +00:00
foreach ( $conf -> file -> dol_document_root as $type => $dirroot ) {
2020-09-07 08:18:17 +00:00
// Default core/modules dir
if ( $type === 'main' ) {
$modulesdir [ $dirroot . '/core/modules' . $subdir . '/' ] = $dirroot . '/core/modules' . $subdir . '/' ;
}
// Scan dir from external modules
$handle = @ opendir ( $dirroot );
2021-02-23 21:03:23 +00:00
if ( is_resource ( $handle )) {
while (( $file = readdir ( $handle )) !== false ) {
if ( preg_match ( '/disabled/' , $file )) {
continue ; // We discard module if it contains disabled into name.
}
2024-02-18 14:09:01 +00:00
if ( substr ( $file , 0 , 1 ) != '.' && is_dir ( $dirroot . '/' . $file ) && strtoupper ( substr ( $file , 0 , 3 )) != 'CVS' && $file != 'includes' ) {
2021-02-23 21:03:23 +00:00
if ( is_dir ( $dirroot . '/' . $file . '/core/modules' . $subdir . '/' )) {
2020-09-07 08:18:17 +00:00
$modulesdir [ $dirroot . '/' . $file . '/core/modules' . $subdir . '/' ] = $dirroot . '/' . $file . '/core/modules' . $subdir . '/' ;
}
}
}
closedir ( $handle );
}
}
return $modulesdir ;
2012-05-08 20:49:03 +00:00
}
2011-08-11 01:34:54 +00:00
/**
2011-08-31 12:24:47 +00:00
* Try to guess default paper format according to language into $langs
*
2024-09-29 19:52:31 +00:00
* @ param ? Translate $outputlangs Output lang to use to autodetect output format if setup not done
2023-05-02 02:11:05 +00:00
* @ return string Default paper format code
2011-08-11 01:34:54 +00:00
*/
2024-09-29 19:52:31 +00:00
function dol_getDefaultFormat ( $outputlangs = null )
2011-08-11 01:34:54 +00:00
{
2020-09-07 08:18:17 +00:00
global $langs ;
2013-04-29 07:25:42 +00:00
2020-09-07 08:18:17 +00:00
$selected = 'EUA4' ;
if ( ! $outputlangs ) {
$outputlangs = $langs ;
}
2013-04-29 07:25:42 +00:00
2021-02-23 21:03:23 +00:00
if ( $outputlangs -> defaultlang == 'ca_CA' ) {
$selected = 'CAP4' ; // Canada
}
if ( $outputlangs -> defaultlang == 'en_US' ) {
$selected = 'USLetter' ; // US
}
2020-09-07 08:18:17 +00:00
return $selected ;
2011-08-11 01:34:54 +00:00
}
2009-02-20 20:28:16 +00:00
2009-02-19 19:06:12 +00:00
/**
2024-01-13 18:48:20 +00:00
* Show information on an object
2012-05-12 14:27:20 +00:00
* TODO Move this into html . formother
2011-08-31 12:24:47 +00:00
*
2024-09-28 10:09:35 +00:00
* @ param object | CommonObject $object Object to show
* @ param int $usetable Output into a table
2012-02-04 13:39:47 +00:00
* @ return void
2009-02-19 19:06:12 +00:00
*/
2019-01-27 14:20:16 +00:00
function dol_print_object_info ( $object , $usetable = 0 )
2009-02-19 19:06:12 +00:00
{
2020-09-07 08:18:17 +00:00
global $langs , $db ;
// Load translation files required by the page
$langs -> loadLangs ( array ( 'other' , 'admin' ));
include_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php' ;
$deltadateforserver = getServerTimeZoneInt ( 'now' );
$deltadateforclient = (( int ) $_SESSION [ 'dol_tz' ] + ( int ) $_SESSION [ 'dol_dst' ]);
//$deltadateforcompany=((int) $_SESSION['dol_tz'] + (int) $_SESSION['dol_dst']);
$deltadateforuser = round ( $deltadateforclient - $deltadateforserver );
//print "x".$deltadateforserver." - ".$deltadateforclient." - ".$deltadateforuser;
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '<table class="border tableforfield centpercent">' ;
}
2020-09-07 08:18:17 +00:00
// Import key
2021-02-23 21:03:23 +00:00
if ( ! empty ( $object -> import_key )) {
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2020-09-07 08:18:17 +00:00
print $langs -> trans ( " ImportedWithSet " );
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
2020-09-07 08:18:17 +00:00
print $object -> import_key ;
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
2020-09-07 08:18:17 +00:00
}
2025-09-21 12:58:38 +00:00
// Creation
if ( ! empty ( $object -> user_creation_id ) || ! empty ( $object -> date_creation )) {
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2025-08-07 11:19:18 +00:00
print $langs -> trans ( " Creation " );
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
2025-09-23 08:18:08 +00:00
print '<div class="valignmiddle inline-block">' ;
if ( $object -> user_creation_id > 0 ) {
$userstatic = new User ( $db );
$userstatic -> fetch ( $object -> user_creation_id );
2025-09-21 12:58:38 +00:00
print $userstatic -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
2020-09-07 08:18:17 +00:00
} else {
2025-09-21 12:58:38 +00:00
print $langs -> trans ( " Unknown " );
2021-02-23 21:03:23 +00:00
}
2025-09-23 08:18:08 +00:00
print '</div>' ;
2025-08-07 11:19:18 +00:00
if ( ! empty ( $object -> date_creation )) {
2025-09-23 08:18:08 +00:00
print ' - ' ;
2025-08-07 11:19:18 +00:00
print '<div class="valignmiddle inline-block">' ;
print dol_print_date ( $object -> date_creation , 'dayhour' , 'tzserver' );
if ( $deltadateforuser ) {
print ' <span class="opacitymedium">' . $langs -> trans ( " CurrentHour " ) . '</span> / ' . dol_print_date ( $object -> date_creation , " dayhour " , " tzuserrel " ) . ' <span class="opacitymedium">' . $langs -> trans ( " ClientHour " ) . '</span>' ;
}
print '</div>' ;
2021-02-23 21:03:23 +00:00
}
2025-08-07 11:19:18 +00:00
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
2020-09-07 08:18:17 +00:00
}
2025-09-21 12:58:38 +00:00
// Last modification
if ( ! empty ( $object -> user_modification_id ) || ! empty ( $object -> date_modification )) {
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2025-08-07 11:19:18 +00:00
print $langs -> trans ( " LastModified " );
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
2025-08-07 11:19:18 +00:00
print '<div class="valignmiddle inline-block">' ;
2025-09-23 08:18:08 +00:00
if ( $object -> user_modification_id > 0 ) {
$userstatic = new User ( $db );
$userstatic -> fetch ( $object -> user_modification_id );
2025-09-21 12:58:38 +00:00
print $userstatic -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
2020-09-07 08:18:17 +00:00
} else {
2025-09-21 12:58:38 +00:00
print $langs -> trans ( " Unknown " );
2021-02-23 21:03:23 +00:00
}
2025-08-07 11:19:18 +00:00
print '</div>' ;
2020-09-07 08:18:17 +00:00
2025-08-07 11:19:18 +00:00
if ( ! empty ( $object -> date_modification )) {
print ' - ' ;
print '<div class="valignmiddle inline-block">' ;
print dol_print_date ( $object -> date_modification , 'dayhour' , 'tzserver' );
if ( $deltadateforuser ) {
print ' <span class="opacitymedium">' . $langs -> trans ( " CurrentHour " ) . '</span> / ' . dol_print_date ( $object -> date_modification , " dayhour " , " tzuserrel " ) . ' <span class="opacitymedium">' . $langs -> trans ( " ClientHour " ) . '</span>' ;
}
print '</div>' ;
2021-02-23 21:03:23 +00:00
}
2025-08-07 11:19:18 +00:00
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
2020-09-07 08:18:17 +00:00
}
2025-09-21 12:58:38 +00:00
// Validation
if ( ! empty ( $object -> user_validation_id ) || ! empty ( $object -> date_validation )) {
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2025-08-07 11:19:18 +00:00
print $langs -> trans ( " Validation " );
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
2025-09-21 12:58:38 +00:00
$userstatic = new User ( $db );
$userstatic -> fetch ( $object -> user_validation_id ? $object -> user_validation_id : $object -> user_validation );
if ( $userstatic -> id ) {
print $userstatic -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
2020-09-07 08:18:17 +00:00
} else {
2025-09-21 12:58:38 +00:00
print $langs -> trans ( " Unknown " );
2021-02-23 21:03:23 +00:00
}
2020-09-07 08:18:17 +00:00
2025-08-07 11:19:18 +00:00
if ( ! empty ( $object -> date_validation )) {
print ' - ' ;
print '<div class="valignmiddle inline-block">' ;
print dol_print_date ( $object -> date_validation , 'dayhour' , 'tzserver' );
if ( $deltadateforuser ) {
print ' <span class="opacitymedium">' . $langs -> trans ( " CurrentHour " ) . '</span> / ' . dol_print_date ( $object -> date_validation , " dayhour " , 'tzuserrel' ) . ' <span class="opacitymedium">' . $langs -> trans ( " ClientHour " ) . '</span>' ;
}
print '</div>' ;
2021-02-23 21:03:23 +00:00
}
2025-08-07 11:19:18 +00:00
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
2020-09-07 08:18:17 +00:00
}
2025-08-07 11:19:18 +00:00
// Approval (old method using already loaded object and not id is kept for backward compatibility)
if ( ! empty ( $object -> user_approve ) || ! empty ( $object -> user_approve_id ) || ! empty ( $object -> date_approve ) || ! empty ( $object -> date_approval )) {
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2025-08-07 11:19:18 +00:00
print $langs -> trans ( " Approval " );
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
2024-09-28 10:09:35 +00:00
// user_approve is not defined in Dolibarr code @phan-suppress-next-line PhanUndeclaredProperty
2022-08-22 13:09:38 +00:00
if ( ! empty ( $object -> user_approve ) && is_object ( $object -> user_approve )) {
2024-09-28 10:09:35 +00:00
if ( $object -> user_approve -> id ) { // @phan-suppress-current-line PhanUndeclaredProperty
// @phan-suppress-next-line PhanUndeclaredProperty,PhanPluginUnknownObjectMethodCall
2021-02-23 21:03:23 +00:00
print $object -> user_approve -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
} else {
print $langs -> trans ( " Unknown " );
}
2020-09-07 08:18:17 +00:00
} else {
$userstatic = new User ( $db );
$userstatic -> fetch ( $object -> user_approve_id ? $object -> user_approve_id : $object -> user_approve );
2021-02-23 21:03:23 +00:00
if ( $userstatic -> id ) {
print $userstatic -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
} else {
print $langs -> trans ( " Unknown " );
}
}
2020-09-07 08:18:17 +00:00
2025-08-07 11:19:18 +00:00
if ( ! empty ( $object -> date_approve ) || ! empty ( $object -> date_approval )) {
print ' - ' ;
print '<div class="valignmiddle inline-block">' ;
print dol_print_date ( $object -> date_approve ? $object -> date_approve : $object -> date_approval , 'dayhour' , 'tzserver' );
if ( $deltadateforuser ) {
print ' <span class="opacitymedium">' . $langs -> trans ( " CurrentHour " ) . '</span> / ' . dol_print_date ( $object -> date_approve , " dayhour " , 'tzuserrel' ) . ' <span class="opacitymedium">' . $langs -> trans ( " ClientHour " ) . '</span>' ;
}
print '</div>' ;
2021-02-23 21:03:23 +00:00
}
2025-08-07 11:19:18 +00:00
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
2020-09-07 08:18:17 +00:00
}
2025-08-07 11:19:18 +00:00
// Approval
if ( ! empty ( $object -> user_approve_id2 ) || ! empty ( $object -> date_approve2 )) {
2024-09-28 10:09:35 +00:00
'@phan-var-force CommandeFournisseur $object' ;
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2025-08-07 11:19:18 +00:00
print $langs -> trans ( " Approval " );
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
2020-09-07 08:18:17 +00:00
$userstatic = new User ( $db );
$userstatic -> fetch ( $object -> user_approve_id2 );
2021-02-23 21:03:23 +00:00
if ( $userstatic -> id ) {
print $userstatic -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
} else {
print $langs -> trans ( " Unknown " );
}
2020-09-07 08:18:17 +00:00
2025-08-07 11:19:18 +00:00
if ( ! empty ( $object -> date_approve2 )) {
print ' - ' ;
print '<div class="valignmiddle inline-block">' ;
print dol_print_date ( $object -> date_approve2 , 'dayhour' , 'tzserver' );
if ( $deltadateforuser ) {
print ' <span class="opacitymedium">' . $langs -> trans ( " CurrentHour " ) . '</span> / ' . dol_print_date ( $object -> date_approve2 , " dayhour " , 'tzuserrel' ) . ' <span class="opacitymedium">' . $langs -> trans ( " ClientHour " ) . '</span>' ;
}
print '</div>' ;
2021-02-23 21:03:23 +00:00
}
2025-08-07 11:19:18 +00:00
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
2020-09-07 08:18:17 +00:00
}
2025-08-07 11:19:18 +00:00
// Signature
if ( ! empty ( $object -> user_signature ) || ! empty ( $object -> user_signature_id ) || ! empty ( $object -> date_signature )) {
2024-09-28 10:09:35 +00:00
'@phan-var-force Propal $object' ;
2021-03-26 16:44:41 +00:00
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2025-08-07 11:19:18 +00:00
print $langs -> trans ( 'Signature' );
2021-03-26 16:44:41 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
if ( is_object ( $object -> user_signature )) {
if ( $object -> user_signature -> id ) {
print $object -> user_signature -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
} else {
print $langs -> trans ( 'Unknown' );
}
} else {
$userstatic = new User ( $db );
2022-07-03 10:54:58 +00:00
$userstatic -> fetch ( $object -> user_signature_id ? $object -> user_signature_id : $object -> user_signature );
2021-03-26 16:44:41 +00:00
if ( $userstatic -> id ) {
print $userstatic -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
} else {
print $langs -> trans ( 'Unknown' );
}
}
2025-08-07 11:19:18 +00:00
if ( ! empty ( $object -> date_signature )) {
print ' - ' ;
print '<div class="valignmiddle inline-block">' ;
print dol_print_date ( $object -> date_signature , 'dayhour' );
if ( $deltadateforuser ) {
print ' <span class="opacitymedium">' . $langs -> trans ( 'CurrentHour' ) . '</span> / ' . dol_print_date ( $object -> date_signature , 'dayhour' , 'tzuserrel' ) . ' <span class="opacitymedium">' . $langs -> trans ( 'ClientHour' ) . '</span>' ;
}
print '</div>' ;
2021-03-26 16:44:41 +00:00
}
2025-08-07 11:19:18 +00:00
2021-03-26 16:44:41 +00:00
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
}
2025-08-07 11:19:18 +00:00
// Closing
if ( ! empty ( $object -> user_closing_id ) || ! empty ( $object -> date_cloture ) || ! empty ( $object -> date_closing )) {
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2025-08-07 11:19:18 +00:00
print $langs -> trans ( " Closing " );
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
2023-10-17 08:52:19 +00:00
$userstatic = new User ( $db );
$userstatic -> fetch ( $object -> user_closing_id );
if ( $userstatic -> id ) {
print $userstatic -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
2020-09-07 08:18:17 +00:00
} else {
2023-10-17 08:52:19 +00:00
print $langs -> trans ( " Unknown " );
2021-02-23 21:03:23 +00:00
}
2020-09-07 08:18:17 +00:00
2025-08-07 11:19:18 +00:00
if ( ! empty ( $object -> date_cloture ) || ! empty ( $object -> date_closing )) {
if ( isset ( $object -> date_cloture ) && ! empty ( $object -> date_cloture )) {
$object -> date_closing = $object -> date_cloture ;
}
print ' - ' ;
print '<div class="valignmiddle inline-block">' ;
print dol_print_date ( $object -> date_closing , 'dayhour' , 'tzserver' );
if ( $deltadateforuser ) {
print ' <span class="opacitymedium">' . $langs -> trans ( " CurrentHour " ) . '</span> / ' . dol_print_date ( $object -> date_closing , " dayhour " , 'tzuserrel' ) . ' <span class="opacitymedium">' . $langs -> trans ( " ClientHour " ) . '</span>' ;
}
print '</div>' ;
2021-02-23 21:03:23 +00:00
}
2025-08-07 11:19:18 +00:00
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
2020-09-07 08:18:17 +00:00
}
2025-08-07 11:19:18 +00:00
// Reconciliation
if ( ! empty ( $object -> user_rappro ) || ! empty ( $object -> user_rappro_id ) || ! empty ( $object -> date_rappro )) {
2024-09-28 10:09:35 +00:00
'@phan-var-force Account $object' ;
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2025-08-07 11:19:18 +00:00
print $langs -> trans ( " Reconciliation " );
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
if ( is_object ( $object -> user_rappro )) {
2024-09-28 10:09:35 +00:00
$user_rappro = $object -> user_rappro ;
'@phan-var-force User $user_rappro' ;
if ( $user_rappro -> id ) {
print $user_rappro -> getNomUrl ( - 1 , '' , 0 , 0 , 0 );
2021-02-23 21:03:23 +00:00
} else {
print $langs -> trans ( " Unknown " );
}
2020-09-07 08:18:17 +00:00
} else {
$userstatic = new User ( $db );
2022-07-03 10:54:58 +00:00
$userstatic -> fetch ( $object -> user_rappro_id ? $object -> user_rappro_id : $object -> user_rappro );
2021-02-23 21:03:23 +00:00
if ( $userstatic -> id ) {
print $userstatic -> getNomUrl ( 1 , '' , 0 , 0 , 0 );
} else {
print $langs -> trans ( " Unknown " );
}
}
2020-09-07 08:18:17 +00:00
2025-08-07 11:19:18 +00:00
if ( ! empty ( $object -> date_rappro )) { // Note: date_rappro is not found on Dolibarr classes
print ' - ' ;
print '<div class="valignmiddle inline-block">' ;
print dol_print_date ( $object -> date_rappro , 'dayhour' , 'tzserver' ); // @phan-suppress-current-line PhanUndeclaredProperty
if ( $deltadateforuser ) {
print ' <span class="opacitymedium">' . $langs -> trans ( " CurrentHour " ) . '</span> / ' . dol_print_date ( $object -> date_rappro , " dayhour " , 'tzuserrel' ) . ' <span class="opacitymedium">' . $langs -> trans ( " ClientHour " ) . '</span>' ; // @phan-suppress-current-line PhanUndeclaredProperty
}
print '</div>' ;
2021-02-23 21:03:23 +00:00
}
2025-08-07 11:19:18 +00:00
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
2020-09-07 08:18:17 +00:00
}
2025-08-07 11:19:18 +00:00
// Last sending
2021-02-23 21:03:23 +00:00
if ( ! empty ( $object -> date_envoi )) {
2024-09-28 10:09:35 +00:00
'@phan-var-force Mailing $object' ;
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '<tr><td class="titlefield">' ;
}
2025-08-07 11:19:18 +00:00
print $langs -> trans ( " LastSending " );
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</td><td>' ;
} else {
print ': ' ;
}
2021-01-03 17:42:45 +00:00
print dol_print_date ( $object -> date_envoi , 'dayhour' , 'tzserver' );
2021-02-23 21:03:23 +00:00
if ( $deltadateforuser ) {
2022-06-28 11:14:36 +00:00
print ' <span class="opacitymedium">' . $langs -> trans ( " CurrentHour " ) . '</span> / ' . dol_print_date ( $object -> date_envoi , " dayhour " , 'tzuserrel' ) . ' <span class="opacitymedium">' . $langs -> trans ( " ClientHour " ) . '</span>' ;
2021-02-23 21:03:23 +00:00
}
if ( $usetable ) {
print '</td></tr>' ;
} else {
print '<br>' ;
}
2020-09-07 08:18:17 +00:00
}
2021-02-23 21:03:23 +00:00
if ( $usetable ) {
print '</table>' ;
}
2009-02-19 19:06:12 +00:00
}
2015-03-03 17:33:53 +00:00
/**
* Return an email formatted to include a tracking id
2015-06-08 15:13:23 +00:00
* For example myemail @ example . com becom myemail + trackingid @ example . com
2015-03-03 17:33:53 +00:00
*
2015-06-08 15:13:23 +00:00
* @ param string $email Email address ( Ex : " toto@example.com " , " John Do <johndo@example.com> " )
2015-03-03 17:33:53 +00:00
* @ param string $trackingid Tracking id ( Ex : thi123 for thirdparty with id 123 )
2016-06-23 18:19:35 +00:00
* @ return string Return email tracker string
2015-03-03 17:33:53 +00:00
*/
function dolAddEmailTrackId ( $email , $trackingid )
{
2019-11-13 18:37:08 +00:00
$tmp = explode ( '@' , $email );
return $tmp [ 0 ] . '+' . $trackingid . '@' . ( isset ( $tmp [ 1 ]) ? $tmp [ 1 ] : '' );
2015-03-03 17:33:53 +00:00
}
2009-02-19 18:57:54 +00:00
/**
2020-10-22 18:01:59 +00:00
* Return true if email has a domain name that can be resolved to MX type .
2011-08-31 12:24:47 +00:00
*
2015-06-08 15:13:23 +00:00
* @ param string $mail Email address ( Ex : " toto@example.com " , " John Do <johndo@example.com> " )
2020-10-22 18:01:59 +00:00
* @ return int - 1 if error ( function not available ), 0 = Not valid , 1 = Valid
2009-02-19 18:57:54 +00:00
*/
2009-03-25 19:12:35 +00:00
function isValidMailDomain ( $mail )
2009-02-19 18:57:54 +00:00
{
2020-09-07 08:18:17 +00:00
list ( $user , $domain ) = explode ( " @ " , $mail , 2 );
2020-10-27 17:55:55 +00:00
return ( $domain ? isValidMXRecord ( $domain ) : 0 );
2009-02-19 18:57:54 +00:00
}
2009-04-06 08:34:42 +00:00
/**
2011-08-31 12:24:47 +00:00
* Url string validation
* < http [ s ] > :// [ user [ : pass ] @ ] hostname [ port ] [ / path ] [ ? getquery ] [ anchor ]
*
2012-02-04 13:39:47 +00:00
* @ param string $url Url
2014-07-31 23:31:52 +00:00
* @ param int $http 1 : verify http is provided , 0 : not verify http
* @ param int $pass 1 : verify user and pass is provided , 0 : not verify user and pass
* @ param int $port 1 : verify port is provided , 0 : not verify port
* @ param int $path 1 : verify a path is provided " / " or " /... " or " /.../ " , 0 : not verify path
* @ param int $query 1 : verify query is provided , 0 : not verify query
* @ param int $anchor 1 : verify anchor is provided , 0 : not verify anchor
2012-02-04 13:39:47 +00:00
* @ return int 1 = Check is OK , 0 = Check is KO
2009-04-06 08:34:42 +00:00
*/
2019-01-27 14:20:16 +00:00
function isValidUrl ( $url , $http = 0 , $pass = 0 , $port = 0 , $path = 0 , $query = 0 , $anchor = 0 )
2009-04-06 08:34:42 +00:00
{
2020-09-07 08:18:17 +00:00
$ValidUrl = 0 ;
$urlregex = '' ;
// SCHEME
2021-02-23 21:03:23 +00:00
if ( $http ) {
$urlregex .= " ^(http: \ / \ /|https: \ / \ /) " ;
}
2020-09-07 08:18:17 +00:00
// USER AND PASS
2021-02-23 21:03:23 +00:00
if ( $pass ) {
$urlregex .= " ([a-z0-9+!*(),;?&= \$ _.-]+( \ :[a-z0-9+!*(),;?&= \$ _.-]+)?@) " ;
}
2020-09-07 08:18:17 +00:00
// HOSTNAME OR IP
//$urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*"; // x allowed (ex. http://localhost, http://routerlogin)
//$urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)+"; // x.x
$urlregex .= " ([a-z0-9+ \$ _ \\ \ :-])+( \ .[a-z0-9+ \$ _-][a-z0-9+ \$ _-]+)* " ; // x ou x.xx (2 x ou plus)
//use only one of the above
// PORT
2021-02-23 21:03:23 +00:00
if ( $port ) {
$urlregex .= " ( \ :[0-9] { 2,5}) " ;
}
2020-09-07 08:18:17 +00:00
// PATH
2021-02-23 21:03:23 +00:00
if ( $path ) {
$urlregex .= " ( \ /([a-z0-9+ \$ _-] \ .?)+)* \ / " ;
}
2020-09-07 08:18:17 +00:00
// GET Query
2021-02-23 21:03:23 +00:00
if ( $query ) {
$urlregex .= " ( \ ?[a-z+& \$ _.-][a-z0-9;:@ \ /&%=+ \$ _.-]*) " ;
}
2020-09-07 08:18:17 +00:00
// ANCHOR
2021-02-23 21:03:23 +00:00
if ( $anchor ) {
$urlregex .= " (#[a-z_.-][a-z0-9+ \$ _.-]*) $ " ;
}
2020-09-07 08:18:17 +00:00
// check
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/' . $urlregex . '/i' , $url )) {
2020-09-07 08:18:17 +00:00
$ValidUrl = 1 ;
}
//print $urlregex.' - '.$url.' - '.$ValidUrl;
return $ValidUrl ;
2009-04-06 08:34:42 +00:00
}
2019-04-23 20:49:33 +00:00
/**
* Check if VAT numero is valid ( check done on syntax only , no database or remote access )
*
* @ param Societe $company VAT number
2019-05-22 13:37:59 +00:00
* @ return int 1 = Check is OK , 0 = Check is KO
2019-04-23 20:49:33 +00:00
*/
function isValidVATID ( $company )
{
2021-02-23 21:03:23 +00:00
if ( $company -> isInEEC ()) { // Syntax check rules for EEC countries
2020-09-07 08:18:17 +00:00
/* Disabled because some companies can have an address in Irland and a vat number in France .
2021-02-23 21:03:23 +00:00
$vatprefix = $company -> country_code ;
if ( $vatprefix == 'GR' ) $vatprefix = '(EL|GR)' ;
elseif ( $vatprefix == 'MC' ) $vatprefix = 'FR' ; // Monaco is using french VAT numbers
else $vatprefix = preg_quote ( $vatprefix , '/' ); */
2020-09-07 08:18:17 +00:00
$vatprefix = '[a-zA-Z][a-zA-Z]' ;
2021-02-23 21:03:23 +00:00
if ( ! preg_match ( '/^' . $vatprefix . '[a-zA-Z0-9\-\.]{5,14}$/i' , str_replace ( ' ' , '' , $company -> tva_intra ))) {
2020-09-07 08:18:17 +00:00
return 0 ;
}
}
return 1 ;
2019-04-23 20:49:33 +00:00
}
2009-04-06 08:34:42 +00:00
/**
2011-08-31 12:24:47 +00:00
* Clean an url string
*
2012-02-04 13:39:47 +00:00
* @ param string $url Url
2016-04-09 17:32:05 +00:00
* @ param integer $http 1 = keep both http :// and https :// , 0 : remove http :// but not https ://
2012-02-04 13:39:47 +00:00
* @ return string Cleaned url
2009-04-06 08:34:42 +00:00
*/
2019-01-27 14:20:16 +00:00
function clean_url ( $url , $http = 1 )
2009-04-06 08:34:42 +00:00
{
2024-01-13 18:48:20 +00:00
// Fixed by Matelli (see http://matelli.fr/showcases/patch%73-dolibarr/fix-cleaning-url.html)
2020-09-07 08:18:17 +00:00
// To include the minus sign in a char class, we must not escape it but put it at the end of the class
// Also, there's no need of escape a dot sign in a class
2020-09-19 20:41:05 +00:00
$regs = array ();
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/^(https?:[\\/]+)?([0-9A-Z.-]+\.[A-Z]{2,4})(:[0-9]+)?/i' , $url , $regs )) {
2020-09-07 08:18:17 +00:00
$proto = $regs [ 1 ];
$domain = $regs [ 2 ];
$port = isset ( $regs [ 3 ]) ? $regs [ 3 ] : '' ;
//print $url." -> ".$proto." - ".$domain." - ".$port;
//$url = dol_string_nospecial(trim($url));
$url = trim ( $url );
// Si http: defini on supprime le http (Si https on ne supprime pas)
$newproto = $proto ;
2021-02-23 21:03:23 +00:00
if ( $http == 0 ) {
if ( preg_match ( '/^http:[\\/]+/i' , $url )) {
2020-09-07 08:18:17 +00:00
$url = preg_replace ( '/^http:[\\/]+/i' , '' , $url );
$newproto = '' ;
}
}
// On passe le nom de domaine en minuscule
$CleanUrl = preg_replace ( '/^' . preg_quote ( $proto . $domain , '/' ) . '/i' , $newproto . strtolower ( $domain ), $url );
return $CleanUrl ;
2021-02-23 21:03:23 +00:00
} else {
return $url ;
}
2009-04-06 08:34:42 +00:00
}
2014-10-11 21:44:50 +00:00
2014-10-11 21:46:49 +00:00
/**
* Returns an email value with obfuscated parts .
*
* @ param string $mail Email
2024-01-13 18:48:20 +00:00
* @ param string $replace Replacement character ( default : * )
2016-07-06 09:23:32 +00:00
* @ param int $nbreplace Number of replacement character ( default : 8 )
2014-10-11 21:46:49 +00:00
* @ param int $nbdisplaymail Number of character unchanged ( default : 4 )
* @ param int $nbdisplaydomain Number of character unchanged of domain ( default : 3 )
* @ param bool $displaytld Display tld ( default : true )
* @ return string Return email with hidden parts or '' ;
*/
2019-01-27 14:20:16 +00:00
function dolObfuscateEmail ( $mail , $replace = " * " , $nbreplace = 8 , $nbdisplaymail = 4 , $nbdisplaydomain = 3 , $displaytld = true )
2014-10-11 21:46:49 +00:00
{
2021-02-23 21:03:23 +00:00
if ( ! isValidEmail ( $mail )) {
return '' ;
}
2014-10-11 21:46:49 +00:00
$tab = explode ( '@' , $mail );
2019-01-27 10:55:16 +00:00
$tab2 = explode ( '.' , $tab [ 1 ]);
2014-10-11 21:46:49 +00:00
$string_replace = '' ;
$mail_name = $tab [ 0 ];
$mail_domaine = $tab2 [ 0 ];
$mail_tld = '' ;
2016-04-09 17:53:16 +00:00
$nbofelem = count ( $tab2 );
2021-02-23 21:03:23 +00:00
for ( $i = 1 ; $i < $nbofelem && $displaytld ; $i ++ ) {
2014-10-11 21:46:49 +00:00
$mail_tld .= '.' . $tab2 [ $i ];
}
2019-11-13 18:37:08 +00:00
for ( $i = 0 ; $i < $nbreplace ; $i ++ ) {
2014-10-11 21:46:49 +00:00
$string_replace .= $replace ;
}
2019-11-13 18:37:08 +00:00
if ( strlen ( $mail_name ) > $nbdisplaymail ) {
2014-10-11 21:46:49 +00:00
$mail_name = substr ( $mail_name , 0 , $nbdisplaymail );
}
2019-11-13 18:37:08 +00:00
if ( strlen ( $mail_domaine ) > $nbdisplaydomain ) {
$mail_domaine = substr ( $mail_domaine , strlen ( $mail_domaine ) - $nbdisplaydomain );
2014-10-11 21:46:49 +00:00
}
2019-11-13 18:37:08 +00:00
return $mail_name . $string_replace . $mail_domaine . $mail_tld ;
2014-10-11 21:46:49 +00:00
}
2014-10-11 21:44:50 +00:00
2008-11-16 01:09:04 +00:00
/**
2011-08-31 12:24:47 +00:00
* Return lines of an html table from an array
* Used by array2table function only
2012-02-04 13:39:47 +00:00
*
2024-09-13 01:09:23 +00:00
* @ param array < null | int | float | string > $data Array of data
2012-02-04 13:39:47 +00:00
* @ param string $troptions Options for tr
* @ param string $tdoptions Options for td
* @ return string
2008-11-16 01:09:04 +00:00
*/
2019-01-27 14:20:16 +00:00
function array2tr ( $data , $troptions = '' , $tdoptions = '' )
2012-02-04 13:39:47 +00:00
{
2020-09-07 08:18:17 +00:00
$text = '<tr ' . $troptions . '>' ;
foreach ( $data as $key => $item ) {
2024-09-13 01:09:23 +00:00
$text .= '<td ' . $tdoptions . '>' . (( string ) $item ) . '</td>' ;
2020-09-07 08:18:17 +00:00
}
$text .= '</tr>' ;
return $text ;
2008-11-16 01:09:04 +00:00
}
/**
2011-08-31 12:24:47 +00:00
* Return an html table from an array
2012-02-04 13:39:47 +00:00
*
2024-09-13 01:09:23 +00:00
* @ param array < int | string , null | string | int | float > $data Array of data
2012-02-04 13:39:47 +00:00
* @ param int $tableMarkup Table markup
2012-02-15 12:55:00 +00:00
* @ param string $tableoptions Options for table
2012-02-04 13:39:47 +00:00
* @ param string $troptions Options for tr
* @ param string $tdoptions Options for td
* @ return string
2008-11-16 01:09:04 +00:00
*/
2019-01-27 14:20:16 +00:00
function array2table ( $data , $tableMarkup = 1 , $tableoptions = '' , $troptions = '' , $tdoptions = '' )
2012-02-04 13:39:47 +00:00
{
2020-09-07 08:18:17 +00:00
$text = '' ;
2021-02-23 21:03:23 +00:00
if ( $tableMarkup ) {
$text = '<table ' . $tableoptions . '>' ;
}
2020-09-07 08:18:17 +00:00
foreach ( $data as $key => $item ) {
if ( is_array ( $item )) {
$text .= array2tr ( $item , $troptions , $tdoptions );
} else {
$text .= '<tr ' . $troptions . '>' ;
2024-09-13 01:09:23 +00:00
$text .= '<td ' . $tdoptions . '>' . (( string ) $key ) . '</td>' ;
$text .= '<td ' . $tdoptions . '>' . (( string ) $item ) . '</td>' ;
2020-09-07 08:18:17 +00:00
$text .= '</tr>' ;
}
}
2021-02-23 21:03:23 +00:00
if ( $tableMarkup ) {
$text .= '</table>' ;
}
2020-09-07 08:18:17 +00:00
return $text ;
2008-11-16 01:09:04 +00:00
}
2008-06-20 21:10:24 +00:00
/**
2013-04-16 13:00:41 +00:00
* Return last or next value for a mask ( according to area we should not reset )
2008-06-20 21:10:24 +00:00
*
2025-04-05 12:09:47 +00:00
* @ param DoliDB $db Database handler
* @ param string $mask Mask to use . Must contains { 0. .. 0 } . Can contains { t .. }, { u ... }, { user_extra_xxx }, . ; .
* @ param string $table Table containing field with counter
* @ param string $field Field containing already used values of counter
* @ param string $where To add a filter on selection ( for example to filter on invoice types )
* @ param null | Societe | '' $objsoc The company that own the object we need a counter for
* @ param int | '' $date Date to use for the { y },{ m },{ d } tags . is timestamp or '' to use dol_now ()
* @ param string $mode 'next' for next value or 'last' for last value
* @ param bool $bentityon Activate the entity filter . Default is true ( for modules not compatible with multicompany )
* @ param ? User $objuser Object user we need data from .
* @ param ? string $forceentity Entity id to force , can be '0' or '1' or '1,2' etc
* @ param ? BookKeeping $objbookkeeping The record in bookkeeping
* @ return string New value ( numeric ) or error message
2008-06-20 21:10:24 +00:00
*/
2025-04-05 12:09:47 +00:00
function get_next_value ( $db , $mask , $table , $field , $where = '' , $objsoc = '' , $date = '' , $mode = 'next' , $bentityon = true , $objuser = null , $forceentity = null , $objbookkeeping = null )
2008-06-20 21:10:24 +00:00
{
2024-03-13 09:54:20 +00:00
global $user ;
2020-09-07 08:18:17 +00:00
2021-02-23 21:03:23 +00:00
if ( ! is_object ( $objsoc )) {
2024-10-03 17:40:34 +00:00
$valueforccc = ( string ) $objsoc ;
2024-01-15 17:43:17 +00:00
} elseif ( $table == " commande_fournisseur " || $table == " facture_fourn " || $table == " paiementfourn " ) {
2021-02-23 21:03:23 +00:00
$valueforccc = dol_string_unaccent ( $objsoc -> code_fournisseur );
} else {
$valueforccc = dol_string_unaccent ( $objsoc -> code_client );
}
2020-09-07 08:18:17 +00:00
$sharetable = $table ;
2021-02-23 21:03:23 +00:00
if ( $table == 'facture' || $table == 'invoice' ) {
$sharetable = 'invoicenumber' ; // for getEntity function
}
2020-09-07 08:18:17 +00:00
// Clean parameters
2021-02-23 21:03:23 +00:00
if ( $date == '' ) {
$date = dol_now (); // We use local year and month of PHP server to search numbers
}
2020-09-07 08:18:17 +00:00
// but we should use local year and month of user
// For debugging
//dol_syslog("mask=".$mask, LOG_DEBUG);
//include_once(DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php');
//$mask='FA{yy}{mm}-{0000@99}';
//$date=dol_mktime(12, 0, 0, 1, 1, 1900);
//$date=dol_stringtotime('20130101');
$hasglobalcounter = false ;
2024-09-28 10:09:35 +00:00
$maskrefclient_maskcounter = '' ;
$maskrefclient_clientcode = '' ;
$maskrefclient_maskclientcode = '' ;
$maskrefclient_maskoffset = '' ;
2020-09-19 20:41:05 +00:00
$reg = array ();
2020-09-07 08:18:17 +00:00
// Extract value for mask counter, mask raz and mask offset
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/\{(0+)([@\+][0-9\-\+\=]+)?([@\+][0-9\-\+\=]+)?\}/i' , $mask , $reg )) {
2020-09-07 08:18:17 +00:00
$masktri = $reg [ 1 ] . ( ! empty ( $reg [ 2 ]) ? $reg [ 2 ] : '' ) . ( ! empty ( $reg [ 3 ]) ? $reg [ 3 ] : '' );
$maskcounter = $reg [ 1 ];
$hasglobalcounter = true ;
} else {
// setting some defaults so the rest of the code won't fail if there is a third party counter
$masktri = '00000' ;
$maskcounter = '00000' ;
}
$maskraz = - 1 ;
$maskoffset = 0 ;
$resetEveryMonth = false ;
2023-11-27 10:39:32 +00:00
if ( dol_strlen ( $maskcounter ) < 3 && ! getDolGlobalString ( 'MAIN_COUNTER_WITH_LESS_3_DIGITS' )) {
2021-02-23 21:03:23 +00:00
return 'ErrorCounterMustHaveMoreThan3Digits' ;
}
2020-09-07 08:18:17 +00:00
// Extract value for third party mask counter
2020-12-20 13:31:54 +00:00
$regClientRef = array ();
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/\{(c+)(0*)\}/i' , $mask , $regClientRef )) {
2020-09-07 08:18:17 +00:00
$maskrefclient = $regClientRef [ 1 ] . $regClientRef [ 2 ];
$maskrefclient_maskclientcode = $regClientRef [ 1 ];
$maskrefclient_maskcounter = $regClientRef [ 2 ];
$maskrefclient_maskoffset = 0 ; //default value of maskrefclient_counter offset
$maskrefclient_clientcode = substr ( $valueforccc , 0 , dol_strlen ( $maskrefclient_maskclientcode )); //get n first characters of client code where n is length in mask
$maskrefclient_clientcode = str_pad ( $maskrefclient_clientcode , dol_strlen ( $maskrefclient_maskclientcode ), " # " , STR_PAD_RIGHT ); //padding maskrefclient_clientcode for having exactly n characters in maskrefclient_clientcode
$maskrefclient_clientcode = dol_string_nospecial ( $maskrefclient_clientcode ); //sanitize maskrefclient_clientcode for sql insert and sql select like
2021-02-23 21:03:23 +00:00
if ( dol_strlen ( $maskrefclient_maskcounter ) > 0 && dol_strlen ( $maskrefclient_maskcounter ) < 3 ) {
return 'ErrorCounterMustHaveMoreThan3Digits' ;
}
} else {
$maskrefclient = '' ;
}
2020-09-07 08:18:17 +00:00
// fail if there is neither a global nor a third party counter
2021-02-23 21:03:23 +00:00
if ( ! $hasglobalcounter && ( $maskrefclient_maskcounter == '' )) {
2020-09-07 08:18:17 +00:00
return 'ErrorBadMask' ;
}
// Extract value for third party type
2020-09-19 20:41:05 +00:00
$regType = array ();
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/\{(t+)\}/i' , $mask , $regType )) {
2020-09-07 08:18:17 +00:00
$masktype = $regType [ 1 ];
2022-12-14 13:53:14 +00:00
$masktype_value = dol_substr ( preg_replace ( '/^TE_/' , '' , $objsoc -> typent_code ), 0 , dol_strlen ( $regType [ 1 ])); // get n first characters of thirdparty typent_code (where n is length in mask)
2020-09-07 08:18:17 +00:00
$masktype_value = str_pad ( $masktype_value , dol_strlen ( $regType [ 1 ]), " # " , STR_PAD_RIGHT ); // we fill on right with # to have same number of char than into mask
} else {
$masktype = '' ;
$masktype_value = '' ;
}
// Extract value for user
2025-04-05 12:09:47 +00:00
$regUser = array ();
if ( preg_match ( '/\{(u+)\}/i' , $mask , $regUser )) {
2020-09-07 08:18:17 +00:00
$lastname = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' ;
2021-02-23 21:03:23 +00:00
if ( is_object ( $objuser )) {
$lastname = $objuser -> lastname ;
}
2020-09-07 08:18:17 +00:00
2025-04-05 12:09:47 +00:00
$maskuser = $regUser [ 1 ];
$maskuser_value = substr ( $lastname , 0 , dol_strlen ( $regUser [ 1 ])); // get n first characters of user firstname (where n is length in mask)
$maskuser_value = str_pad ( $maskuser_value , dol_strlen ( $regUser [ 1 ]), " # " , STR_PAD_RIGHT ); // we fill on right with # to have same number of char than into mask
2020-09-07 08:18:17 +00:00
} else {
$maskuser = '' ;
$maskuser_value = '' ;
}
2025-04-05 12:09:47 +00:00
// Extract value for journal code
$regJournal = array ();
if ( preg_match ( '/\{(jj+)\}/i' , $mask , $regJournal )) {
2025-04-05 13:29:41 +00:00
$journalcode = 'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ' ;
if ( is_object ( $objbookkeeping )) {
2025-09-15 14:16:32 +00:00
$journalcode = ( string ) $objbookkeeping -> code_journal ;
2025-04-05 12:09:47 +00:00
}
$maskjournal = $regJournal [ 1 ];
$maskjournal_value = substr ( $journalcode , 0 , dol_strlen ( $regJournal [ 1 ])); // get n first characters of journal code (where n is length in mask)
$maskjournal_value = str_pad ( $maskjournal_value , dol_strlen ( $regJournal [ 1 ]), " # " , STR_PAD_RIGHT ); // we fill on right with # to have same number of char than into mask
} else {
$maskjournal = '' ;
$maskjournal_value = '' ;
}
2026-06-28 11:43:41 +00:00
// Personalized field {XXX-1} to {XXX-99}
2020-09-07 08:18:17 +00:00
$maskperso = array ();
$maskpersonew = array ();
$tmpmask = $mask ;
2020-09-19 20:41:05 +00:00
$regKey = array ();
2024-09-11 14:46:16 +00:00
while ( preg_match ( '/\{([A-Z]+)\-([0-9]+)\}/' , $tmpmask , $regKey )) {
2020-09-07 08:18:17 +00:00
$maskperso [ $regKey [ 1 ]] = '{' . $regKey [ 1 ] . '-' . $regKey [ 2 ] . '}' ;
2024-02-28 14:36:29 +00:00
// @phan-suppress-next-line PhanParamSuspiciousOrder
2024-03-18 02:45:11 +00:00
$maskpersonew [ $regKey [ 1 ]] = str_pad ( '' , ( int ) $regKey [ 2 ], '_' , STR_PAD_RIGHT );
2020-09-07 08:18:17 +00:00
$tmpmask = preg_replace ( '/\{' . $regKey [ 1 ] . '\-' . $regKey [ 2 ] . '\}/i' , $maskpersonew [ $regKey [ 1 ]], $tmpmask );
}
2021-02-23 21:03:23 +00:00
if ( strstr ( $mask , 'user_extra_' )) {
2019-10-27 10:53:20 +00:00
$start = " { user_extra_ " ;
$end = " \ } " ;
2020-01-09 23:03:10 +00:00
$extra = get_string_between ( $mask , " user_extra_ " , " } " );
2019-10-27 10:53:20 +00:00
if ( ! empty ( $user -> array_options [ 'options_' . $extra ])) {
2020-01-09 23:03:10 +00:00
$mask = preg_replace ( '#(' . $start . ')(.*?)(' . $end . ')#si' , $user -> array_options [ 'options_' . $extra ], $mask );
2019-10-27 10:53:20 +00:00
}
2020-09-07 08:18:17 +00:00
}
2025-04-05 13:29:41 +00:00
// Now define value for all alternative $mask variable we will need to work
2020-09-07 08:18:17 +00:00
$maskwithonlyymcode = $mask ;
$maskwithonlyymcode = preg_replace ( '/\{(0+)([@\+][0-9\-\+\=]+)?([@\+][0-9\-\+\=]+)?\}/i' , $maskcounter , $maskwithonlyymcode );
$maskwithonlyymcode = preg_replace ( '/\{dd\}/i' , 'dd' , $maskwithonlyymcode );
$maskwithonlyymcode = preg_replace ( '/\{(c+)(0*)\}/i' , $maskrefclient , $maskwithonlyymcode );
$maskwithonlyymcode = preg_replace ( '/\{(t+)\}/i' , $masktype_value , $maskwithonlyymcode );
$maskwithonlyymcode = preg_replace ( '/\{(u+)\}/i' , $maskuser_value , $maskwithonlyymcode );
2025-04-05 13:29:41 +00:00
$maskwithonlyymcode = preg_replace ( '/\{(j+)\}/i' , $maskjournal_value , $maskwithonlyymcode );
2021-02-23 21:03:23 +00:00
foreach ( $maskperso as $key => $val ) {
2020-09-07 08:18:17 +00:00
$maskwithonlyymcode = preg_replace ( '/' . preg_quote ( $val , '/' ) . '/i' , $maskpersonew [ $key ], $maskwithonlyymcode );
}
$maskwithnocode = $maskwithonlyymcode ;
$maskwithnocode = preg_replace ( '/\{yyyy\}/i' , 'yyyy' , $maskwithnocode );
$maskwithnocode = preg_replace ( '/\{yy\}/i' , 'yy' , $maskwithnocode );
$maskwithnocode = preg_replace ( '/\{y\}/i' , 'y' , $maskwithnocode );
$maskwithnocode = preg_replace ( '/\{mm\}/i' , 'mm' , $maskwithnocode );
// Now maskwithnocode = 0000ddmmyyyyccc for example
// and maskcounter = 0000 for example
//print "maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode."\n<br>";
//var_dump($reg);
2025-04-05 13:29:41 +00:00
// If an offset is asked ($reg is parsed from the counter mask)
2021-02-23 21:03:23 +00:00
if ( ! empty ( $reg [ 2 ]) && preg_match ( '/^\+/' , $reg [ 2 ])) {
$maskoffset = preg_replace ( '/^\+/' , '' , $reg [ 2 ]);
}
if ( ! empty ( $reg [ 3 ]) && preg_match ( '/^\+/' , $reg [ 3 ])) {
$maskoffset = preg_replace ( '/^\+/' , '' , $reg [ 3 ]);
}
2020-09-07 08:18:17 +00:00
// Define $sqlwhere
$sqlwhere = '' ;
$yearoffset = 0 ; // Use year of current $date by default
2025-04-05 13:29:41 +00:00
$yearoffsettype = false ; // false: no reset, 0,-,=,+: reset at offset month SOCIETE_FISCAL_MONTH_START, x=reset at offset month x
2020-09-07 08:18:17 +00:00
2025-04-05 13:29:41 +00:00
// If a restore to zero after a month is asked we check if there is already a value for this year ($reg is parsed from the counter mask)
2021-02-23 21:03:23 +00:00
if ( ! empty ( $reg [ 2 ]) && preg_match ( '/^@/' , $reg [ 2 ])) {
$yearoffsettype = preg_replace ( '/^@/' , '' , $reg [ 2 ]);
}
if ( ! empty ( $reg [ 3 ]) && preg_match ( '/^@/' , $reg [ 3 ])) {
$yearoffsettype = preg_replace ( '/^@/' , '' , $reg [ 3 ]);
}
2020-09-07 08:18:17 +00:00
//print "yearoffset=".$yearoffset." yearoffsettype=".$yearoffsettype;
2021-02-23 21:03:23 +00:00
if ( is_numeric ( $yearoffsettype ) && $yearoffsettype >= 1 ) {
2020-09-07 08:18:17 +00:00
$maskraz = $yearoffsettype ; // For backward compatibility
2023-11-27 11:24:18 +00:00
} elseif ( $yearoffsettype === '0' || ( ! empty ( $yearoffsettype ) && ! is_numeric ( $yearoffsettype ) && getDolGlobalInt ( 'SOCIETE_FISCAL_MONTH_START' ) > 1 )) {
2024-01-05 03:18:53 +00:00
$maskraz = getDolGlobalString ( 'SOCIETE_FISCAL_MONTH_START' );
2021-02-23 21:03:23 +00:00
}
2020-09-07 08:18:17 +00:00
//print "maskraz=".$maskraz; // -1=no reset
2025-04-07 11:10:32 +00:00
$monthcomp = 0 ;
$yearcomp = '' ;
2020-09-07 08:18:17 +00:00
if ( $maskraz > 0 ) { // A reset is required
if ( $maskraz == 99 ) {
2024-03-18 02:45:11 +00:00
$maskraz = ( int ) date ( 'm' , $date );
2020-09-07 08:18:17 +00:00
$resetEveryMonth = true ;
}
2021-02-23 21:03:23 +00:00
if ( $maskraz > 12 ) {
return 'ErrorBadMaskBadRazMonth' ;
}
2020-09-07 08:18:17 +00:00
// Define posy, posm and reg
2021-02-23 21:03:23 +00:00
if ( $maskraz > 1 ) { // if reset is not first month, we need month and year into mask
if ( preg_match ( '/^(.*)\{(y+)\}\{(m+)\}/i' , $maskwithonlyymcode , $reg )) {
2021-03-01 19:37:16 +00:00
$posy = 2 ;
$posm = 3 ;
2021-02-23 21:03:23 +00:00
} elseif ( preg_match ( '/^(.*)\{(m+)\}\{(y+)\}/i' , $maskwithonlyymcode , $reg )) {
2021-03-01 19:37:16 +00:00
$posy = 3 ;
$posm = 2 ;
2021-02-23 21:03:23 +00:00
} else {
return 'ErrorCantUseRazInStartedYearIfNoYearMonthInMask' ;
}
2020-09-07 08:18:17 +00:00
2021-02-23 21:03:23 +00:00
if ( dol_strlen ( $reg [ $posy ]) < 2 ) {
return 'ErrorCantUseRazWithYearOnOneDigit' ;
}
2023-12-04 11:05:28 +00:00
} else { // if reset is for a specific month in year, we need year
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/^(.*)\{(m+)\}\{(y+)\}/i' , $maskwithonlyymcode , $reg )) {
2025-04-05 13:29:41 +00:00
$posy = 3 ; //index in regex
2021-03-01 19:37:16 +00:00
$posm = 2 ;
2021-02-23 21:03:23 +00:00
} elseif ( preg_match ( '/^(.*)\{(y+)\}\{(m+)\}/i' , $maskwithonlyymcode , $reg )) {
2025-04-05 13:29:41 +00:00
$posy = 2 ; //index in regex
2021-03-01 19:37:16 +00:00
$posm = 3 ;
2021-02-23 21:03:23 +00:00
} elseif ( preg_match ( '/^(.*)\{(y+)\}/i' , $maskwithonlyymcode , $reg )) {
2025-04-05 13:29:41 +00:00
$posy = 2 ; //index in regex
2021-03-01 19:37:16 +00:00
$posm = 0 ;
2021-02-23 21:03:23 +00:00
} else {
return 'ErrorCantUseRazIfNoYearInMask' ;
}
2020-09-07 08:18:17 +00:00
}
// Define length
2023-12-04 11:05:28 +00:00
$yearlen = $posy ? dol_strlen ( $reg [ $posy ]) : 0 ;
$monthlen = $posm ? dol_strlen ( $reg [ $posm ]) : 0 ;
2020-09-07 08:18:17 +00:00
// Define pos
2021-02-23 21:03:23 +00:00
$yearpos = ( dol_strlen ( $reg [ 1 ]) + 1 );
2020-09-07 08:18:17 +00:00
$monthpos = ( $yearpos + $yearlen );
if ( $posy == 3 && $posm == 2 ) { // if month is before year
2021-02-23 21:03:23 +00:00
$monthpos = ( dol_strlen ( $reg [ 1 ]) + 1 );
$yearpos = ( $monthpos + $monthlen );
2020-09-07 08:18:17 +00:00
}
//print "xxx ".$maskwithonlyymcode." maskraz=".$maskraz." posy=".$posy." yearlen=".$yearlen." yearpos=".$yearpos." posm=".$posm." monthlen=".$monthlen." monthpos=".$monthpos." yearoffsettype=".$yearoffsettype." resetEveryMonth=".$resetEveryMonth."\n";
// Define $yearcomp and $monthcomp (that will be use in the select where to search max number)
$monthcomp = $maskraz ;
2025-04-07 10:23:17 +00:00
$yearcomp = '' ;
2020-09-07 08:18:17 +00:00
2021-02-23 21:03:23 +00:00
if ( ! empty ( $yearoffsettype ) && ! is_numeric ( $yearoffsettype ) && $yearoffsettype != '=' ) { // $yearoffsettype is - or +
2024-03-18 02:45:11 +00:00
$currentyear = ( int ) date ( " Y " , $date );
2024-08-16 18:13:02 +00:00
$fiscaldate = dol_mktime ( 0 , 0 , 0 , $maskraz , 1 , $currentyear );
$newyeardate = dol_mktime ( 0 , 0 , 0 , 1 , 1 , $currentyear );
$nextnewyeardate = dol_mktime ( 0 , 0 , 0 , 1 , 1 , $currentyear + 1 );
2020-09-07 08:18:17 +00:00
//echo 'currentyear='.$currentyear.' date='.dol_print_date($date, 'day').' fiscaldate='.dol_print_date($fiscaldate, 'day').'<br>';
// If after or equal of current fiscal date
2021-02-23 21:03:23 +00:00
if ( $date >= $fiscaldate ) {
2020-09-07 08:18:17 +00:00
// If before of next new year date
2021-02-23 21:03:23 +00:00
if ( $date < $nextnewyeardate && $yearoffsettype == '+' ) {
$yearoffset = 1 ;
}
2021-02-28 23:19:52 +00:00
} elseif ( $date >= $newyeardate && $yearoffsettype == '-' ) {
// If after or equal of current new year date
2021-02-23 21:03:23 +00:00
$yearoffset = - 1 ;
}
2024-03-18 02:45:11 +00:00
} elseif (( int ) date ( " m " , $date ) < $maskraz && empty ( $resetEveryMonth )) {
2021-02-28 23:19:52 +00:00
// For backward compatibility
2021-02-23 21:03:23 +00:00
$yearoffset = - 1 ;
} // If current month lower that month of return to zero, year is previous year
if ( $yearlen == 4 ) {
2024-03-21 21:29:21 +00:00
$yearcomp = sprintf ( " %04d " , idate ( " Y " , $date ) + $yearoffset );
2021-02-23 21:03:23 +00:00
} elseif ( $yearlen == 2 ) {
2024-03-21 21:29:21 +00:00
$yearcomp = sprintf ( " %02d " , idate ( " y " , $date ) + $yearoffset );
2021-02-23 21:03:23 +00:00
} elseif ( $yearlen == 1 ) {
2025-04-07 10:23:17 +00:00
$yearcomp = ( string ) (( int ) substr ( date ( 'y' , $date ), 1 , 1 ) + $yearoffset );
2021-02-23 21:03:23 +00:00
}
2025-04-05 13:29:41 +00:00
if ( $monthcomp > 1 && empty ( $resetEveryMonth )) { // Test with month is useless if monthcomp = 1 (0 is same as 1)
2021-02-23 21:03:23 +00:00
if ( $yearlen == 4 ) {
2024-03-21 21:29:21 +00:00
$yearcomp1 = sprintf ( " %04d " , idate ( " Y " , $date ) + $yearoffset + 1 );
2021-02-23 21:03:23 +00:00
} elseif ( $yearlen == 2 ) {
2024-03-21 21:29:21 +00:00
$yearcomp1 = sprintf ( " %02d " , idate ( " y " , $date ) + $yearoffset + 1 );
2024-09-28 10:09:35 +00:00
} else {
$yearcomp1 = '' ;
2021-02-23 21:03:23 +00:00
}
2020-09-07 08:18:17 +00:00
$sqlwhere .= " ( " ;
2026-07-19 15:32:14 +00:00
$sqlwhere .= " (SUBSTRING( " . $field . " , " . (( int ) $yearpos ) . " , " . (( int ) $yearlen ) . " ) = ' " . $db -> escape ( $yearcomp ) . " ' " ;
$sqlwhere .= " AND SUBSTRING( " . $field . " , " . (( int ) $monthpos ) . " , " . (( int ) $monthlen ) . " ) >= ' " . str_pad (( string ) (( int ) $monthcomp ), (( int ) $monthlen ), '0' , STR_PAD_LEFT ) . " ') " ;
2020-09-07 08:18:17 +00:00
$sqlwhere .= " OR " ;
2026-07-19 15:32:14 +00:00
$sqlwhere .= " (SUBSTRING( " . $field . " , " . (( int ) $yearpos ) . " , " . (( int ) $yearlen ) . " ) = ' " . $db -> escape ( $yearcomp1 ) . " ' " ;
$sqlwhere .= " AND SUBSTRING( " . $field . " , " . (( int ) $monthpos ) . " , " . (( int ) $monthlen ) . " ) < ' " . str_pad (( string ) (( int ) $monthcomp ), (( int ) $monthlen ), '0' , STR_PAD_LEFT ) . " ') " ;
2020-09-07 08:18:17 +00:00
$sqlwhere .= ')' ;
2020-12-20 13:31:54 +00:00
} elseif ( $resetEveryMonth ) {
2026-07-19 15:32:14 +00:00
$sqlwhere .= " (SUBSTRING( " . $field . " , " . (( int ) $yearpos ) . " , " . (( int ) $yearlen ) . " ) = ' " . $db -> escape ( $yearcomp ) . " ' " ;
$sqlwhere .= " AND SUBSTRING( " . $field . " , " . (( int ) $monthpos ) . " , " . (( int ) $monthlen ) . " ) = ' " . str_pad (( string ) (( int ) $monthcomp ), (( int ) $monthlen ), '0' , STR_PAD_LEFT ) . " ') " ;
2020-12-20 13:31:54 +00:00
} else { // reset is done on january
2026-07-19 15:32:14 +00:00
$sqlwhere .= " (SUBSTRING( " . $field . " , " . (( int ) $yearpos ) . " , " . (( int ) $yearlen ) . " ) = ' " . $db -> escape ( $yearcomp ) . " ') " ;
2020-09-07 08:18:17 +00:00
}
}
//print "sqlwhere=".$sqlwhere." yearcomp=".$yearcomp."<br>\n"; // sqlwhere and yearcomp defined only if we ask a reset
//print "masktri=".$masktri." maskcounter=".$maskcounter." maskraz=".$maskraz." maskoffset=".$maskoffset."<br>\n";
// Define $sqlstring
2020-11-07 19:01:28 +00:00
if ( function_exists ( 'mb_strrpos' )) {
$posnumstart = mb_strrpos ( $maskwithnocode , $maskcounter , 0 , 'UTF-8' );
2020-05-21 13:05:19 +00:00
} else {
2020-09-07 08:18:17 +00:00
$posnumstart = strrpos ( $maskwithnocode , $maskcounter );
2015-11-20 17:05:00 +00:00
} // Pos of counter in final string (from 0 to ...)
2021-02-23 21:03:23 +00:00
if ( $posnumstart < 0 ) {
return 'ErrorBadMaskFailedToLocatePosOfSequence' ;
}
2026-07-19 15:32:14 +00:00
$sqlstring = " SUBSTRING( " . $field . " , " . ((( int ) $posnumstart ) + 1 ) . " , " . dol_strlen ( $maskcounter ) . " ) " ;
2020-09-07 08:18:17 +00:00
// Define $maskLike
$maskLike = dol_string_nospecial ( $mask );
$maskLike = str_replace ( " % " , " _ " , $maskLike );
2024-01-13 18:48:20 +00:00
// Replace protected special codes with matching number of _ as wild card character
2025-04-07 10:41:13 +00:00
if ( $resetEveryMonth && $yearcomp && $monthcomp ) { // Perf optimization, when a reset is requested at each month, we can include the year and month inside the filter
2025-04-05 13:29:41 +00:00
$maskLike = preg_replace ( '/\{yyyy\}/i' , $yearcomp , $maskLike );
$maskLike = preg_replace ( '/\{yy\}/i' , $yearcomp , $maskLike );
$maskLike = preg_replace ( '/\{y\}/i' , $yearcomp , $maskLike );
$maskLike = preg_replace ( '/\{mm\}/i' , sprintf ( " %02d " , $monthcomp ), $maskLike );
2025-04-07 10:41:13 +00:00
} elseif ( $maskraz == 1 && $yearcomp ) { // Perf optimization, when a reset is requested at first month, we can include the year inside the filter, but not the month
2025-04-05 13:29:41 +00:00
$maskLike = preg_replace ( '/\{yyyy\}/i' , $yearcomp , $maskLike );
$maskLike = preg_replace ( '/\{yy\}/i' , $yearcomp , $maskLike );
$maskLike = preg_replace ( '/\{y\}/i' , $yearcomp , $maskLike );
$maskLike = preg_replace ( '/\{mm\}/i' , '__' , $maskLike ); // we can't include the month in the filter
} else {
$maskLike = preg_replace ( '/\{yyyy\}/i' , '____' , $maskLike );
$maskLike = preg_replace ( '/\{yy\}/i' , '__' , $maskLike );
$maskLike = preg_replace ( '/\{y\}/i' , '_' , $maskLike );
$maskLike = preg_replace ( '/\{mm\}/i' , '__' , $maskLike );
}
2020-09-07 08:18:17 +00:00
$maskLike = preg_replace ( '/\{dd\}/i' , '__' , $maskLike );
2024-02-28 14:36:29 +00:00
// @phan-suppress-next-line PhanParamSuspiciousOrder
2020-09-07 08:18:17 +00:00
$maskLike = str_replace ( dol_string_nospecial ( '{' . $masktri . '}' ), str_pad ( " " , dol_strlen ( $maskcounter ), " _ " ), $maskLike );
2021-02-23 21:03:23 +00:00
if ( $maskrefclient ) {
2024-02-28 14:36:29 +00:00
// @phan-suppress-next-line PhanParamSuspiciousOrder
2021-02-23 21:03:23 +00:00
$maskLike = str_replace ( dol_string_nospecial ( '{' . $maskrefclient . '}' ), str_pad ( " " , dol_strlen ( $maskrefclient ), " _ " ), $maskLike );
}
if ( $masktype ) {
$maskLike = str_replace ( dol_string_nospecial ( '{' . $masktype . '}' ), $masktype_value , $maskLike );
}
if ( $maskuser ) {
$maskLike = str_replace ( dol_string_nospecial ( '{' . $maskuser . '}' ), $maskuser_value , $maskLike );
}
2025-04-05 13:29:41 +00:00
if ( $maskjournal ) {
$maskLike = str_replace ( dol_string_nospecial ( '{' . $maskjournal . '}' ), $maskjournal_value , $maskLike );
}
2021-02-23 21:03:23 +00:00
foreach ( $maskperso as $key => $val ) {
2020-09-07 08:18:17 +00:00
$maskLike = str_replace ( dol_string_nospecial ( $maskperso [ $key ]), $maskpersonew [ $key ], $maskLike );
}
2019-06-18 17:41:16 +00:00
2020-09-07 08:18:17 +00:00
// Get counter in database
$counter = 0 ;
$sql = " SELECT MAX( " . $sqlstring . " ) as val " ;
2025-01-20 02:54:04 +00:00
$sql .= " FROM " . MAIN_DB_PREFIX . $db -> sanitize ( $table );
$sql .= " WHERE " . $db -> sanitize ( $field ) . " LIKE ' " . $db -> escape ( $maskLike ) . ( getDolGlobalString ( 'SEARCH_FOR_NEXT_VAL_ON_START_ONLY' ) ? " % " : " " ) . " ' " ;
$sql .= " AND " . $db -> sanitize ( $field ) . " NOT LIKE '(PROV%)' " ;
2022-11-10 16:10:51 +00:00
2022-11-10 16:19:12 +00:00
// To ensure that all variables within the MAX() brackets are integers
2023-10-10 20:25:52 +00:00
// This avoid bad detection of max when data are noised with non numeric values at the position of the numero
2022-12-01 16:39:28 +00:00
if ( getDolGlobalInt ( 'MAIN_NUMBERING_FILTER_ON_INT_ONLY' )) {
2024-02-21 17:14:29 +00:00
// @phan-suppress-next-line PhanPluginSuspiciousParamPosition
2023-12-15 12:49:09 +00:00
$sql .= " AND " . $db -> regexpsql ( $sqlstring , '^[0-9]+$' , 1 );
2022-12-01 16:39:28 +00:00
}
2022-11-10 16:19:12 +00:00
2021-02-23 21:03:23 +00:00
if ( $bentityon ) { // only if entity enable
2020-09-07 08:18:17 +00:00
$sql .= " AND entity IN ( " . getEntity ( $sharetable ) . " ) " ;
2021-02-23 21:03:23 +00:00
} elseif ( ! empty ( $forceentity )) {
2021-03-22 10:30:18 +00:00
$sql .= " AND entity IN ( " . $db -> sanitize ( $forceentity ) . " ) " ;
2021-02-23 21:03:23 +00:00
}
if ( $where ) {
$sql .= $where ;
}
if ( $sqlwhere ) {
2026-04-14 14:38:13 +00:00
$sanitizedsqlwhere = $sqlwhere ;
$sql .= " AND " . $sanitizedsqlwhere ;
2021-02-23 21:03:23 +00:00
}
2020-09-07 08:18:17 +00:00
//print $sql.'<br>';
2022-12-28 15:40:03 +00:00
dol_syslog ( " functions2::get_next_value mode= " . $mode , LOG_DEBUG );
2020-09-07 08:18:17 +00:00
$resql = $db -> query ( $sql );
2021-02-23 21:03:23 +00:00
if ( $resql ) {
2020-09-07 08:18:17 +00:00
$obj = $db -> fetch_object ( $resql );
$counter = $obj -> val ;
2021-02-23 21:03:23 +00:00
} else {
dol_print_error ( $db );
}
2020-09-07 08:18:17 +00:00
// Check if we must force counter to maskoffset
2021-02-23 21:03:23 +00:00
if ( empty ( $counter )) {
$counter = $maskoffset ;
} elseif ( preg_match ( '/[^0-9]/i' , $counter )) {
2020-09-07 08:18:17 +00:00
dol_syslog ( " Error, the last counter found is ' " . $counter . " ' so is not a numeric value. We will restart to 1. " , LOG_ERR );
2023-03-23 17:37:05 +00:00
$counter = 0 ;
2023-11-27 10:39:32 +00:00
} elseif ( $counter < $maskoffset && ! getDolGlobalString ( 'MAIN_NUMBERING_OFFSET_ONLY_FOR_FIRST' )) {
2021-02-23 21:03:23 +00:00
$counter = $maskoffset ;
}
2020-09-07 08:18:17 +00:00
2021-02-23 21:03:23 +00:00
if ( $mode == 'last' ) { // We found value for counter = last counter value. Now need to get corresponding ref of invoice.
2020-09-07 08:18:17 +00:00
$counterpadded = str_pad ( $counter , dol_strlen ( $maskcounter ), " 0 " , STR_PAD_LEFT );
// Define $maskLike
$maskLike = dol_string_nospecial ( $mask );
$maskLike = str_replace ( " % " , " _ " , $maskLike );
2024-01-13 18:48:20 +00:00
// Replace protected special codes with matching number of _ as wild card character
2020-09-07 08:18:17 +00:00
$maskLike = preg_replace ( '/\{yyyy\}/i' , '____' , $maskLike );
$maskLike = preg_replace ( '/\{yy\}/i' , '__' , $maskLike );
$maskLike = preg_replace ( '/\{y\}/i' , '_' , $maskLike );
$maskLike = preg_replace ( '/\{mm\}/i' , '__' , $maskLike );
$maskLike = preg_replace ( '/\{dd\}/i' , '__' , $maskLike );
$maskLike = str_replace ( dol_string_nospecial ( '{' . $masktri . '}' ), $counterpadded , $maskLike );
2021-02-23 21:03:23 +00:00
if ( $maskrefclient ) {
2024-02-28 14:36:29 +00:00
// @phan-suppress-next-line PhanParamSuspiciousOrder
2021-02-23 21:03:23 +00:00
$maskLike = str_replace ( dol_string_nospecial ( '{' . $maskrefclient . '}' ), str_pad ( " " , dol_strlen ( $maskrefclient ), " _ " ), $maskLike );
}
if ( $masktype ) {
$maskLike = str_replace ( dol_string_nospecial ( '{' . $masktype . '}' ), $masktype_value , $maskLike );
}
if ( $maskuser ) {
$maskLike = str_replace ( dol_string_nospecial ( '{' . $maskuser . '}' ), $maskuser_value , $maskLike );
}
2020-09-07 08:18:17 +00:00
$ref = '' ;
2025-01-20 02:54:04 +00:00
$sql = " SELECT " . $db -> sanitize ( $field ) . " as ref " ;
$sql .= " FROM " . MAIN_DB_PREFIX . $db -> sanitize ( $table );
$sql .= " WHERE " . $db -> sanitize ( $field ) . " LIKE ' " . $db -> escape ( $maskLike ) . ( getDolGlobalString ( 'SEARCH_FOR_NEXT_VAL_ON_START_ONLY' ) ? " % " : " " ) . " ' " ;
$sql .= " AND " . $db -> sanitize ( $field ) . " NOT LIKE '%PROV%' " ;
2021-02-23 21:03:23 +00:00
if ( $bentityon ) { // only if entity enable
2020-09-07 08:18:17 +00:00
$sql .= " AND entity IN ( " . getEntity ( $sharetable ) . " ) " ;
2021-02-23 21:03:23 +00:00
} elseif ( ! empty ( $forceentity )) {
2021-03-22 10:30:18 +00:00
$sql .= " AND entity IN ( " . $db -> sanitize ( $forceentity ) . " ) " ;
2021-02-23 21:03:23 +00:00
}
if ( $where ) {
$sql .= $where ;
}
if ( $sqlwhere ) {
2021-08-27 23:45:53 +00:00
$sql .= " AND " . $sqlwhere ;
2021-02-23 21:03:23 +00:00
}
2020-09-07 08:18:17 +00:00
2022-12-28 15:40:03 +00:00
dol_syslog ( " functions2::get_next_value mode= " . $mode , LOG_DEBUG );
2020-09-07 08:18:17 +00:00
$resql = $db -> query ( $sql );
2021-02-23 21:03:23 +00:00
if ( $resql ) {
2020-09-07 08:18:17 +00:00
$obj = $db -> fetch_object ( $resql );
2021-02-23 21:03:23 +00:00
if ( $obj ) {
$ref = $obj -> ref ;
}
} else {
dol_print_error ( $db );
}
2020-09-07 08:18:17 +00:00
$numFinal = $ref ;
2020-12-20 13:31:54 +00:00
} elseif ( $mode == 'next' ) {
2020-09-07 08:18:17 +00:00
$counter ++ ;
2022-02-01 14:55:04 +00:00
$maskrefclient_counter = 0 ;
2020-09-07 08:18:17 +00:00
// If value for $counter has a length higher than $maskcounter chars
2021-02-23 21:03:23 +00:00
if ( $counter >= pow ( 10 , dol_strlen ( $maskcounter ))) {
2020-09-07 08:18:17 +00:00
$counter = 'ErrorMaxNumberReachForThisMask' ;
}
2021-02-23 21:03:23 +00:00
if ( ! empty ( $maskrefclient_maskcounter )) {
2020-09-07 08:18:17 +00:00
//print "maskrefclient_maskcounter=".$maskrefclient_maskcounter." maskwithnocode=".$maskwithnocode." maskrefclient=".$maskrefclient."\n<br>";
// Define $sqlstring
$maskrefclient_posnumstart = strpos ( $maskwithnocode , $maskrefclient_maskcounter , strpos ( $maskwithnocode , $maskrefclient )); // Pos of counter in final string (from 0 to ...)
2021-02-23 21:03:23 +00:00
if ( $maskrefclient_posnumstart <= 0 ) {
return 'ErrorBadMask' ;
}
2026-07-19 15:32:14 +00:00
$sanitized_maskrefclient_string = 'SUBSTRING(' . $field . ', ' . (( int ) $maskrefclient_posnumstart + 1 ) . ', ' . dol_strlen ( $maskrefclient_maskcounter ) . ')' ;
2020-09-07 08:18:17 +00:00
//print "x".$sqlstring;
// Define $maskrefclient_maskLike
$maskrefclient_maskLike = dol_string_nospecial ( $mask );
$maskrefclient_maskLike = str_replace ( " % " , " _ " , $maskrefclient_maskLike );
2024-01-13 18:48:20 +00:00
// Replace protected special codes with matching number of _ as wild card character
2020-09-07 08:18:17 +00:00
$maskrefclient_maskLike = str_replace ( dol_string_nospecial ( '{yyyy}' ), '____' , $maskrefclient_maskLike );
$maskrefclient_maskLike = str_replace ( dol_string_nospecial ( '{yy}' ), '__' , $maskrefclient_maskLike );
$maskrefclient_maskLike = str_replace ( dol_string_nospecial ( '{y}' ), '_' , $maskrefclient_maskLike );
$maskrefclient_maskLike = str_replace ( dol_string_nospecial ( '{mm}' ), '__' , $maskrefclient_maskLike );
$maskrefclient_maskLike = str_replace ( dol_string_nospecial ( '{dd}' ), '__' , $maskrefclient_maskLike );
2024-02-28 14:36:29 +00:00
// @phan-suppress-next-line PhanParamSuspiciousOrder
2020-09-07 08:18:17 +00:00
$maskrefclient_maskLike = str_replace ( dol_string_nospecial ( '{' . $masktri . '}' ), str_pad ( " " , dol_strlen ( $maskcounter ), " _ " ), $maskrefclient_maskLike );
2024-02-28 14:36:29 +00:00
// @phan-suppress-next-line PhanParamSuspiciousOrder
2020-09-07 08:18:17 +00:00
$maskrefclient_maskLike = str_replace ( dol_string_nospecial ( '{' . $maskrefclient . '}' ), $maskrefclient_clientcode . str_pad ( " " , dol_strlen ( $maskrefclient_maskcounter ), " _ " ), $maskrefclient_maskLike );
// Get counter in database
2026-07-19 15:32:14 +00:00
$maskrefclient_sql = " SELECT MAX( " . $sanitized_maskrefclient_string . " ) as val " ;
2026-04-03 20:39:18 +00:00
$maskrefclient_sql .= " FROM " . MAIN_DB_PREFIX . $db -> sanitize ( $table );
2025-01-20 02:54:04 +00:00
$maskrefclient_sql .= " WHERE " . $db -> sanitize ( $field ) . " LIKE ' " . $db -> escape ( $maskrefclient_maskLike ) . ( getDolGlobalString ( 'SEARCH_FOR_NEXT_VAL_ON_START_ONLY' ) ? " % " : " " ) . " ' " ;
2021-02-23 21:03:23 +00:00
if ( $bentityon ) { // only if entity enable
2020-09-07 08:18:17 +00:00
$maskrefclient_sql .= " AND entity IN ( " . getEntity ( $sharetable ) . " ) " ;
2021-02-23 21:03:23 +00:00
} elseif ( ! empty ( $forceentity )) {
2024-10-16 23:24:59 +00:00
$maskrefclient_sql .= " AND entity IN ( " . $db -> sanitize ( $forceentity ) . " ) " ;
2021-02-23 21:03:23 +00:00
}
if ( $where ) {
$maskrefclient_sql .= $where ; //use the same optional where as general mask
}
if ( $sqlwhere ) {
$maskrefclient_sql .= ' AND ' . $sqlwhere ; //use the same sqlwhere as general mask
}
2021-08-27 23:45:53 +00:00
$maskrefclient_sql .= " AND (SUBSTRING( " . $field . " , " . ( strpos ( $maskwithnocode , $maskrefclient ) + 1 ) . " , " . dol_strlen ( $maskrefclient_maskclientcode ) . " ) = ' " . $db -> escape ( $maskrefclient_clientcode ) . " ') " ;
2020-09-07 08:18:17 +00:00
dol_syslog ( " functions2::get_next_value maskrefclient " , LOG_DEBUG );
$maskrefclient_resql = $db -> query ( $maskrefclient_sql );
2021-02-23 21:03:23 +00:00
if ( $maskrefclient_resql ) {
2020-09-07 08:18:17 +00:00
$maskrefclient_obj = $db -> fetch_object ( $maskrefclient_resql );
$maskrefclient_counter = $maskrefclient_obj -> val ;
2021-02-23 21:03:23 +00:00
} else {
dol_print_error ( $db );
}
2020-09-07 08:18:17 +00:00
2021-02-23 21:03:23 +00:00
if ( empty ( $maskrefclient_counter ) || preg_match ( '/[^0-9]/i' , $maskrefclient_counter )) {
$maskrefclient_counter = $maskrefclient_maskoffset ;
}
2013-06-06 19:18:50 +00:00
$maskrefclient_counter ++ ;
2020-09-07 08:18:17 +00:00
}
2010-12-13 23:50:51 +00:00
2020-09-07 08:18:17 +00:00
// Build numFinal
$numFinal = $mask ;
2010-12-13 23:50:51 +00:00
2020-09-07 08:18:17 +00:00
// We replace special codes except refclient
2021-02-23 21:03:23 +00:00
if ( ! empty ( $yearoffsettype ) && ! is_numeric ( $yearoffsettype ) && $yearoffsettype != '=' ) { // yearoffsettype is - or +, so we don't want current year
2024-03-18 02:45:11 +00:00
$numFinal = preg_replace ( '/\{yyyy\}/i' , ( string ) (( int ) date ( " Y " , $date ) + $yearoffset ), $numFinal );
$numFinal = preg_replace ( '/\{yy\}/i' , ( string ) (( int ) date ( " y " , $date ) + $yearoffset ), $numFinal );
2024-03-19 17:52:11 +00:00
$numFinal = preg_replace ( '/\{y\}/i' , ( string ) (( int ) substr (( string ) date ( " y " , $date ), 1 , 1 ) + $yearoffset ), $numFinal );
2023-12-04 11:05:28 +00:00
} else { // we want yyyy to be current year
2020-09-07 08:18:17 +00:00
$numFinal = preg_replace ( '/\{yyyy\}/i' , date ( " Y " , $date ), $numFinal );
$numFinal = preg_replace ( '/\{yy\}/i' , date ( " y " , $date ), $numFinal );
$numFinal = preg_replace ( '/\{y\}/i' , substr ( date ( " y " , $date ), 1 , 1 ), $numFinal );
}
$numFinal = preg_replace ( '/\{mm\}/i' , date ( " m " , $date ), $numFinal );
$numFinal = preg_replace ( '/\{dd\}/i' , date ( " d " , $date ), $numFinal );
// Now we replace the counter
$maskbefore = '{' . $masktri . '}' ;
$maskafter = str_pad ( $counter , dol_strlen ( $maskcounter ), " 0 " , STR_PAD_LEFT );
2022-04-08 08:19:20 +00:00
//print 'x'.$numFinal.' - '.$maskbefore.' - '.$maskafter.'y';exit;
2020-09-07 08:18:17 +00:00
$numFinal = str_replace ( $maskbefore , $maskafter , $numFinal );
// Now we replace the refclient
2021-02-23 21:03:23 +00:00
if ( $maskrefclient ) {
2022-04-08 08:19:20 +00:00
//print "maskrefclient=".$maskrefclient." maskrefclient_counter=".$maskrefclient_counter." maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode." maskrefclient_clientcode=".$maskrefclient_clientcode." maskrefclient_maskcounter=".$maskrefclient_maskcounter."\n<br>";exit;
2020-09-07 08:18:17 +00:00
$maskrefclient_maskbefore = '{' . $maskrefclient . '}' ;
2022-04-08 08:19:20 +00:00
$maskrefclient_maskafter = $maskrefclient_clientcode ;
if ( dol_strlen ( $maskrefclient_maskcounter ) > 0 ) {
2024-09-13 01:09:23 +00:00
$maskrefclient_maskafter .= str_pad (( string ) $maskrefclient_counter , dol_strlen ( $maskrefclient_maskcounter ), " 0 " , STR_PAD_LEFT );
2022-04-08 08:19:20 +00:00
}
2024-09-28 10:09:35 +00:00
$numFinal = str_replace ( $maskrefclient_maskbefore , ( string ) $maskrefclient_maskafter , $numFinal );
2012-09-23 20:09:54 +00:00
}
2020-09-07 08:18:17 +00:00
// Now we replace the type
2021-02-23 21:03:23 +00:00
if ( $masktype ) {
2020-09-07 08:18:17 +00:00
$masktype_maskbefore = '{' . $masktype . '}' ;
$masktype_maskafter = $masktype_value ;
$numFinal = str_replace ( $masktype_maskbefore , $masktype_maskafter , $numFinal );
}
// Now we replace the user
2021-02-23 21:03:23 +00:00
if ( $maskuser ) {
2020-09-07 08:18:17 +00:00
$maskuser_maskbefore = '{' . $maskuser . '}' ;
$maskuser_maskafter = $maskuser_value ;
$numFinal = str_replace ( $maskuser_maskbefore , $maskuser_maskafter , $numFinal );
}
2025-04-05 13:29:41 +00:00
// Now we replace the journal code
if ( $maskjournal ) {
$maskjournal_maskbefore = '{' . $maskjournal . '}' ;
$maskjournal_maskafter = $maskjournal_value ;
$numFinal = str_replace ( $maskjournal_maskbefore , $maskjournal_maskafter , $numFinal );
}
2024-03-20 18:58:44 +00:00
} else {
$numFinal = " ErrorBadMode " ;
dol_syslog ( " functions2::get_next_value ErrorBadMode ' $mode ' " , LOG_ERR );
2020-09-07 08:18:17 +00:00
}
dol_syslog ( " functions2::get_next_value return " . $numFinal , LOG_DEBUG );
return $numFinal ;
2008-11-16 01:09:04 +00:00
}
2017-10-04 01:22:41 +00:00
2018-08-31 19:39:23 +00:00
/**
2024-03-13 01:17:35 +00:00
* Get string from " $start " up to " $end "
*
* If string is " STARTcontentEND " and $start is " START " and $end is " END " ,
* then this function returns " content "
2018-08-31 19:39:23 +00:00
*
* @ param string $string String to test
2024-03-13 01:17:35 +00:00
* @ param string $start String Value for start
* @ param string $end String Value for end
2018-08-31 19:39:23 +00:00
* @ return string Return part of string
*/
2018-08-15 15:34:35 +00:00
function get_string_between ( $string , $start , $end )
{
2023-12-04 11:05:28 +00:00
$ini = strpos ( $string , $start );
2024-03-13 01:17:35 +00:00
if ( $ini === false ) {
return '' ;
2021-02-23 21:03:23 +00:00
}
2023-12-04 11:05:28 +00:00
$ini += strlen ( $start );
2024-03-13 01:17:35 +00:00
$endpos = strpos ( $string , $end , $ini );
if ( $endpos === false ) {
return '' ;
}
return substr ( $string , $ini , $endpos - $ini );
2017-05-29 13:38:40 +00:00
}
2017-10-04 01:22:41 +00:00
2009-01-31 15:23:05 +00:00
/**
* Check value
2011-08-31 12:24:47 +00:00
*
2012-02-15 12:55:00 +00:00
* @ param string $mask Mask to use
* @ param string $value Value
2023-12-06 14:46:39 +00:00
* @ return int | string Return integer < 0 or error string if KO , 0 if OK
2009-01-31 15:23:05 +00:00
*/
2019-01-27 14:20:16 +00:00
function check_value ( $mask , $value )
2009-01-31 15:23:05 +00:00
{
2020-09-07 08:18:17 +00:00
$result = 0 ;
$hasglobalcounter = false ;
2024-09-28 10:09:35 +00:00
$maskrefclient_maskcounter = '' ;
2020-09-07 08:18:17 +00:00
// Extract value for mask counter, mask raz and mask offset
2020-09-25 15:23:42 +00:00
$reg = array ();
2020-12-20 13:31:54 +00:00
if ( preg_match ( '/\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}/i' , $mask , $reg )) {
2020-09-07 08:18:17 +00:00
$masktri = $reg [ 1 ] . ( isset ( $reg [ 2 ]) ? $reg [ 2 ] : '' ) . ( isset ( $reg [ 3 ]) ? $reg [ 3 ] : '' );
$maskcounter = $reg [ 1 ];
$hasglobalcounter = true ;
} else {
// setting some defaults so the rest of the code won't fail if there is a third party counter
$masktri = '00000' ;
$maskcounter = '00000' ;
}
$maskraz = - 1 ;
$maskoffset = 0 ;
2021-02-23 21:03:23 +00:00
if ( dol_strlen ( $maskcounter ) < 3 ) {
return 'ErrorCounterMustHaveMoreThan3Digits' ;
}
2020-09-07 08:18:17 +00:00
// Extract value for third party mask counter
2020-09-25 15:23:42 +00:00
$regClientRef = array ();
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/\{(c+)(0*)\}/i' , $mask , $regClientRef )) {
2020-09-07 08:18:17 +00:00
$maskrefclient = $regClientRef [ 1 ] . $regClientRef [ 2 ];
$maskrefclient_maskclientcode = $regClientRef [ 1 ];
$maskrefclient_maskcounter = $regClientRef [ 2 ];
$maskrefclient_maskoffset = 0 ; //default value of maskrefclient_counter offset
$maskrefclient_clientcode = substr ( '' , 0 , dol_strlen ( $maskrefclient_maskclientcode )); //get n first characters of client code to form maskrefclient_clientcode
$maskrefclient_clientcode = str_pad ( $maskrefclient_clientcode , dol_strlen ( $maskrefclient_maskclientcode ), " # " , STR_PAD_RIGHT ); //padding maskrefclient_clientcode for having exactly n characters in maskrefclient_clientcode
$maskrefclient_clientcode = dol_string_nospecial ( $maskrefclient_clientcode ); //sanitize maskrefclient_clientcode for sql insert and sql select like
2021-02-23 21:03:23 +00:00
if ( dol_strlen ( $maskrefclient_maskcounter ) > 0 && dol_strlen ( $maskrefclient_maskcounter ) < 3 ) {
return 'ErrorCounterMustHaveMoreThan3Digits' ;
}
} else {
$maskrefclient = '' ;
}
2020-09-07 08:18:17 +00:00
// fail if there is neither a global nor a third party counter
2021-02-23 21:03:23 +00:00
if ( ! $hasglobalcounter && ( $maskrefclient_maskcounter == '' )) {
2020-09-07 08:18:17 +00:00
return 'ErrorBadMask' ;
}
$maskwithonlyymcode = $mask ;
$maskwithonlyymcode = preg_replace ( '/\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}/i' , $maskcounter , $maskwithonlyymcode );
$maskwithonlyymcode = preg_replace ( '/\{dd\}/i' , 'dd' , $maskwithonlyymcode );
$maskwithonlyymcode = preg_replace ( '/\{(c+)(0*)\}/i' , $maskrefclient , $maskwithonlyymcode );
$maskwithnocode = $maskwithonlyymcode ;
$maskwithnocode = preg_replace ( '/\{yyyy\}/i' , 'yyyy' , $maskwithnocode );
$maskwithnocode = preg_replace ( '/\{yy\}/i' , 'yy' , $maskwithnocode );
$maskwithnocode = preg_replace ( '/\{y\}/i' , 'y' , $maskwithnocode );
$maskwithnocode = preg_replace ( '/\{mm\}/i' , 'mm' , $maskwithnocode );
// Now maskwithnocode = 0000ddmmyyyyccc for example
// and maskcounter = 0000 for example
//print "maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode."\n<br>";
// If an offset is asked
2021-02-23 21:03:23 +00:00
if ( ! empty ( $reg [ 2 ]) && preg_match ( '/^\+/' , $reg [ 2 ])) {
$maskoffset = preg_replace ( '/^\+/' , '' , $reg [ 2 ]);
}
if ( ! empty ( $reg [ 3 ]) && preg_match ( '/^\+/' , $reg [ 3 ])) {
$maskoffset = preg_replace ( '/^\+/' , '' , $reg [ 3 ]);
}
2020-09-07 08:18:17 +00:00
// Define $sqlwhere
// If a restore to zero after a month is asked we check if there is already a value for this year.
2021-02-23 21:03:23 +00:00
if ( ! empty ( $reg [ 2 ]) && preg_match ( '/^@/' , $reg [ 2 ])) {
$maskraz = preg_replace ( '/^@/' , '' , $reg [ 2 ]);
}
if ( ! empty ( $reg [ 3 ]) && preg_match ( '/^@/' , $reg [ 3 ])) {
$maskraz = preg_replace ( '/^@/' , '' , $reg [ 3 ]);
}
if ( $maskraz >= 0 ) {
2020-09-07 08:18:17 +00:00
if ( $maskraz == 99 ) {
2024-03-18 02:45:11 +00:00
$maskraz = ( int ) date ( 'm' );
2020-09-07 08:18:17 +00:00
$resetEveryMonth = true ;
}
2021-02-23 21:03:23 +00:00
if ( $maskraz > 12 ) {
return 'ErrorBadMaskBadRazMonth' ;
}
2020-09-07 08:18:17 +00:00
// Define reg
2021-02-23 21:03:23 +00:00
if ( $maskraz > 1 && ! preg_match ( '/^(.*)\{(y+)\}\{(m+)\}/i' , $maskwithonlyymcode , $reg )) {
return 'ErrorCantUseRazInStartedYearIfNoYearMonthInMask' ;
}
if ( $maskraz <= 1 && ! preg_match ( '/^(.*)\{(y+)\}/i' , $maskwithonlyymcode , $reg )) {
return 'ErrorCantUseRazIfNoYearInMask' ;
}
2020-09-07 08:18:17 +00:00
//print "x".$maskwithonlyymcode." ".$maskraz;
}
2020-12-20 13:31:54 +00:00
//print "masktri=".$masktri." maskcounter=".$maskcounter." maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode." maskraz=".$maskraz." maskoffset=".$maskoffset."<br>\n";
2020-09-07 08:18:17 +00:00
2020-12-20 12:54:02 +00:00
if ( function_exists ( 'mb_strrpos' )) {
2020-12-29 03:27:16 +00:00
$posnumstart = mb_strrpos ( $maskwithnocode , $maskcounter , 0 , 'UTF-8' );
2021-02-23 21:03:23 +00:00
} else {
2020-12-20 12:54:02 +00:00
$posnumstart = strrpos ( $maskwithnocode , $maskcounter );
} // Pos of counter in final string (from 0 to ...)
2021-02-23 21:03:23 +00:00
if ( $posnumstart < 0 ) {
return 'ErrorBadMaskFailedToLocatePosOfSequence' ;
}
2020-09-07 08:18:17 +00:00
2020-12-20 12:54:02 +00:00
// Check we have a number in $value at position ($posnumstart+1).', '.dol_strlen($maskcounter)
// TODO
2020-09-07 08:18:17 +00:00
2021-02-23 21:03:23 +00:00
// Check length
$len = dol_strlen ( $maskwithnocode );
if ( dol_strlen ( $value ) != $len ) {
$result = - 1 ;
}
2010-12-13 23:50:51 +00:00
2021-02-23 21:03:23 +00:00
dol_syslog ( " functions2::check_value result= " . $result , LOG_DEBUG );
return $result ;
2009-01-31 15:23:05 +00:00
}
2008-11-16 01:09:04 +00:00
/**
2011-07-04 08:38:51 +00:00
* Convert a binary data to string that represent hexadecimal value
2011-08-31 12:24:47 +00:00
*
2012-02-04 14:20:32 +00:00
* @ param string $bin Value to convert
* @ param boolean $pad Add 0
* @ param boolean $upper Convert to tupper
* @ return string x
2008-11-16 01:09:04 +00:00
*/
2019-01-27 14:20:16 +00:00
function binhex ( $bin , $pad = false , $upper = false )
2008-11-16 01:09:04 +00:00
{
2020-09-07 08:18:17 +00:00
$last = dol_strlen ( $bin ) - 1 ;
2024-03-18 12:00:51 +00:00
$x = 0 ;
2021-02-23 21:03:23 +00:00
for ( $i = 0 ; $i <= $last ; $i ++ ) {
2024-03-18 12:00:51 +00:00
$x += ( $bin [ $last - $i ] ? 1 : 0 ) << $i ;
2021-02-23 21:03:23 +00:00
}
2020-09-07 08:18:17 +00:00
$x = dechex ( $x );
2021-02-23 21:03:23 +00:00
if ( $pad ) {
while ( dol_strlen ( $x ) < intval ( dol_strlen ( $bin )) / 4 ) {
$x = " 0 $x " ;
}
}
if ( $upper ) {
$x = strtoupper ( $x );
}
2020-09-07 08:18:17 +00:00
return $x ;
2008-11-16 01:09:04 +00:00
}
/**
2011-07-04 08:38:51 +00:00
* Convert an hexadecimal string into a binary string
2011-08-31 12:24:47 +00:00
*
2012-02-04 13:39:47 +00:00
* @ param string $hexa Hexadecimal string to convert ( example : 'FF' )
* @ return string bin
2008-11-16 01:09:04 +00:00
*/
function hexbin ( $hexa )
{
2020-09-07 08:18:17 +00:00
$bin = '' ;
$strLength = dol_strlen ( $hexa );
2021-02-23 21:03:23 +00:00
for ( $i = 0 ; $i < $strLength ; $i ++ ) {
2020-09-07 08:18:17 +00:00
$bin .= str_pad ( decbin ( hexdec ( $hexa [ $i ])), 4 , '0' , STR_PAD_LEFT );
}
return $bin ;
2008-11-16 01:09:04 +00:00
}
/**
2011-07-04 08:38:51 +00:00
* Retourne le numero de la semaine par rapport a une date
2011-08-31 12:24:47 +00:00
*
2012-02-04 13:39:47 +00:00
* @ param string $time Date au format 'timestamp'
2016-06-23 18:19:43 +00:00
* @ return string Number of week
2008-11-16 01:09:04 +00:00
*/
function numero_semaine ( $time )
{
2024-01-15 22:23:23 +00:00
$stime = dol_print_date ( $time , '%Y-%m-%d' );
2010-12-13 23:50:51 +00:00
2025-09-01 09:40:04 +00:00
$reg = array ();
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/^([0-9]+)\-([0-9]+)\-([0-9]+)\s?([0-9]+)?:?([0-9]+)?/i' , $stime , $reg )) {
2020-09-07 08:18:17 +00:00
// Date est au format 'YYYY-MM-DD' ou 'YYYY-MM-DD HH:MM:SS'
2024-03-18 02:45:11 +00:00
$annee = ( int ) $reg [ 1 ];
$mois = ( int ) $reg [ 2 ];
$jour = ( int ) $reg [ 3 ];
2024-09-28 10:09:35 +00:00
} else {
$annee = 0 ;
$mois = 0 ;
$jour = 0 ;
2020-09-07 08:18:17 +00:00
}
2010-12-13 23:50:51 +00:00
2020-09-07 08:18:17 +00:00
/*
2021-02-23 21:03:23 +00:00
* Norme ISO - 8601 :
2024-01-13 18:48:20 +00:00
* - Week 1 of the year contains Jan 4 th , or contains the first Thursday of January .
* - Most years have 52 weeks , but 53 weeks for years starting on a Thursday and bisectile years that start on a Wednesday .
* - The first day of a week is Monday
2021-02-23 21:03:23 +00:00
*/
2010-12-13 23:50:51 +00:00
2020-09-07 08:18:17 +00:00
// Definition du Jeudi de la semaine
2024-03-18 02:45:11 +00:00
if (( int ) date ( " w " , mktime ( 12 , 0 , 0 , $mois , $jour , $annee )) == 0 ) { // Dimanche
2021-02-23 21:03:23 +00:00
$jeudiSemaine = mktime ( 12 , 0 , 0 , $mois , $jour , $annee ) - 3 * 24 * 60 * 60 ;
} elseif ( date ( " w " , mktime ( 12 , 0 , 0 , $mois , $jour , $annee )) < 4 ) { // du Lundi au Mercredi
2024-03-18 02:45:11 +00:00
$jeudiSemaine = mktime ( 12 , 0 , 0 , $mois , $jour , $annee ) + ( 4 - ( int ) date ( " w " , mktime ( 12 , 0 , 0 , $mois , $jour , $annee ))) * 24 * 60 * 60 ;
} elseif (( int ) date ( " w " , mktime ( 12 , 0 , 0 , $mois , $jour , $annee )) > 4 ) { // du Vendredi au Samedi
$jeudiSemaine = mktime ( 12 , 0 , 0 , $mois , $jour , $annee ) - (( int ) date ( " w " , mktime ( 12 , 0 , 0 , $mois , $jour , $annee )) - 4 ) * 24 * 60 * 60 ;
2021-02-23 21:03:23 +00:00
} else { // Jeudi
$jeudiSemaine = mktime ( 12 , 0 , 0 , $mois , $jour , $annee );
}
2020-09-07 08:18:17 +00:00
// Definition du premier Jeudi de l'annee
2024-03-18 02:45:11 +00:00
if (( int ) date ( " w " , mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine ))) == 0 ) { // Dimanche
$premierJeudiAnnee = mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine )) + 4 * 24 * 60 * 60 ;
} elseif (( int ) date ( " w " , mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine ))) < 4 ) { // du Lundi au Mercredi
$premierJeudiAnnee = mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine )) + ( 4 - ( int ) date ( " w " , mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine )))) * 24 * 60 * 60 ;
} elseif (( int ) date ( " w " , mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine ))) > 4 ) { // du Vendredi au Samedi
$premierJeudiAnnee = mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine )) + ( 7 - (( int ) date ( " w " , mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine ))) - 4 )) * 24 * 60 * 60 ;
2023-12-04 11:05:28 +00:00
} else { // Jeudi
2024-03-18 02:45:11 +00:00
$premierJeudiAnnee = mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine ));
2020-09-07 08:18:17 +00:00
}
// Definition du numero de semaine: nb de jours entre "premier Jeudi de l'annee" et "Jeudi de la semaine";
$numeroSemaine = (
2023-12-04 11:05:28 +00:00
(
2024-03-18 02:45:11 +00:00
( int ) date ( " z " , mktime ( 12 , 0 , 0 , ( int ) date ( " m " , $jeudiSemaine ), ( int ) date ( " d " , $jeudiSemaine ), ( int ) date ( " Y " , $jeudiSemaine )))
2024-02-19 16:03:07 +00:00
-
2024-03-18 02:45:11 +00:00
( int ) date ( " z " , mktime ( 12 , 0 , 0 , ( int ) date ( " m " , $premierJeudiAnnee ), ( int ) date ( " d " , $premierJeudiAnnee ), ( int ) date ( " Y " , $premierJeudiAnnee )))
2024-02-18 14:09:01 +00:00
) / 7
2020-09-07 08:18:17 +00:00
) + 1 ;
// Cas particulier de la semaine 53
2021-02-23 21:03:23 +00:00
if ( $numeroSemaine == 53 ) {
2024-03-18 02:45:11 +00:00
// Les annees qui commencent un Jeudi et les annees bissextiles commencant un Mercredi en possedent 53
if (
(( int ) date ( " w " , mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine ))) == 4 )
|| (
(( int ) date ( " w " , mktime ( 12 , 0 , 0 , 1 , 1 , ( int ) date ( " Y " , $jeudiSemaine ))) == 3 )
&& (( int ) date ( " z " , mktime ( 12 , 0 , 0 , 12 , 31 , ( int ) date ( " Y " , $jeudiSemaine ))) == 365 )
)
) {
2020-09-07 08:18:17 +00:00
$numeroSemaine = 53 ;
} else {
$numeroSemaine = 1 ;
}
}
//echo $jour."-".$mois."-".$annee." (".date("d-m-Y",$premierJeudiAnnee)." - ".date("d-m-Y",$jeudiSemaine).") -> ".$numeroSemaine."<BR>";
return sprintf ( " %02d " , $numeroSemaine );
2008-11-16 01:09:04 +00:00
}
/**
2011-07-04 08:38:51 +00:00
* Convertit une masse d ' une unite vers une autre unite
2011-08-31 12:24:47 +00:00
*
2012-02-04 13:39:47 +00:00
* @ param float $weight Masse a convertir
2014-09-27 14:00:11 +00:00
* @ param int $from_unit Unite originale en puissance de 10
2012-02-04 13:39:47 +00:00
* @ param int $to_unit Nouvelle unite en puissance de 10
* @ return float Masse convertie
2008-11-16 01:09:04 +00:00
*/
2019-01-27 14:20:16 +00:00
function weight_convert ( $weight , & $from_unit , $to_unit )
2008-11-16 01:09:04 +00:00
{
2020-09-07 08:18:17 +00:00
/* Pour convertire 320 gr en Kg appeler
2021-02-23 21:03:23 +00:00
* $f = - 3
* weigh_convert ( 320 , $f , 0 ) retournera 0.32
*
*/
2022-11-19 21:15:58 +00:00
$weight = is_numeric ( $weight ) ? $weight : 0 ;
2023-12-27 11:12:20 +00:00
while ( $from_unit != $to_unit ) {
2021-02-23 21:03:23 +00:00
if ( $from_unit > $to_unit ) {
2024-08-07 00:53:45 +00:00
$weight *= 10 ;
$from_unit -= 1 ;
2020-09-07 08:18:17 +00:00
$weight = weight_convert ( $weight , $from_unit , $to_unit );
}
2021-02-23 21:03:23 +00:00
if ( $from_unit < $to_unit ) {
2024-08-07 00:53:45 +00:00
$weight /= 10 ;
$from_unit += 1 ;
2020-09-07 08:18:17 +00:00
$weight = weight_convert ( $weight , $from_unit , $to_unit );
}
}
return $weight ;
2008-11-16 01:09:04 +00:00
}
2009-01-07 10:57:36 +00:00
/**
2024-01-13 18:48:20 +00:00
* Save personal parameter
2011-08-31 12:24:47 +00:00
*
2025-10-23 11:43:53 +00:00
* @ param DoliDB $db Handler database
* @ param Conf $conf Object conf
* @ param User $user Object user
* @ param array < string , string | int > $tab Array ( key => value ) with all parameters to save / update
* @ param int $entity If a value is >= 0 , we force the search on a specific entity . If - 1 , means search depends on default setup .
* @ return int Return integer < 0 if KO , > 0 if OK
2012-01-15 18:07:01 +00:00
*
2019-03-11 00:01:15 +00:00
* @ see dolibarr_get_const (), dolibarr_set_const (), dolibarr_del_const ()
2009-01-07 10:57:36 +00:00
*/
2025-10-23 11:43:53 +00:00
function dol_set_user_param ( $db , $conf , & $user , $tab , $entity = - 1 )
2009-01-07 10:57:36 +00:00
{
2024-01-13 18:48:20 +00:00
// Verification parameters
2021-02-23 21:03:23 +00:00
if ( count ( $tab ) < 1 ) {
return - 1 ;
}
2020-09-07 08:18:17 +00:00
2025-10-23 11:43:53 +00:00
$entity = ( $entity == - 1 ? (( int ) $conf -> entity ) : (( int ) $entity ));
2020-09-07 08:18:17 +00:00
$db -> begin ();
// We remove old parameters for all keys in $tab
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " user_param " ;
2021-08-27 16:18:50 +00:00
$sql .= " WHERE fk_user = " . (( int ) $user -> id );
2025-10-23 11:43:53 +00:00
$sql .= " AND entity = " . (( int ) $entity );
$sql .= " AND param IN ( " ;
2020-09-07 08:18:17 +00:00
$i = 0 ;
2021-02-23 21:03:23 +00:00
foreach ( $tab as $key => $value ) {
if ( $i > 0 ) {
$sql .= ',' ;
}
2020-09-07 08:18:17 +00:00
$sql .= " ' " . $db -> escape ( $key ) . " ' " ;
$i ++ ;
}
$sql .= " ) " ;
dol_syslog ( " functions2.lib::dol_set_user_param " , LOG_DEBUG );
$resql = $db -> query ( $sql );
2021-02-23 21:03:23 +00:00
if ( ! $resql ) {
2020-09-07 08:18:17 +00:00
dol_print_error ( $db );
$db -> rollback ();
return - 1 ;
}
2021-02-23 21:03:23 +00:00
foreach ( $tab as $key => $value ) {
2020-09-07 08:18:17 +00:00
// Set new parameters
2024-07-26 03:01:26 +00:00
$forcevalue = 0 ;
if ( is_array ( $value )) {
if ( $value [ " forcevalue " ] == 1 ) {
$forcevalue = 1 ;
}
$value = $value [ " value " ];
}
if ( $forcevalue == 1 || $value ) {
2025-10-23 11:43:53 +00:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " user_param (fk_user, entity, param, value) " ;
$sql .= " VALUES ( " . (( int ) $user -> id ) . " , " . (( int ) $entity ) . " , " ;
2020-09-07 08:18:17 +00:00
$sql .= " ' " . $db -> escape ( $key ) . " ',' " . $db -> escape ( $value ) . " ') " ;
dol_syslog ( " functions2.lib::dol_set_user_param " , LOG_DEBUG );
$result = $db -> query ( $sql );
2021-02-23 21:03:23 +00:00
if ( ! $result ) {
2020-09-07 08:18:17 +00:00
dol_print_error ( $db );
$db -> rollback ();
return - 1 ;
}
$user -> conf -> $key = $value ;
//print "key=".$key." user->conf->key=".$user->conf->$key;
} else {
unset ( $user -> conf -> $key );
}
}
$db -> commit ();
return 1 ;
2009-01-07 10:57:36 +00:00
}
/**
2024-01-13 18:48:20 +00:00
* Returns formatted reduction
2011-08-31 12:24:47 +00:00
*
2024-11-04 22:53:20 +00:00
* @ param int | float $reduction Reduction percentage
2012-02-04 13:39:47 +00:00
* @ param Translate $langs Output language
2024-01-13 18:48:20 +00:00
* @ return string Formatted reduction
2009-01-07 10:57:36 +00:00
*/
2019-01-27 14:20:16 +00:00
function dol_print_reduction ( $reduction , $langs )
2009-01-07 10:57:36 +00:00
{
2020-09-07 08:18:17 +00:00
$string = '' ;
2021-02-23 21:03:23 +00:00
if ( $reduction == 100 ) {
2020-09-07 08:18:17 +00:00
$string = $langs -> transnoentities ( " Offered " );
} else {
2024-09-05 14:05:37 +00:00
$string = vatrate (( string ) $reduction , true );
2020-09-07 08:18:17 +00:00
}
return $string ;
2009-01-07 10:57:36 +00:00
}
2009-03-09 21:59:29 +00:00
/**
2011-10-05 20:54:39 +00:00
* Return OS version .
2024-01-13 18:48:20 +00:00
* Note that PHP_OS returns only OS ( not version ) and OS PHP was built on , not necessarily OS PHP runs on .
2011-08-31 12:24:47 +00:00
*
2019-11-27 10:34:10 +00:00
* @ param string $option Option string
* @ return string OS version
2009-03-09 21:59:29 +00:00
*/
2019-11-27 10:34:10 +00:00
function version_os ( $option = '' )
2009-03-09 21:59:29 +00:00
{
2021-02-23 21:03:23 +00:00
if ( $option == 'smr' ) {
$osversion = php_uname ( 's' ) . ' ' . php_uname ( 'm' ) . ' ' . php_uname ( 'r' );
} else {
$osversion = php_uname ();
}
2020-09-07 08:18:17 +00:00
return $osversion ;
2009-03-09 21:59:29 +00:00
}
/**
2011-08-31 12:24:47 +00:00
* Return PHP version
*
* @ return string PHP version
2021-08-04 18:07:12 +00:00
* @ see versionphparray (), versioncompare ()
2009-03-09 21:59:29 +00:00
*/
function version_php ()
{
2020-09-07 08:18:17 +00:00
return phpversion ();
2009-03-09 21:59:29 +00:00
}
2023-11-18 18:03:47 +00:00
/**
* Return DB version
*
* @ return string PHP version
*/
function version_db ()
{
global $db ;
2023-11-19 00:02:21 +00:00
if ( is_object ( $db ) && method_exists ( $db , 'getVersion' )) {
2023-11-18 18:03:47 +00:00
return $db -> getVersion ();
}
return '' ;
}
2009-03-09 21:59:29 +00:00
/**
2011-08-31 12:24:47 +00:00
* Return Dolibarr version
*
* @ return string Dolibarr version
2021-08-04 18:07:12 +00:00
* @ see versiondolibarrarray (), versioncompare ()
2009-03-09 21:59:29 +00:00
*/
function version_dolibarr ()
{
2020-09-07 08:18:17 +00:00
return DOL_VERSION ;
2009-03-09 21:59:29 +00:00
}
/**
2011-08-31 12:24:47 +00:00
* Return web server version
*
* @ return string Web server version
2009-03-09 21:59:29 +00:00
*/
function version_webserver ()
{
2020-09-07 08:18:17 +00:00
return $_SERVER [ " SERVER_SOFTWARE " ];
2009-03-09 21:59:29 +00:00
}
2010-02-27 10:11:00 +00:00
2010-02-27 22:53:27 +00:00
/**
2011-08-31 12:24:47 +00:00
* Return list of activated modules usable for document generation
*
2012-02-04 13:39:47 +00:00
* @ param DoliDB $db Database handler
* @ param string $type Type of models ( company , invoice , ... )
* @ param int $maxfilenamelength Max length of value to show
2025-09-01 09:10:36 +00:00
* @ param int $showempty Add an empty record if 1
2024-08-14 17:21:10 +00:00
* @ return string [] | int <- 1 , 0 > 0 if no module is activated , or array ( key => label ) . For modules that need directory scan , key is completed with " :filename " , - 1 if error
2010-02-27 22:53:27 +00:00
*/
2025-09-01 09:10:36 +00:00
function getListOfModels ( $db , $type , $maxfilenamelength = 0 , $showempty = 0 )
2010-02-27 22:53:27 +00:00
{
2025-07-18 00:59:19 +00:00
global $conf , $hookmanager , $langs ;
$docmodels = array ();
2020-09-07 08:18:17 +00:00
$found = 0 ;
$dirtoscan = '' ;
$sql = " SELECT nom as id, nom as doc_template_name, libelle as label, description as description " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " document_model " ;
$sql .= " WHERE type = ' " . $db -> escape ( $type ) . " ' " ;
2025-09-01 09:10:36 +00:00
$sql .= " AND entity IN (0, " . (( int ) $conf -> entity ) . " ) " ;
2020-09-07 08:18:17 +00:00
$sql .= " ORDER BY description DESC " ;
dol_syslog ( '/core/lib/function2.lib.php::getListOfModels' , LOG_DEBUG );
2025-09-01 09:10:36 +00:00
2023-03-31 21:31:20 +00:00
$resql_models = $db -> query ( $sql );
if ( $resql_models ) {
$num = $db -> num_rows ( $resql_models );
2025-09-01 09:10:36 +00:00
if ( $showempty ) {
2025-09-01 09:40:04 +00:00
$docmodels [ 0 ] = ' ' ;
2025-09-01 09:10:36 +00:00
}
2020-09-07 08:18:17 +00:00
$i = 0 ;
2021-02-23 21:03:23 +00:00
while ( $i < $num ) {
2020-09-07 08:18:17 +00:00
$found = 1 ;
2023-03-31 21:31:20 +00:00
$obj = $db -> fetch_object ( $resql_models );
2020-09-07 08:18:17 +00:00
2025-09-01 09:10:36 +00:00
if ( $obj -> id == '0' ) { // We discard bad record (should not happen)
$i ++ ;
continue ;
}
2020-09-07 08:18:17 +00:00
// If this generation module needs to scan a directory, then description field is filled
// with the constant that contains list of directories to scan (COMPANY_ADDON_PDF_ODT_PATH, ...).
2021-02-23 21:03:23 +00:00
if ( ! empty ( $obj -> description )) { // A list of directories to scan is defined
2020-09-07 08:18:17 +00:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
$const = $obj -> description ;
2023-12-23 18:47:10 +00:00
$dirtoscan = preg_replace ( '/[\r\n]+/' , ',' , trim ( getDolGlobalString ( $const )));
2020-09-07 08:18:17 +00:00
$listoffiles = array ();
// Now we add models found in directories scanned
$listofdir = explode ( ',' , $dirtoscan );
2021-02-23 21:03:23 +00:00
foreach ( $listofdir as $key => $tmpdir ) {
2020-09-07 08:18:17 +00:00
$tmpdir = trim ( $tmpdir );
$tmpdir = preg_replace ( '/DOL_DATA_ROOT/' , DOL_DATA_ROOT , $tmpdir );
2021-02-23 21:03:23 +00:00
if ( ! $tmpdir ) {
2021-03-01 19:37:16 +00:00
unset ( $listofdir [ $key ]);
continue ;
2021-02-23 21:03:23 +00:00
}
if ( is_dir ( $tmpdir )) {
2020-09-07 08:18:17 +00:00
// all type of template is allowed
2024-09-28 10:09:35 +00:00
$tmpfiles = dol_dir_list ( $tmpdir , 'files' , 0 , '' , array (), 'name' , SORT_ASC , 0 );
2021-02-23 21:03:23 +00:00
if ( count ( $tmpfiles )) {
$listoffiles = array_merge ( $listoffiles , $tmpfiles );
}
2020-09-07 08:18:17 +00:00
}
}
2021-02-23 21:03:23 +00:00
if ( count ( $listoffiles )) {
foreach ( $listoffiles as $record ) {
2020-09-07 08:18:17 +00:00
$max = ( $maxfilenamelength ? $maxfilenamelength : 28 );
2025-07-18 00:59:19 +00:00
$docmodels [ $obj -> id . ':' . $record [ 'fullname' ]] = dol_trunc ( $record [ 'name' ], $max , 'middle' );
2020-09-07 08:18:17 +00:00
}
} else {
2025-07-18 00:59:19 +00:00
$docmodels [ 0 ] = $obj -> label . ': ' . $langs -> trans ( " None " );
2020-09-07 08:18:17 +00:00
}
} else {
2025-10-14 16:47:57 +00:00
if ( $type == 'member' && $obj -> doc_template_name == 'standard_member' ) { // Special case, if member template, we add variant per format
2020-09-07 08:18:17 +00:00
global $_Avery_Labels ;
include_once DOL_DOCUMENT_ROOT . '/core/lib/format_cards.lib.php' ;
2021-02-23 21:03:23 +00:00
foreach ( $_Avery_Labels as $key => $val ) {
2025-07-18 00:59:19 +00:00
$docmodels [ $obj -> id . ':' . $key ] = ( $obj -> label ? $obj -> label : $obj -> doc_template_name ) . ' ' . $val [ 'name' ];
2020-09-07 08:18:17 +00:00
}
2020-10-24 07:32:39 +00:00
} else {
2020-10-27 18:46:07 +00:00
// Common usage
2025-07-18 00:59:19 +00:00
$docmodels [ $obj -> id ] = $obj -> label ? $obj -> label : $obj -> doc_template_name ;
2020-09-07 08:18:17 +00:00
}
}
2025-09-01 09:10:36 +00:00
2020-09-07 08:18:17 +00:00
$i ++ ;
}
} else {
dol_print_error ( $db );
return - 1 ;
}
2025-07-18 00:59:19 +00:00
$parameters = array (
'list' => & $docmodels ,
'found' => & $found ,
'type' => $type ,
'maxfilenamelength' => $maxfilenamelength ,
);
$reshook = $hookmanager -> executeHooks ( 'getListOfModels' , $parameters );
if ( $reshook < 0 ) {
setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
}
2021-02-23 21:03:23 +00:00
if ( $found ) {
2025-07-18 00:59:19 +00:00
return $docmodels ;
2021-02-23 21:03:23 +00:00
} else {
return 0 ;
}
2010-02-27 22:53:27 +00:00
}
2010-04-13 19:56:24 +00:00
/**
2011-01-05 17:43:58 +00:00
* This function evaluates a string that should be a valid IPv4
2024-01-13 18:48:20 +00:00
* Note : For ip 169.254 . 0.0 , it returns 0 with some PHP ( 5.6 . 24 ) and 2 with some minor patches of PHP ( 5.6 . 25 ) . See https :// github . com / php / php - src / pull / 1954.
2017-06-06 05:57:03 +00:00
*
2014-07-17 19:19:03 +00:00
* @ param string $ip IP Address
2014-07-26 12:16:09 +00:00
* @ return int 0 if not valid or reserved range , 1 if valid and public IP , 2 if valid and private range IP
2010-04-13 19:56:24 +00:00
*/
function is_ip ( $ip )
{
2014-07-26 12:16:09 +00:00
// First we test if it is a valid IPv4
2014-07-17 19:12:50 +00:00
if ( filter_var ( $ip , FILTER_VALIDATE_IP , FILTER_FLAG_IPV4 )) {
2014-07-26 12:16:09 +00:00
// Then we test if it is a private range
2021-02-23 21:03:23 +00:00
if ( ! filter_var ( $ip , FILTER_VALIDATE_IP , FILTER_FLAG_NO_PRIV_RANGE )) {
return 2 ;
}
2014-07-26 12:16:09 +00:00
// Then we test if it is a reserved range
2021-02-23 21:03:23 +00:00
if ( ! filter_var ( $ip , FILTER_VALIDATE_IP , FILTER_FLAG_NO_RES_RANGE )) {
return 0 ;
}
2014-07-17 19:12:50 +00:00
2014-07-26 12:16:09 +00:00
return 1 ;
2014-07-17 19:12:50 +00:00
}
2025-12-28 01:19:01 +00:00
return 0 ; // If not valid
2010-04-13 19:56:24 +00:00
}
2011-01-05 17:43:58 +00:00
/**
* Build a login from lastname , firstname
2011-08-31 12:24:47 +00:00
*
2012-02-04 13:39:47 +00:00
* @ param string $lastname Lastname
* @ param string $firstname Firstname
* @ return string Login
2011-01-05 17:43:58 +00:00
*/
2019-01-27 14:20:16 +00:00
function dol_buildlogin ( $lastname , $firstname )
2011-01-05 17:43:58 +00:00
{
2020-11-04 12:33:52 +00:00
//$conf->global->MAIN_BUILD_LOGIN_RULE = 'f.lastname';
2024-02-08 15:28:24 +00:00
$charforseparator = getDolGlobalString ( " MAIN_USER_SEPARATOR_CHAR_FOR_GENERATED_LOGIN " , '.' );
if ( $charforseparator == 'none' ) {
$charforseparator = '' ;
}
2026-03-07 18:48:08 +00:00
if ( getDolGlobalString ( 'MAIN_BUILD_LOGIN_RULE' ) == 'flastname' ) { // flastname
$login = strtolower ( dol_string_unaccent ( dol_trunc ( $firstname , 1 , 'right' , 'UTF-8' , 1 )));
$login .= strtolower ( dol_string_unaccent ( $lastname ));
$login = dol_string_nospecial ( $login , '' ); // For special names
} elseif ( getDolGlobalString ( 'MAIN_BUILD_LOGIN_RULE' ) == 'f.lastname' ) { // f.lastname
2020-11-04 12:33:52 +00:00
$login = strtolower ( dol_string_unaccent ( dol_trunc ( $firstname , 1 , 'right' , 'UTF-8' , 1 )));
2024-02-08 15:28:24 +00:00
$login .= ( $login ? $charforseparator : '' );
2020-11-04 12:33:52 +00:00
$login .= strtolower ( dol_string_unaccent ( $lastname ));
$login = dol_string_nospecial ( $login , '' ); // For special names
} else { // firstname.lastname
$login = strtolower ( dol_string_unaccent ( $firstname ));
2024-02-08 15:28:24 +00:00
$login .= ( $login ? $charforseparator : '' );
2020-11-04 12:33:52 +00:00
$login .= strtolower ( dol_string_unaccent ( $lastname ));
$login = dol_string_nospecial ( $login , '' ); // For special names
}
// TODO Add a hook to allow external modules to suggest new rules
2020-09-07 08:18:17 +00:00
return $login ;
2011-04-03 18:02:18 +00:00
}
/**
* Return array to use for SoapClient constructor
2011-08-31 12:24:47 +00:00
*
2024-09-28 10:09:35 +00:00
* @ return array { connection_timeout : int , response_timeout : int , proxy_use : int < 0 , 1 > , proxy_host : false | string , proxy_port : false | string , proxy_login : false | string , proxy_password : false | string , trace : int < 0 , 1 > }
2011-04-03 18:02:18 +00:00
*/
function getSoapParams ()
{
2020-09-07 08:18:17 +00:00
$params = array ();
2024-08-07 01:05:02 +00:00
$proxyuse = getDolGlobalString ( 'MAIN_PROXY_USE' );
2026-03-07 18:48:08 +00:00
$proxyhost = ( ! $proxyuse ? false : getDolGlobalString ( 'MAIN_PROXY_HOST' ));
$proxyport = ( ! $proxyuse ? false : getDolGlobalString ( 'MAIN_PROXY_PORT' ));
$proxyuser = ( ! $proxyuse ? false : getDolGlobalString ( 'MAIN_PROXY_USER' ));
$proxypass = ( ! $proxyuse ? false : getDolGlobalString ( 'MAIN_PROXY_PASS' ));
2024-08-07 01:05:02 +00:00
$timeout = getDolGlobalInt ( 'MAIN_USE_CONNECT_TIMEOUT' , 10 ); // Connection timeout
$response_timeout = getDolGlobalInt ( 'MAIN_USE_RESPONSE_TIMEOUT' , 30 ); // Response timeout
2020-09-07 08:18:17 +00:00
//print extension_loaded('soap');
2021-02-23 21:03:23 +00:00
if ( $proxyuse ) {
2024-02-18 14:09:01 +00:00
$params = array ( 'connection_timeout' => $timeout ,
'response_timeout' => $response_timeout ,
2020-09-07 08:18:17 +00:00
'proxy_use' => 1 ,
'proxy_host' => $proxyhost ,
'proxy_port' => $proxyport ,
'proxy_login' => $proxyuser ,
'proxy_password' => $proxypass ,
'trace' => 1
);
} else {
2024-02-18 14:09:01 +00:00
$params = array ( 'connection_timeout' => $timeout ,
'response_timeout' => $response_timeout ,
2020-09-07 08:18:17 +00:00
'proxy_use' => 0 ,
'proxy_host' => false ,
'proxy_port' => false ,
'proxy_login' => false ,
'proxy_password' => false ,
'trace' => 1
);
}
return $params ;
2011-04-03 18:02:18 +00:00
}
2013-06-16 21:15:20 +00:00
2013-06-19 07:26:20 +00:00
/**
2018-07-15 18:09:51 +00:00
* Return link url to an object
2013-06-19 07:26:20 +00:00
*
* @ param int $objectid Id of record
2025-10-22 16:00:07 +00:00
* @ param string $objecttype Type of object ( 'invoice' , 'order' , 'expedition' , 'user' , 'myobject@mymodule' , ... )
2013-06-19 07:26:20 +00:00
* @ param int $withpicto Picto to show
* @ param string $option More options
* @ return string URL of link to object id / type
*/
2019-01-27 14:20:16 +00:00
function dolGetElementUrl ( $objectid , $objecttype , $withpicto = 0 , $option = '' )
2013-06-19 07:26:20 +00:00
{
2025-04-03 11:59:46 +00:00
global $db , $langs ;
2013-06-16 21:15:20 +00:00
2019-11-13 18:37:08 +00:00
$ret = '' ;
2020-01-07 12:48:44 +00:00
$regs = array ();
2013-06-19 07:26:20 +00:00
2020-07-24 09:53:44 +00:00
// If we ask a resource form external module (instead of default path)
2020-01-07 12:48:44 +00:00
if ( preg_match ( '/^([^@]+)@([^@]+)$/i' , $objecttype , $regs )) {
$myobject = $regs [ 1 ];
$module = $regs [ 2 ];
2021-02-23 21:03:23 +00:00
} else {
2020-07-24 09:53:44 +00:00
// Parse $objecttype (ex: project_task)
$module = $myobject = $objecttype ;
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/^([^_]+)_([^_]+)/i' , $objecttype , $regs )) {
2020-07-24 09:53:44 +00:00
$module = $regs [ 1 ];
$myobject = $regs [ 2 ];
}
2013-06-19 07:26:20 +00:00
}
2019-10-12 10:31:35 +00:00
// Generic case for $classpath
2020-01-07 12:48:44 +00:00
$classpath = $module . '/class' ;
2013-06-19 07:26:20 +00:00
2019-10-12 10:31:35 +00:00
// Special cases, to work with non standard path
2013-06-19 07:26:20 +00:00
if ( $objecttype == 'facture' || $objecttype == 'invoice' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'bills' );
2013-09-11 12:18:56 +00:00
$classpath = 'compta/facture/class' ;
2020-01-09 23:03:10 +00:00
$module = 'facture' ;
$myobject = 'facture' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'commande' || $objecttype == 'order' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'orders' );
2013-09-11 12:18:56 +00:00
$classpath = 'commande/class' ;
2020-01-09 23:03:10 +00:00
$module = 'commande' ;
$myobject = 'commande' ;
2025-10-01 15:37:43 +00:00
} elseif ( $objecttype == 'mailing' ) {
$langs -> load ( 'mailing' );
$classpath = 'comm/mailing/class' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'propal' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'propal' );
2013-06-19 07:26:20 +00:00
$classpath = 'comm/propal/class' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'supplier_proposal' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'supplier_proposal' );
2015-11-15 17:23:42 +00:00
$classpath = 'supplier_proposal/class' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'shipping' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'sendings' );
2013-09-11 12:18:56 +00:00
$classpath = 'expedition/class' ;
2020-01-07 12:48:44 +00:00
$myobject = 'expedition' ;
2025-10-22 16:00:07 +00:00
$module = 'expedition' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'delivery' ) {
2025-09-11 11:31:34 +00:00
$langs -> load ( 'sendings' );
2020-10-06 10:05:24 +00:00
$classpath = 'delivery/class' ;
$myobject = 'delivery' ;
2020-10-06 13:57:50 +00:00
$module = 'delivery_note' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'contract' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'contracts' );
2013-09-11 12:18:56 +00:00
$classpath = 'contrat/class' ;
2020-01-09 23:03:10 +00:00
$module = 'contrat' ;
$myobject = 'contrat' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'member' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'members' );
2013-09-11 12:18:56 +00:00
$classpath = 'adherents/class' ;
2020-01-09 23:03:10 +00:00
$module = 'adherent' ;
$myobject = 'adherent' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'cabinetmed_cons' ) {
2013-09-11 12:18:56 +00:00
$classpath = 'cabinetmed/class' ;
2020-01-09 23:03:10 +00:00
$module = 'cabinetmed' ;
$myobject = 'cabinetmedcons' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'fichinter' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'interventions' );
2013-09-11 12:18:56 +00:00
$classpath = 'fichinter/class' ;
2020-01-09 23:03:10 +00:00
$module = 'ficheinter' ;
$myobject = 'fichinter' ;
2021-09-18 22:50:23 +00:00
} elseif ( $objecttype == 'project' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'projects' );
2021-09-18 22:50:23 +00:00
$classpath = 'projet/class' ;
$module = 'projet' ;
2025-10-23 12:47:27 +00:00
} elseif ( $objecttype == 'project_task' ) {
2021-11-11 17:23:34 +00:00
$langs -> load ( 'projects' );
2017-09-13 13:12:54 +00:00
$classpath = 'projet/class' ;
2020-01-09 23:03:10 +00:00
$module = 'projet' ;
$myobject = 'task' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'stock' ) {
2018-05-24 10:16:04 +00:00
$classpath = 'product/stock/class' ;
2020-01-09 23:03:10 +00:00
$module = 'stock' ;
$myobject = 'stock' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'inventory' ) {
2019-10-12 10:31:35 +00:00
$classpath = 'product/inventory/class' ;
2020-01-09 23:03:10 +00:00
$module = 'stock' ;
$myobject = 'inventory' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'mo' ) {
2020-01-07 19:28:21 +00:00
$classpath = 'mrp/class' ;
2020-01-09 23:03:10 +00:00
$module = 'mrp' ;
$myobject = 'mo' ;
2021-02-28 23:19:52 +00:00
} elseif ( $objecttype == 'productlot' ) {
2021-02-25 14:47:14 +00:00
$classpath = 'product/stock/class' ;
$module = 'stock' ;
$myobject = 'productlot' ;
}
2013-06-19 07:26:20 +00:00
2019-10-12 10:31:35 +00:00
// Generic case for $classfile and $classname
2021-03-01 19:37:16 +00:00
$classfile = strtolower ( $myobject );
$classname = ucfirst ( $myobject );
2020-07-24 09:53:44 +00:00
//print "objecttype=".$objecttype." module=".$module." subelement=".$subelement." classfile=".$classfile." classname=".$classname." classpath=".$classpath;
2019-10-12 10:31:35 +00:00
2013-06-19 07:26:20 +00:00
if ( $objecttype == 'invoice_supplier' ) {
2013-09-11 12:18:56 +00:00
$classfile = 'fournisseur.facture' ;
2019-11-13 18:37:08 +00:00
$classname = 'FactureFournisseur' ;
2013-08-09 11:48:44 +00:00
$classpath = 'fourn/class' ;
2019-11-13 18:37:08 +00:00
$module = 'fournisseur' ;
2020-05-21 13:05:19 +00:00
} elseif ( $objecttype == 'order_supplier' ) {
2013-09-11 12:18:56 +00:00
$classfile = 'fournisseur.commande' ;
2019-11-13 18:37:08 +00:00
$classname = 'CommandeFournisseur' ;
2013-08-09 11:48:44 +00:00
$classpath = 'fourn/class' ;
2019-11-13 18:37:08 +00:00
$module = 'fournisseur' ;
2021-02-23 21:03:23 +00:00
} elseif ( $objecttype == 'supplier_proposal' ) {
2020-10-20 14:37:15 +00:00
$classfile = 'supplier_proposal' ;
$classname = 'SupplierProposal' ;
$classpath = 'supplier_proposal/class' ;
$module = 'supplier_proposal' ;
2021-02-23 21:03:23 +00:00
} elseif ( $objecttype == 'stock' ) {
2018-05-24 10:16:04 +00:00
$classpath = 'product/stock/class' ;
2019-11-13 18:37:08 +00:00
$classfile = 'entrepot' ;
$classname = 'Entrepot' ;
2022-05-13 08:46:02 +00:00
} elseif ( $objecttype == 'facturerec' ) {
$classpath = 'compta/facture/class' ;
$classfile = 'facture-rec' ;
$classname = 'FactureRec' ;
2022-11-30 14:17:27 +00:00
$module = 'facture' ;
} elseif ( $objecttype == 'mailing' ) {
$classpath = 'comm/mailing/class' ;
$classfile = 'mailing' ;
$classname = 'Mailing' ;
2018-05-24 10:16:04 +00:00
}
2020-01-07 12:48:44 +00:00
2022-09-25 21:06:42 +00:00
if ( isModEnabled ( $module )) {
2019-11-13 18:37:08 +00:00
$res = dol_include_once ( '/' . $classpath . '/' . $classfile . '.class.php' );
2021-02-23 21:03:23 +00:00
if ( $res ) {
if ( class_exists ( $classname )) {
2018-05-24 10:16:04 +00:00
$object = new $classname ( $db );
2019-11-13 18:37:08 +00:00
$res = $object -> fetch ( $objectid );
2018-07-12 16:27:09 +00:00
if ( $res > 0 ) {
2019-11-13 18:37:08 +00:00
$ret = $object -> getNomUrl ( $withpicto , $option );
} elseif ( $res == 0 ) {
$ret = $langs -> trans ( 'Deleted' );
2018-07-12 16:27:09 +00:00
}
2018-05-24 10:16:04 +00:00
unset ( $object );
2021-02-23 21:03:23 +00:00
} else {
dol_syslog ( " Class with classname " . $classname . " is unknown even after the include " , LOG_ERR );
}
2013-06-16 21:15:20 +00:00
}
}
2013-06-19 07:26:20 +00:00
return $ret ;
2013-06-24 18:02:02 +00:00
}
2014-04-26 19:36:58 +00:00
/**
2024-08-03 11:27:19 +00:00
* Clean corrupted database tree ( orphelins linked to a not existing parent ), record linked to themself , and also child - parent loop
2014-04-26 19:36:58 +00:00
*
2014-04-26 20:23:46 +00:00
* @ param DoliDB $db Database handler
2014-04-26 19:36:58 +00:00
* @ param string $tabletocleantree Table to clean
* @ param string $fieldfkparent Field name that contains id of parent
* @ return int Nb of records fixed / deleted
*/
function cleanCorruptedTree ( $db , $tabletocleantree , $fieldfkparent )
{
2019-11-13 18:37:08 +00:00
$totalnb = 0 ;
$listofid = array ();
$listofparentid = array ();
2014-04-26 19:36:58 +00:00
// Get list of all id in array listofid and all parents in array listofparentid
2026-04-14 16:40:54 +00:00
$sql = " SELECT rowid, " . $db -> sanitize ( $fieldfkparent ) . " as parent_id FROM " . MAIN_DB_PREFIX . $db -> sanitize ( $tabletocleantree );
2014-04-26 19:36:58 +00:00
$resql = $db -> query ( $sql );
2021-02-23 21:03:23 +00:00
if ( $resql ) {
2014-04-26 19:36:58 +00:00
$num = $db -> num_rows ( $resql );
$i = 0 ;
2021-02-23 21:03:23 +00:00
while ( $i < $num ) {
2014-04-26 19:36:58 +00:00
$obj = $db -> fetch_object ( $resql );
2019-11-13 18:37:08 +00:00
$listofid [] = $obj -> rowid ;
2021-02-23 21:03:23 +00:00
if ( $obj -> parent_id > 0 ) {
$listofparentid [ $obj -> rowid ] = $obj -> parent_id ;
}
2014-04-26 19:36:58 +00:00
$i ++ ;
}
2020-05-21 13:05:19 +00:00
} else {
2014-04-26 19:36:58 +00:00
dol_print_error ( $db );
}
2021-02-23 21:03:23 +00:00
if ( count ( $listofid )) {
2014-04-26 19:36:58 +00:00
print 'Code requested to clean tree (may be to solve data corruption), so we check/clean orphelins and loops.' . " <br> \n " ;
// Check loops on each other
2026-04-03 20:39:18 +00:00
$sql = " UPDATE " . MAIN_DB_PREFIX . $db -> sanitize ( $tabletocleantree ) . " SET " . $db -> sanitize ( $fieldfkparent ) . " = 0 WHERE " . $db -> sanitize ( $fieldfkparent ) . " = rowid " ; // So we update only records linked to themself
2014-04-26 19:36:58 +00:00
$resql = $db -> query ( $sql );
2021-02-23 21:03:23 +00:00
if ( $resql ) {
2024-09-28 10:09:35 +00:00
$nb = $db -> affected_rows ( $resql );
2021-02-23 21:03:23 +00:00
if ( $nb > 0 ) {
2014-04-26 19:36:58 +00:00
print '<br>Some record that were parent of themself were cleaned.' ;
}
2019-11-13 18:37:08 +00:00
$totalnb += $nb ;
2014-04-26 19:36:58 +00:00
}
//else dol_print_error($db);
// Check other loops
2019-11-13 18:37:08 +00:00
$listofidtoclean = array ();
2021-02-23 21:03:23 +00:00
foreach ( $listofparentid as $id => $pid ) {
2014-04-26 19:36:58 +00:00
// Check depth
//print 'Analyse record id='.$id.' with parent '.$pid.'<br>';
2021-03-01 19:37:16 +00:00
$cursor = $id ;
$arrayidparsed = array (); // We start from child $id
2021-02-23 21:03:23 +00:00
while ( $cursor > 0 ) {
2019-11-13 18:37:08 +00:00
$arrayidparsed [ $cursor ] = 1 ;
2021-02-23 21:03:23 +00:00
if ( $arrayidparsed [ $listofparentid [ $cursor ]]) { // We detect a loop. A record with a parent that was already into child
2014-04-26 19:36:58 +00:00
print 'Found a loop between id ' . $id . ' - ' . $cursor . '<br>' ;
unset ( $arrayidparsed );
2019-11-13 18:37:08 +00:00
$listofidtoclean [ $cursor ] = $id ;
2014-04-26 19:36:58 +00:00
break ;
}
2024-08-03 11:27:19 +00:00
// @phpstan-ignore-next-line PHPStan thinks this line is never reached
2019-11-13 18:37:08 +00:00
$cursor = $listofparentid [ $cursor ];
2014-04-26 19:36:58 +00:00
}
2021-02-23 21:03:23 +00:00
if ( count ( $listofidtoclean )) {
break ;
}
2014-04-26 19:36:58 +00:00
}
2024-08-03 11:27:19 +00:00
$sql = " UPDATE " . MAIN_DB_PREFIX . $db -> sanitize ( $tabletocleantree );
$sql .= " SET " . $db -> sanitize ( $fieldfkparent ) . " = 0 " ;
Qual: Apply automatic phan fixes (deprecations, unneeded imports) (#28154)
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
2024-02-13 20:46:12 +00:00
$sql .= " WHERE rowid IN ( " . $db -> sanitize ( implode ( ',' , $listofidtoclean )) . " ) " ; // So we update only records detected wrong
2014-04-26 19:36:58 +00:00
$resql = $db -> query ( $sql );
2021-02-23 21:03:23 +00:00
if ( $resql ) {
2024-09-28 10:09:35 +00:00
$nb = $db -> affected_rows ( $resql );
2021-02-23 21:03:23 +00:00
if ( $nb > 0 ) {
2014-04-26 19:36:58 +00:00
// Removed orphelins records
print '<br>Some records were detected to have parent that is a child, we set them as root record for id: ' ;
Qual: Apply automatic phan fixes (deprecations, unneeded imports) (#28154)
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
2024-02-13 20:46:12 +00:00
print implode ( ',' , $listofidtoclean );
2014-04-26 19:36:58 +00:00
}
2019-11-13 18:37:08 +00:00
$totalnb += $nb ;
2014-04-26 19:36:58 +00:00
}
//else dol_print_error($db);
// Check and clean orphelins
2024-08-03 11:27:19 +00:00
$sql = " UPDATE " . MAIN_DB_PREFIX . $db -> sanitize ( $tabletocleantree );
$sql .= " SET " . $db -> sanitize ( $fieldfkparent ) . " = 0 " ;
$sql .= " WHERE " . $db -> sanitize ( $fieldfkparent ) . " NOT IN ( " . $db -> sanitize ( implode ( ',' , $listofid ), 1 ) . " ) " ; // So we update only records linked to a non existing parent
2014-04-26 19:36:58 +00:00
$resql = $db -> query ( $sql );
2021-02-23 21:03:23 +00:00
if ( $resql ) {
2024-09-28 10:09:35 +00:00
$nb = $db -> affected_rows ( $resql );
2021-02-23 21:03:23 +00:00
if ( $nb > 0 ) {
2014-04-26 19:36:58 +00:00
// Removed orphelins records
print '<br>Some orphelins were found and modified to be parent so records are visible again for id: ' ;
Qual: Apply automatic phan fixes (deprecations, unneeded imports) (#28154)
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
2024-02-13 20:46:12 +00:00
print implode ( ',' , $listofid );
2014-04-26 19:36:58 +00:00
}
2019-11-13 18:37:08 +00:00
$totalnb += $nb ;
2014-04-26 19:36:58 +00:00
}
//else dol_print_error($db);
print '<br>We fixed ' . $totalnb . ' record(s). Some records may still be corrupted. New check may be required.' ;
return $totalnb ;
}
2023-07-12 14:32:50 +00:00
return - 1 ;
2014-04-26 19:36:58 +00:00
}
2014-03-15 15:29:33 +00:00
2014-12-08 18:05:22 +00:00
/**
2015-06-26 14:21:09 +00:00
* Convert an array with RGB value into hex RGB value .
* This is the opposite function of colorStringToArray
2014-12-08 18:05:22 +00:00
*
2024-09-28 10:09:35 +00:00
* @ param array { 0 : int , 1 : int , 2 : int } $arraycolor Array
2015-06-12 12:37:27 +00:00
* @ param string $colorifnotfound Color code to return if entry not defined or not a RGB format
2015-06-26 14:21:09 +00:00
* @ return string RGB hex value ( without # before). For example: 'FF00FF', '01FF02'
2019-08-18 02:56:48 +00:00
* @ see colorStringToArray (), colorHexToRgb ()
2014-12-08 18:05:22 +00:00
*/
2019-01-27 14:20:16 +00:00
function colorArrayToHex ( $arraycolor , $colorifnotfound = '888888' )
2014-12-08 18:05:22 +00:00
{
2021-02-23 21:03:23 +00:00
if ( ! is_array ( $arraycolor )) {
return $colorifnotfound ;
}
if ( empty ( $arraycolor )) {
return $colorifnotfound ;
}
2019-01-27 10:55:16 +00:00
return sprintf ( " %02s " , dechex ( $arraycolor [ 0 ])) . sprintf ( " %02s " , dechex ( $arraycolor [ 1 ])) . sprintf ( " %02s " , dechex ( $arraycolor [ 2 ]));
2014-12-08 18:05:22 +00:00
}
/**
2015-06-12 12:37:27 +00:00
* Convert a string RGB value ( 'FFFFFF' , '255,255,255' ) into an array RGB array ( 255 , 255 , 255 ) .
2015-06-26 14:21:09 +00:00
* This is the opposite function of colorArrayToHex .
2015-06-12 12:37:27 +00:00
* If entry is already an array , return it .
2014-12-08 18:05:22 +00:00
*
2024-10-17 01:08:38 +00:00
* @ param string | array { 0 : int , 1 : int , 2 : int } $stringcolor String with hex ( FFFFFF ) or comma RGB ( '255,255,255' )
2024-09-28 10:09:35 +00:00
* @ param array { 0 : int , 1 : int , 2 : int } | array {} $colorifnotfound Color code array to return if entry not defined
* @ return array { 0 : int , 1 : int , 2 : int } RGB hex value ( without # before). For example: FF00FF
2019-08-18 02:56:48 +00:00
* @ see colorArrayToHex (), colorHexToRgb ()
2014-12-08 18:05:22 +00:00
*/
2019-11-13 18:37:08 +00:00
function colorStringToArray ( $stringcolor , $colorifnotfound = array ( 88 , 88 , 88 ))
2014-12-08 18:05:22 +00:00
{
2021-02-23 21:03:23 +00:00
if ( is_array ( $stringcolor )) {
2024-10-17 01:08:38 +00:00
return $stringcolor ; // If already in the correct output format, we return as is
2021-02-23 21:03:23 +00:00
}
2019-11-13 18:37:08 +00:00
$reg = array ();
$tmp = preg_match ( '/^#?([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])$/' , $stringcolor , $reg );
2021-02-23 21:03:23 +00:00
if ( ! $tmp ) {
2024-09-28 10:09:35 +00:00
$tmp = array_map ( 'intval' , explode ( ',' , $stringcolor ));
'@phan-var-force int[] $tmp' ;
2021-02-23 21:03:23 +00:00
if ( count ( $tmp ) < 3 ) {
return $colorifnotfound ;
}
2014-12-08 18:05:22 +00:00
return $tmp ;
}
2019-11-13 18:37:08 +00:00
return array ( hexdec ( $reg [ 1 ]), hexdec ( $reg [ 2 ]), hexdec ( $reg [ 3 ]));
2014-12-08 18:05:22 +00:00
}
2019-02-26 16:44:16 +00:00
/**
2019-08-18 02:56:48 +00:00
* @ param string $color the color you need to valid
2025-08-09 11:52:31 +00:00
* @ param bool $allow_white in case of white isn ' t valid
* @ return bool
2019-02-26 16:44:16 +00:00
*/
2019-03-07 14:49:16 +00:00
function colorValidateHex ( $color , $allow_white = true )
2019-02-26 16:44:16 +00:00
{
2021-02-23 21:03:23 +00:00
if ( ! $allow_white && ( $color === '#fff' || $color === '#ffffff' )) {
return false ;
}
2019-03-22 13:32:15 +00:00
2021-02-23 21:03:23 +00:00
if ( preg_match ( '/^#[a-f0-9]{6}$/i' , $color )) { //hex color is valid
2020-09-07 08:18:17 +00:00
return true ;
}
return false ;
2019-02-26 16:44:16 +00:00
}
/**
2019-08-18 01:42:38 +00:00
* Change color to make it less aggressive ( ratio is negative ) or more aggressive ( ratio is positive )
*
2019-10-23 18:12:29 +00:00
* @ param string $hex Color in hex ( '#AA1122' or 'AA1122' or '#a12' or 'a12' )
* @ param integer $ratio Default =- 50. Note : 0 = Component color is unchanged , - 100 = Component color become 88 , + 100 = Component color become 00 or FF
2019-10-24 19:46:52 +00:00
* @ param integer $brightness Default = 0. Adjust brightness . - 100 = Decrease brightness by 100 % , + 100 = Increase of 100 %.
2019-08-18 01:42:38 +00:00
* @ return string New string of color
* @ see colorAdjustBrightness ()
*/
2019-10-23 18:12:29 +00:00
function colorAgressiveness ( $hex , $ratio = - 50 , $brightness = 0 )
2019-08-18 01:42:38 +00:00
{
2021-02-23 21:03:23 +00:00
if ( empty ( $ratio )) {
$ratio = 0 ; // To avoid null
}
2019-10-23 18:12:29 +00:00
2019-08-18 01:42:38 +00:00
// Steps should be between -255 and 255. Negative = darker, positive = lighter
$ratio = max ( - 100 , min ( 100 , $ratio ));
// Normalize into a six character long hex string
$hex = str_replace ( '#' , '' , $hex );
if ( strlen ( $hex ) == 3 ) {
$hex = str_repeat ( substr ( $hex , 0 , 1 ), 2 ) . str_repeat ( substr ( $hex , 1 , 1 ), 2 ) . str_repeat ( substr ( $hex , 2 , 1 ), 2 );
}
// Split into three parts: R, G and B
$color_parts = str_split ( $hex , 2 );
$return = '#' ;
foreach ( $color_parts as $color ) {
2020-01-09 23:03:10 +00:00
$color = hexdec ( $color ); // Convert to decimal
2021-02-23 21:03:23 +00:00
if ( $ratio > 0 ) { // We increase aggressivity
if ( $color > 127 ) {
$color += (( 255 - $color ) * ( $ratio / 100 ));
}
if ( $color < 128 ) {
$color -= ( $color * ( $ratio / 100 ));
}
2024-01-13 18:48:20 +00:00
} else { // We decrease aggressiveness
2021-02-23 21:03:23 +00:00
if ( $color > 128 ) {
$color -= (( $color - 128 ) * ( abs ( $ratio ) / 100 ));
}
if ( $color < 127 ) {
$color += (( 128 - $color ) * ( abs ( $ratio ) / 100 ));
}
2019-08-18 01:42:38 +00:00
}
2021-02-23 21:03:23 +00:00
if ( $brightness > 0 ) {
2024-11-14 22:26:18 +00:00
$color = ( int ) ( $color * ( 100 + abs ( $brightness )) / 100 );
2020-05-21 13:05:19 +00:00
} else {
2024-11-14 22:26:18 +00:00
$color = ( int ) ( $color * ( 100 - abs ( $brightness )) / 100 );
2019-10-23 18:12:29 +00:00
}
2024-11-14 22:26:18 +00:00
$color = max ( 0 , min ( 255 , ( int ) $color )); // Adjust color to stay into valid range
2019-08-18 01:42:38 +00:00
$return .= str_pad ( dechex ( $color ), 2 , '0' , STR_PAD_LEFT ); // Make two char hex code
}
//var_dump($hex.' '.$ratio.' -> '.$return);
return $return ;
}
/**
* @ param string $hex Color in hex ( '#AA1122' or 'AA1122' or '#a12' or 'a12' )
* @ param integer $steps Step / offset added to each color component . It should be between - 255 and 255. Negative = darker , positive = lighter
* @ return string New color with format '#AA1122'
2019-10-23 15:48:55 +00:00
* @ see colorAgressiveness ()
2019-02-26 16:44:16 +00:00
*/
2019-03-04 10:15:01 +00:00
function colorAdjustBrightness ( $hex , $steps )
{
2020-09-07 08:18:17 +00:00
// Steps should be between -255 and 255. Negative = darker, positive = lighter
$steps = max ( - 255 , min ( 255 , $steps ));
// Normalize into a six character long hex string
$hex = str_replace ( '#' , '' , $hex );
if ( strlen ( $hex ) == 3 ) {
$hex = str_repeat ( substr ( $hex , 0 , 1 ), 2 ) . str_repeat ( substr ( $hex , 1 , 1 ), 2 ) . str_repeat ( substr ( $hex , 2 , 1 ), 2 );
}
// Split into three parts: R, G and B
$color_parts = str_split ( $hex , 2 );
$return = '#' ;
foreach ( $color_parts as $color ) {
$color = hexdec ( $color ); // Convert to decimal
$color = max ( 0 , min ( 255 , $color + $steps )); // Adjust color
$return .= str_pad ( dechex ( $color ), 2 , '0' , STR_PAD_LEFT ); // Make two char hex code
}
return $return ;
2019-02-26 16:44:16 +00:00
}
/**
2019-03-07 14:49:16 +00:00
* @ param string $hex color in hex
2019-02-26 16:44:16 +00:00
* @ param integer $percent 0 to 100
* @ return string
*/
2019-03-04 10:15:01 +00:00
function colorDarker ( $hex , $percent )
{
2020-09-07 08:18:17 +00:00
$steps = intval ( 255 * $percent / 100 ) * - 1 ;
return colorAdjustBrightness ( $hex , $steps );
2019-02-26 16:44:16 +00:00
}
/**
2019-03-07 14:49:16 +00:00
* @ param string $hex color in hex
2019-02-26 16:44:16 +00:00
* @ param integer $percent 0 to 100
* @ return string
*/
2019-03-04 10:15:01 +00:00
function colorLighten ( $hex , $percent )
{
2020-09-07 08:18:17 +00:00
$steps = intval ( 255 * $percent / 100 );
return colorAdjustBrightness ( $hex , $steps );
2019-02-26 16:44:16 +00:00
}
/**
2024-03-11 22:18:01 +00:00
* @ param string $hex color in hex
* @ param float | false $alpha 0 to 1 to add alpha channel
* @ param bool $returnArray true = return an array instead , false = return string
2024-09-15 23:50:58 +00:00
* @ return string | array { r : int , g : int , b : int , a ? : float } String or array
2019-02-26 16:44:16 +00:00
*/
2019-03-04 10:15:01 +00:00
function colorHexToRgb ( $hex , $alpha = false , $returnArray = false )
{
2020-09-07 08:18:17 +00:00
$string = '' ;
2024-03-11 22:18:01 +00:00
$hex = str_replace ( '#' , '' , $hex );
$length = strlen ( $hex );
2020-09-07 08:18:17 +00:00
$rgb = array ();
$rgb [ 'r' ] = hexdec ( $length == 6 ? substr ( $hex , 0 , 2 ) : ( $length == 3 ? str_repeat ( substr ( $hex , 0 , 1 ), 2 ) : 0 ));
$rgb [ 'g' ] = hexdec ( $length == 6 ? substr ( $hex , 2 , 2 ) : ( $length == 3 ? str_repeat ( substr ( $hex , 1 , 1 ), 2 ) : 0 ));
$rgb [ 'b' ] = hexdec ( $length == 6 ? substr ( $hex , 4 , 2 ) : ( $length == 3 ? str_repeat ( substr ( $hex , 2 , 1 ), 2 ) : 0 ));
if ( $alpha !== false ) {
2023-12-27 11:12:20 +00:00
$rgb [ 'a' ] = ( float ) $alpha ;
2024-03-18 02:45:11 +00:00
$string = 'rgba(' . implode ( ',' , array_map ( 'strval' , $rgb )) . ')' ;
2020-09-07 08:18:17 +00:00
} else {
2024-03-18 02:45:11 +00:00
$string = 'rgb(' . implode ( ',' , array_map ( 'strval' , $rgb )) . ')' ;
2020-09-07 08:18:17 +00:00
}
if ( $returnArray ) {
return $rgb ;
} else {
return $string ;
}
2019-02-26 16:44:16 +00:00
}
2023-09-28 08:44:22 +00:00
/**
* Color Hex to Hsl ( used for style )
*
* @ param string $hex Color in hex
* @ param float | false $alpha 0 to 1 to add alpha channel
* @ param bool $returnArray true = return an array instead , false = return string
2024-09-15 23:50:58 +00:00
* @ return array { h : float , l : float , s : float , a : int | float } | string HSLA as string or array
2023-09-28 08:44:22 +00:00
*/
function colorHexToHsl ( $hex , $alpha = false , $returnArray = false )
{
2024-11-14 22:26:18 +00:00
$hex = colorArrayToHex ( colorStringToArray ( $hex ));
2023-09-28 08:44:22 +00:00
$hex = str_replace ( '#' , '' , $hex );
$red = hexdec ( substr ( $hex , 0 , 2 )) / 255 ;
$green = hexdec ( substr ( $hex , 2 , 2 )) / 255 ;
$blue = hexdec ( substr ( $hex , 4 , 2 )) / 255 ;
$cmin = min ( $red , $green , $blue );
$cmax = max ( $red , $green , $blue );
$delta = $cmax - $cmin ;
if ( $delta == 0 ) {
$hue = 0 ;
} elseif ( $cmax === $red ) {
$hue = (( $green - $blue ) / $delta );
} elseif ( $cmax === $green ) {
$hue = ( $blue - $red ) / $delta + 2 ;
} else {
$hue = ( $red - $green ) / $delta + 4 ;
}
$hue = round ( $hue * 60 );
if ( $hue < 0 ) {
$hue += 360 ;
}
$lightness = (( $cmax + $cmin ) / 2 );
$saturation = $delta === 0 ? 0 : ( $delta / ( 1 - abs ( 2 * $lightness - 1 )));
if ( $saturation < 0 ) {
$saturation += 1 ;
}
2024-02-18 14:09:01 +00:00
$lightness = round ( $lightness * 100 );
$saturation = round ( $saturation * 100 );
2023-09-28 08:44:22 +00:00
if ( $returnArray ) {
return array (
'h' => $hue ,
'l' => $lightness ,
's' => $saturation ,
'a' => $alpha === false ? 1 : $alpha
);
} elseif ( $alpha ) {
return 'hsla(' . $hue . ', ' . $saturation . ', ' . $lightness . ' / ' . $alpha . ')' ;
} else {
return 'hsl(' . $hue . ', ' . $saturation . ', ' . $lightness . ')' ;
}
}
2019-02-26 16:44:16 +00:00
2016-07-23 14:37:21 +00:00
/**
* Applies the Cartesian product algorithm to an array
* Source : http :// stackoverflow . com / a / 15973172
*
2024-09-28 10:09:35 +00:00
* @ param array < string | int , string [] > $input Array of products
* @ return array < array < string , string >> Array of combinations
2016-07-23 14:37:21 +00:00
*/
2018-08-15 15:34:35 +00:00
function cartesianArray ( array $input )
{
2020-09-07 08:18:17 +00:00
// filter out empty values
$input = array_filter ( $input );
2014-12-08 18:05:22 +00:00
2020-09-07 08:18:17 +00:00
$result = array ( array ());
2016-07-23 14:37:21 +00:00
2020-09-07 08:18:17 +00:00
foreach ( $input as $key => $values ) {
$append = array ();
2016-07-23 14:37:21 +00:00
2020-09-07 08:18:17 +00:00
foreach ( $result as $product ) {
foreach ( $values as $item ) {
$product [ $key ] = $item ;
$append [] = $product ;
}
}
2016-07-23 14:37:21 +00:00
2020-09-07 08:18:17 +00:00
$result = $append ;
}
2016-07-23 14:37:21 +00:00
2020-09-07 08:18:17 +00:00
return $result ;
2017-05-14 13:17:40 +00:00
}
2017-06-25 15:09:08 +00:00
/**
* Get name of directory where the api_ ... class . php file is stored
*
2020-06-17 23:09:30 +00:00
* @ param string $moduleobject Module object name
* @ return string Directory name
2017-06-25 15:09:08 +00:00
*/
2020-06-17 23:09:30 +00:00
function getModuleDirForApiClass ( $moduleobject )
2017-06-25 15:09:08 +00:00
{
2020-09-07 08:18:17 +00:00
$moduledirforclass = $moduleobject ;
2021-02-23 21:03:23 +00:00
if ( $moduledirforclass != 'api' ) {
$moduledirforclass = preg_replace ( '/api$/i' , '' , $moduledirforclass );
}
2020-09-07 08:18:17 +00:00
if ( $moduleobject == 'contracts' ) {
$moduledirforclass = 'contrat' ;
2025-10-22 16:04:39 +00:00
} elseif ( in_array ( $moduleobject , array ( 'admin' , 'login' , 'setup' , 'access' , 'status' , 'tools' , 'documents' , 'objectlinks' , 'emailtemplates' ))) {
2020-09-07 08:18:17 +00:00
$moduledirforclass = 'api' ;
2025-10-21 00:05:51 +00:00
} elseif ( in_array ( $moduleobject , [ 'contact' , 'contacts' , 'customer' , 'thirdparty' , 'thirdparties' ])) {
2020-09-07 08:18:17 +00:00
$moduledirforclass = 'societe' ;
2026-02-07 22:44:57 +00:00
} elseif ( $moduleobject == 'propal' || $moduleobject == 'propale' || $moduleobject == 'proposals' ) {
2020-09-07 08:18:17 +00:00
$moduledirforclass = 'comm/propal' ;
} elseif ( $moduleobject == 'agenda' || $moduleobject == 'agendaevents' ) {
$moduledirforclass = 'comm/action' ;
2025-10-29 17:58:06 +00:00
} elseif ( $moduleobject == 'mailing' || $moduleobject == 'mailings' ) {
2025-10-01 15:37:43 +00:00
$moduledirforclass = 'comm/mailing' ;
2025-10-21 00:05:51 +00:00
} elseif ( in_array ( $moduleobject , [ 'adherent' , 'members' , 'memberstypes' , 'subscriptions' ])) {
2020-09-07 08:18:17 +00:00
$moduledirforclass = 'adherents' ;
} elseif ( $moduleobject == 'don' || $moduleobject == 'donations' ) {
$moduledirforclass = 'don' ;
} elseif ( $moduleobject == 'banque' || $moduleobject == 'bankaccounts' ) {
$moduledirforclass = 'compta/bank' ;
} elseif ( $moduleobject == 'category' || $moduleobject == 'categorie' ) {
$moduledirforclass = 'categories' ;
} elseif ( $moduleobject == 'order' || $moduleobject == 'orders' ) {
$moduledirforclass = 'commande' ;
} elseif ( $moduleobject == 'shipments' ) {
$moduledirforclass = 'expedition' ;
2022-12-30 15:16:29 +00:00
} elseif ( $moduleobject == 'multicurrencies' ) {
$moduledirforclass = 'multicurrency' ;
2020-09-07 08:18:17 +00:00
} elseif ( $moduleobject == 'facture' || $moduleobject == 'invoice' || $moduleobject == 'invoices' ) {
$moduledirforclass = 'compta/facture' ;
} elseif ( $moduleobject == 'project' || $moduleobject == 'projects' || $moduleobject == 'task' || $moduleobject == 'tasks' ) {
$moduledirforclass = 'projet' ;
2025-11-14 15:06:59 +00:00
} elseif ( $moduleobject == 'stock' || $moduleobject == 'stockmovements' || $moduleobject == 'warehouses' || $moduleobject == 'productlots' ) {
2020-09-07 08:18:17 +00:00
$moduledirforclass = 'product/stock' ;
} elseif ( $moduleobject == 'supplierproposals' || $moduleobject == 'supplierproposal' || $moduleobject == 'supplier_proposal' ) {
$moduledirforclass = 'supplier_proposal' ;
} elseif ( $moduleobject == 'fournisseur' || $moduleobject == 'supplierinvoices' || $moduleobject == 'supplierorders' ) {
$moduledirforclass = 'fourn' ;
} elseif ( $moduleobject == 'ficheinter' || $moduleobject == 'interventions' ) {
$moduledirforclass = 'fichinter' ;
} elseif ( $moduleobject == 'mos' ) {
$moduledirforclass = 'mrp' ;
2024-06-26 15:05:42 +00:00
} elseif ( $moduleobject == 'workstations' ) {
$moduledirforclass = 'workstation' ;
2023-04-29 05:37:02 +00:00
} elseif ( $moduleobject == 'accounting' ) {
$moduledirforclass = 'accountancy' ;
2025-07-17 19:34:26 +00:00
} elseif ( $moduleobject == 'paiements' ) {
$moduledirforclass = 'compta/facture' ;
2023-10-31 12:37:15 +00:00
} elseif ( in_array ( $moduleobject , array ( 'products' , 'expensereports' , 'users' , 'tickets' , 'boms' , 'receptions' , 'partnerships' , 'recruitments' ))) {
2020-09-07 08:18:17 +00:00
$moduledirforclass = preg_replace ( '/s$/' , '' , $moduleobject );
2024-02-19 16:03:07 +00:00
} elseif ( $moduleobject == 'paymentsalaries' ) {
$moduledirforclass = 'salaries' ;
} elseif ( $moduleobject == 'paymentexpensereports' ) {
$moduledirforclass = 'expensereport' ;
2025-10-29 17:58:06 +00:00
} elseif ( $moduleobject == 'eventattendees' ) {
$moduledirforclass = 'eventorganization' ;
} elseif ( $moduleobject == 'holidays' ) {
$moduledirforclass = 'holiday' ;
2020-09-07 08:18:17 +00:00
}
return $moduledirforclass ;
2017-06-25 15:09:08 +00:00
}
2017-09-07 14:23:51 +00:00
2019-04-01 17:27:34 +00:00
/**
2017-09-07 14:23:51 +00:00
* Return 2 hexa code randomly
2017-09-13 13:12:54 +00:00
*
2019-04-01 17:27:34 +00:00
* @ param int $min Between 0 and 255
* @ param int $max Between 0 and 255
* @ return string A color string '12'
2017-09-07 14:23:51 +00:00
*/
2019-04-01 17:27:34 +00:00
function randomColorPart ( $min = 0 , $max = 255 )
2018-08-15 15:34:35 +00:00
{
2020-09-07 08:18:17 +00:00
return str_pad ( dechex ( mt_rand ( $min , $max )), 2 , '0' , STR_PAD_LEFT );
2017-09-07 14:23:51 +00:00
}
2019-04-01 17:27:34 +00:00
/**
2017-09-07 14:23:51 +00:00
* Return hexadecimal color randomly
2017-09-13 13:12:54 +00:00
*
2019-04-01 17:27:34 +00:00
* @ param int $min Between 0 and 255
* @ param int $max Between 0 and 255
* @ return string A color string '123456'
*/
function randomColor ( $min = 0 , $max = 255 )
{
2020-09-07 08:18:17 +00:00
return randomColorPart ( $min , $max ) . randomColorPart ( $min , $max ) . randomColorPart ( $min , $max );
2019-04-01 17:27:34 +00:00
}
2019-04-02 18:02:43 +00:00
2021-02-23 21:03:23 +00:00
if ( ! function_exists ( 'dolEscapeXML' )) {
2020-09-07 08:18:17 +00:00
/**
* Encode string for xml usage
*
* @ param string $string String to encode
* @ return string String encoded
*/
function dolEscapeXML ( $string )
{
2024-02-18 14:09:01 +00:00
return strtr ( $string , array ( '\'' => ''' , '"' => '"' , '&' => '&' , '<' => '<' , '>' => '>' ));
2020-09-07 08:18:17 +00:00
}
2017-09-13 18:57:53 +00:00
}
2019-04-01 16:46:13 +00:00
2019-04-02 18:02:43 +00:00
2019-04-16 23:13:59 +00:00
/**
* Convert links to local wrapper to medias files into a string into a public external URL readable on internet
2019-04-18 08:12:00 +00:00
*
2019-04-16 23:13:59 +00:00
* @ param string $notetoshow Text to convert
* @ return string String
*/
function convertBackOfficeMediasLinksToPublicLinks ( $notetoshow )
{
2020-09-07 08:18:17 +00:00
global $dolibarr_main_url_root ;
// Define $urlwithroot
$urlwithouturlroot = preg_replace ( '/' . preg_quote ( DOL_URL_ROOT , '/' ) . '$/i' , '' , trim ( $dolibarr_main_url_root ));
$urlwithroot = $urlwithouturlroot . DOL_URL_ROOT ; // This is to use external domain name found into config file
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
$notetoshow = preg_replace ( '/src="[a-zA-Z0-9_\/\-\.]*(viewimage\.php\?modulepart=medias[^"]*)"/' , 'src="' . $urlwithroot . '/\1"' , $notetoshow );
return $notetoshow ;
2019-04-16 23:13:59 +00:00
}
2020-01-23 10:47:30 +00:00
/**
* Function to format a value into a defined format for French administration ( no thousand separator & decimal separator force to ',' with two decimals )
* Function used into accountancy FEC export
*
2021-08-02 16:31:26 +00:00
* @ param float $amount Amount to format
2020-01-23 11:04:14 +00:00
* @ return string Chain with formatted upright
* @ see price2num () Format a numeric into a price for FEC files
2020-01-23 10:47:30 +00:00
*/
function price2fec ( $amount )
{
global $conf ;
// Clean parameters
2021-02-23 21:03:23 +00:00
if ( empty ( $amount )) {
$amount = 0 ; // To have a numeric value if amount not defined or = ''
}
2024-01-13 18:48:20 +00:00
$amount = ( is_numeric ( $amount ) ? $amount : 0 ); // Check if amount is numeric, for example, an error occurred when amount value = o (letter) instead 0 (number)
2020-01-23 10:47:30 +00:00
2020-01-23 11:02:29 +00:00
// Output decimal number by default
2023-11-27 10:39:32 +00:00
$nbdecimal = ( ! getDolGlobalString ( 'ACCOUNTING_FEC_DECIMAL_LENGTH' ) ? 2 : $conf -> global -> ACCOUNTING_FEC_DECIMAL_LENGTH );
2020-01-23 10:47:30 +00:00
2020-01-23 11:02:29 +00:00
// Output separators by default
2023-11-27 10:39:32 +00:00
$dec = ( ! getDolGlobalString ( 'ACCOUNTING_FEC_DECIMAL_SEPARATOR' ) ? ',' : $conf -> global -> ACCOUNTING_FEC_DECIMAL_SEPARATOR );
$thousand = ( ! getDolGlobalString ( 'ACCOUNTING_FEC_THOUSAND_SEPARATOR' ) ? '' : $conf -> global -> ACCOUNTING_FEC_THOUSAND_SEPARATOR );
2020-01-23 10:47:30 +00:00
// Format number
2020-01-23 11:02:29 +00:00
$output = number_format ( $amount , $nbdecimal , $dec , $thousand );
2020-01-23 10:47:30 +00:00
return $output ;
}
2020-10-07 12:58:54 +00:00
/**
* Check the syntax of some PHP code .
2020-10-07 15:17:13 +00:00
*
* @ param string $code PHP code to check .
2024-10-17 01:08:38 +00:00
* @ return false | array { 0 : string , 1 : int } If false , then check was successful , otherwise an array ( message , line ) of errors is returned .
2020-10-07 12:58:54 +00:00
*/
function phpSyntaxError ( $code )
{
2021-02-23 21:03:23 +00:00
if ( ! defined ( " CR " )) {
define ( " CR " , " \r " );
}
if ( ! defined ( " LF " )) {
define ( " LF " , " \n " );
}
if ( ! defined ( " CRLF " )) {
define ( " CRLF " , " \r \n " );
}
2020-10-07 12:58:54 +00:00
2020-10-31 13:32:18 +00:00
$braces = 0 ;
$inString = 0 ;
foreach ( token_get_all ( '<?php ' . $code ) as $token ) {
2020-10-07 12:58:54 +00:00
if ( is_array ( $token )) {
switch ( $token [ 0 ]) {
case T_CURLY_OPEN :
case T_DOLLAR_OPEN_CURLY_BRACES :
2021-02-23 21:03:23 +00:00
case T_START_HEREDOC :
++ $inString ;
break ;
case T_END_HEREDOC :
-- $inString ;
break ;
2020-10-07 12:58:54 +00:00
}
2020-10-07 15:17:13 +00:00
} elseif ( $inString & 1 ) {
2020-10-07 12:58:54 +00:00
switch ( $token ) {
2020-10-07 15:17:13 +00:00
case '`' :
case '\'' :
2021-02-23 21:03:23 +00:00
case '"' :
-- $inString ;
break ;
2020-10-07 12:58:54 +00:00
}
} else {
switch ( $token ) {
2020-10-07 15:17:13 +00:00
case '`' :
case '\'' :
2021-02-23 21:03:23 +00:00
case '"' :
++ $inString ;
break ;
case '{' :
++ $braces ;
break ;
2020-10-07 12:58:54 +00:00
case '}' :
if ( $inString ) {
-- $inString ;
} else {
-- $braces ;
2021-02-23 21:03:23 +00:00
if ( $braces < 0 ) {
break 2 ;
}
2020-10-07 12:58:54 +00:00
}
break ;
}
}
}
$inString = @ ini_set ( 'log_errors' , false );
$token = @ ini_set ( 'display_errors' , true );
ob_start ();
$code = substr ( $code , strlen ( '<?php ' ));
$braces || $code = " if(0) { { $code } \n } " ;
2024-02-28 14:36:29 +00:00
// @phan-suppress-next-line PhanPluginUnsafeEval
2020-10-07 12:58:54 +00:00
if ( eval ( $code ) === false ) {
if ( $braces ) {
$braces = PHP_INT_MAX ;
} else {
2020-10-07 15:17:13 +00:00
false !== strpos ( $code , CR ) && $code = strtr ( str_replace ( CRLF , LF , $code ), CR , LF );
$braces = substr_count ( $code , LF );
2020-10-07 12:58:54 +00:00
}
$code = ob_get_clean ();
$code = strip_tags ( $code );
if ( preg_match ( " 'syntax error, (.+) in .+ on line ( \ d+) $ 's " , $code , $code )) {
$code [ 2 ] = ( int ) $code [ 2 ];
$code = $code [ 2 ] <= $braces
2024-02-19 16:03:07 +00:00
? array ( $code [ 1 ], $code [ 2 ])
: array ( 'unexpected $end' . substr ( $code [ 1 ], 14 ), $braces );
2021-02-23 21:03:23 +00:00
} else {
$code = array ( 'syntax error' , 0 );
}
2020-10-07 12:58:54 +00:00
} else {
ob_end_clean ();
$code = false ;
}
@ ini_set ( 'display_errors' , $token );
@ ini_set ( 'log_errors' , $inString );
return $code ;
}
2022-12-13 15:50:29 +00:00
/**
* Check the syntax of some PHP code .
*
* @ return int > 0 if OK , 0 if no Return if we accept link added from the media browser into HTML field for public usage
*/
function acceptLocalLinktoMedia ()
{
global $user ;
// If $acceptlocallinktomedia is true, we can add link media files int email templates (we already can do this into HTML editor of an email).
// Note that local link to a file into medias are replaced with a real link by email in CMailFile.class.php with value $urlwithroot defined like this:
// $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
// $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
2025-04-25 17:08:56 +00:00
2022-12-13 15:50:29 +00:00
$acceptlocallinktomedia = getDolGlobalInt ( 'MAIN_DISALLOW_MEDIAS_IN_EMAIL_TEMPLATES' ) ? 0 : 1 ;
2025-04-25 17:08:56 +00:00
2025-10-03 17:20:28 +00:00
// By default we accept to add medias from emails templates but this may be refused in the future
2025-04-25 17:08:56 +00:00
// we detect we are not on a public url that we can access remotely (if we are on a private network, such files can't be reached),
// except if MAIN_ALLOW_WYSIWYG_LOCAL_MEDIAS_ON_PRIVATE_NETWORK is net, in which case we accept also if instance has a local or private network URL.
2022-12-13 15:50:29 +00:00
if ( $acceptlocallinktomedia ) {
global $dolibarr_main_url_root ;
$urlwithouturlroot = preg_replace ( '/' . preg_quote ( DOL_URL_ROOT , '/' ) . '$/i' , '' , trim ( $dolibarr_main_url_root ));
2025-04-25 17:08:56 +00:00
// Parse $newUrl to get the IP of the server
2022-12-13 15:50:29 +00:00
$newUrlArray = parse_url ( $urlwithouturlroot );
$hosttocheck = $newUrlArray [ 'host' ];
$hosttocheck = str_replace ( array ( '[' , ']' ), '' , $hosttocheck ); // Remove brackets of IPv6
if ( function_exists ( 'gethostbyname' )) {
$iptocheck = gethostbyname ( $hosttocheck );
} else {
$iptocheck = $hosttocheck ;
}
//var_dump($iptocheck.' '.$acceptlocallinktomedia);
2025-04-25 17:08:56 +00:00
$allowPrivateNetworkIP = getDolGlobalInt ( 'MAIN_ALLOW_WYSIWYG_LOCAL_MEDIAS_ON_PRIVATE_NETWORK' );
2023-11-07 16:50:28 +00:00
if ( ! $allowPrivateNetworkIP && ! filter_var ( $iptocheck , FILTER_VALIDATE_IP , FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE )) {
2025-04-25 17:08:56 +00:00
// If ip of public url ($iptocheck) is a private network IP (192.168.0.1; 127.0.0.1...), we do not allow to upload files on media (they are unreachable publicly).
2022-12-13 15:50:29 +00:00
$acceptlocallinktomedia = 0 ;
2025-04-25 17:08:56 +00:00
//dol_syslog("WYSIWYG Editor : local media not allowed (checked IP: {$iptocheck}). Use MAIN_ALLOW_WYSIWYG_LOCAL_MEDIAS_ON_PRIVATE_NETWORK = 1 to allow local URL into WYSIWYG html content");
2022-12-13 15:50:29 +00:00
}
2025-04-25 17:08:56 +00:00
$allowUrlInHTTP = getDolGlobalInt ( 'MAIN_ALLOW_WYSIWYG_EVEN_ON_UNSECURED_EXTERNAL_HTTP_URL' );
if ( ! $allowUrlInHTTP && preg_match ( '/http:/i' , $urlwithouturlroot )) {
2022-12-13 15:50:29 +00:00
// If public url is not a https, we do not allow to add medias link. It will generate security alerts when email will be sent.
$acceptlocallinktomedia = 0 ;
// TODO Show a warning
}
if ( ! empty ( $user -> socid )) {
$acceptlocallinktomedia = 0 ;
}
}
2022-12-13 16:05:50 +00:00
//return 1;
2022-12-13 15:50:29 +00:00
return $acceptlocallinktomedia ;
}
2023-05-25 13:11:16 +00:00
/**
* Remove first and last parenthesis but only if first is the opening and last the closing of the same group
*
* @ param string $string String to sanitize
* @ return string String without global parenthesis
*/
function removeGlobalParenthesis ( $string )
{
$string = trim ( $string );
// If string does not start and end with parenthesis, we return $string as is.
if ( ! preg_match ( '/^\(.*\)$/' , $string )) {
return $string ;
}
$nbofchars = dol_strlen ( $string );
2023-12-04 11:05:28 +00:00
$i = 0 ;
$g = 0 ;
2023-05-25 13:11:16 +00:00
$countparenthesis = 0 ;
while ( $i < $nbofchars ) {
$char = dol_substr ( $string , $i , 1 );
if ( $char == '(' ) {
$countparenthesis ++ ;
} elseif ( $char == ')' ) {
$countparenthesis -- ;
if ( $countparenthesis <= 0 ) { // We reach the end of an independent group of parenthesis
$g ++ ;
}
}
$i ++ ;
}
if ( $g <= 1 ) {
return preg_replace ( '/^\(/' , '' , preg_replace ( '/\)$/' , '' , $string ));
}
return $string ;
}
2024-05-14 16:19:48 +00:00
/**
2024-05-22 00:56:20 +00:00
* Return array of Emojis for miscellaneous use .
2024-05-14 16:19:48 +00:00
*
2024-05-22 01:21:54 +00:00
* @ return array < string , array < string >> Array of Emojis in hexadecimal
2024-05-22 00:56:20 +00:00
* @ see getArrayOfEmoji ()
2024-05-14 16:19:48 +00:00
*/
2024-05-22 00:56:20 +00:00
function getArrayOfEmojiBis ()
2024-05-14 16:19:48 +00:00
{
$arrayofcommonemoji = array (
'misc' => array ( '2600' , '26FF' ), // Miscellaneous Symbols
'ding' => array ( '2700' , '27BF' ), // Dingbats
'????' => array ( '9989' , '9989' ), // Variation Selectors
'vars' => array ( 'FE00' , 'FE0F' ), // Variation Selectors
'pict' => array ( '1F300' , '1F5FF' ), // Miscellaneous Symbols and Pictographs
'emot' => array ( '1F600' , '1F64F' ), // Emoticons
'tran' => array ( '1F680' , '1F6FF' ), // Transport and Map Symbols
'flag' => array ( '1F1E0' , '1F1FF' ), // Flags (note: may be 1F1E6 instead of 1F1E0)
'supp' => array ( '1F900' , '1F9FF' ), // Supplemental Symbols and Pictographs
);
return $arrayofcommonemoji ;
}
/**
* Remove EMoji from email content
*
2024-09-28 10:09:35 +00:00
* @ param string $text String to sanitize
* @ param int < 0 , 2 > $allowedemoji Mode to allow emoji
* @ return string Sanitized string
2024-05-14 16:19:48 +00:00
*/
function removeEmoji ( $text , $allowedemoji = 1 )
{
// $allowedemoji can be
// 0=no emoji, 1=exclude the main known emojis (default), 2=keep only the main known (not implemented), 3=accept all
// Note that to accept emoji in database, you must use utf8mb4, utf8mb3 is not enough.
if ( $allowedemoji == 0 ) {
// For a large removal:
$text = preg_replace ( '/[\x{2600}-\x{FFFF}]/u' , '' , $text );
$text = preg_replace ( '/[\x{10000}-\x{10FFFF}]/u' , '' , $text );
}
// Delete emoji chars with a regex
// See https://www.unicode.org/emoji/charts/full-emoji-list.html
if ( $allowedemoji == 1 ) {
2024-05-22 00:56:20 +00:00
$arrayofcommonemoji = getArrayOfEmojiBis ();
2024-05-14 16:19:48 +00:00
foreach ( $arrayofcommonemoji as $key => $valarray ) {
$text = preg_replace ( '/[\x{' . $valarray [ 0 ] . '}-\x{' . $valarray [ 1 ] . '}]/u' , '' , $text );
}
}
if ( $allowedemoji == 2 ) {
// TODO Not yet implemented
}
return $text ;
}
2024-10-03 19:36:39 +00:00
/**
* Clean a cell to respect rules of CSV file cells
*
2026-01-05 11:42:09 +00:00
* @ param string | int | float $newvalue String to clean ( must be UTF - 8 encoded )
* @ param string $charset Expected output character set ( 'UTF-8' , 'ISO-8859-1' , ... ) . Default '' will use the value into EXPORT_CSV_FORCE_CHARSET .
* @ param string $separator CSV char separator ( often ',' or ';' ) . Default '' will use the value into EXPORT_CSV_SEPARATOR_TO_USE .
* @ return string Value cleaned
2024-10-03 19:36:39 +00:00
*/
2024-10-05 12:51:45 +00:00
function csvClean ( $newvalue , $charset = '' , $separator = '' )
2024-10-03 19:36:39 +00:00
{
2024-10-05 12:51:45 +00:00
global $langs ;
2024-10-03 19:36:39 +00:00
$addquote = 0 ;
2024-10-05 12:51:45 +00:00
if ( empty ( $charset )) {
$charset = getDolGlobalString ( 'EXPORT_CSV_FORCE_CHARSET' );
}
2024-10-03 19:36:39 +00:00
if ( empty ( $separator )) {
$separator = getDolGlobalString ( 'EXPORT_CSV_SEPARATOR_TO_USE' );
}
2024-10-05 12:51:45 +00:00
2026-01-05 11:42:09 +00:00
$newvalue = $langs -> convToOutputCharset (( string ) $newvalue , 'UTF-8' , $charset ); // newvalue is now encoded into $charset
2024-10-05 12:51:45 +00:00
2024-10-03 19:36:39 +00:00
// Rule Dolibarr: No HTML
//print $charset.' '.$newvalue."\n";
//$newvalue=dol_string_nohtmltag($newvalue,0,$charset);
$newvalue = dol_htmlcleanlastbr ( $newvalue );
//print $charset.' '.$newvalue."\n";
// Rule 1 CSV: No CR, LF in cells (except if USE_STRICT_CSV_RULES is 1, we can keep record as it is but we must add quotes)
$oldvalue = $newvalue ;
$newvalue = str_replace ( " \r " , '' , $newvalue );
$newvalue = str_replace ( " \n " , '\n' , $newvalue );
if ( getDolGlobalString ( 'USE_STRICT_CSV_RULES' ) && $oldvalue != $newvalue ) {
// If we must use enclusure on text with CR/LF)
if ( getDolGlobalInt ( 'USE_STRICT_CSV_RULES' ) == 1 ) {
// If we use strict CSV rules (original value must remain but we add quote)
$newvalue = $oldvalue ;
}
$addquote = 1 ;
}
// Rule 2 CSV: If value contains ", we must escape with ", and add "
if ( preg_match ( '/"/' , $newvalue )) {
$addquote = 1 ;
$newvalue = str_replace ( '"' , '""' , $newvalue );
}
// Rule 3 CSV: If value contains separator, we must add "
if ( preg_match ( '/' . $separator . '/' , $newvalue )) {
$addquote = 1 ;
}
2026-07-03 17:30:34 +00:00
// Rule 4 CSV: If value is a string started with char that trigger formula in calc software, we must add "
if ( preg_match ( '/^\s*[=+-@]/' , $newvalue )) {
2026-07-03 17:19:54 +00:00
$addquote = 1 ;
}
2024-10-03 19:36:39 +00:00
return ( $addquote ? '"' : '' ) . $newvalue . ( $addquote ? '"' : '' );
}
2025-11-11 14:06:57 +00:00
/**
* Function to output HTML to make an ajax call to make registration
*
2026-01-08 02:01:18 +00:00
* @ param string $constanttosavelastko Name of constant to save the last call that failed
2026-02-09 17:04:59 +00:00
* @ param string $constanttosavefirstok Name of constant to save the first try that succeed
2025-11-11 14:06:57 +00:00
* @ param array < string , string > $arrayofdata Array of key - value to add as parameter in the ajax call
2026-01-08 02:01:18 +00:00
* @ param int $forceping Value 1 to force the ping , even if it was already done
2025-11-11 18:31:18 +00:00
* @ return void
2025-11-11 14:06:57 +00:00
*/
function printCodeForPing ( $constanttosavelastko , $constanttosavefirstok , $arrayofdata = array (), $forceping = 0 )
{
global $dolibarr_distrib ;
global $db , $conf ;
2026-02-13 01:01:19 +00:00
require_once DOL_DOCUMENT_ROOT . '/blockedlog/lib/blockedlog.lib.php' ;
2026-01-08 21:55:03 +00:00
$algo = 'sha256' ;
2026-02-13 00:05:25 +00:00
$hash_unique_id = getHashUniqueIdOfRegistration ( $algo );
2025-11-11 14:06:57 +00:00
// Disable ping if $constanttosavelastpingko is set and is recent (this month)
if ( getDolGlobalString ( $constanttosavelastko ) && substr ( getDolGlobalString ( $constanttosavelastko ), 0 , 6 ) == dol_print_date ( dol_now (), '%Y%m' ) && ! $forceping ) {
2026-02-09 17:04:59 +00:00
print " \n " ;
print '<!-- printCodeForPing: NO JS CODE TO ENABLE the call for ' . $constanttosavefirstok . '. An error already occurred this month (' . $constanttosavelastko . ' is set), we will re-try next month. -->' . " \n " ;
2025-11-11 14:06:57 +00:00
} else {
2026-02-09 17:04:59 +00:00
print " \n " ;
print '<!-- printCodeForPing: Includes JS to make ajax call for ' . $constanttosavefirstok . '. forceping=' . $forceping . ' ' . $constanttosavefirstok . '=' . getDolGlobalString ( $constanttosavefirstok ) . ' ' . $constanttosavelastko . '=' . getDolGlobalString ( $constanttosavelastko ) . ' -->' . " \n " ;
2025-11-11 14:06:57 +00:00
print " <!-- JS CODE TO ENABLE the call --> \n " ;
$url_for_ping = getDolGlobalString ( 'MAIN_URL_FOR_PING' , " https://ping.dolibarr.org/ " );
// Try to guess the distrib used
$distrib = 'standard' ;
if ( isset ( $_SERVER [ " SERVER_ADMIN " ]) && $_SERVER [ " SERVER_ADMIN " ] == 'doliwamp@localhost' ) {
$distrib = 'doliwamp' ;
}
if ( ! empty ( $dolibarr_distrib )) {
$distrib = $dolibarr_distrib ;
}
?>
< script >
jQuery ( document ) . ready ( function ( tmp ) {
console . log ( " Try remote call with hash_unique_id is dol_hash('dolibarr'+instance_unique_id, 'sha256') " );
$ . ajax ({
method : " POST " ,
url : " <?php echo $url_for_ping ?> " ,
timeout : 500 , // timeout milliseconds
cache : false ,
data : {
< ? php
foreach ( $arrayofdata as $datakey => $dataval ) {
print $datakey . " : ' " . dol_escape_js ( $dataval ) . " ', \n " ;
}
?>
2026-01-08 21:55:03 +00:00
hash_algo : 'dol_hash-<?php echo $algo; ?>' ,
2025-11-11 14:06:57 +00:00
hash_unique_id : '<?php echo dol_escape_js($hash_unique_id); ?>' ,
version : '<?php echo (float) DOL_VERSION; ?>' ,
version_full : '<?php echo DOL_VERSION; ?>' ,
2026-02-19 23:49:35 +00:00
versionblockedlog : '<?php echo (float) getBlockedLogVersionToShow(); ?>' ,
versionblockedlog_full : '<?php echo getBlockedLogVersionToShow(); ?>' ,
2025-11-11 14:06:57 +00:00
entity : '<?php echo (int) $conf->entity; ?>' ,
dbtype : '<?php echo dol_escape_js($db->type); ?>' ,
php_version : '<?php echo dol_escape_js(phpversion()); ?>' ,
os_version : '<?php echo dol_escape_js(version_os(' smr ')); ?>' ,
db_version : '<?php echo dol_escape_js(version_db()); ?>' ,
distrib : '<?php echo dol_escape_js($distrib); ?>' ,
token : 'notrequired'
},
success : function ( data , status , xhr ) { // success callback function (data contains body of response)
2026-02-13 00:22:06 +00:00
console . log ( " Ping ok - we call pingresult to save this " );
2025-11-11 14:06:57 +00:00
$ . ajax ({
method : 'GET' ,
url : '<?php echo DOL_URL_ROOT.' / core / ajax / pingresult . php '; ?>' ,
timeout : 500 , // timeout milliseconds
cache : false ,
data : { hash_algo : 'dol_hash-sha256' , hash_unique_id : '<?php echo dol_escape_js($hash_unique_id); ?>' , action : '<?php echo $constanttosavefirstok ?>' , token : '<?php echo currentToken(); ?>' }, // for update
});
},
error : function ( data , status , xhr ) { // error callback function
2026-02-13 00:22:06 +00:00
console . log ( " Ping ko - we call pingresult to save this: " + data );
2025-11-11 14:06:57 +00:00
$ . ajax ({
method : 'GET' ,
url : '<?php echo DOL_URL_ROOT.' / core / ajax / pingresult . php '; ?>' ,
timeout : 500 , // timeout milliseconds
cache : false ,
data : { hash_algo : 'dol_hash-sha256' , hash_unique_id : '<?php echo dol_escape_js($hash_unique_id); ?>' , action : '<?php echo $constanttosavelastko ?>' , token : '<?php echo currentToken(); ?>' },
});
}
});
});
</ script >
< ? php
}
}
2026-05-10 13:40:32 +00:00
/**
* Check that a zip file is Dolibarr rule compliant
*
* @ param ZipArchive $zip The object ZipArchive
* @ param string $originalfilename The name of file submitted
* @ param string $zipfile The name of file in disk ( into temp directory )
2026-05-10 21:12:12 +00:00
* @ param Translate $langs Output language
* @ return array { error : int , errormsg : ? string , upload : int } Array with result
2026-05-10 13:40:32 +00:00
*/
2026-05-10 21:12:12 +00:00
function validateZipFile ( $zip , $originalfilename , $zipfile , $langs )
2026-05-10 13:40:32 +00:00
{
2026-05-10 21:12:12 +00:00
global $count , $results ;
2026-05-10 13:40:32 +00:00
2026-05-10 21:12:12 +00:00
$error = 0 ;
2026-05-10 13:40:32 +00:00
$return = array (
'error' => 0 ,
2026-05-10 21:12:12 +00:00
'errormsg' => '' , // Concatenating to this, so must be string
2026-05-10 13:40:32 +00:00
'upload' => 0
);
dol_syslog ( " Validate zip file " . $originalfilename );
2026-05-10 21:12:12 +00:00
$subdir = basename ( $zipfile );
2026-05-10 13:40:32 +00:00
//$dir='/home/dolibarr/dolistore.com/tmp/'.$subdir;
2026-05-10 21:12:12 +00:00
$dir = sys_get_temp_dir () . '/unzip-dir-' . $subdir ;
2026-05-10 13:40:32 +00:00
mkdir ( $dir , 0777 , true );
$zip -> extractTo ( $dir . '/' );
$zip -> close ();
// Zip content of a module should be ./mymodule or ./htdocs/mymodule
// But we first we check if we need to change dir (for zip that are ./module/htdocs/module instead of ./htdocs/module)
2026-05-10 21:12:12 +00:00
if ( $dh = opendir ( $dir )) {
$nbofsubdirs = 0 ;
2026-05-10 13:40:32 +00:00
while (( $file = readdir ( $dh )) !== false ) {
2026-05-10 21:12:12 +00:00
if ( in_array ( $file , array ( '.' , '..' ))) {
continue ;
}
2026-05-10 13:40:32 +00:00
dol_syslog ( " We check if dir " . $dir . '/' . $file . '/htdocs exists' );
if ( is_dir ( $dir . '/' . $file . '/htdocs' )) {
dol_syslog ( 'Dir ' . $dir . '/' . $file . '/htdocs exists. So we use dir=' . $dir . '/' . $file . ' as root for package to analyse.' );
2026-05-10 21:12:12 +00:00
$dir = $dir . '/' . $file ;
2026-05-10 13:40:32 +00:00
break ;
}
}
closedir ( $dh );
}
// Now $dir contains root of zip, so mymodule or htdocs/mymodule
// Analyze files
2026-05-10 21:12:12 +00:00
$ismodule = $istheme = 0 ;
2026-05-10 13:40:32 +00:00
$reg = array ();
if ( preg_match ( '/^module([a-zA-Z0-9]*)_([-a-zA-Z0-9]+)\-([0-9][0-9\.]*)\.zip$/i' , $originalfilename , $reg )) {
2026-05-10 21:12:12 +00:00
$ismodule = $reg [ 2 ];
$extmoduleornot = $reg [ 1 ];
if ( $extmoduleornot ) {
$ismodule = 0 ;
}
2026-05-10 13:40:32 +00:00
}
if ( preg_match ( '/^theme_([-a-zA-Z0-9]+)\-([0-9][0-9\.]*)\.zip$/i' , $originalfilename , $reg )) {
2026-05-10 21:12:12 +00:00
$istheme = $reg [ 1 ];
2026-05-10 13:40:32 +00:00
}
dol_syslog ( " Now dir is the directory with root of the zip = " . $dir , LOG_DEBUG );
2026-05-10 21:12:12 +00:00
$dirmoduletheme = $dir . '/' . ( $ismodule ? $ismodule : ( $istheme ? $istheme : '' ));
if ( is_dir ( $dir . '/htdocs' )) {
$dirmoduletheme = $dir . '/htdocs/' . ( $ismodule ? $ismodule : ( $istheme ? $istheme : '' ));
}
2026-05-10 13:40:32 +00:00
$dirmodulethemeroot = dirname ( $dirmoduletheme );
dol_syslog ( " Now dirmodulethemeroot = dir where is the module dir = " . $dirmodulethemeroot . " and dirmoduletheme = dir with name of the module = " . $dirmoduletheme , LOG_DEBUG );
if ( ! empty ( $ismodule ) || ! empty ( $istheme )) {
dol_syslog ( " file ismodule= " . $ismodule . " istheme= " . $istheme );
// It's a module or theme file
2026-05-10 21:12:12 +00:00
if (( ! empty ( $ismodule ) || ! empty ( $istheme )) && $dh = opendir ( $dir )) {
$nbofsubdirs = 0 ;
$direrror = '' ;
2026-05-10 13:40:32 +00:00
while (( $file = readdir ( $dh )) !== false ) {
2026-05-10 21:12:12 +00:00
if ( in_array ( $file , array ( '.' , '..' , 'README' , 'README.txt' , 'README.md' ))) {
continue ;
}
2026-05-10 13:40:32 +00:00
dol_syslog ( " subdirs found for package: " . $file );
$nbofsubdirs ++ ;
2026-05-10 21:12:12 +00:00
$alloweddirs = array ( 'htdocs' , 'docs' , 'scripts' , 'test' , 'build' , ( $ismodule ? $ismodule : ( $istheme ? $istheme : '' )));
2026-05-10 13:40:32 +00:00
if ( ! in_array ( $file , $alloweddirs )) {
$error ++ ;
2026-05-10 21:12:12 +00:00
$direrror = $file ;
2026-05-10 13:40:32 +00:00
break ;
}
}
if ( $error ) {
2026-05-10 21:12:12 +00:00
$return [ 'errormsg' ] .= $langs -> trans ( " UnvalidZipFile " ) . '<br>' ;
$return [ 'errormsg' ] .= $langs -> trans ( " moduleContents " ) . '<br>' ;
$return [ 'errormsg' ] .= $langs -> trans ( " moduleDirectoryRule1 " ) . '<br>' ;
$return [ 'errormsg' ] .= $langs -> trans ( " moduleDirectoryRule2 " ) . '<br>' ;
$return [ 'errormsg' ] .= $langs -> trans ( " directoryFound " ) . ' ' . $direrror . '<br><br>' . " \n " ;
2026-05-10 13:40:32 +00:00
}
closedir ( $dh );
}
// It's a module or theme file (check htdocs directory)
if ( ! $error && ! empty ( $ismodule ) && is_dir ( $dirmodulethemeroot ) && $dh = opendir ( $dirmodulethemeroot )) {
2026-05-10 21:12:12 +00:00
dol_syslog ( " Scanning module dir " . $dirmodulethemeroot . " to ensure there is only one directory (with name of the module) in the root path " );
$nbofsubdir = 0 ;
$lastdirfound = '' ;
2026-05-10 13:40:32 +00:00
while (( $file = readdir ( $dh )) !== false ) {
2026-05-10 21:12:12 +00:00
if ( in_array ( $file , array ( '.' , '..' , 'README' , 'README.txt' , 'README.md' ))) {
continue ;
}
2026-05-10 13:40:32 +00:00
$lastdirfound = $file ;
2026-05-10 21:12:12 +00:00
dol_syslog ( " Found file or dir " . $file );
2026-05-10 13:40:32 +00:00
$nbofsubdir ++ ;
}
closedir ( $dh );
if ( $nbofsubdir >= 2 && ! is_file ( $dirmoduletheme . '/metapackage.conf' )) {
2026-05-10 21:12:12 +00:00
$return [ 'errormsg' ] .= $langs -> trans ( " rootDirWarning " , $nbofsubdir , basename ( $dirmoduletheme )) . '<br><br>' ;
2026-05-10 13:40:32 +00:00
$error ++ ;
}
if ( $ismodule != $lastdirfound ) {
if ( is_file ( $dirmoduletheme . '/metapackage.conf' )) {
// Check each dir found is inside list of modules
} else {
2026-05-10 21:12:12 +00:00
$return [ 'errormsg' ] .= $langs -> trans ( " moduleNameMismatch " , $lastdirfound , $ismodule ) . '<br><br>' ;
2026-05-10 13:40:32 +00:00
$error ++ ;
}
}
}
// Check "custom" compatibility
if ( ! $error && ! empty ( $ismodule )) {
dol_syslog ( " check the good practice of code " );
$count = 0 ;
$results = array ();
$search = array (
0 => array (
2026-05-10 21:12:12 +00:00
'name' => 'main' ,
'types' => array ( 'php' ),
'pattern' => '(require|include).*(main|master)\.inc\.php' ,
'multiple' => true // Means we must find 0 or several times the pattern. Error if found 1 occurrence.
2026-05-10 13:40:32 +00:00
),
1 => array (
2026-05-10 21:12:12 +00:00
'name' => 'dol_document_root' ,
'types' => array ( 'php' , 'class.php' , 'lib.php' , 'modules.php' ),
'pattern' => '(require|include)(_once)?\(?(.*)[\"\']+\)?;' ,
'id' => 3 , // eg. Use $regs[3] for test instead $regs[1]
'contain' => array ( 'DOL_DOCUMENT_ROOT' ),
'notcontain' => array ( $ismodule ),
'strict' => true // if true ('contain' && 'notcontain'), if false or not use ('contain' || 'notcontain')
2026-05-10 13:40:32 +00:00
)
);
2026-05-10 21:17:59 +00:00
analyzeDirContents ( $dir , $search , $results , $count ); // This include a global $count
2026-05-10 13:40:32 +00:00
dol_syslog ( " count of errors = " . $count );
if ( ! empty ( $count )) { // count of errors is not null
foreach ( $results as $result ) {
if ( $result [ 'testname' ] == 'main' ) {
2026-05-10 21:12:12 +00:00
$return [ 'errormsg' ] .= $langs -> trans ( " mainIncludeError " , $result [ 'filename' ], $ismodule ) . '<br><br>' ;
2026-05-10 13:40:32 +00:00
} elseif ( $result [ 'testname' ] == 'dol_include_once' ) {
2026-05-10 21:12:12 +00:00
$return [ 'errormsg' ] .= $langs -> trans ( " dolIncludeError " , $result [ 'filename' ], $ismodule ) . '<br>' ;
$return [ 'errormsg' ] .= $result [ 'line' ] . '<br><br>' ;
2026-05-10 13:40:32 +00:00
} elseif ( $result [ 'testname' ] == 'dol_document_root' ) {
2026-05-10 21:12:12 +00:00
$return [ 'errormsg' ] .= $langs -> trans ( " docRootError " , $result [ 'filename' ], $ismodule ) . '<br>' ;
$return [ 'errormsg' ] .= $result [ 'line' ] . '<br><br>' ;
2026-05-10 13:40:32 +00:00
}
}
dol_syslog ( " file " . $originalfilename . " is not compatible with custom directory! " , LOG_ERR );
$error ++ ;
}
}
} else {
dol_syslog ( " file " . $originalfilename . " is not a module and not a theme! " , LOG_WARNING ); // It can be a doc, android app, ...
}
if ( ! empty ( $error )) {
dol_syslog ( " validateZipFile Error " );
$link = '<a target="_blank" class="linktowiki" href="https://wiki.dolibarr.org/index.php/Modules - Packaging rules and Dolistore validation rules">Dolibarr wiki developer documentation</a>' ;
2026-05-10 21:12:12 +00:00
$return [ 'errormsg' ] .= $langs -> trans ( " UnvalidZipFile " ) . '<br>' ;
$return [ 'errormsg' ] .= $langs -> trans ( " SeeDocumentation " , $link ) . '<br>' ;
$return [ 'errormsg' ] .= " <br> \n " ;
$return [ 'errormsg' ] .= $langs -> trans ( " Contact " );
2026-05-10 13:40:32 +00:00
$return [ 'upload' ] = - 1 ;
$error ++ ;
} else {
dol_syslog ( " validateZipFile OK " );
}
2026-05-10 21:12:12 +00:00
if ( $return [ 'errormsg' ] === '' ) {
$return [ 'errormsg' ] = null ;
}
2026-05-10 13:40:32 +00:00
$return [ 'error' ] = $error ;
return $return ;
}
2026-05-10 21:17:59 +00:00
/**
* Analyze files of a directory and subdirectories .
* Called by validateZipFile ()
*
* @ param string $dir Root dir to scan
2026-05-10 23:16:16 +00:00
* @ param array < array { name : string , types : string [], pattern : string , multiple ? : bool , id ? : int , contain ? : string [], notcontain ? : string [], strict ? : bool } > $search Array with strings to search
* @ param array < array { testname : string , filename : string , line : string } > $results Array with results
* @ param int < 0 , max > $count Count of errors
2026-05-10 21:17:59 +00:00
* @ return void
*/
function analyzeDirContents ( $dir , $search = array (), & $results = array (), & $count = 0 )
{
$files = scandir ( $dir );
foreach ( $files as $key => $value ) {
$path = realpath ( $dir . DIRECTORY_SEPARATOR . $value );
if ( ! is_dir ( $path )) {
$content = file_get_contents ( $path );
// Clean the content of file to make analysis easier and avoid some false positive
$content = preg_replace ( '/^\s*\/\/.*$/m' , '' , $content );
$fileName = basename ( $path );
$fileNameWithoutTmp = preg_replace ( '/\/tmp\/unzip[^\/]+\//' , '' , $path );
$file_array = explode ( " . " , $fileName );
foreach ( $search as $pattern ) {
if ( count ( $file_array ) > 1 ) {
$ext = $file_array [ 1 ];
if ( ! empty ( $file_array [ 2 ])) {
$ext = $file_array [ 1 ] . '.' . $file_array [ 2 ];
}
if ( in_array ( $ext , $pattern [ 'types' ])) {
2026-05-10 23:16:16 +00:00
if ( strpos ( $content , '<?php' ) !== 0 ) {
continue ;
} // We discard files that are not php pages (we discard scripts)
if ( strpos ( $path , 'htdocs_' ) > 0 ) {
continue ;
} // We discard files that are files into htdocs_... because it is files for core, so no need to be compatible with custom
if ( strpos ( $path , 'phpunit' ) > 0 ) {
continue ;
} // We discard files that are files into phpunit because it is files for core, so no need to be compatible with custom
2026-05-10 21:17:59 +00:00
$regs = array ();
if ( ! empty ( $pattern [ 'multiple' ])) {
preg_match_all ( '/' . $pattern [ 'pattern' ] . '/' , $content , $regs );
// Error if only one result (0 is ok, >1 is ok)
if ( ! empty ( $regs ) && count ( $regs [ 0 ]) == 1 ) {
$results [] = array (
'testname' => $pattern [ 'name' ],
'filename' => $fileNameWithoutTmp
);
$count ++ ;
}
} else {
$id = ( ! empty ( $pattern [ 'id' ]) ? $pattern [ 'id' ] : 1 );
preg_match_all ( '/' . $pattern [ 'pattern' ] . '/' , $content , $regs );
if ( ! empty ( $regs ) && ! empty ( $regs [ $id ])) {
foreach ( $regs [ $id ] as $i => $string ) {
if ( ! empty ( $pattern [ 'contain' ]) && is_array ( $pattern [ 'contain' ])) {
foreach ( $pattern [ 'contain' ] as $contain ) {
// Mode strict true : doit contenir && ne pas contenir
if ( ! empty ( $pattern [ 'notcontain' ]) && ! empty ( $pattern [ 'strict' ]) && is_array ( $pattern [ 'notcontain' ])) {
foreach ( $pattern [ 'notcontain' ] as $notcontain ) {
if ( strstr ( $string , $contain ) && strstr ( $string , $notcontain )) {
$results [] = array (
'testname' => $pattern [ 'name' ],
'filename' => $fileName ,
'line' => $regs [ 0 ][ $i ]
);
$count ++ ;
}
}
} elseif ( ! strstr ( $string , $contain )) { // If found
// Mode strict false : must contains. Note strstr return false if not found
// We found $contain into $string
$results [] = array (
'testname' => $pattern [ 'name' ],
'filename' => $fileName ,
'line' => $regs [ 0 ][ $i ]
);
$count ++ ;
}
}
}
// Ou ne doit pas contenir
if ( empty ( $count ) && ! empty ( $pattern [ 'notcontain' ]) && empty ( $pattern [ 'strict' ]) && is_array ( $pattern [ 'notcontain' ])) {
foreach ( $pattern [ 'notcontain' ] as $notcontain ) {
if ( strstr ( $string , $notcontain )) {
$results [] = array (
'testname' => $pattern [ 'name' ],
'filename' => $fileName ,
'line' => $regs [ 0 ][ $i ]
);
$count ++ ;
}
}
}
}
}
}
}
}
}
} elseif ( $value != " . " && $value != " .. " ) {
analyzeDirContents ( $path , $search , $results , $count );
}
}
}