$value) { if (is_array($value)) { $array[$key] = convertDate_SIMOG($value); } else { if ((stripos($key, "DATA_") !== false) || (stripos($key, "TERMINE_") !== false) && $key != "TERMINE_RIDOTTO") { $array[$key] = date2mysql($value); } } } return $array; } function convertDate_FROMSIMOG($array) { foreach($array AS $key => $value) { if (is_array($value)) { $array[$key] = convertDate_FROMSIMOG($value); } else { if ((stripos($key, "DATA_") !== false) || (stripos($key, "TERMINE_") !== false) && $key != "TERMINE_RIDOTTO") { $array[$key] = mysql2date($value); } } } return $array; } function convertDate_DbDateSimog($array) { foreach($array AS $key => $value) { if (is_array($value)) { $array[$key] = convertDate_DbDateSimog($value); } else if (!empty($value)) { if ((stripos($key, "DATA_") !== false) || (stripos($key, "TERMINE_") !== false) && $key != "TERMINE_RIDOTTO") { $date = new DateTime(($value)); $array[$key] = $date->format(DateTime::ATOM); } } } return $array; } class anac { public $info; public $version; public $modulo; public $elemento; public $codice_simog; public $codice_lotto; private $checksPDO; private $db; public function __construct() { global $pdo; $this->db = $pdo; $this->version = self::getVersion(); $this->modulo = "anac"; } public function updateStato($stato) { if (empty($this->info["stato"]) || $this->info["stato"] < $stato) { $this->db->go("UPDATE b_simog SET stato = :stato WHERE codice = :codice",[":stato"=>$stato,":codice"=>$this->info["codice"]]); } if (isset($_SESSION["ente"])) { $_SESSION["ente"]->manageUpdates("anac",$this->info["codice"],$this); } } public static function getVersion($data = "") { $return = "3.04.7"; if(time() >= strtotime('2023-02-13 00:00:00')) { $return = "3.04.8"; } if(time() >= strtotime('2023-06-21 00:00:00') || DEMO_ENV || DEVELOP_ENV) { $return = "3.04.9"; } if (! empty($data)) { $data = strtotime($data); if($data < strtotime('2022-06-22')) { $return = "3.04.5"; } } return $return; } public static function limiteSmartCIG($data = "") { if (empty($data)) { $data = time(); } else { $data = strtotime($data); } $limite = 40000; // TODO: Implementare controllo su data in caso di modifica normativa return $limite; } public static function getSceltaContraenteFromGara($id,$smart_cig,$data = "") { if ($smart_cig == "S") { $source = "raccordoSmartGare.json"; } else if ($smart_cig == "N") { $source = "raccordoRegularGare.json"; } if (!empty($source)) { $version = self::getVersion($data); $path = self::getVersionPath($version); if (!empty($path)) { $path .= "/data/{$source}"; if (file_exists($path)) { $options = jsonToArray($path); if (!empty($options)) { return $options[$id] ?? false; } } } } return false; } public static function getXMLPath($codice_ente,$anno = NULL,$generale = false) { if (is_numeric($codice_ente)) { global $config; $path = $config["mediaFolder"]."/enti/{$codice_ente}/XML190"; if (!empty($anno)) { if (is_numeric($anno)) { $path .= "/{$anno}"; if ($generale) { $path .= "_generale"; } $path .= ".xml"; return $path; } } return $path; } return false; } public static function getDateXML190($codice_ente,$anno,$generale) { $path = self::getXMLPath($codice_ente,$anno,$generale); if (file_exists($path)) { adaptMemoryLimitToFile($path); $existent = file_get_contents($path); $existent = new SimpleXMLElement($existent); if (!empty($existent)) { $return["dataPubblicazione"] = $existent->metadata->dataPubbicazioneDataset; $return["dataAggiornamento"] = $existent->metadata->dataUltimoAggiornamentoDataset; } } return false; } public static function getURL190($codice_ente,$anno,$generale) { global $config; $path = self::getXMLPath($codice_ente,$anno,$generale); if (!empty($path)) { $clean = str_replace($config["mediaFolder"],"",$path); return $config["link_sito"] ."/documenti". $clean; } } public static function getSceltaContraente190($id,$smart_cig) { if ($smart_cig == "S") { $source = "raccordoSmart190.json"; } else if ($smart_cig == "N") { $source = "raccordoRegular190.json"; } if (!empty($source)) { $version = self::getVersion(); $path = self::getVersionPath($version); if (!empty($path)) { $path .= "/data/{$source}"; if (file_exists($path)) { $options = jsonToArray($path); if (!empty($options)) { return $options[$id] ?? false; } } } } return false; } public static function parsePartecipante190($tmp) { $partecipante = []; if ($tmp["stato"] == "IT") { $partecipante["codiceFiscale"] = $tmp["codice_fiscale"] ?? $tmp["codice_fiscale_impresa"]; } else { $partecipante["identificativoFiscaleEstero"] = $tmp["codice_fiscale"] ?? $tmp["codice_fiscale_impresa"]; } $partecipante["ragioneSociale"] = $tmp["ragione_sociale"]; if (!empty($tmp["ruolo"])) { $partecipante["ruolo"] = $tmp["ruolo"]; } return $partecipante; } public static function validateXML190($path) { $errori = []; if (file_exists($path)) { $version = self::getVersion(); $pathDataSet = self::getVersionPath($version); if (!empty($path) && !empty($pathDataSet) && is_file($path)) { $pathDataSet .= "/utility/datasetAppaltiL190.xsd"; $xml = new DOMDocument(); libxml_use_internal_errors(true); if ($xml->loadXML(file_get_contents($path))) { if (!$xml->schemaValidate($pathDataSet)) { $errori = libxml_get_errors(); libxml_clear_errors(); } } } } else { $errori[] = __("File non esistente"); } return $errori; } public static function get190Data($codice_ente,$anno,$generale) { global $pdo; $selectLotti = "SELECT b_simog_lotti.codice, b_simog.codice_ente, b_simog.smart_cig, b_simog_lotti.oggetto,b_simog_lotti.id_scelta_contraente,b_simog_lotti.cig, b_simog_lotti.importo,b_simog_lotti.190data_inizio,b_simog_lotti.190data_fine,b_simog_lotti.190importoAggiudicato,b_simog_lotti.190liquidazioni FROM b_simog_lotti JOIN b_simog ON b_simog_lotti.codice_simog = b_simog.codice WHERE b_simog.anno_riferimento = :anno AND b_simog_lotti.eliminato = 'N' AND b_simog.stato <> '90' AND b_simog_lotti.cig IS NOT NULL "; if ($generale) { $selectLotti .= " AND b_simog.codice_gestore = :ente "; } else { $selectLotti .= " AND b_simog.codice_ente = :ente "; } $selectLotti .= " ORDER BY b_simog_lotti.codice "; $lotti = $pdo->go($selectLotti,[":anno"=>$anno,":ente"=>$codice_ente])->fetchAll(PDO::FETCH_ASSOC); $data = []; if (count($lotti) > 0) { $qRaggruppamento = $pdo->prepare("SELECT * FROM r_raggruppamenti_simog WHERE r_raggruppamenti_simog.codice_padre = :codice_partecipante "); $qPartecipanti = $pdo->prepare("SELECT * FROM r_partecipanti_simog WHERE r_partecipanti_simog.codice_lotto = :codice_lotto ");; foreach($lotti AS $tmp) { $lotto = []; $lotto["cig"] = (!empty($tmp["cig"])) ? $tmp["cig"] : "0000000000"; if (!empty($enti[$tmp["codice_ente"]])) { $beneficiario = $enti[$tmp["codice_ente"]]; } else { $beneficiario = $enti[$tmp["codice_ente"]] = Ente::getInfoFromID($tmp["codice_ente"])[0]; } $lotto["strutturaProponente"]["codiceFiscaleProp"] = $beneficiario["cf"]; $lotto["strutturaProponente"]["denominazione"] = $beneficiario["denominazione"]; $lotto["oggetto"] = substr(trim(strip_tags($tmp["oggetto"])),0,250);; $lotto["oggetto"] = str_replace("<","<",$lotto["oggetto"]); $lotto["oggetto"] = str_replace("<","min.",$lotto["oggetto"]); $lotto["oggetto"] = str_replace(">","mag.",$lotto["oggetto"]); $lotto["sceltaContraente"] = self::getSceltaContraente190($tmp["id_scelta_contraente"],$tmp["smart_cig"]); $partecipanti = []; $raggruppamenti = []; $aggiudicatari = []; $raggruppamenti_aggiudicatari = []; $bloccoPartecipanti = []; $bloccoAggiudicatari = []; $qPartecipanti->bindValue(":codice_lotto",$tmp["codice"]); $qPartecipanti->execute(); if ($qPartecipanti->rowCount() > 0) { while($partecipante = $qPartecipanti->fetch(PDO::FETCH_ASSOC)) { $aggiudicatario = ($partecipante["aggiudicatario"] == "S") ? true : false; $qRaggruppamento->bindValue(":codice_partecipante",$partecipante["codice"]); $qRaggruppamento->execute(); if ($qRaggruppamento->rowCount() > 0) { $partecipante["raggruppamento"] = $qRaggruppamento->fetchAll(PDO::FETCH_ASSOC); $raggruppamenti[] = $partecipante; if ($aggiudicatario) { $raggruppamenti_aggiudicatari[] = $partecipante; } } else { $partecipanti[] = $partecipante; if ($aggiudicatario) { $aggiudicatari[] = $partecipante; } } } if (!empty($raggruppamenti)) { foreach($raggruppamenti AS $partecipante) { $raggruppamento = []; $partecipante["ruolo"] = "04-CAPOGRUPPO"; $raggruppamento["membro"][] = self::parsePartecipante190($partecipante); foreach($partecipante["raggruppamento"] AS $sub) { $raggruppamento["membro"][] = self::parsePartecipante190($sub); } $bloccoPartecipanti["raggruppamento"][] = $raggruppamento; } } if (!empty($partecipanti)) { foreach($partecipanti AS $partecipante) { $bloccoPartecipanti["partecipante"][] = self::parsePartecipante190($partecipante); } } if (!empty($raggruppamenti_aggiudicatari)) { foreach($raggruppamenti_aggiudicatari AS $partecipante) { $raggruppamento = []; $partecipante["ruolo"] = "04-CAPOGRUPPO"; $raggruppamento["membro"][] = self::parsePartecipante190($partecipante); foreach($partecipante["raggruppamento"] AS $sub) { $raggruppamento["membro"][] = self::parsePartecipante190($sub); } $bloccoAggiudicatari["aggiudicatarioRaggruppamento"][] = $raggruppamento; } } if (!empty($aggiudicatari)) { foreach($aggiudicatari AS $partecipante) { $bloccoAggiudicatari["aggiudicatario"][] = self::parsePartecipante190($partecipante); } } } $lotto["partecipanti"] = $bloccoPartecipanti; $lotto["aggiudicatari"] = $bloccoAggiudicatari; $lotto["importoAggiudicazione"] = ($tmp["190importoAggiudicato"] > 0) ? number_format($tmp["190importoAggiudicato"],2,".","") : 0; $tempiCompletamento = []; if (!empty($tmp["190data_inizio"]) && !empty($tmp["190data_fine"])) { $tempiCompletamento["dataInizio"] = $tmp["190data_inizio"]; $tempiCompletamento["dataUltimazione"] = $tmp["190data_fine"]; } $lotto["tempiCompletamento"] = $tempiCompletamento; $lotto["importoSommeLiquidate"] = ($tmp["190liquidazioni"] > 0) ? number_format($tmp["190liquidazioni"],2,".","") : 0; $data["lotto"][] = $lotto; } } return $data; } public static function generaXML($codice_ente,$anno,$generale,$simulazione = false) { $return = false; $data = self::get190Data($codice_ente,$anno,$generale); if (!empty($data)) { $xml = []; $xml["legge190:pubblicazione"]["@xmlns:legge190"]="legge190_1_0"; $xml["legge190:pubblicazione"]["@xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance"; $xml["legge190:pubblicazione"]["@xsi:schemaLocation"]="legge190_1_0 datasetAppaltiL190.xsd"; $enti = []; $ente = $enti[$codice_ente] = Ente::getInfoFromID($codice_ente)[0]; $metadata = []; $metadata["titolo"] = "Pubblicazione dati legge 190/2012"; $metadata["abstract"] = "Pubblicazione dati legge 190/2012 - Anno di riferimento " . $anno; $metadata["dataPubblicazioneDataset"] = self::getDateXML190($codice_ente,$anno,$generale)["dataPubblicazione"] ?? date("Y-m-d"); $metadata["entePubblicatore"] = $ente["denominazione"] . " - Codice Fiscale " . $ente["cf"]; if (!$simulazione) { $metadata["dataUltimoAggiornamentoDataset"] = date("Y-m-d"); } else { $metadata["dataUltimoAggiornamentoDataset"] = self::getDateXML190($codice_ente,$anno,$generale)["dataAggiornamento"] ?? date("Y-m-d"); } $metadata["annoRiferimento"] = $anno; $metadata["urlFile"] = self::getURL190($codice_ente,$anno,$generale); $metadata["licenza"] = "IODL"; $xml["legge190:pubblicazione"]["metadata"] = $metadata; $xml["legge190:pubblicazione"]["data"] = $data; $string_xml = html_entity_decode(array2XML($xml,"","",true),ENT_QUOTES,'UTF-8'); $string_xml = str_replace("&", "&", $string_xml); $string_xml = utf8_encode($string_xml); $domxml = new DOMDocument('1.0'); $domxml->preserveWhiteSpace = true; $domxml->formatOutput = true; $domxml->loadXML($string_xml); return $domxml->saveXML(); } return $return; } public static function getVersionPath($version) { $path = __DIR__ . "/versions/{$version}"; if (is_dir($path)) { return $path; } return false; } public function printEditGara() { return $this->includeView("/views/form-gara.php"); } public function printEditLotto($codice_lotto = 0) { return $this->includeView("/views/form-lotto.php",$codice_lotto); } public function printRequisiti() { return $this->includeView("/views/requisiti.php"); } public function printPubblica() { return $this->includeView("/views/pubblica.php"); } public function printDeleteLotto($codice_lotto) { return $this->includeView("/views/delete-lotto.php",$codice_lotto); } public function printDeleteGara() { return $this->includeView("/views/delete-gara.php"); } public function printPrendiInCarico() { return $this->includeView("/views/presa-in-carico.php"); } public function printRicevutaCIG($codice_lotto = 0) { return $this->includeView("/views/ricevuta-cig.php",$codice_lotto); } public function printScheda($codice_lotto,$type) { return $this->includeView("/views/form-schede.php",$codice_lotto,["type"=>$type]); } private function includeView($view,$codice_lotto=0,$data = null) { $path = self::getVersionPath($this->version); if (!empty($path)) { $path .= $view; if (file_exists($path)) { include($path); return true; } } return false; } public static function relazioniModulo($modulo,$codice_gara,$codice_lotto = null) { global $pdo; $bind = []; $bind[":modulo"] = $modulo; $bind[":codice_gara"] = $codice_gara; $sql = "SELECT * FROM r_simog_moduli WHERE modulo = :modulo AND codice_gara = :codice_gara "; if ($codice_lotto !== null) { $bind[":codice_lotto"] = $codice_lotto; $sql .= " AND codice_lotto = :codice_lotto "; } return $pdo->go($sql,$bind)->fetch(PDO::FETCH_ASSOC); } public function getRelazioni($codice_lotto = null) { $bind = [":codice_simog"=>$this->info["codice"]]; $sql = "SELECT * FROM r_simog_moduli WHERE gara_simog = :codice_simog "; if (!empty($codice_lotto)) { $bind[":codice_lotto"] = $codice_lotto; $sql .= " AND lotto_simog = :codice_lotto "; } return $this->db->go($sql,$bind)->fetchAll(PDO::FETCH_ASSOC); } public function getBreadcrumb($breadcrumb = []) { $relazioni = $this->getRelazioni(); if (!empty($relazioni)) { foreach($relazioni AS $relazione) { if ($_SESSION["utente"]->permission($relazione["modulo"],$relazione["codice_gara"])) { global $beRoot; if (file_exists("{$beRoot}/{$relazione["modulo"]}/panel.php")) { $infoModulo = Modulo::getInfo($relazione["modulo"]); $breadcrumb["/{$relazione["modulo"]}/panel.php?codice={$relazione["codice_gara"]}"] = __($infoModulo["titolo"]) . " - " . __("Pannello"); } } } } return $breadcrumb; } public static function relazioniDisponibili() { $return = []; $return["pcp"] = ["link"=>"/backend/pcp/panel.php?codice=#codice_gara#&codice_round=#codice_fase#","updateCig"=>"/backend/pcp/anac/update.php"]; $return["gare"] = ["link"=>"/backend/gare/panel.php?codice=#codice_gara#&codice_round=#codice_fase#","updateCig"=>"/backend/gare/anac/update.php"]; $return["concorsi"] = ["link"=>"/backend/concorsi/panel.php?codice=#codice_gara#&codice_round=#codice_fase#","updateCig"=>"/backend/concorsi/anac/update.php"]; return $return; } public function saveRelazione($modulo,$codice_gara,$codice_lotto,$lotto_simog) { return self::staticSaveRelazione($modulo,$codice_gara,$codice_lotto,$this->info["codice"],$lotto_simog); } public static function staticSaveRelazione($modulo,$codice_gara,$codice_lotto,$codice_simog,$lotto_simog) { $relazioniDisponibili = self::relazioniDisponibili(); if (!empty($relazioniDisponibili[$modulo])) { $relazione = []; $relazione["modulo"] = $modulo; $relazione["codice_gara"] = $codice_gara; $relazione["codice_lotto"] = $codice_lotto; $relazione["gara_simog"] = $codice_simog; $relazione["lotto_simog"] = $lotto_simog; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "r_simog_moduli"; $salva->operazione = "INSERT"; $salva->oggetto = $relazione; $codice = $salva->save(); if (!empty($codice)) { return true; } } } public function updateRelazioni($codice_lotto) { $relazioni = $this->getRelazioni($codice_lotto); if (!empty($relazioni)) { $relazioniDisponibili = self::relazioniDisponibili(); $lotto = $this->getLotti($codice_lotto)[0] ?? false; if (!empty($lotto)) { global $root; foreach($relazioni AS $relazione) { if (!empty($relazioniDisponibili[$relazione["modulo"]]["updateCig"])) { include($root.$relazioniDisponibili[$relazione["modulo"]]["updateCig"]); } } } } } public static function labels190() { $labels = []; $labels["190data_inizio"] = "Data inizio contratto"; $labels["190data_fine"] = "Data fine contratto"; $labels["190importoAggiudicato"] = "Importo aggiudicato"; $labels["190liquidazioni"] = "Importo liquidato"; $labels["partecipanti"] = "Partecipanti"; $labels["aggiudicatari"] = "Aggiudicatari"; return $labels; } public function check190Lotto($lotto) { $missing = []; if (empty($lotto["190data_inizio"])) { $missing[] = "190data_inizio"; } if (empty($lotto["190data_fine"])) { $missing[] = "190data_fine"; } if (empty($lotto["190importoAggiudicato"])) { $missing[] = "190importoAggiudicato"; } if (empty($lotto["190liquidazioni"])) { $missing[] = "190liquidazioni"; } if (empty($this->checksPDO["partecipanti"])) { $this->checksPDO["partecipanti"] = $this->db->prepare("SELECT codice FROM r_partecipanti_simog WHERE codice_lotto = :lotto"); $this->checksPDO["aggiudicatari"] = $this->db->prepare("SELECT codice FROM r_partecipanti_simog WHERE codice_lotto = :lotto AND aggiudicatario = 'S'"); } $this->checksPDO["partecipanti"]->bindValue(":lotto",$lotto["codice"]); $this->checksPDO["partecipanti"]->execute(); if (empty($this->checksPDO["partecipanti"]->rowCount())) { $missing[] = "partecipanti"; } $this->checksPDO["aggiudicatari"]->bindValue(":lotto",$lotto["codice"]); $this->checksPDO["aggiudicatari"]->execute(); if (empty($this->checksPDO["aggiudicatari"]->rowCount())) { $missing[] = "aggiudicatari"; } return $missing; } public function addRequisitiObbligatori() { if (empty($this->getDati()["requisiti"])) { $requisiti = self::getListeSIMOG("CodRequisitoType",$this->info["data_invio_simog"]) ?? false; if (!empty($requisiti)) { foreach($requisiti AS $id => $descr) { if (strpos($descr,"OBBLIGATORIO") !== FALSE) { $requisito = []; $requisito["codice_dettaglio"] = $id; $requisito["descrizione"] = ""; $requisito["valore"] = ""; $requisito["flag_esclusione"] = "S"; $requisito["flag_comprova_offerta"] = "N"; $requisito["flag_avvalimento"] = "N"; $requisito["flag_bando_tipo"] = "N"; $requisito["flag_riservatezza"] = "N"; $requisito["DOCUMENTO"] = []; $requisito["CIG"] = []; $this->saveRequisito($requisito); } } } } } public function saveRequisito($requisito) { $dati = $this->getDati(); $requisiti = $dati["requisiti"] ?? []; if (empty($requisito["codice_dettaglio"]) && !empty($requisito["hidden_codice_dettaglio"])) { $requisito["codice_dettaglio"] = $requisito["hidden_codice_dettaglio"]; } if (!empty($requisito["codice_dettaglio"])) { $id = $requisito["codice_dettaglio"]; $requisiti[$id] = $requisito; $dati["requisiti"] = $requisiti; $update = []; $update["codice"] = $this->info["codice"]; $this->info["dati"] = $update["dati"] = json_encode($dati); $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_simog"; $salva->operazione = "UPDATE"; $salva->oggetto = $update; $codice = $salva->save(); if ($codice === $this->info["codice"]) { $this->updateSimogLog("inviaRequisiti",2,__("Non sincronizzato")); return true; } } return false; } public function deleteRequisito($idRequisito) { $dati = $this->getDati(); $requisito = self::getListeSIMOG("CodRequisitoType",$this->info["data_invio_simog"])[$idRequisito] ?? false; if (!empty($requisito)) { if (strpos($requisito,"OBBLIGATORIO") === FALSE) { if (isset($dati["requisiti"][$idRequisito])) { unset($dati["requisiti"][$idRequisito]); } $update = []; $update["codice"] = $this->info["codice"]; $this->info["dati"] = $update["dati"] = json_encode($dati); $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_simog"; $salva->operazione = "UPDATE"; $salva->oggetto = $update; $codice = $salva->save(); if ($codice === $this->info["codice"]) { return true; } } } return false; } public function printLoginButton() { $path = __DIR__."/views/login-button.php"; if (file_exists($path)) { include($path); return true; } return false; } public function createFromSIMOG($response,$anno,$codice_ente,$smart) { $return = false; $path = self::getVersionPath($this->version); if (!empty($path)) { $path .= "/script/updateFromSIMOG.php"; if (file_exists($path)) { $operation = "create"; include($path); } } return $return; } public function getRequestArray($method,$codice_lotto=0) { $return = false; $path = self::getVersionPath($this->version); if (!empty($path)) { if (strpos($method,".") === false) { $path .= "/script/{$method}.php"; if (file_exists($path)) { $operation = "get"; include($path); } } } return $return; } public function manageResponse($response,$method,$codice_lotto=0,$massive = false) { $return = false; $path = self::getVersionPath($this->version); if (!empty($path)) { if (strpos($method,".") === false) { $path .= "/script/{$method}.php"; if (file_exists($path)) { $operation = "put"; include($path); if (!empty($this->info["codice"])) { $this->getManagerRegistro()->addToLog("SIMOG",$method,$codice_lotto); } } } } return $return; } public function saveGara($post) { $return = false; $path = self::getVersionPath($this->version); if (!empty($path)) { $path .= "/script/saveGara.php"; if (file_exists($path)) { include($path); if (!empty($return["codice"])) { $this->getManagerRegistro()->addToLog("SAVE",__("Dati gara")); if (empty($post["codice"])) { if ($this->modulo != "anac") { $utenti = ente::getUtentiFromModulo($this->modulo,$_SESSION["ente"]->codice,"",$return["codice"]); } else { $utenti = []; } if ($_SESSION["utente"]->gerarchia > 15) { $utenti[] = $_SESSION["utente"]->codice; } if (!empty($utenti)) { foreach($utenti AS $utente) { $permesso = []; $permesso["sezione"] = "anac"; $permesso["codice_elemento"] = $this->info["codice"]; $permesso["codice_gestore"] = $_SESSION["ente"]->codice; $permesso["funzione"] = "0"; $permesso["codice_utente"] = $utente; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "r_permessi"; $salva->operazione = "INSERT"; $salva->oggetto = $permesso; $salva->save(); } } } } } } return $return; } public function saveLotto($lotto,$saveDati = false, bool $force = false) { $return = false; $path = self::getVersionPath($this->version); if (!empty($path)) { $path .= "/script/saveLotto.php"; if (file_exists($path)) { include($path); $this->getManagerRegistro()->addToLog("SAVE",__("Dati lotto"),$lotto["codice"] ?? 0); } } return $return; } public function savePresaInCarico($post) { $return = false; $path = self::getVersionPath($this->version); if (!empty($path)) { $path .= "/script/savePresaInCarico.php"; if (file_exists($path)) { include($path); } } return $return; } public function savePubblica($post) { $return = false; $path = self::getVersionPath($this->version); if (!empty($path)) { $path .= "/script/savePubblica.php"; if (file_exists($path)) { include($path); $this->getManagerRegistro()->addToLog("SAVE",__("Dati pubblicazione")); } } return $return; } public function getManagerRegistro() { return new registriManager("anac",$this->info["codice"]); } public function addToLog($operazione,$oggetto) { return $this->getManagerRegistro()->addToLog($operazione,$oggetto,$this->info["codice"]); } public function getLog($start=0,$length=-1) { return $this->getManagerRegistro()->getLog($start,$length); } public function getLastSimogLog($method,$codice_lotto = 0) { return $this->db->go("SELECT codice,esito,msg FROM b_simog_log WHERE codice_simog = :simog AND metodo = :method AND codice_lotto = :codice_lotto ORDER BY codice DESC LIMIT 0,1", [":simog"=>$this->info["codice"],":method"=>$method,":codice_lotto"=>$codice_lotto])->fetch(PDO::FETCH_ASSOC) ?? FALSE; } public function updateSimogLog($method,$esito,$msg,$codice_lotto = 0) { $log = $this->getLastSimogLog($method,$codice_lotto); if (!empty($log)) { $log["esito"] = $esito; $log["msg"] = $msg; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_simog_log"; $salva->operazione = "UPDATE"; $salva->oggetto = $log; $salva->save(); } } public function getDati() { $return = json_decode($this->info["dati"],true); if (isset($return["importo"]) && $return["importo"] > 0) { $return["importo"] = number_format($return["importo"],2,".",""); } return $return; } public static function getStati() { return jsonToArray(__DIR__."/stati.json"); } public static function getStatiSchede() { return jsonToArray(__DIR__."/statiSchede.json"); } public static function getListeSIMOG($type,$data="") { $return = []; $version = self::getVersion($data); $path = self::getVersionPath($version); if (!empty($path)) { $path .= "/data/liste-simog.xml"; if (file_exists($path)) { $schema = simplexml_load_file($path); $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 (strpos($selects[$select["@name"]][$value["@value"]],"***") !== false) { $selects[$select["@name"]][$value["@value"]] = substr($selects[$select["@name"]][$value["@value"]],0,strpos($selects[$select["@name"]][$value["@value"]],"***")); } } } if (count($selects) > 0) { $return = $selects; } } } } if (!empty($return[$type])) { return $return[$type]; } else { return false; } } public function showDateInvito() { $procedureInvito = self::getOptions("procedure_invito"); if (!empty($procedureInvito)) { $lotti = $this->getLotti(); foreach($lotti as $lotto) { if (in_array($lotto["id_scelta_contraente"],$procedureInvito)) { return true; } } } return false; } public function ignoreDateScadenza() { $procedureInvito = self::getOptions("procedure_no_scadenza"); if (!empty($procedureInvito)) { $lotti = $this->getLotti(); foreach($lotti as $lotto) { if (in_array($lotto["id_scelta_contraente"],$procedureInvito)) { return true; } } } return false; } public static function getOptions($type,$data="") { $return = []; if (strpos($type,".") === false) { $version = self::getVersion($data); $path = self::getVersionPath($version); if (empty($data)) { $data = time(); } else { $data = strtotime($data); } if (!empty($path)) { $path .= "/data/{$type}.json"; if (file_exists($path)) { $options = jsonToArray($path); if (!empty($options)) { foreach($options AS $key => $opt) { if (is_array($opt)) { $insert = true; if (!empty($opt["scadenza"])) { if (strtotime($opt["scadenza"]) < $data) { $insert = false; } } if ($insert) { $return[$key] = $opt["titolo"]; } } else { $return[$key] = $opt; } } } } } } if (empty($return)) { $return = false; } return $return; } public function getLotti($codice = null) { $bind = [":codice_simog"=>$this->info["codice"]]; $sql = "SELECT * FROM b_simog_lotti WHERE codice_simog = :codice_simog AND eliminato = 'N' "; if ($codice !== null) { $bind[":codice"] = $codice; $sql .= " AND codice = :codice "; } return $this->db->go($sql . " ORDER BY ordinamento, codice",$bind)->fetchAll(PDO::FETCH_ASSOC); } public function getRaggruppamento($lotto,$partecipante) { $bind = [":codice_lotto"=>$lotto,":codice_partecipante"=>$partecipante]; $sql = "SELECT r_raggruppamenti_simog.* FROM r_raggruppamenti_simog JOIN r_partecipanti_simog ON r_raggruppamenti_simog.codice_padre = r_partecipanti_simog.codice WHERE r_partecipanti_simog.codice_lotto = :codice_lotto AND r_partecipanti_simog.codice = :codice_partecipante "; $return = $this->db->go($sql,$bind)->fetchAll(PDO::FETCH_ASSOC); return $return; } public function savePartecipante($partecipante,$codice_lotto) { if (!empty($this->getLotti($codice_lotto)[0])) { return self::staticSavePartecipante($partecipante,$codice_lotto); } } private static function staticSavePartecipante($partecipante,$codice_lotto) { global $pdo; $partecipante["ruolo"] = (!empty($partecipante["raggruppamento"])) ? "04-CAPOGRUPPO" : ""; $partecipante["codice_lotto"] = $codice_lotto; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "r_partecipanti_simog"; $salva->operazione = empty($partecipante["codice"]) ? "INSERT" : "UPDATE"; $salva->oggetto = $partecipante; $codice = $salva->save(); if ($codice > 0) { $pdo->go("DELETE FROM r_raggruppamenti_simog WHERE codice_padre = :codice",[":codice"=>$codice]); if (!empty($partecipante["raggruppamento"])) { foreach($partecipante["raggruppamento"] AS $sub) { $sub["codice_padre"] = $codice; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "r_raggruppamenti_simog"; $salva->operazione = "INSERT"; $salva->oggetto = $sub; $salva->save(); } } return true; } return false; } public function getPartecipantiLotto($codice_lotto) { if (!empty($this->getLotti($codice_lotto)[0])) { $sql = "SELECT * FROM r_partecipanti_simog WHERE r_partecipanti_simog.codice_lotto = :codice_lotto "; $ooee = $this->db->go($sql,[":codice_lotto"=>$codice_lotto])->fetchAll(PDO::FETCH_ASSOC); $return = []; foreach($ooee AS $oe) { $raggruppamento = $this->getRaggruppamento($codice_lotto,$oe["codice"]); if (!empty($raggruppamento)) { $oe["raggruppamento"] = $raggruppamento; } $return[] = $oe; } return $return; } return false; } public static function init($codice) { if (!empty($codice) && !empty($_SESSION["utente"]) && !empty($_SESSION["ente"])) { global $pdo; $bind = [":codice"=>$codice,":codice_gestore"=>$_SESSION["ente"]->codice]; $sql = "SELECT * FROM b_simog WHERE codice = :codice AND codice_gestore = :codice_gestore"; if (!$_SESSION["utente"]->fromHere()) { $sql .= " AND codice_ente = :codice_ente"; $bind[":codice_ente"] = $_SESSION["utente"]->codice_ente; } if ($_SESSION["utente"]->gerarchia > 10) { $ids = Utente::getPermissionsInModulo($_SESSION["ente"]->codice,$_SESSION["utente"]->codice,"anac"); $ids = implode(",",$ids); $sql .= " AND b_simog.codice IN ({$ids}) "; } $anac = $pdo->go($sql,$bind)->fetch(PDO::FETCH_ASSOC); if (!empty($anac)) { $continua = true; if ($_SESSION["utente"]->codice_ente != $anac["codice_gestore"] && $_SESSION["utente"]->codice_ente != $anac["codice_ente"] && $_SESSION["utente"]->gerarchia > 9) { $continua = false; } if ($continua) { $instance = new anac(); $instance->info = $anac; $instance->version = self::getVersion($anac["data_invio_simog"]); return $instance; } } } return false; } private static function defaultAutenticationLevel() { return $_SESSION["ente"]->defaultAutenticationLevel(); } public function checkLock($id_cmd) { $return = true; $stato = $this->info["stato"] ?? 0; if ($_SESSION["utente"]->readOnly) { return true; } else { if (($stato >= 0) && !empty($id_cmd) && $_SESSION["utente"]->unlockSupporto()) { $cmd = self::getInfoModulo($id_cmd); $loa = $cmd["authenticationLevel"] ?? self::defaultAutenticationLevel(); if ($_SESSION["utente"]->authenticationLevel < $loa) { return true; } if ($cmd !== false) { if (($stato >= $cmd["stato_minimo"] || $cmd["stato_minimo"] == null) && ($stato <= $cmd["stato_massimo"] || $cmd["stato_massimo"] === null)) { $return = false; } } } } return $return; } public function saveCUI($lotto,$cui) { $dati = $this->getLotti($lotto)[0]["dati"] ?? []; if (!empty($dati)) { $dati = json_decode($dati,true); if (empty($dati["cui"])) { $dati["cui"] = []; } $lastCui = end($dati["cui"]); $dati["cui"][] = $cui; $dati = json_encode($dati); $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_simog_lotti"; $salva->operazione = "UPDATE"; $salva->oggetto = ["codice"=>$lotto,"dati"=>$dati]; if (!empty($salva->save())) { if (empty($lastCui)) { $cui = explode("-",$cui); $cui = $cui[0]; $this->db->go("UPDATE b_simog_schede SET cui = :cui WHERE codice_lotto = :lotto",[":lotto"=>$lotto,":cui"=>$cui]); } } } } public function sezioneFromRuolo($ruolo) { $path = self::getVersionPath($this->version); if (!empty($path)) { $path .= "/data/ruoliSezioni.json"; if (file_exists($path)) { $return = jsonToArray($path); return $return[$ruolo] ?? false; } } return false; } public function setScheda($tipologia,$data) { $fields = $this->getFieldsScheda($tipologia); $array = []; foreach($fields AS $idCampo => $info) { if ($info["insert"]) { if(isset($data[$idCampo])) { if (!empty($info["subElement"])) { $array[$info["subElement"]][$idCampo] = $data[$idCampo]; } else { if ($tipologia != "varianti") { $array[$idCampo] = $data[$idCampo]; } else { $array["Variante"][$idCampo] = $data[$idCampo]; } } } if ((!isset($array[$idCampo]) || $array[$idCampo] == "") && isset($info["default"])) { $array[$idCampo] = $info["default"]; } } } return $array; } public function getLastCUI($lotto,$full = false) { $return = 0; $lottoDB = $this->getLotti($lotto)[0] ?? []; if (!empty($lottoDB)) { $dati = json_decode($lottoDB["dati"],true); if (!empty($dati["cui"])) { $return = end($dati["cui"]); if (!$full) { $return = explode("-",$return); $return = $return[1]; } } } return $return; } public function getSchede($lotto,$type = null) { $codice_cui = $this->getLastCUI($lotto); $return = false; if ($codice_cui !== false) { $bind = array(":codice_lotto"=>$lotto,":cui"=>$codice_cui); $sql = "SELECT * FROM b_simog_schede WHERE cui = :cui AND codice_lotto = :codice_lotto AND codice NOT IN (SELECT codice_padre FROM b_simog_schede) "; if (!empty($type)) { $bind[":type"] = $type; $sql .= " AND tipologia= :type "; } $risultato = $this->db->go($sql,$bind); if ($risultato->rowCount() > 0) { $tmp = $risultato->fetchAll(PDO::FETCH_ASSOC); foreach($tmp AS $scheda) { if ($scheda["stato"] <= 97) { if (!is_array($return)) { $return = array(); } $scheda["json"] = json_decode($scheda["json"],true); $return[] = $scheda; } } } } return $return; } public static function getAppaloType(array $lotto) : string { $appaltoType=""; if (!empty($lotto["dati"]["flag_escluso"]) && $lotto["dati"]["flag_escluso"] == "S") { $appaltoType = "Escluso"; } else if (!empty($lotto["dati"]["cig_acc_quadro"])) { $appaltoType = "Adesione"; } else { $appaltoType = "Aggiudicazione"; } return $appaltoType; } public function getFieldsScheda($type) { $path = self::getVersionPath($this->version); if (!empty($path)) { $path .= "/data/schedeLoaderFields.json"; if (file_exists($path)) { $return = jsonToArray($path); if (!empty($return[$type])) { return $return[$type]; } } } return false; } public function saveSchede($lotto,$schede,$tipologia,$stato) { $errori = []; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_simog_schede"; $salva->operazione = "INSERT"; $codice_cui = $this->getLastCUI($lotto); $schede_inserite = $this->getSchede($lotto,$tipologia); if ($codice_cui !== false) { foreach($schede AS $id => $scheda) { $continua = true; $errori = []; if (!empty($scheda["id_locale"]) && !empty($schede_inserite)) { foreach($schede_inserite AS $existent) { if ($existent["id_locale"] == $scheda["id_locale"]) { $json = convertDate_SIMOG($scheda["json"]); $json = json_encode($json); if($json == $existent["json"] && ! in_array($existent["stato"], array(0, 5))) $continua = false; } } } if ($continua) { $scheda["codice_lotto"] = $lotto; $scheda["tipologia"] = $tipologia; $scheda["stato"] = $stato; $scheda["cui"] = $codice_cui; $scheda["codice_padre"] = (is_numeric($id)) ? $id : 0; $scheda["json"] = convertDate_SIMOG($scheda["json"]); if (!empty($scheda["json"]["ID_SCHEDA_SIMOG"])) { $scheda["response_id"] = $scheda["json"]["ID_SCHEDA_SIMOG"]; } if ($tipologia=="varianti" && !empty($scheda["json"]["Motivi"])) { $motivi = array(); foreach($scheda["json"]["Motivi"] AS $motivo) { $motivi[] = array("ID_MOTIVO_VAR"=>$motivo); } $scheda["json"]["Motivi"] = $motivi; } $scheda["json"] = json_encode($scheda["json"]); $salva->oggetto = $scheda; $codice = $salva->save(); if ($codice !== false) { if (empty($scheda["id_locale"])) { $salva->operazione = "UPDATE"; $salva->oggetto = array("codice"=>$codice,"id_locale"=>$codice); $codice = $salva->save(); $salva->operazione = "INSERT"; } if(in_array($scheda["tipologia"], array('finanziamenti', 'requisiti', 'comuni')) && $stato > 0) { $_exclude_codes = ""; $codici_padri = $this->db->go('SELECT codice_padre FROM b_simog_schede WHERE tipologia = "appalto" AND codice_lotto = :codice_lotto AND cui = :cui', array(':codice_lotto' => $scheda["codice_lotto"], ':cui' => $scheda["cui"]))->fetchAll(PDO::FETCH_COLUMN, 0); if(! empty($codici_padri)) $_exclude_codes = 'AND codice NOT IN ('.implode(',', $codici_padri).')'; $this->db->go('UPDATE b_simog_schede SET stato = 1 WHERE codice_lotto = :codice_lotto AND cui = :cui AND tipologia = "appalto" '.$_exclude_codes.' AND stato > 1 AND stato < 97',array(':codice_lotto' => $scheda["codice_lotto"], ':cui' => $scheda["cui"])); } } else { $errori[] = $id; } } } } else { $errori[] = __("CUI Sconosciuto"); } return $errori; } public function listSchede($lotto=null,$all=false) { $path = self::getVersionPath($this->version); $return = false; if (!empty($path)) { $path .= "/data/schedeLoader.json"; if (file_exists($path)) { $return = jsonToArray($path); if (!empty($return)) { if (!$all && !empty($lotto)) { $lotto = $this->getLotti($lotto)[0] ?? null; if (!empty($lotto)) { $lotto["dati"] = json_decode($lotto["dati"],true); $aggiudicata = false; $appaltoType=""; $datiComuni = $this->getSchede($lotto["codice"],"comuni"); if (!empty($datiComuni[0]) && $datiComuni[0]["stato"] == 3) { $json = $datiComuni[0]["json"] ?? null; if ($json["ESITO_PROCEDURA"]==="1") { $aggiudicata = true; } $tipologia_procedura = $datiComuni["TIPOLOGIA_PROCEDURA"] ?? 0; } $appaltoType = anac::getAppaloType($lotto); $tmp = $return; $return = []; foreach($tmp AS $id_scheda => $scheda) { if (!$scheda["aggiudicazione"] || ($scheda["aggiudicazione"] && $aggiudicata)) { if (empty($scheda["appalto"]) || (!empty($scheda["appalto"]) && in_array($appaltoType,$scheda["appalto"])!== false)) { $return[$id_scheda] = $scheda; } } } } } } } } return $return; } static function getModuli($smart="N",$stato = null) { global $config; $moduli = jsonToArray($config["jsonFolder"]."/anac-panel.json"); $tmp = []; foreach($moduli AS $id_modulo => $modulo) { $insert = true; if (!$modulo["smart"]) { if ($smart == "S") $insert = false; } if ($insert && $stato !== null) { if ($modulo["stato_minimo"] > $stato) { $insert = false; } } if (is_array($modulo["stati_esclusi"]) && in_array($stato,$modulo["stati_esclusi"]) !== false) { $insert = false; } if ($insert)$tmp[$id_modulo] = $modulo; $moduli = $tmp; } return $moduli; } static function getInfoModulo($radice) { $return = false; if (!empty($radice)) { $moduli = self::getModuli(false); if (!empty($moduli[$radice])) { $return = $moduli[$radice]; $return["id"] = $radice; $return["titolo"] = __($return["titolo"]); $return["descrizione"] = __($return["descrizione"]); } } return $return; } static function massiveImport($ente,$anno_riferimento,$lotti) { global $pdo; $errors = []; $ris_check_lotto = $pdo->prepare("SELECT b_simog_lotti.codice FROM b_simog_lotti JOIN b_simog ON b_simog_lotti.codice_simog = b_simog.codice WHERE b_simog_lotti.cig = :cig AND b_simog.codice_gestore = :codice_ente "); $ris_check_lotto->bindValue(':codice_ente',$ente); $ris_insert_simog = $pdo->prepare("INSERT INTO b_simog (codice_ente,codice_gestore,stato,smart_cig,oggetto,anno_riferimento,utente_modifica) VALUES (:codice_ente,:codice_ente,0,:smart_cig,:oggetto,:anno,:utente_modifica)"); $delete_simog = $pdo->prepare("INSERT INTO b_simog (codice_ente,codice_gestore,stato,smart_cig,oggetto,anno_riferimento,utente_modifica) VALUES (:codice_ente,:codice_ente,0,:smart_cig,:oggetto,:anno,:utente_modifica)"); $ris_insert_simog->bindValue(':anno',$anno_riferimento); $ris_insert_simog->bindValue(':codice_ente',$ente); $ris_insert_simog->bindValue(':utente_modifica',$_SESSION["utente"]->codice); $ris_insert_lotto_simog = $pdo->prepare("INSERT INTO b_simog_lotti (codice_simog,cig,id_scelta_contraente,oggetto,190data_inizio,190data_fine,190importoAggiudicato,190liquidazioni,utente_modifica) VALUES (:codice_simog,:cig,:id_scelta_contraente,:oggetto,:190data_inizio,:190data_fine,:190importoAggiudicato,:190liquidazioni,:utente_modifica)"); $ris_insert_lotto_simog->bindValue(':utente_modifica',$_SESSION["utente"]->codice); $ris_insert_partecipanti = $pdo->prepare("INSERT INTO r_partecipanti_simog (codice_lotto,codice_fiscale,ragione_sociale,stato,aggiudicatario,utente_modifica) VALUES (:codice_lotto,:codice_fiscale,:ragione_sociale,:stato,:aggiudicatario,:utente_modifica)"); $ris_insert_partecipanti->bindValue(':utente_modifica',$_SESSION["utente"]->codice); $ris_insert_raggruppamento = $pdo->prepare("INSERT INTO r_raggruppamenti_simog (codice_padre,codice_fiscale_impresa,ragione_sociale,stato,ruolo,utente_modifica) VALUES (:codice_padre,:codice_fiscale,:ragione_sociale,:stato,:ruolo,:utente_modifica)"); $ris_insert_raggruppamento->bindValue(':utente_modifica',$_SESSION["utente"]->codice); foreach($lotti AS $lotto) { if (isset($lotto["cig"])) { $smart = (is_numeric(substr($lotto["cig"], 0, 1))) ? "N" : "S"; $ris_check_lotto->bindValue(":cig",$lotto["cig"]); $ris_check_lotto->execute(); if ($ris_check_lotto->rowCount() == 0 || str_replace("0","",$lotto["cig"]) == "") { $lotto_simog = []; if ($smart == "S") { $source = "raccordoSmart190.json"; } else { $source = "raccordoRegular190.json"; } $lotto["id_scelta_contraente"] = ""; if (!empty($source)) { $version = self::getVersion(); $path = self::getVersionPath($version); if (!empty($path)) { $path .= "/data/{$source}"; if (file_exists($path)) { $options = jsonToArray($path); if (!empty($options)) { foreach($options AS $id => $value) { $value = strtolower(preg_replace("/[^A-Za-z0-9]/", '', $value)); $current = strtolower(preg_replace("/[^A-Za-z0-9]/", '', $lotto["sceltaContraente"])); if ($value == $current) { $lotto["id_scelta_contraente"] = $id; break; } } } } } } if (!empty($lotto["id_scelta_contraente"])) { $ris_insert_simog->bindValue(':smart_cig',$smart); $ris_insert_simog->bindValue(':oggetto',$lotto["oggetto"]); $ris_insert_simog->execute(); $codice_simog = $pdo->lastInsertId(); $lotto_simog[':codice_simog'] = $codice_simog; $lotto_simog[':oggetto'] = $lotto["oggetto"]; $lotto_simog[':cig'] = $lotto["cig"]; $lotto_simog[':190data_inizio'] = null; $lotto_simog[':190data_fine'] = null; $lotto_simog[':190importoAggiudicato'] = null; $lotto_simog[':190liquidazioni'] = null; $lotto_simog[":id_scelta_contraente"] = $lotto["id_scelta_contraente"]; if (!empty($lotto["tempiCompletamento"]["dataInizio"])) { $lotto_simog[':190data_inizio'] = $lotto["tempiCompletamento"]["dataInizio"]; } if (!empty($lotto["tempiCompletamento"]["dataUltimazione"])) { $lotto_simog[':190data_fine'] = $lotto["tempiCompletamento"]["dataUltimazione"]; } if (!empty($lotto["importoAggiudicazione"])) { $lotto_simog[':190importoAggiudicato'] = $lotto["importoAggiudicazione"]; } if (!empty($lotto["importoSommeLiquidate"])) { $lotto_simog[':190liquidazioni'] = $lotto["importoSommeLiquidate"]; } foreach($lotto_simog AS $chiave => $valore) $ris_insert_lotto_simog->bindValue($chiave,$valore); $ris_insert_lotto_simog->execute(); $codice_lotto = $pdo->lastInsertId(); if (!empty($lotto["partecipanti"])) { $aggiudicatari = []; if (isset($lotto["aggiudicatari"])) { if (isset($lotto["aggiudicatari"]["aggiudicatario"])) { $tmp_aggiudicatari = $lotto["aggiudicatari"]["aggiudicatario"]; if (isset($tmp_aggiudicatari["ragioneSociale"])) { $tmp_aggiudicatari = [$tmp_aggiudicatari]; } foreach($tmp_aggiudicatari AS $tmp_agg) { if (isset($tmp_agg["codiceFiscale"])) { $aggiudicatari[] = $tmp_agg["codiceFiscale"]; } else if (isset($tmp_agg["identificativoFiscaleEstero"])) { $aggiudicatari[] = $tmp_agg["identificativoFiscaleEstero"]; } } } if (isset($lotto["aggiudicatari"]["aggiudicatarioRaggruppamento"])) { $tmp_aggiudicatari = $lotto["aggiudicatari"]["aggiudicatarioRaggruppamento"]; if (isset($tmp_aggiudicatari["membro"])) { $tmp_aggiudicatari = [$tmp_aggiudicatari]; } foreach($tmp_aggiudicatari AS $tmp_gruop) { foreach($tmp_gruop["membro"] AS $tmp_agg) { if (isset($tmp_agg["codiceFiscale"])) { $aggiudicatari[] = $tmp_agg["codiceFiscale"]; } else if (isset($tmp_agg["identificativoFiscaleEstero"])) { $aggiudicatari[] = $tmp_agg["identificativoFiscaleEstero"]; } } } } } if (isset($lotto["partecipanti"]["partecipante"])) { $partecipanti = $lotto["partecipanti"]["partecipante"]; if (isset($partecipanti["ragioneSociale"])) { $partecipanti = [$partecipanti]; } foreach($partecipanti AS $partecipante) { if (!empty($partecipante["codiceFiscale"]) || !empty($partecipante["identificativoFiscaleEstero"])) { $codice_partecipante = 0; $primo = "N"; $stato = "IT"; $ris_insert_partecipanti->bindValue(':codice_lotto',$codice_lotto); if (isset($partecipante["codiceFiscale"])) { $ris_insert_partecipanti->bindValue(':codice_fiscale',$partecipante["codiceFiscale"]); if (in_array($partecipante["codiceFiscale"], $aggiudicatari) !== false) { $primo = "S"; } } else { $ris_insert_partecipanti->bindValue(':codice_fiscale',""); } if (isset($partecipante["identificativoFiscaleEstero"])) { $stato = "EE"; $ris_insert_partecipanti->bindValue(':codice_fiscale',$partecipante["identificativoFiscaleEstero"]); if (in_array($partecipante["identificativoFiscaleEstero"], $aggiudicatari) !== false) { $primo = "S"; } } $ris_insert_partecipanti->bindValue(':ragione_sociale',$partecipante["ragioneSociale"]); $ris_insert_partecipanti->bindValue(':stato',$stato); $ris_insert_partecipanti->bindValue(':aggiudicatario',$primo); $ris_insert_partecipanti->execute(); } } } if (isset($lotto["partecipanti"]["raggruppamento"])) { $raggruppamenti = $lotto["partecipanti"]["raggruppamento"]; if (isset($raggruppamenti["membro"])) { $raggruppamenti = [$raggruppamenti]; } foreach($raggruppamenti AS $group) { foreach($group["membro"] AS $partecipante) { if (!empty($partecipante["codiceFiscale"]) || !empty($partecipante["identificativoFiscaleEstero"])) { if (isset($partecipante["ruolo"])) { if ($partecipante["ruolo"] == "04-CAPOGRUPPO") { $codice_padre = 0; } if (empty($codice_padre)) { $ris_insert = $ris_insert_partecipanti; $ris_insert->bindValue(':codice_lotto',$codice_lotto); } else { $ris_insert = $ris_insert_raggruppamento; $ris_insert->bindValue(':codice_padre',$codice_padre); $ris_insert->bindValue(':ruolo',$partecipante["ruolo"]); } $primo = "N"; $stato = "IT"; if (isset($partecipante["codiceFiscale"])) { $ris_insert->bindValue(':codice_fiscale',$partecipante["codiceFiscale"]); if (in_array($partecipante["codiceFiscale"], $aggiudicatari) !== false) { $primo = "S"; } } else { $ris_insert->bindValue(':codice_fiscale',""); } if (isset($partecipante["identificativoFiscaleEstero"])) { $stato = "EE"; $ris_insert->bindValue(':codice_fiscale',$partecipante["identificativoFiscaleEstero"]); if (in_array($partecipante["identificativoFiscaleEstero"], $aggiudicatari) !== false) { $primo = "S"; } } $ris_insert->bindValue(':ragione_sociale',$partecipante["ragioneSociale"]); if (empty($codice_padre)) { $ris_insert->bindValue(':aggiudicatario',$primo); } $ris_insert->bindValue(':stato',$stato); $ris_insert->execute(); if ($partecipante["ruolo"] == "04-CAPOGRUPPO") { $codice_padre = $pdo->lastInsertId(); } } } } } } } } else { $errors[] = $lotto["cig"] . ": " . __("Impossibile risalire alla scelta del contraente"); } } else { $errors[] = $lotto["cig"] . ": " . __("GiĆ  presente"); } } else { $errors[] = "Verificare XML"; break; } } return $errors; } public function printSuggerimenti($cig,$key) { $suggerimenti = $this->suggerimenti($cig); if (!empty($suggerimenti[$key])) { include(__DIR__."/views/suggerimenti.php"); } } public function printSuggerimentiMultipli($cig,$key) { $suggerimenti = $this->suggerimenti($cig); if (!empty($suggerimenti[$key])) { include(__DIR__."/views/suggerimentiMultipli.php"); } } public function printButtonSuggerimenti() { include __DIR__."/views/buttonSuggerimenti.php"; } private static function moduliSuggerimenti() { $moduli = []; $moduli["gare"] = ["titolo"=>"Gare e affidamenti","url"=>"/backend/gare/anac/suggestions.php","lost"=>"/backend/gare/anac/lost.php"]; $moduli["concorsi"] = ["titolo"=>"Concorsi","url"=>"/backend/concorsi/anac/suggestions.php","lost"=>"/backend/concorsi/anac/lost.php"]; $moduli["pcp"] = ["titolo"=>"PCP","url"=>"/backend/pcp/anac/suggestions.php","lost"=>"/backend/pcp/anac/lost.php"]; $moduli["stipula"] = ["titolo"=>"Stipula Contratti","url"=>"/backend/contratti/anac/suggestions.php","lost"=>"/backend/contratti/anac/lost.php"]; return $moduli; } public static function getProcedureMancanti(bool $bindLostElements = false) { $moduli = self::moduliSuggerimenti(); global $pdo; global $root; $return = []; if (!empty($moduli)) { if ($bindLostElements) { ini_set("max_execution_time",600); } $checkExistingLotto = $pdo->prepare("SELECT codice, codice_simog FROM b_simog_lotti WHERE cig = :cig"); foreach($moduli AS $idModulo => $data) { $_getProcedureMancantiAnac = true; if (!empty($data["lost"])) { $path = $root . $data["lost"]; if (file_exists($path)) { include($path); } } } } return $return; } public static function importazioneSuggerimenti190Lotto(array $lotto, bool $force = false): Int { $aggiornamenti = 0; if (!empty($lotto["cig"])) { $simog = self::init($lotto["codice_simog"]); $suggerimenti = $simog->suggerimenti($lotto["cig"]); if (!empty($suggerimenti)) { if (!empty($suggerimenti["190"])) { foreach($suggerimenti["190"] AS $suggerimento) { if (!empty($suggerimento["data"])) { foreach($suggerimento["data"] AS $key => $value) { if (!empty($value) && (empty($lotto[$key]) || $force)) { $aggiornamenti++; self::updateDati190($lotto["cig"],$key,$value); } } } } } if (!empty($suggerimenti["partecipanti"])) { foreach($suggerimenti["partecipanti"] AS $suggerimento) { $partecipantiSimog = $simog->getPartecipantiLotto($lotto["codice"]); if (!empty($suggerimento["data"])) { if (empty($partecipantiSimog) || $force) { $aggiornamenti++; self::updatePartecipanti190($lotto["cig"],$suggerimento["data"]); } else if (!empty($partecipantiSimog)) { foreach($suggerimento["data"] AS $partecipanteSuggestion) { $found = false; foreach($partecipantiSimog AS $partecipanteSimog) { if (strpos($partecipanteSimog["codice_fiscale"],$partecipanteSuggestion["codice_fiscale"]) !== false || strpos($partecipanteSuggestion["codice_fiscale"],$partecipanteSimog["codice_fiscale"]) !== false) { $found = true; $partecipanteSimog["aggiudicatario"] = $partecipanteSuggestion["aggiudicatario"]; self::staticSavePartecipante($partecipanteSimog,$lotto["codice"]); } } if (!$found) { self::staticSavePartecipante($partecipanteSuggestion,$lotto["codice"]); } } } } } } } } return $aggiornamenti; } public static function importazioneMassivaSuggerimenti190(int $anno = null,int $ente = null,bool $force=false) { global $pdo; $aggiornamenti = 0; $bind = []; $sql = "SELECT codice FROM b_simog WHERE codice > 0 "; if (!empty($anno)) { $sql .= " AND anno_riferimento = :anno"; $bind[":anno"] = $anno; } if (!empty($ente)) { $sql .= " AND codice_ente = :ente"; $bind[":ente"] = $ente; } $gare = $pdo->go($sql,$bind)->fetchAll(PDO::FETCH_COLUMN); if (!empty($gare)) { foreach($gare AS $gara) { $simog = self::init($gara); if (!empty($simog)) { $lotti = $simog->getLotti(); if (!empty($lotti)) { foreach($lotti AS $lotto) { $aggiornamenti += self::importazioneSuggerimenti190Lotto($lotto,$force); } } } } } return $aggiornamenti; } public function suggerimenti($cig) { $data = []; if (strlen($cig) == 10 && $cig != "0000000000") { global $root; $moduli = self::moduliSuggerimenti(); if (!empty($moduli)) { foreach($moduli AS $modulo => $info) { if (!empty($info["url"])) { if (file_exists($root.$info["url"])) { include($root.$info["url"]); } } } } } return $data; } public static function updatePartecipanti190($cig,$partecipanti) { global $pdo; $lotti = $pdo->go("SELECT b_simog_lotti.codice FROM b_simog_lotti JOIN b_simog ON b_simog_lotti.codice_simog = b_simog.codice WHERE b_simog_lotti.cig = :cig ",[":cig"=>$cig]); if ($lotti->rowCount() > 0) { $delete = $pdo->prepare("DELETE FROM r_partecipanti_simog WHERE codice_lotto = :lotto"); while($lotto = $lotti->fetch(PDO::FETCH_ASSOC)) { $lotto = $lotto["codice"]; $delete->bindValue(":lotto",$lotto); $delete->execute(); if (!empty($partecipanti)) { foreach($partecipanti AS $partecipante) { self::staticSavePartecipante($partecipante,$lotto); } } } } } public static function updateDati190($cig,$chiave,$valore) { global $pdo; $keys = ["190data_inizio","190data_fine","190importoAggiudicato","190liquidazioni"]; if (in_array($chiave,$keys) !== false) { $lotti = $pdo->go("SELECT b_simog_lotti.codice FROM b_simog_lotti JOIN b_simog ON b_simog_lotti.codice_simog = b_simog.codice WHERE b_simog_lotti.cig = :cig ",[":cig"=>$cig]); if ($lotti->rowCount() > 0) { while($lotto = $lotti->fetch(PDO::FETCH_ASSOC)) { if ($chiave == "190importoAggiudicato" || $chiave == "190liquidazioni") { $valore = number_format($valore,2,".",""); } $lotto[$chiave] = $valore; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_simog_lotti"; $salva->operazione = "UPDATE"; $salva->oggetto = $lotto; $salva->save(); } } } } }