info = null; $this->db = $pdo; } static function pannelli($filters = null) { $moduli = self::getModuli($filters); $tmp = []; foreach ($moduli as $modulo) { $tmp[] = $modulo["tipo"]; } $tmp = array_unique($tmp); if (!empty($tmp)) { $tipologie = []; global $config; $conf = jsonToArray($config["jsonFolder"] . "/progetti-tipologie.json"); foreach ($tmp as $tipo) { $tipologie[$tipo] = $conf[$tipo]; } return $tipologie; } else { return false; } } 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 getModuli($filters = null) { global $config; $moduli = jsonToArray($config["jsonFolder"] . "/progetti-panel.json"); $tmp = []; foreach ($moduli as $id_modulo => $modulo) { $insert = true; if (is_array($filters) && !empty($filters)) { foreach ($filters as $key => $value) { if ($modulo[$key] !== $value) { $insert = false; } } } if ($insert) { $tmp[$id_modulo] = $modulo; } $moduli = $tmp; } return $moduli; } private static function defaultAutenticationLevel() { return $_SESSION["ente"]->defaultAutenticationLevel(); } public function checkLock($id_cmd,$checkStato = null) { $return = false; $loa = self::defaultAutenticationLevel(); if ($_SESSION["utente"]->authenticationLevel < $loa) { return true; } return $return; } public function getManagerMonitoraggio() { if (empty($this->managerMonitoraggio)) { $manager = new mop($this); if (!empty($manager)) { $this->managerMonitoraggio = $manager; } } return $this->managerMonitoraggio; } public function getManagerIncarichi() { if (empty($this->managerIncarichi)) { $manager = new Incarichi("progetti", $this->info["codice"]); if (!empty($manager)) { $this->managerIncarichi = $manager; } } return $this->managerIncarichi; } public function getManagerRegistro() { return new registriManager("progetti", $this->info["codice"]); } public function addToLog($operazione, $oggetto) { return $this->getManagerRegistro()->addToLog($operazione, $oggetto); } public function getLog($start = 0, $length = -1) { return $this->getManagerRegistro()->getLog($start, $length); } public static function tipologie() { return [ "L" => "Lavori", "S" => "Servizi", "F" => "Forniture" ]; } public static function getImmobili($codice_ente = null,$codice = null) { $where = ""; $bind = []; if (!isset($codice_ente)) { if (!$_SESSION["utente"]->fromHere()) { $codice_ente = $_SESSION["utente"]->codice_ente; } } if (!empty($codice_ente)) { $bind[":codice_ente"] = $codice_ente; $where = " WHERE codice_ente = :codice_ente "; } if (!empty($codice)) { if (!empty($where)) { $where .= " AND "; } else { $where = " WHERE "; } $bind[":codice"] = $codice; $where .= " codice = :codice "; } global $pdo; $return = $pdo->go("SELECT * FROM b_progetti_immobili {$where} ORDER BY descrizione ASC ",$bind)->fetchAll(PDO::FETCH_ASSOC); if (!empty($codice)) { return $return[0]; } return $return; } public static function init($codice) { if (!empty($codice) && !empty($_SESSION["utente"]) && !empty($_SESSION["ente"])) { global $pdo; $bind = [":codice" => $codice]; $sql = "SELECT * FROM b_progetti WHERE codice = :codice "; if (!$_SESSION["utente"]->fromHere()) { $sql .= " AND codice_ente = :codice_ente"; $bind[":codice_ente"] = $_SESSION["utente"]->codice_ente; } $progetto = $pdo->go($sql, $bind)->fetch(PDO::FETCH_ASSOC); if (!empty($progetto)) { $instance = new progetto(); $instance->info = $progetto; return $instance; } } return false; } public function saveCIG($cig) { $continua = true; if (!empty($cig["codice"])) { $continua = false; if (!empty($this->getCIG(["codice"=>$cig["codice"]]))) { $continua = true; } } if ($continua) { $cig["codice_progetto"] = $this->info["codice"]; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_progetti_cig"; $salva->operazione = (empty($cig["codice"])) ? "INSERT" : "UPDATE"; $salva->oggetto = $cig; return $salva->save(); } } public static function save($data) { global $pdo; $return = false; $operazione_generale = $operazione = empty($data["codice"]) ? "INSERT" : "UPDATE"; $expect = ["codice", "cup", "oggetto", "anno", "descrizione","area","tipologia", "importo", "codice_ente", "utente_creazione", "timestamp_creazione"]; if ($operazione == "INSERT") { $data["utente_creazione"] = $_SESSION["utente"]->codice ?? -1; $data["timestamp_creazione"] = date('d/m/Y H:i:s'); } $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_progetti"; $salva->operazione = $operazione; $salva->oggetto = $data; $salva->expect = $expect; $codice = $salva->save(); if ($codice !== false) { $bind = array(":codice" => $codice); $strsql = "DELETE FROM r_cpv_progetti WHERE codice_progetto = :codice"; $pdo->go($strsql, $bind); scriviLog("r_cpv_progetti", "DELETE", $pdo->getSQL()); if (!empty($data["cpv"])) { $data["cpv"] = array_unique($data["cpv"]); foreach ($data["cpv"] as $codice_categoria) { if ($codice_categoria != "") { $bind = array(":codice" => $codice, ":codice_categoria" => $codice_categoria, ":codice_utente" => $_SESSION["utente"]->codice); $strsql = "INSERT INTO r_cpv_progetti (codice_progetto,codice,utente_modifica) VALUES (:codice,:codice_categoria,:codice_utente)"; $pdo->go($strsql, $bind); scriviLog("r_cpv_progetti", "INSERT", $pdo->getSQL()); } } } if ($operazione_generale == "INSERT") { if ($_SESSION["utente"]->gerarchia > 15) { $utenti = [$_SESSION["utente"]->codice]; } if (!empty($utenti)) { foreach ($utenti as $utente) { $permesso = []; $permesso["sezione"] = "progetti"; $permesso["codice_elemento"] = $codice; $permesso["funzione"] = "0"; $permesso["codice_gestore"] = $_SESSION["ente"]->codice; $permesso["codice_utente"] = $utente; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "r_permessi"; $salva->operazione = "INSERT"; $salva->oggetto = $permesso; $salva->save(); } } } $return = progetto::init($codice); if (empty($return)) { $return = -1; if ($operazione == "INSERT") { $pdo->go("DELETE FROM b_progetti WHERE codice = :codice", [":codice" => $codice]); } } else { $return->addToLog($operazione_generale, "Dati generali"); } } return $return; } public function dichiaraIncompiuta() { $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_progetti"; $salva->operazione = "UPDATE"; $salva->oggetto = ["codice"=>$this->info["codice"],"stato_programmazione"=>"I"]; $codice = $salva->save(); if ($codice !== false) { return true; } return false; } public function nonRiproposto() { $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_progetti"; $salva->operazione = "UPDATE"; $salva->oggetto = ["codice"=>$this->info["codice"],"stato_programmazione"=>"A"]; $codice = $salva->save(); if ($codice !== false) { return true; } return false; } public function getDotazione($codice = null) { return self::getDotazioneProgetto($this->info["codice"],["codice"=>$codice]); } public function getCIG($filtri = null) { $bind = [":progetto"=>$this->info["codice"]]; $filters = ""; if (!empty($filtri["codice"])) { $filters .= " AND codice = :codice "; $bind[":codice"] = $filtri["codice"]; } if (!empty($filtri["cig"])) { $filters .= " AND cig = :cig "; $bind[":cig"] = $filtri["cig"]; } return $this->db->go("SELECT * FROM b_progetti_cig WHERE codice_progetto = :progetto {$filters} ORDER BY codice",$bind)->fetchAll(PDO::FETCH_ASSOC); } public static function evaluateStepCIG($procedura) { $previsti = progetto::getOpzioni("monitoraggio","tipoProcedureAggiudicazione")[$procedura["procedura"]]["step"] ?? null; $status = "danger"; if (!empty($procedura["step"]) && !empty($previsti)) { $procedura["step"] = json_decode($procedura["step"],true); $status = "success"; $previsti = array_keys($previsti); foreach($previsti AS $idStep) { if (empty($procedura["step"][$idStep]["prevista"])) { $status = "warning"; } } } return $status; } public static function getOpzioni($contesto,$source,$version = null) { $path = ""; if (preg_match('/^[a-zA-Z0-9]+$/', $source)) { if ($contesto == "monitoraggio") { if (empty($version)) { $version = "latest"; } $path = __DIR__ . "/ws/monitoraggio/sources/{$version}/"; } else if ($contesto == "programmazione") { if (empty($version)) { $version = "latest"; } $path = __DIR__ . "/ws/programmazione/sources/{$version}/"; } else if ($contesto == "cup") { if (empty($version)) { $version = "latest"; } $path = __DIR__ . "/ws/cup/sources/{$version}/"; } if (!empty($path)) { $path .= $source . ".json"; if (file_exists($path)) { return jsonToArray($path); } } } } public static function availableInfoTypes() { return ["select","text","settore-cup","nuts","localizzazione-istat","textarea","geolocalizzazione","quadro-economico","advanced","iter-progetto"]; } public static function getKeyInfo($keyName) { $dictionary = jsonToArray(__DIR__."/utilities/info/dictionary.json"); $return = $dictionary[$keyName] ?? null; if (!empty($return)) { $return["key"] = $keyName; return $return; } } public function printForm($keyName) { $keyInfo = self::getKeyInfo($keyName); $values = $this->getInfo($keyName); include (__DIR__."/utilities/info/form-card.php"); } public function printFormWithKeys($keys) { foreach($keys AS $key) { $this->printForm($key); } } public function saveInfo($keyName,$data) { $keyInfo = self::getKeyInfo($keyName); if (!empty($keyInfo)) { $codici = []; if (!empty($data)) { $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_progetti_info"; foreach($data AS $codice => $value) { $input = []; $input["codice_progetto"] = $this->info["codice"]; $input["key"] = $keyName; $input["codice"] = (is_numeric($codice)) ? $codice : null; if (is_array($value)) { $value = json_encode($value); } $input["value"] = $value; $salva->operazione = (empty($input["codice"])) ? "INSERT" : "UPDATE"; $salva->oggetto = $input; $codice = $salva->save(); if ($codice !== false) { $codici[] = $codice; } } } $bind = [":progetto"=>$this->info["codice"], ":keyName" => $keyName]; $this->db->go("DELETE FROM b_progetti_info WHERE b_progetti_info.codice_progetto = :progetto AND b_progetti_info.key = :keyName AND codice NOT IN (" . implode(",",$codici) . ")",$bind); scriviLog("b_progetti_info","DELETE",$this->db->getSQL()); } } public function getInfo($keyName) { return self::getInfoProgetto($this->info["codice"],$keyName); } public function getCategorieMerceologiche() { return self::getCategorieMerceologicheProgetto($this->info["codice"]); } public static function getCategorieMerceologicheProgetto($codice_progetto) { global $_state_cpvProgetto; if (empty($_state_cpvProgetto)) { global $pdo; $_state_cpvProgetto = $pdo->prepare("SELECT codice FROM r_cpv_progetti WHERE codice_progetto = :codice "); } $codici_categoria = []; $_state_cpvProgetto->execute(array(":codice" => $codice_progetto)); if ($_state_cpvProgetto->rowCount() > 0) { while ($categoria = $_state_cpvProgetto->fetch(PDO::FETCH_ASSOC)) { if (!empty($categoria)) { $codici_categoria[] = $categoria["codice"]; } } } $codici_categoria = array_unique($codici_categoria); return $codici_categoria; } public function generaCUI() { if (empty($this->info["cui"])) { $tipologie = ($this->info["tipologia"] == "L") ? "'L'" : "'S','F'"; $sql = "SELECT codice FROM b_progetti WHERE codice_ente = :ente AND anno = :anno AND tipologia IN ({$tipologie}) AND cui IS NOT NULL AND cui <> '' "; $bind = []; $bind[":ente"] = $this->info["codice_ente"]; $bind[":anno"] = $this->info["anno"]; $count = $this->db->go($sql,$bind)->rowCount(); $id = $count + 1; $cui = $this->info["tipologia"] . Ente::getInfoFromID($this->info["codice_ente"])[0]["cf"] . $this->info["anno"] . str_pad($id,5,"0",STR_PAD_LEFT); $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_progetti"; $salva->operazione = "UPDATE"; $salva->oggetto = ["codice"=>$this->info["codice"],"cui"=>$cui]; $codice = $salva->save(); if ($codice !== false) { $this->addToLog("UPDATE",__("Generato CUI")); return $cui; } } return false; } public static function getInfoProgetto($codice_progetto,$keyName) { $keyInfo = self::getKeyInfo($keyName); if (!empty($keyInfo)) { global $_progetInfoStatement; if (!isset($_progetInfoStatement)) { global $pdo; $_progetInfoStatement = $pdo->prepare("SELECT b_progetti_info.* FROM b_progetti_info WHERE b_progetti_info.codice_progetto = :progetto AND b_progetti_info.key = :keyName"); } $bind = [":progetto"=>$codice_progetto, ":keyName" => $keyName]; $_progetInfoStatement->execute($bind); if ($_progetInfoStatement->rowCount() > 0) { if (!empty($keyInfo["multiple"])) { return $_progetInfoStatement->fetchAll(PDO::FETCH_ASSOC); } else { return $_progetInfoStatement->fetch(PDO::FETCH_ASSOC); } } } } public static function getDotazioneProgetto($codice_progetto,$filtri = null) { $bind = [":progetto"=>$codice_progetto]; $filters = ""; if (!empty($filtri["codice"])) { $filters .= " AND codice = :codice "; $bind[":codice"] = $filtri["codice"]; } if (!empty($filtri["anno"])) { $filters .= " AND anno = :anno "; $bind[":anno"] = $filtri["anno"]; } if (!empty($filtri["annoMaggioreDi"])) { $filters .= " AND anno > :annoMaggioreDi "; $bind[":annoMaggioreDi"] = $filtri["annoMaggioreDi"]; } if (!empty($filtri["annoMinoreDi"])) { $filters .= " AND anno < :annoMinoreDi "; $bind[":annoMinoreDi"] = $filtri["annoMinoreDi"]; } if (!empty($filtri["privata"])) { $filters .= " AND privata = :privata "; $bind[":privata"] = $filtri["privata"]; } global $pdo; return $pdo->go("SELECT * FROM b_progetti_dotazione WHERE codice_progetto = :progetto {$filters} ORDER BY anno",$bind)->fetchAll(PDO::FETCH_ASSOC); } private static function moduliSuggerimenti() { $moduli = []; $moduli["gare"] = ["titolo"=>"Gare e affidamenti","url"=>"/backend/gare/progetti/suggestions.php"]; return $moduli; } public function suggerimenti() { $data = []; global $root; $moduli = self::moduliSuggerimenti(); $cup = $this->info["cup"]; if (!empty($moduli)) { foreach($moduli AS $modulo => $info) { if (!empty($info["url"])) { if (file_exists($root.$info["url"])) { include($root.$info["url"]); } } } } return $data; } } function quickInfoProgetto($codice_progetto,$keyName) { $return = progetto::getInfoProgetto($codice_progetto,$keyName); if (!empty($return) && (isset($return["value"]))) { return $return["value"]; } return ""; } function quickDotazioneProgetto($codice_progetto,$anno=null,$privata=null,$annoMaggioreDi = false,$onlyImmobili = false) { $filters = []; if (!empty($anno)) { $keyAnno = ($annoMaggioreDi) ? "annoMaggioreDi" : "anno"; $filters[$keyAnno] = $anno; } if (isset($privata)) { $filters["privata"] = $privata; } $return = progetto::getDotazioneProgetto($codice_progetto,$filters); if (!empty($return)) { $totale = 0; $tipologiaPrivata = []; foreach($return AS $dotazione) { if (!$onlyImmobili || $dotazione["codice_immobile"] > 0) { $totale += $dotazione["importo"]; if (!empty($privata) && $privata == "S") { $extraInfo = json_decode($dotazione["extraInfo"],true); $tipologiaPrivata[] = $extraInfo["tipologiaPrivata"]; } } } if (!empty($privata) && $privata == "S") { return ["totale"=>$totale,"tipologie"=>$tipologiaPrivata]; } else { return $totale; } } } function quickResponsabileProgetto($codice_progetto) { $return = Incarichi::getIncaricatiFromElement("progetti",$codice_progetto,14); if (empty($return)) { $return["cognome"] = quickInfoProgetto($codice_progetto,"legacy-rup-cognome"); $return["nome"] = quickInfoProgetto($codice_progetto,"legacy-rup-nome"); $return["codice_fiscale"] = quickInfoProgetto($codice_progetto,"legacy-rup-cf"); } else { $return = $return[0]; $return = array_merge($return,$return["extraInfo"]); } return $return; } ?>