"GEN", "02" => "FEB", "03" => "MAR", "04" => "APR", "05" => "MAG", "06" => "GIU", "07" => "LUG", "08" => "AGO", "09" => "SET", "10" => "OTT", "11" => "NOV", "12" => "DEC"); return "
" . $giorno . "
" . $mesi[$mese] . " " . $anno . "
"; } function sanitize_string($str, $replace = array(), $delimiter = '-', $lower = true) { if (!empty($replace)) { $str = str_replace((array) $replace, ' ', $str); } $unwanted_array = array( 'Š' => 'S', 'š' => 's', 'Ž' => 'Z', 'ž' => 'z', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'Þ' => 'B', 'ß' => 'Ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'a', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ý' => 'y', 'þ' => 'b', 'ÿ' => 'y' ); $clean = strtr($str, $unwanted_array); $clean = utf8_encode($str); $clean = preg_replace("/[^a-zA-Z0-9\.\/_|+ -]/", '', $clean); $clean = trim($clean, '-'); if ($lower) { $clean = strtolower($clean); } $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean); $clean = str_replace("..", ".", $clean); return $clean; } function only_simple_chars($str) { $str = preg_replace("/(\&#?[a-zA-Z0-9]+;)/","-",$str); $str = sanitize_string($str); return $str; } function normal_text($string) { $string = strip_tags($string); return $string; } function makeurl($modulo, $codice, $titolo) { $titolo = html_entity_decode($titolo); $titolo = sanitize_string($titolo, "'"); if (strlen($titolo) > 200) { $titolo = substr($titolo, 0, 200); } $href = "/" . $modulo . "/id" . $codice . "-" . $titolo; $href = str_replace(' ', "-", (preg_replace('!\s+!', ' ', $href))); return $href; } if (!function_exists('url')) { function url($string) { $protocol = "http"; if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { $protocol .= "s"; } $string = "{$protocol}://{$_SERVER["SERVER_NAME"]}{$string}"; return $string; } } function replace4URL($stringa) { $stringa = str_replace('"', "", $stringa); $stringa = str_replace(' ', "-", $stringa); return $stringa; } function fattoriale($number) { if ($number < 2) { return 1; } else { return ($number * fattoriale($number - 1)); } } function human_filesize($bytes, $decimals = 2) { $size = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); $factor = floor((strlen($bytes) - 1) / 3); return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . " " . @$size[$factor]; } function folderSize($dir) { $size = 0; foreach (glob(rtrim($dir, '/') . '/*', GLOB_NOSORT) as $each) { $size += is_file($each) ? filesize($each) : folderSize($each); } return $size; } if (!function_exists('simple_encrypt')) { function simple_encrypt($text, $salt) { ini_set("memory_limit", "10G"); $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length(AES_256_CBC)); return trim(openssl_encrypt($text, AES_256_CBC, $salt, 0, $iv) . ":" . base64_encode($iv)); } } if (!function_exists('simple_decrypt')) { function simple_decrypt($text, $salt) { ini_set("memory_limit", "10G"); $parts = explode(':', $text); return openssl_decrypt($parts[0], AES_256_CBC, $salt, 0, base64_decode($parts[1])); } } function getName($nomefile, $destinazione) { $numero = 0; $percorso = $destinazione; $nome_documento_doc = sanitize_string($nomefile); $percorso_nomefile = $percorso . $nome_documento_doc; while (file_exists($percorso_nomefile)) { $numero++; $percorso_nomefile = $percorso . $numero . "-" . $nome_documento_doc; } if ($numero > 0) { $nome_documento_doc = $numero . "-" . $nome_documento_doc; } return $nome_documento_doc; } function copiafile_chunck($nomefile, $destinazione, $chunk_folder, $nome_destinazione = "", $elimina = true) { if (strpos($nomefile, "../") === false) { $numero = 0; $percorso = $destinazione; if ($nome_destinazione == "") { $nome_documento_doc = sanitize_string($nomefile); //SELEZIONIAMO DALL'ARRAY IL NOME EFFETTIVO DEL FILE $percorso_nomefile = $percorso . $nome_documento_doc; while (file_exists($percorso_nomefile)) { $numero++; $percorso_nomefile = $percorso . $numero . "-" . $nome_documento_doc; } if ($numero > 0) { $nome_documento_doc = $numero . "-" . $nome_documento_doc; } } else { $percorso_nomefile = $percorso . $nome_destinazione; $nome_documento_doc = $nome_destinazione; } copy($chunk_folder . "/" . $nomefile, $percorso_nomefile); if ($elimina) { unlink($chunk_folder . "/" . $nomefile); } return $nome_documento_doc; } else { return false; } } function copiafile($nome_file, $destinazione) { if (strpos($nome_file, "../") === false) { $nomefile = $nome_file; //SCRIPT PER L'UPLOAD DEL DOCUMENTO - SE ESISTE VIENE RINOMINATA ANTEPONENDO UN NUMERO if (is_uploaded_file($nomefile["tmp_name"])) { $numero = 0; $percorso = $destinazione; $nome_documento_doc = sanitize_string($nomefile["name"]); $percorso_nomefile = $percorso . $nome_documento_doc; while (file_exists("$percorso_nomefile")) { $numero++; $percorso_nomefile = $percorso . $numero . "-" . $nome_documento_doc; } if ($numero > 0) { //VALORE CHE VA INSERITO NEL DATABASE $nome_documento_doc = $numero . "-" . $nome_documento_doc; } copy($nomefile["tmp_name"], $percorso_nomefile); return $nome_documento_doc; } else { return false; } } } // ********************* fine copia file function get_string_between($string, $start, $end) { $string = ' ' . $string; $ini = strpos($string, $start); if ($ini == 0) { return ''; } $ini += strlen($start); $len = strpos($string, $end, $ini) - $ini; return substr($string, $ini, $len); } function replace_accents($string) { return str_replace(array('à', 'á', 'â', 'ã', 'ä', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ù', 'Ú', 'Û', 'Ü', 'Ý'), array('a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y'), $string); } function get_campi($tabella) { $campi = ""; global $pdo; $strsql = "DESCRIBE " . $tabella . ";"; $risultato = $pdo->query($strsql); if ($risultato->rowCount() > 0) { $campi = array(); while ($record = $risultato->fetch(PDO::FETCH_ASSOC)) { $campi[$record["Field"]] = ""; } } return $campi; } function oggi() { $today = getdate(); switch ($today['mday']) { case "1": $day = "01"; break; case "2": $day = "02"; break; case "3": $day = "03"; break; case "4": $day = "04"; break; case "5": $day = "05"; break; case "6": $day = "06"; break; case "7": $day = "07"; break; case "8": $day = "08"; break; case "9": $day = "09"; break; default: $day = $today['mday']; } switch ($today['month']) { case "January": $mese = "01"; break; case "February": $mese = "02"; break; case "March": $mese = "03"; break; case "April": $mese = "04"; break; case "May": $mese = "05"; break; case "June": $mese = "06"; break; case "July": $mese = "07"; break; case "August": $mese = "08"; break; case "September": $mese = "09"; break; case "October": $mese = "10"; break; case "November": $mese = "11"; break; case "December": $mese = "12"; break; default: $mese = "01"; } return $day . "/" . $mese . "/" . $today['year']; } function mysql2time($mysql_date) { return substr($mysql_date, -5); } function mysql2date($mysql_date) { $anno = substr($mysql_date, 0, 4); $mese = substr($mysql_date, 5, 2); $giorno = substr($mysql_date, 8, 2); $reversed_data = "$giorno/$mese/$anno"; if (($reversed_data == "00/00/0000") | ($reversed_data == "//")) { $reversed_data = ""; } return $reversed_data; } function date2mysql($normal_date) { $anno = substr($normal_date, 6, 4); $mese = substr($normal_date, 3, 2); $giorno = substr($normal_date, 0, 2); $reversed_data = "$anno-$mese-$giorno"; if ($reversed_data == "--") { $reversed_data = ""; } return $reversed_data; } function mysql2completedate($mysql_date) { $mesi = array( 1 => 'Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre' ); $giorni = array( 'Domenica', 'Lunedi', 'Martedi', 'Mercoledi', 'Giovedi', 'Venerdi', 'Sabato' ); list($sett, $giorno, $mese, $anno, $ora) = explode('-', date('w-d-n-Y-H:i', strtotime($mysql_date))); return $giorni[$sett] . " - " . $giorno . " " . $mesi[$mese] . " " . $anno . " - " . $ora; } function mysql2datetime($mysql_date) { $anno = substr($mysql_date, 0, 4); $mese = substr($mysql_date, 5, 2); $giorno = substr($mysql_date, 8, 2); $ora = substr($mysql_date, 11, 2); $minuti = substr($mysql_date, 14, 2); $reversed_data = "$giorno/$mese/$anno $ora:$minuti"; if (($reversed_data == "00/00/0000 00:00") || ($reversed_data == "// :")) { $reversed_data = ""; } return $reversed_data; } function datetime2mysql($normal_date) { $anno = substr($normal_date, 6, 4); $mese = substr($normal_date, 3, 2); $giorno = substr($normal_date, 0, 2); $ora = substr($normal_date, 11, 2); $minuti = substr($normal_date, 14, 2); $reversed_data = "$anno-$mese-$giorno $ora:$minuti"; if ($reversed_data == "--") { $reversed_data = ""; } return $reversed_data; } function dateFromCF($cf, $format = "mysql") { $anno = substr($cf, 6, 2); $anno_maggiorenne = date('Y') - 18; $anno = ((2000 + $anno) > $anno_maggiorenne) ? "19" . $anno : "20" . $anno; $mese = substr($cf, 8, 1); switch ($mese) { // attenzione le lettere non sono in successione alfabetica case 'A': $mese = "01"; break; case 'B': $mese = "02"; break; case 'C': $mese = "03"; break; case 'D': $mese = "04"; break; case 'E': $mese = "05"; break; case 'H': $mese = "06"; break; case 'L': $mese = "07"; break; case 'M': $mese = "08"; break; case 'P': $mese = "09"; break; case 'R': $mese = "10"; break; case 'S': $mese = "11"; break; case 'T': $mese = "12"; break; default: $mese = "01"; break; } $giorno = substr($cf, 9, 2); if ($giorno > 40) { $giorno -= 40; if ($giorno < 10) { $giorno = "0" . $giorno; } } $data = ""; switch ($format) { case 'it': $data = $giorno . "/" . $mese . "/" . $anno; break; default: $data = $anno . "-" . $mese . "-" . $giorno; break; } return $data; } function getCategorieServiziTecnici() { global $pdo; $risultato = $pdo->go("SELECT * FROM b_categorie_progettazione WHERE attivo = 'S'"); if ($risultato->rowCount() > 0) { $tmp = []; while ($cat = $risultato->fetch(PDO::FETCH_ASSOC)) { $tmp[$cat["codice"]] = $cat; } return $tmp; } return false; } function getCategorieSOA() { global $pdo; $risultato = $pdo->go("SELECT * FROM b_categorie_soa WHERE attivo = 'S'"); if ($risultato->rowCount() > 0) { $tmp = []; while ($cat = $risultato->fetch(PDO::FETCH_ASSOC)) { $tmp[$cat["codice"]] = $cat; } return $tmp; } return false; } function getClassificheSOA() { global $pdo; $risultato = $pdo->go("SELECT * FROM b_classifiche_soa WHERE attivo = 'S'"); if ($risultato->rowCount() > 0) { $tmp = []; while ($cat = $risultato->fetch(PDO::FETCH_ASSOC)) { $cat["descrizione"] = ""; if (!empty($cat["minimo"])) { $cat["descrizione"] .= " - " . number_format($cat["minimo"], 0, ",", "."); } $cat["descrizione"] .= (!empty($cat["massimo"])) ? (" - " . number_format($cat["massimo"], 0, ",", ".")) : " e oltre"; $tmp[$cat["codice"]] = $cat; } return $tmp; } return false; } function getClassificaSOAFromImporto($importo) { $classifiche = getClassificheSOA(); foreach ($classifiche as $id => $classifica) { if ((empty($classifica["minimo"]) || $classifica["minimo"] <= $importo) && (empty($classifica["massimo"]) || $classifica["massimo"] >= $importo)) { return $id; } } } //************* funzione log function scriviLog($nometab, $operazione, $istruzione, $id_record = 0) { global $todayDbLogPath; if ($operazione != "ACCESSO" && $operazione != "LOGIN-ATTEMPT") { $istruzione = base64_encode($istruzione); } $codoperatore = 0; if (!empty($_SESSION["utente"])) { $codoperatore = $_SESSION["utente"]->codice; } if (empty($codoperatore) && $operazione == "ACCESSO") { $codoperatore = $id_record; } $tmp = []; $tmp[] = date("Y-m-d H:i:s"); $tmp[] = (!empty($_SESSION["ente"])) ? $_SESSION["ente"]->codice : 0; $tmp[] = $codoperatore; $tmp[] = $nometab; $tmp[] = $operazione; $tmp[] = $_SERVER["REMOTE_ADDR"] ?? ''; $tmp[] = $istruzione; $message = implode(";", $tmp); file_put_contents($todayDbLogPath, $message . "\n", FILE_APPEND); } function suddivisione_pdo($richiesta, $nomecampo, $suffix = "") { $cond = ""; $bind = array(); $i = 0; if (is_array($richiesta)) { foreach ($richiesta as $parola) { $i++; if (strlen($parola) > 0) { $bind[":" . $suffix . "parola_" . $i] = "%" . $parola . "%"; $cond .= $nomecampo . " like :" . $suffix . "parola_" . $i . " OR "; } } $cond = substr($cond, 0, strlen($cond) - 3); //per eliminare l'ultimo OR } else { if (strlen($richiesta) > 0) { $i++; $bind[":" . $suffix . "parola_" . $i] = "%" . $richiesta . "%"; $cond .= $nomecampo . " like :" . $suffix . "parola_" . $i . " "; } } return array("sql" => $cond, "bind" => $bind); } function genpwd($cnt) { $pwd = str_shuffle('abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'); return substr($pwd, 0, $cnt); } function generateStrongPassword($length = 9, $add_dashes = false, $available_sets = 'luds') { $sets = []; if (strpos($available_sets, 'l') !== false) { $sets[] = 'abcdefghjkmnpqrstuvwxyz'; } if (strpos($available_sets, 'u') !== false) { $sets[] = 'ABCDEFGHJKMNPQRSTUVWXYZ'; } if (strpos($available_sets, 'd') !== false) { $sets[] = '23456789'; } if (strpos($available_sets, 's') !== false) { $sets[] = '!@#$%&*?'; } $all = $password = $dash_str = ''; foreach ($sets as $set) { $password .= $set[array_rand(str_split($set))]; $all .= $set; } $all = str_split($all); for ($i = 0; $i < $length - count($sets); $i++) { $password .= $all[array_rand($all)]; } $password = str_shuffle($password); if (!$add_dashes) { return $password; } $dash_len = floor(sqrt($length)); while (strlen($password) > $dash_len) { $dash_str .= substr($password, 0, $dash_len) . '-'; $password = substr($password, $dash_len); } $dash_str .= $password; return $dash_str; } function randomPassword($len = 8) { /* Programmed by Christian Haensel ** christian@chftp.com ** http://www.chftp.com ** ** Exclusively published on weberdev.com. ** If you like my scripts, please let me know or link to me. ** You may copy, redistribute, change and alter my scripts as ** long as this information remains intact. ** ** Modified by Josh Hartman on 12/30/2010. */ if (($len % 2) !== 0) { // Length paramenter must be a multiple of 2 $len = 8; } $length = $len - 2; // Makes room for the two-digit number on the end $conso = array('b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'); $vocal = array('a', 'e', 'i', 'o', 'u'); $password = ''; srand((float) microtime() * 1000000); $max = $length / 2; for ($i = 1; $i <= $max; $i++) { $password .= $conso[rand(0, 19)]; $password .= $vocal[rand(0, 4)]; } $password .= rand(10, 99); return $password; } function getThemes() { global $beRoot; $themes = jsonToArray($beRoot . "/customize/themes.json"); if (is_array($themes) && !empty($themes)) { foreach ($themes as $key => $theme) { if (empty($theme["active"])) { unset($themes[$key]); } } } return $themes; } function color_luminance($hex, $percent) { $hex = preg_replace('/[^0-9a-f]/i', '', $hex); $new_hex = ''; if (strlen($hex) < 6) { $hex = $hex[0] + $hex[0] + $hex[1] + $hex[1] + $hex[2] + $hex[2]; } for ($i = 0; $i < 3; $i++) { $dec = hexdec(substr($hex, $i * 2, 2)); $dec = min(max(0, $dec + $dec * $percent), 255); $new_hex .= str_pad(dechex($dec), 2, 0, STR_PAD_LEFT); } return $new_hex; } function dayDiff($date_1, $date_2) { $date1 = date_create($date_1); $date2 = date_create($date_2); $diff = date_diff($date1, $date2); return $diff->format("%a"); } function differenza_ore($ora1, $ora2, $sep) { $part = explode($sep, $ora1); $arr = explode($sep, $ora2); $diff = mktime($arr[0], $arr[1]) - mktime($part[0], $part[1]); $ore = floor($diff / (60 * 60)); $minuti = ($diff / 60) % 60; $ore = str_pad($ore, 2, 0, STR_PAD_LEFT); $minuti = str_pad($minuti, 2, 0, STR_PAD_LEFT); return $ore . ":" . $minuti; } function somma_ore($ora1, $ora2, $sep) { $ora1 = explode($sep, $ora1); $ora2 = explode($sep, $ora2); $ore = $ora1[0] + $ora2[0]; $minuti = $ora1[1] + $ora2[1]; if ($minuti > 59) { $minuti = $minuti - 60; $ore += 1; } $ore = str_pad($ore, 2, 0, STR_PAD_LEFT); $minuti = str_pad($minuti, 2, 0, STR_PAD_LEFT); return $ore . ":" . $minuti; } function get_client_ip() { $ipaddress = ''; if (isset($_SERVER['HTTP_CLIENT_IP'])) { $ipaddress = $_SERVER['HTTP_CLIENT_IP']; } else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; } else if (isset($_SERVER['HTTP_X_FORWARDED'])) { $ipaddress = $_SERVER['HTTP_X_FORWARDED']; } else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) { $ipaddress = $_SERVER['HTTP_FORWARDED_FOR']; } else if (isset($_SERVER['HTTP_FORWARDED'])) { $ipaddress = $_SERVER['HTTP_FORWARDED']; } else if (isset($_SERVER['REMOTE_ADDR'])) { $ipaddress = $_SERVER['REMOTE_ADDR']; } else { $ipaddress = 'UNKNOWN'; } return $ipaddress; } function is_dir_empty($dir) { if (!is_readable($dir)) { return NULL; } return (count(scandir($dir)) == 2); } function getBrowser() { $u_agent = $_SERVER['HTTP_USER_AGENT']; $bname = 'Unknown'; $platform = 'Unknown'; $version = ""; //First get the platform? if (preg_match('/linux/i', $u_agent)) { $platform = 'linux'; } else if (preg_match('/macintosh|mac os x/i', $u_agent)) { $platform = 'mac'; } else if (preg_match('/windows|win32/i', $u_agent)) { $platform = 'windows'; } // Next get the name of the useragent yes seperately and for good reason if (preg_match('/MSIE/i', $u_agent) && !preg_match('/Opera/i', $u_agent)) { $bname = 'Internet Explorer'; $ub = "MSIE"; } else if (preg_match('/Firefox/i', $u_agent)) { $bname = 'Mozilla Firefox'; $ub = "Firefox"; } else if (preg_match('/Chrome/i', $u_agent)) { $bname = 'Google Chrome'; $ub = "Chrome"; } else if (preg_match('/Safari/i', $u_agent)) { $bname = 'Apple Safari'; $ub = "Safari"; } else if (preg_match('/Opera/i', $u_agent)) { $bname = 'Opera'; $ub = "Opera"; } else if (preg_match('/Netscape/i', $u_agent)) { $bname = 'Netscape'; $ub = "Netscape"; } // finally get the correct version number $known = array('Version', $ub, 'other'); $pattern = '#(?' . join('|', $known) . ')[/ ]+(?[0-9.|a-zA-Z.]*)#'; if (!preg_match_all($pattern, $u_agent, $matches)) { // we have no matching number just continue } // see how many we have $i = count($matches['browser']); if ($i != 1) { //we will have two since we are not using 'other' argument yet //see if version is before or after the name if (strripos($u_agent, "Version") < strripos($u_agent, $ub)) { $version = $matches['version'][0]; } else { $version = $matches['version'][1]; } } else { $version = $matches['version'][0]; } // check if we have a number if ($version == null || $version == "") { $version = "?"; } return array( 'userAgent' => $u_agent, 'name' => $bname, 'version' => $version, 'platform' => $platform, 'pattern' => $pattern, ); } function deleteDir($dirPath) { if (!is_dir($dirPath)) { throw new InvalidArgumentException("$dirPath deve essere una directory"); } if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') { $dirPath .= '/'; } $files = glob($dirPath . '*', GLOB_MARK); foreach ($files as $file) { if (is_dir($file)) { deleteDir($file); } else { unlink($file); } } rmdir($dirPath); } function array2XML($array, $last_key = "", $no_empty = false, $include_empty = false, $sanitize = false) { $xml = ""; foreach ($array as $key => $element) { if ($include_empty || !empty($element)) { $open_tag = $key; $close_tag = $key; $ignore_tag = false; if ($key === '$') { $open_tag = ""; $close_tag = ""; } else if (is_numeric($key)) { $open_tag = $last_key; $close_tag = $last_key; } $attribute = ""; if (is_array($element)) { foreach ($element as $sub_key => $sub_element) { if (strpos($sub_key, "@") === 0) { $sub_element = trim($sub_element); if (!$no_empty || ($no_empty && strlen($sub_element) > 0)) { if ($sanitize) { $sub_element = str_replace(['&', '&', '&', "'", '"'], ['e', 'e', 'e', 'e', '', ''], $sub_element); $sub_element = smart_replace_accents($sub_element); } $attribute .= " " . ltrim($sub_key, "@") . "=\"" . $sub_element . "\""; } unset($element[$sub_key]); } if (is_numeric($sub_key)) { $ignore_tag = true; } } if (!empty($open_tag) && !$ignore_tag) { $xml .= "<" . $open_tag; if (!empty($attribute)) { $xml .= " " . $attribute; } $xml .= ">"; } $xml .= array2XML($element, $open_tag, $no_empty, $include_empty, $sanitize); if ($close_tag && !$ignore_tag) { $xml .= "\n"; } } else { if (!empty($open_tag)) { $xml .= "<" . $open_tag . ">"; } if ($sanitize) { $element = str_replace(['&', '&', '&', "'", '"'], ['e', 'e', 'e', 'e', '', ''], $element); $element = smart_replace_accents($element); } $xml .= $element; if ($close_tag) { $xml .= "\n"; } } } } return $xml; } function getTypeAndExtension($file, $buffer = false) { $return = array(); global $config; $finfo = finfo_open(FILEINFO_MIME_TYPE); if (!$buffer) { if (file_exists($file)) { $type = finfo_file($finfo, $file); } } else { $type = finfo_buffer($finfo, $file); } if (isset($type)) { $return["type"] = $type; if ($type == "application/octet-stream") { $return["ext"] = ".p7m"; if ($buffer) { $tmpPath = $config["chunk_folder"] . "/" . session_id() . rand() . time(); if (file_put_contents($tmpPath, $file)) { $file = $tmpPath; } } $p7m = new P7Manager($file); $content = $p7m->extract(true); $ext = getTypeAndExtension($content, true); if (!empty($ext) && !empty($ext["ext"])) { $return["ext"] = $ext["ext"] . $return["ext"]; } if ($buffer) { unlink($tmpPath); } } else { $extension = P7Manager::extFromMime($type); $return["ext"] = "." . $extension; } } return (!empty($return)) ? $return : false; } function delete_directory($dir) { if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { if (is_dir($dir . $file)) { if (!@rmdir($dir . $file)) { delete_directory($dir . $file . '/'); } } else { @unlink($dir . $file); } } } closedir($handle); @rmdir($dir); } } function removeEmpty($array, $ignore = []) { if (is_array($array)) { foreach ($array as $key => $value) { if (is_numeric($key) || in_array($key, $ignore) === false) { if (is_array($value)) { $array[$key] = removeEmpty($value, $ignore); } else { if (empty($value) && $value !== "0") { unset($array[$key]); } } } } } return $array; } function googleTranslate($string, $language, $source = "IT") { try { $translationClient = new TranslationServiceClient(); $response = $translationClient->translateText( [$string], $language, TranslationServiceClient::locationName('tuttogare-1527696083169', 'global'), ["sourceLanguageCode" => $source] ); foreach ($response->getTranslations() as $translation) { return $translation->getTranslatedText(); } } catch (\Throwable $th) { return $string; } } function getPendingTranslations() { global $config; $pending = []; $path = $config["path_vocabolario"] . "/vocabolario.json"; if (file_exists($path)) { $checkVocabolario = jsonToArray($config["path_vocabolario"] . "/vocabolario.json"); if (!empty($checkVocabolario)) { $pending = []; foreach ($checkVocabolario as $key => $voce) { if (!empty($voce["_verify"])) { $pending[$key] = $voce; } } return $pending; } } return false; } if (!function_exists(("__guue"))) { function __guue($key, $lang = "", $ucfirst = true) { return $key; } } if (!function_exists("__")) { function __($key, $lang = "", $ucfirst = true) { if (!empty($key)) { global $root; global $config; if (empty($lang)) { $lang = (!empty($_SESSION["language"])) ? $_SESSION["language"] : "IT"; } $return = $testo = $key; $found = false; $key = strtolower($key); $path = $config["path_vocabolario"] . "/vocabolario.json"; if (file_exists($path)) { if (!isset($_SESSION["dictionary"])) { $_SESSION["dictionary"] = jsonToArray($path); } $dictionary = $_SESSION["dictionary"]; if (!empty($dictionary)) { if (!empty($dictionary[$key][$lang])) { $found = true; $return = $dictionary[$key][$lang]; } if (!$found && !file_exists($config["path_vocabolario"] . "/vocabolario.lock") && !empty($config["traduzioniAttive"]) && $config["developEnv"]) { touch($config["path_vocabolario"] . "/vocabolario.lock"); $lang_disp = jsonToArray($root . "/inc/language-available.json"); $lang_disp = array_keys($lang_disp); $tmp[$key] = []; foreach ($lang_disp as $language) { $found = false; if (!empty($dictionary[$key][$language])) { $found = true; $tmp[$key][$language] = $dictionary[$key][$language]; } else { if ($language == "IT") { $tmp[$key]["IT"] = $testo; } else { $tmp[$key][$language] = googleTranslate($testo, $language); } } } if (!empty($tmp[$key][$lang])) { $return = $tmp[$key][$lang]; } if (!$found) { $tmp[$key]["_verify"] = 1; } $dictionary = array_merge($dictionary, $tmp); $dictionary = array_filter($dictionary); ksort($dictionary); $_SESSION["dictionary"] = $dictionary; $dictionary = json_encode($dictionary, JSON_PRETTY_PRINT); file_put_contents($path, $dictionary); unlink($config["path_vocabolario"] . "/vocabolario.lock"); } } else { if ($config["developEnv"]) { die("Errore vocabolario"); } } } else { if ($config["developEnv"]) { die("Errore vocabolario"); } } if ($ucfirst) { $return = ucfirst($return); } return $return; } } } function arrayToCsv(array &$fields, $delimiter = ';', $enclosure = '"', $encloseAll = false, $nullToMysqlNull = false) { $delimiter_esc = preg_quote($delimiter, '/'); $enclosure_esc = preg_quote($enclosure, '/'); $output = array(); foreach ($fields as $field) { if ($field === null && $nullToMysqlNull) { $output[] = 'NULL'; continue; } // Enclose fields containing $delimiter, $enclosure or whitespace if ($encloseAll || preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field)) { $output[] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure; } else { $output[] = $field; } } return implode($delimiter, $output); } function tokenGen() { if (empty($_SESSION["token"])) { $_SESSION['token'] = bin2hex(random_bytes(32)); } return $_SESSION['token']; } function tokenVerify($token = "") { if (empty($token) && !empty($_POST["token"])) { $token = $_POST["token"]; } $return = false; if (!empty($_SESSION["token"]) && !empty($token) && $token == $_SESSION["token"]) { $return = true; } return $return; } function jsonToArray($path) { $return = false; if (file_exists($path) && (strpos($path, "../") === false)) { $return = json_decode(file_get_contents($path), true); } return $return; } /** * Get codice pec from ente * * @param int $codiceEnte * @return int */ function getPEC($codiceEnte) { global $pdo; return $pdo->go( "SELECT codice FROM b_pec WHERE codice_ente = :codice_ente AND predefinita = 'S' AND attivo = 'S' AND eliminato = 'N'", [":codice_ente"=>$codiceEnte] )->fetch(PDO::FETCH_COLUMN) ?? 0; } if (!function_exists("array_merge_recursive_distinct")) { function array_merge_recursive_distinct(array &$array1, array &$array2) { $merged = $array1; foreach ($array2 as $key => &$value) { if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) { $merged[$key] = array_merge_recursive_distinct($merged[$key], $value); } else { $merged[$key] = $value; } } return $merged; } } function getStati($continenti = "") { global $pdo; $bind = array(); $sql = "SELECT * FROM b_stati "; if (!empty($continenti)) { $sql .= "WHERE ("; if (!is_array($continenti)) { $continenti = array($continenti); } $i = 0; foreach ($continenti as $continente) { $i++; $bind[":" . $i . "_cont"] = $continente; $sql .= " continente = :" . $i . "_cont OR "; } $sql = substr($sql, 0, -4) . ") "; } $sql .= "ORDER BY stato "; $ris = $pdo->go($sql, $bind); if ($ris->rowCount() > 0) { return $ris->fetchAll(PDO::FETCH_ASSOC); } else { return false; } } function getGeoData($source, $value, $result) { $return = array(); if (!empty($source) && !empty($value) && !empty($result)) { global $pdo; $value = html_entity_decode($value); $bind = array(":value" => $value); switch ($source) { case "stato": $where = "codice_stato = :value AND codice_stato <> '' AND codice_stato IS NOT NULL "; break; case "regione": $where = "regione = :value AND regione <> '' AND regione IS NOT NULL"; break; case "provincia": $where = "provincia = :value AND provincia <> '' AND provincia IS NOT NULL"; break; case "comune": $where = "comune = :value AND comune <> '' AND comune IS NOT NULL"; break; default: return false; } if (!empty($where)) { switch ($result) { case "regione": $select = "CONVERT(regione USING utf8)"; break; case "provincia": $select = "CONVERT(sigla_provincia USING utf8) AS sigla_provincia, CONVERT(provincia USING utf8)"; break; case "comune": $select = "CONVERT(comune USING utf8)"; break; case "cap": $select = "CONVERT(cap USING utf8)"; break; default: return false; } if (!empty($select)) { $sql = "SELECT {$select} AS valore FROM b_locations WHERE {$where} GROUP BY " . str_replace("AS sigla_provincia", "", $select) . " ORDER BY " . str_replace("AS sigla_provincia", "", $select); $ris = $pdo->go($sql, $bind); if ($ris->rowCount() > 0) { $tmp = $ris->fetchAll(PDO::FETCH_ASSOC); $return = []; foreach ($tmp as $i) { if (!empty($i["valore"])) { $return[] = $i; } } } } } } return $return; } function purify($text) { $config = HTMLPurifier_Config::createDefault(); $config->set('Core.Encoding', 'UTF-8'); // replace with your encoding $config->set('Core.EscapeNonASCIICharacters', true); $config->set('CSS.Trusted', true); // allow any css $config->set('CSS.Proprietary', true); // allow any css $config->set('AutoFormat.RemoveEmpty', true); $config->set('CSS.AllowedProperties', ['width', 'color', 'background-color', 'margin-left', 'margin-right', 'text-align']); $config->set('HTML.AllowedElements', ['table','tbody','thead','tr','th','td','div', 'span', 'p', 's', 'br', 'a', 'h1', 'h2', 'h3', 'h4', 'h5', 'strong', 'em', 'u', 'ul', 'li', 'ol', 'hr', 'blockquote', 'sub', 'sup', 'img','figure']); $config->set('HTML.AllowedAttributes', '*.style,*.title,*.href,*.src,*.border,*.alt,*.width,*.height,*.title,*.class,*.colspan,*.rowspan'); $config->set('HTML.DefinitionID', 'enduser-customize.html tutorial'); $config->set('HTML.DefinitionRev', 1); if ($def = $config->maybeGetRawHTMLDefinition()) { $def->addElement('figure', 'Block', 'Optional: (figcaption, Flow) | (Flow, figcaption) | Flow', 'Common'); } if ($css = $config->getCSSDefinition()) { $css->info["width"] = new HTMLPurifier_AttrDef_CSS_Percentage(); } $purifier = new HTMLPurifier($config); return $purifier->purify($text); } function purifyInput(&$array) { if (!empty($array)) { foreach ($array as $key => $value) { if (!is_array($value)) { $array[$key] = purify($value); } else { $array[$key] = purifyInput($value); } } } return $array; } function verifyGoogleCaptcha($response) { $return = false; global $disableCaptcha; if (!empty($response) && !$disableCaptcha) { $url = "https://www.google.com/recaptcha/api/siteverify"; $fields_string = ""; $fields = array( 'secret' => "6LcIxCcUAAAAAPo8yX2P7ovixGTY8SToUfxieLjI", 'response' => $response, 'remoteip' => $_SERVER["REMOTE_ADDR"] ); foreach ($fields as $key => $value) { $fields_string .= $key . '=' . $value . '&'; } $fields_string = rtrim($fields_string, '&'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, count($fields)); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); $result = json_decode($result, true); if (isset($result["success"]) && $result["success"] === true && isset($result["hostname"]) && $result["hostname"] == $_SERVER["SERVER_NAME"]) { $return = true; } } if ($disableCaptcha) { $return = true; } return $return; } function getCurrentDomain() { return $_SESSION["ente"]->getInfo()["dominio"]; } function generatePublicIdentifier(string $tipo_procedura, int $codice_ente, int $codice_procedura) : string { $hostname = getCurrentDomain(); return uuidgen_v4("{$hostname}-{$codice_ente}-{$tipo_procedura}-{$codice_procedura}") . "@{$codice_ente}-{$tipo_procedura}-{$codice_procedura}"; } function verifyGoogleCaptchaV3($response) { $score = 0; global $disableCaptcha; if (!empty($response) && !$disableCaptcha) { $url = "https://www.google.com/recaptcha/api/siteverify"; $fields_string = ""; $fields = array( 'secret' => "6Lcj75wUAAAAACBqH_bil2j6Ktq53DQ2yC_XbO85", 'response' => $_POST["g-recaptcha-response"], 'remoteip' => $_SERVER["REMOTE_ADDR"] ); foreach ($fields as $key => $value) { $fields_string .= $key . '=' . $value . '&'; } $fields_string = rtrim($fields_string, '&'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, count($fields)); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); $result = json_decode($result, true); if (isset($result) && $result["success"] === true && $result["action"] == "login" && $result["hostname"] == $_SERVER["SERVER_NAME"]) { $score = $result["score"]; } } if ($disableCaptcha) { $score = 1; } return $score; } function secondsToTime($seconds, $array = true) { $dtF = new \DateTime('@0'); $dtT = new \DateTime("@$seconds"); if ($array) { $return = array(); $return["giorni"] = $dtF->diff($dtT)->format('%a'); $return["ore"] = $dtF->diff($dtT)->format('%h'); $return["minuti"] = $dtF->diff($dtT)->format('%i'); $return["secondi"] = $dtF->diff($dtT)->format('%s'); return $return; } else { return $dtF->diff($dtT)->format('%a:%h:%i:%s'); } } function returnIndicatorStyle($indicatore, $valore) { $style = "color: #000"; if (!empty($indicatore["values"])) { foreach ($indicatore["values"] as $riferimento => $colore) { if (is_array($colore)) { $count_corrispondenze = 0; $corrispondenza = 0; if (isset($colore["min"])) { $count_corrispondenze++; if ($colore["min"] < $valore) { $corrispondenza++; } } if (isset($colore["max"])) { $count_corrispondenze++; if ($colore["max"] >= $valore) { $corrispondenza++; } } if ($count_corrispondenze == $corrispondenza) { $style = "color: {$colore["color"]}"; } } else { if ($riferimento == $valore) { $style = "color: {$colore}"; } } } } return $style; } function fromCSVtoArray($path) { $return = false; if (file_exists($path) && (strpos($path, "../") === false)) { ini_set('auto_detect_line_endings', TRUE); $handle = fopen($path, "r"); $array = $fields = array(); $i = 0; if ($handle) { while (($row = fgetcsv($handle, 0, ";")) !== false) { if (empty($fields)) { $fields = $row; continue; } foreach ($row as $k => $value) { $array[$i][$fields[$k]] = $value; } $i++; } if (feof($handle)) { $return = $array; } } } return $return; } function truncate($number, $decimal = 2) { if (strpos($number, ".") !== false) { if (!is_numeric($decimal)) { $decimal = 0; } $decimal = floor($decimal); list($intero, $decimali) = explode(".", $number); if ($decimal > 0) { return $intero . "." . substr($decimali, 0, $decimal); } else { return $intero; } } else { return $number; } } function make_color($value, $min = 0, $max = .5) { $ratio = $value; if ($min > 0 || $max < 1) { if ($value < $min) { $ratio = 1; } else if ($value > $max) { $ratio = 0; } else { $range = $min - $max; $ratio = ($value - $max) / $range; } } $hue = ($ratio * 1.2) / 3.60; $rgb = ColorHSLToRGB($hue, 1, .5); $r = round($rgb['r'], 0); $g = round($rgb['g'], 0); $b = round($rgb['b'], 0); return "rgb($r,$g,$b)"; } function ColorHSLToRGB($h, $s, $l) { $r = $l; $g = $l; $b = $l; $v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s); if ($v > 0) { $m = $l + $l - $v; $sv = ($v - $m) / $v; $h *= 6.0; $sextant = floor($h); $fract = $h - $sextant; $vsf = $v * $sv * $fract; $mid1 = $m + $vsf; $mid2 = $v - $vsf; switch ($sextant) { case 0: $r = $v; $g = $mid1; $b = $m; break; case 1: $r = $mid2; $g = $v; $b = $m; break; case 2: $r = $m; $g = $v; $b = $mid1; break; case 3: $r = $m; $g = $mid2; $b = $v; break; case 4: $r = $mid1; $g = $m; $b = $v; break; case 5: $r = $v; $g = $m; $b = $mid2; break; default: return false; } } return array('r' => $r * 255.0, 'g' => $g * 255.0, 'b' => $b * 255.0); } function calculateLuminosity($color) { $r = hexdec(substr($color, 0, 2)) / 255; // red value $g = hexdec(substr($color, 2, 2)) / 255; // green value $b = hexdec(substr($color, 4, 2)) / 255; // blue value if ($r <= 0.03928) { $r = $r / 12.92; } else { $r = pow((($r + 0.055) / 1.055), 2.4); } if ($g <= 0.03928) { $g = $g / 12.92; } else { $g = pow((($g + 0.055) / 1.055), 2.4); } if ($b <= 0.03928) { $b = $b / 12.92; } else { $b = pow((($b + 0.055) / 1.055), 2.4); } return 0.2126 * $r + 0.7152 * $g + 0.0722 * $b; } // calculates the luminosity ratio of two colors // the luminosity ratio equations are from the WCAG 2 requirements // http://www.w3.org/TR/WCAG20/#contrast-ratiodef function calculateLuminosityRatio($color1, $color2) { $l1 = calculateLuminosity($color1); $l2 = calculateLuminosity($color2); if ($l1 > $l2) { $ratio = (($l1 + 0.05) / ($l2 + 0.05)); } else { $ratio = (($l2 + 0.05) / ($l1 + 0.05)); } return $ratio; } // returns an array with the results of the color contrast analysis // it returns akey for each level (AA and AAA, both for normal and large or bold text) // it also returns the calculated contrast ratio // the ratio levels are from the WCAG 2 requirements // http://www.w3.org/TR/WCAG20/#visual-audio-contrast (1.4.3) // http://www.w3.org/TR/WCAG20/#larger-scaledef function evaluateColorContrast($color1, $color2) { $ratio = calculateLuminosityRatio($color1, $color2); $colorEvaluation["levelAANormal"] = ($ratio >= 4.5 ? 'pass' : 'fail'); $colorEvaluation["levelAALarge"] = ($ratio >= 3 ? 'pass' : 'fail'); $colorEvaluation["levelAAMediumBold"] = ($ratio >= 3 ? 'pass' : 'fail'); $colorEvaluation["levelAAANormal"] = ($ratio >= 7 ? 'pass' : 'fail'); $colorEvaluation["levelAAALarge"] = ($ratio >= 4.5 ? 'pass' : 'fail'); $colorEvaluation["levelAAAMediumBold"] = ($ratio >= 4.5 ? 'pass' : 'fail'); $colorEvaluation["ratio"] = $ratio; return $colorEvaluation; } function getDescrizioneFromTipologia($descrizioni, $data = null) { if (empty($data)) { $data = time(); } else { if (!is_numeric($data)) { $data = strtotime($data); } } foreach ($descrizioni as $descrizione) { if ((empty($descrizione["inizio"]) || strtotime($descrizione["inizio"]) <= $data) && (empty($descrizione["fine"]) || strtotime($descrizione["fine"]) >= $data)) { return $descrizione; } } return false; } function getTipologieAffidamento($attivo = true, $data = null) { global $config; $return = jsonToArray($config["jsonFolder"] . "/generic-tipologieAffidamento.json"); if ($attivo) { $tmp = []; foreach ($return as $codice => $tipologia) { if ($tipologia["attivo"]) { $tmp[$codice] = $tipologia; } } $return = $tmp; } return addDescrizioni($return, $data); } function addDescrizioni($array, $data) { if (!empty($array)) { $tmp = []; foreach ($array as $key => $tipologia) { if (isset($tipologia["descrizioni"])) { $descrizioni = getDescrizioneFromTipologia($tipologia["descrizioni"], $data); if (!empty($descrizioni)) { $tipologia += $descrizioni; } } $tmp[$key] = $tipologia; } $array = $tmp; } return $array; } function getProcedure($all = false, $filtroTipologia = null, $data = null, int $enteBeneficiario = null) { global $config; $return = jsonToArray($config["jsonFolder"] . "/gare-procedure.json"); $privato = false; if (!empty($enteBeneficiario)) { $ente = Ente::getInfoFromID($enteBeneficiario)[0] ?? null; if (isset($ente["soggettoPrivato"]) && $ente["soggettoPrivato"] == "S") { $privato = true; } } $proponiRdoIndagine = settingsManager::getValue("proponiNegoziataConIndagineDiMercato"); if ($proponiRdoIndagine !== "S") { unset($return["rdo-indagine"]); } if (!$all) { $tmp = []; foreach ($return as $codice => $tipologia) { if ($tipologia["attivo"] && (!$privato || $tipologia["privata"])) { $insert = true; if (!empty($filtroTipologia)) { $insert = false; if (is_array($tipologia["tipologie"])) { if (in_array($filtroTipologia, $tipologia["tipologie"]) !== false) { $insert = true; } } else { $insert = true; } } if ($insert) { $tmp[$codice] = $tipologia; } } } $return = $tmp; } return addDescrizioni($return, $data); } function getCriteri($attivo = true, $data = null) { global $config; $return = jsonToArray($config["jsonFolder"] . "/generic-criteri.json"); if ($attivo) { $tmp = []; foreach ($return as $codice => $tipologia) { if ($tipologia["attivo"]) { $tmp[$codice] = $tipologia; } } $return = $tmp; } return addDescrizioni($return, $data); } function getModalita($attivo = true, $data = null) { global $config; $return = jsonToArray($config["jsonFolder"] . "/gare-modalita.json"); if ($attivo) { $tmp = []; foreach ($return as $codice => $tipologia) { if ($tipologia["attivo"]) { $tmp[$codice] = $tipologia; } } $return = $tmp; } return addDescrizioni($return, $data); } function getJSON($file) { global $config; return jsonToArray($config["jsonFolder"] . "/{$file}"); } function getListeSIMOG() { global $root; $return = false; if (file_exists($root . "/inc/liste-simog.xml")) { require_once($root . "/inc/xml2json.php"); $schema = simplexml_load_file($root . '/inc/liste-simog.xml'); $schema = xmlToArray($schema); if (!empty($schema["schema"]["xsd:simpleType"])) { $selects = array(); foreach ($schema["schema"]["xsd:simpleType"] as $select) { $selects[$select["@name"]] = array(); foreach ($select["xsd:restriction"]["xsd:enumeration"] as $value) { $selects[$select["@name"]][$value["@value"]] = (!is_array($value["xsd:annotation"]["xsd:documentation"])) ? $value["xsd:annotation"]["xsd:documentation"] : implode(" - ", $value["xsd:annotation"]["xsd:documentation"]); } } if (!empty($selects)) { $return = $selects; } } } ksort($return); return $return; } function sortPartecipantiTotale($a, $b) { return $a["totale"] < $b["totale"]; } function sortInversePartecipantiTotale($a, $b) { return $a["totale"] > $b["totale"]; } function sortEsclusi($a, $b) { return strcmp($a["escluso"], $b["escluso"]); } function FromUTCtoLocale($date) { $tz_from = new DateTimeZone('UTC'); $tz_to = new DateTimeZone('Europe/Rome'); $orig_time = new DateTime($date, $tz_from); $new_time = $orig_time->setTimezone($tz_to); return $new_time->format('Y-m-d H:i:s'); } function orarioToSecondi($ora) { sscanf($ora, "%d:%d:%d", $hours, $minutes, $seconds); return isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds; } function isAssoc(array $arr) { if (array() === $arr) { return false; } return array_keys($arr) !== range(0, count($arr) - 1); } function HTTPStatus($num) { $http = array( 100 => 'HTTP/1.1 100 Continue', 101 => 'HTTP/1.1 101 Switching Protocols', 200 => 'HTTP/1.1 200 OK', 201 => 'HTTP/1.1 201 Created', 202 => 'HTTP/1.1 202 Accepted', 203 => 'HTTP/1.1 203 Non-Authoritative Information', 204 => 'HTTP/1.1 204 No Content', 205 => 'HTTP/1.1 205 Reset Content', 206 => 'HTTP/1.1 206 Partial Content', 300 => 'HTTP/1.1 300 Multiple Choices', 301 => 'HTTP/1.1 301 Moved Permanently', 302 => 'HTTP/1.1 302 Found', 303 => 'HTTP/1.1 303 See Other', 304 => 'HTTP/1.1 304 Not Modified', 305 => 'HTTP/1.1 305 Use Proxy', 307 => 'HTTP/1.1 307 Temporary Redirect', 400 => 'HTTP/1.1 400 Bad Request', 401 => 'HTTP/1.1 401 Unauthorized', 402 => 'HTTP/1.1 402 Payment Required', 403 => 'HTTP/1.1 403 Forbidden', 404 => 'HTTP/1.1 404 Not Found', 405 => 'HTTP/1.1 405 Method Not Allowed', 406 => 'HTTP/1.1 406 Not Acceptable', 407 => 'HTTP/1.1 407 Proxy Authentication Required', 408 => 'HTTP/1.1 408 Request Time-out', 409 => 'HTTP/1.1 409 Conflict', 410 => 'HTTP/1.1 410 Gone', 411 => 'HTTP/1.1 411 Length Required', 412 => 'HTTP/1.1 412 Precondition Failed', 413 => 'HTTP/1.1 413 Request Entity Too Large', 414 => 'HTTP/1.1 414 Request-URI Too Large', 415 => 'HTTP/1.1 415 Unsupported Media Type', 416 => 'HTTP/1.1 416 Requested Range Not Satisfiable', 417 => 'HTTP/1.1 417 Expectation Failed', 500 => 'HTTP/1.1 500 Internal Server Error', 501 => 'HTTP/1.1 501 Not Implemented', 502 => 'HTTP/1.1 502 Bad Gateway', 503 => 'HTTP/1.1 503 Service Unavailable', 504 => 'HTTP/1.1 504 Gateway Time-out', 505 => 'HTTP/1.1 505 HTTP Version Not Supported', ); header($http[$num]); return array( 'code' => $num, 'error' => $http[$num], ); } /** * Check if array is associative or sequential * @param Array $array * @return bool */ function isAssociative(array $array) { if (array() === $array) { return false; } return array_keys($array) !== range(0, count($array) - 1); } if (!function_exists("is_json")) { /** * NON USARE se non strettamente necessario. * Converte una stringa in json internamente e ritorna TRUE/FALSE * in base al successo. * * Un if di questo genere sostituisce il metodo ed è molto più efficiente * if(($var = json_decode($json)) !== null) * * Oppure usa il metodo valid_json * * @param string $string * @return boolean */ function is_json(string $string) { json_decode($string); return json_last_error() === JSON_ERROR_NONE; } } if (!function_exists("valid_json")) { /** * Converte una stringa in json, la assegna al parametro * data e ritorna TRUE/FALSE in base al successo. * * Uso tipico * if(valid_json($json, $data)) { * // Uso di $data * } * * Oppure usa il metodo valid_json * * @param string $string * @param ?object|?array $data * @param ?bool $associative * @param int $depth * @param int $flags * @return boolean */ function valid_json(string $string, &$data, ?bool $associative = null, int $depth = 512, int $flags = 0) { $data = json_decode($string, $associative, $depth, $flags); if($data === NULL || json_last_error() !== JSON_ERROR_NONE) return false; if($associative) { return is_array($data); } return is_object($data); } } if (!function_exists("valid_json_recursive")) { function valid_json_recursive(string $string, &$data) { $data = json_decode($string, TRUE); $success = $data !== null && is_array($data) && json_last_error() === JSON_ERROR_NONE; if($success) { foreach($data as &$entry) { valid_json_recursive($entry, $entry); } } return $success; } } function addBypassCheckURL(string $url) { if (!isset($_SESSION["bypassCheck"])) { $_SESSION["bypassCheck"] = []; } $_SESSION["bypassCheck"][] = $url; $_SESSION["bypassCheck"] = array_unique($_SESSION["bypassCheck"]); } function adaptMemoryLimitToFile($path, $limit = "4G") { if (file_exists($path)) { $size = filesize($path); if ($size > 500 * 1024 * 1024) { $limit = "-1"; } $actual_memory = ini_get("memory_limit"); if ($actual_memory != "-1" && $actual_memory != "4G" && $size > 2000000) { ini_set("memory_limit", $limit); ini_set("max_execution_time", "600"); } } } function getMatchFrom2($id, $table) { global $pdo; $getMatch = $pdo->go("SELECT v3 FROM b_matches_v2 WHERE tabella = :tabella AND v2 = :codice", [":tabella" => $table, ":codice" => $id]); if ($getMatch->rowCount() > 0) { return $getMatch->fetch(PDO::FETCH_COLUMN); } } function pluck($key, $data) { return array_reduce($data, function ($result, $array) use ($key) { isset($array[$key]) && $result[] = $array[$key]; return $result; }, array()); } function group_by($array, $key, $resetKey = true) { $return = array(); foreach ($array as $val) { $return[$val[$key]][] = $val; } if($resetKey){ $return = array_values($return); } return $return; } function arrayIsNumeric($array) { $tmp = []; if (!empty($array)) { foreach ($array as $value) { if (is_numeric($value)) { $tmp[] = (int)$value; } } } return $tmp; } function getMatchFrom3($id, $table) { global $pdo; $getMatch = $pdo->go("SELECT v2 FROM b_matches_v2 WHERE tabella = :tabella AND v3 = :codice", [":tabella" => $table, ":codice" => $id]); if ($getMatch->rowCount() > 0) { return $getMatch->fetch(PDO::FETCH_COLUMN); } } if (!function_exists('array_is_list')) { /** * Check if array has only numeric keys * * @param mixed $arr * @return void */ function array_is_list(array $arr) { if ($arr === []) { return true; } ksort($arr); return array_keys($arr) === range(0, count($arr) - 1); } } if (!function_exists("base64url_encode")) { function base64url_encode($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } } if (!function_exists("base64url_decode")) { function base64url_decode($data) { return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); } } if (!function_exists('value')) { /** * Return the default value of the given value. * * @param mixed $value * @return mixed */ function value($value, ...$args) { return $value instanceof Closure ? $value(...$args) : $value; } } if (!function_exists("array_set")) { /** * Set an array item to a given value using "dot" notation. * * If no key is given to the method, the entire array will be replaced. * * @param array $array * @param string|null $key * @param mixed $value * @return array */ function array_set(&$array, $key, $value) { return DotPath::set($array, $key, $value); } } if (!function_exists("array_get")) { /** * Get an item from an array using "dot" notation. * * @param \ArrayAccess|array $array * @param string|int|null $key * @param mixed $default * @return mixed */ function array_get($array, $key, $default = null, $dictionary = false) { return DotPath::get($array, $key, $default, $dictionary); } } if (!function_exists('array_flatten')) { /** * Convert a multi-dimensional array into a single-dimensional array. * @author Sean Cannon, LitmusBox.com | seanc@litmusbox.com * @param array $array The multi-dimensional array. * @return array|false */ function array_flatten($array) { if (!is_array($array)) { return false; } $result = array(); foreach ($array as $key => $value) { if (is_array($value)) { $result = array_merge($result, array_flatten($value)); } else { $result = array_merge($result, array($key => $value)); } } return $result; } } if (!function_exists('uuidgen')) { function uuidgen($data = null) { // Generate 16 bytes (128 bits) of random data or use the data passed into the function. $data = $data ?? random_bytes(16); assert(strlen($data) == 16); // Set version to 0100 $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // Set bits 6-7 to 10 $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // Output the 36 character UUID. return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); } } if (!function_exists('uuidgen_v4')) { /** * Genera un uuidgen v4 RFC 4122 basato su una stringa * * @param string $data Dati su cui basare l'uuid * @return string Stringa secondo questo standard /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}/ */ function uuidgen_v4($data = null) { // Se non ci sono dati generiamo a caso if(empty($data)) $data = uniqid("uuidgen", true); // Calcoliamo un hash dei dati $hash = md5($data, true); // Dividiamo in UUID $uuid = vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($hash), 4)); // Assegniamo i valori necessari per RFC 4122 $uuid[14] = "4"; switch ($uuid[19]) { case '0': case '2': case '1': case '3': $uuid[19] = '8'; break; case '4': case '5': case '6': case '7': $uuid[19] = '9'; break; case '8': case '9': case 'a': case 'b': $uuid[19] = 'a'; break; default: $uuid[19] = 'b'; break; } return $uuid; } } /** * Genera un uuid v4 rfc4122 casuale * * @return string /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}/ */ function uuidgen_guue() { do { $uuid = uuidgen(); } while(preg_match("/[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}/", $uuid) !== 1); return $uuid; } // https://stackoverflow.com/questions/4519739/split-camelcase-word-into-words-with-php-preg-match-regular-expression function camelCaseToWords($ccWord) { if(empty($ccWord)) return $ccWord; $re = '/(?#! splitCamelCase Rev:20140412) # Split camelCase "words". Two global alternatives. Either g1of2: (?<=[a-z]) # Position is after a lowercase, (?=[A-Z]) # and before an uppercase letter. | (?<=[A-Z]) # Or g2of2; Position is after uppercase, (?=[A-Z][a-z]) # and before upper-then-lower case. /x'; $a = preg_split($re, $ccWord); return implode(" ", $a); } if(!function_exists("currency_format")) { function currency_format($amount, $currency="") { $amount = (is_numeric($amount)) ? floatval($amount) : 0; return $currency . number_format($amount, 2, '.', ''); } } if(!function_exists("die_forbidden")) { function die_forbidden($override_url = null) { if (php_sapi_name() !== "cli") { header('HTTP/1.0 403 Forbidden'); $referer = empty($override_url) ? ($_SERVER["HTTP_REFERER"] ?? "/") : $override_url; die("

Questa pagina non è disponibile

" . __("Ritorna") . ""); } } } function rimuoviZeroDecimaliFromDB($number,string $decimalSeparator = ".") { return trim(rtrim($number,"0"),$decimalSeparator); } function printFormattedNumber($number,int $decimal = null) { $decimalSeparator = ","; $thousandSeparator = "."; if ($decimal > 0) { $return = number_format($number,2,$decimalSeparator,$thousandSeparator); } else { $return = rimuoviZeroDecimaliFromDB(number_format($number,10,$decimalSeparator,$thousandSeparator),$decimalSeparator); } if ($return === "") { $return = 0; } return $return; } if(!function_exists("empty_but_not_zero")) { /** * Ritorna true se è vuoto ma non zero * * @param mixed $val * @return bool */ function empty_but_not_zero($val) { if(!isset($val)) return true; if($val === 0 || $val === "0") return false; return empty($val); } } if(!function_exists("tuttogare_api_call")) { function tuttogare_api_call(string $url, string $token, string $method = "GET", string $body = "") { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_MAX_SEND_SPEED_LARGE, 2 * 524288); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_HEADER, FALSE); $headers = [ "X-Tuttogare-Api-Key: {$token}", ]; if($method === "POST") { curl_setopt($curl, CURLOPT_POST, TRUE); $headers = array_merge( $headers, [ "Encoding: UTF-8", "Http-Method: POST", "Content-Type: application/json", ] ); } curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_POSTFIELDS, $body); return curl_exec($curl); } } if(!function_exists("emptyArrayMultidimensional")) { /** * Ritorna true se c'è un solo campo vuoto nell'array multidimensionale * * @param mixed $val * @return bool */ function emptyArrayMultidimensional($arr){ if(!empty($arr)){ foreach ($arr as $key => $value) { if(is_array($value)){ if(emptyArrayMultidimensional($value)){ return true; } }elseif(empty($value)){ return true; } } } return false; } } if(!function_exists("url_with_params")) { function url_with_params(string $url, ?array $current_params = null) { if($current_params === null) $current_params = $_GET; $url_split = explode("?", $url); parse_str($url_split[1] ?? "", $new_params); foreach($new_params as $key => $param) { $current_params[$key] = $param; } return $url_split[0] . "?" . http_build_query($current_params); } } if(!function_exists("html_alert")) { function html_alert(string $message, string $title="Attenzione", string $type = "danger", string $icon = "fa fa-exclamation-triangle") { ?>

$value) { if($value === $needle) { $results[] = $currentSearch; } elseif(is_array($value)) { $tmp = $currentSearch; $tmp[] = $key; recursive_array_search_all($needle, $value, $tmp, $results); } } return $results; } } if (!function_exists("recursive_array_key_search_all")) { function recursive_array_key_search_all($needle, array $haystack, array &$results = []) { foreach($haystack as $key => $value) { if($key === $needle) { $results[] = $value; } elseif(is_array($value)) { recursive_array_key_search_all($needle, $value, $results); } } return $results; } function recursive_array_key_search_first($needle, array $haystack, array &$results = []) { foreach($haystack as $key => $value) { if($key === $needle) { while(is_array($value) && array_is_list($value)) { $value = array_values($value)[0]; } return $value; } elseif(is_array($value)) { $result = recursive_array_key_search_first($needle, $value, $results); if($result !== null) return $result; } } return null; } } if(!function_exists("vdump")) { function vdump(...$args) { if(defined("__VERBOSE")) { call_user_func_array('dump', $args); } } } if(!function_exists("swalDie")) { function swalDie($html, $title="Attenzione", $return_url = "reload", $type = "error", $script = true) { ?> '; } } if(!function_exists("arrayDiff")) { function arrayDiff($A, $B) { $intersect = array_intersect($A, $B); return array_merge(array_diff($A, $intersect), array_diff($B, $intersect)); } } if(!function_exists("recursive_unset")) { function recursive_unset(array &$array, array $keysToRemove) { foreach ($array as $key => &$value) { if (is_array($value)) { recursive_unset($value, $keysToRemove); } } foreach ($keysToRemove as $key ) { unset($array[$key]); } } } if(!function_exists("realFolderPathOrCreate")) { function realFolderPathOrCreate(string $path) : string { if(is_bool($realPath = realpath($path))) { mkdir($path, 0777, true); $realPath = realpath($path); } return $realPath; } } if(! function_exists("get_radice")) { /** * Get radice from URI * * @return String */ function get_radice() : ?String { $radice = explode("/",$_SERVER["PHP_SELF"]); if (isset($radice[1])) { if ($radice[1] == "backend") { Ente::$frontOfficeRequest = false; if ((isset($_SESSION["utente"]) && !empty($_SESSION["utente"]->gerarchia) && $_SESSION["utente"]->gerarchia < 100) || $radice[2] == "form" || (isset($_SESSION["bypassCheck"]) && in_array($_SERVER["REQUEST_URI"],$_SESSION["bypassCheck"]) !== FALSE)) { return $radice[2] ?? ""; } else { header('HTTP/1.0 403 Forbidden'); ?>

Forbidden

0, "M" => 1, "N" => 2, "P" => 3, "Q" => 4, "R" => 5, "S" => 6, "T" => 7, "U" => 8, "V" => 9]; $codice = substr($cf, -5, 4); for ($i=1; $i < strlen($codice); $i++) { if(! ctype_digit($codice[$i])) { $codice[$i] = $dictionary[$codice[$i]]; } } return $codice; } }