db = $pdo; $this->version = self::getVersion(); $this->modulo = "cpn"; } public function updateStato($stato) { if (empty($this->info["stato"]) || $this->info["stato"] < $stato) { $this->db->go("UPDATE b_cpn SET stato = :stato WHERE codice = :codice",[":stato"=>$stato,":codice"=>$this->info["codice"]]); } if (isset($_SESSION["ente"])) { $_SESSION["ente"]->manageUpdates("cpn",$this->info["codice"],$this); } } public static function getVersion($data = "") { $return = "latest"; if (!empty($data)) { $data = strtotime($data); // TODO: Implementare riconoscimento versione su aggiornamenti } return $return; } public static function getSceltaContraenteFromGara($id,$data = "") { $source = "raccordoGare.json"; if (!empty($source)) { $version = self::getVersion($data); $path = self::getVersionPath($version); if (!empty($path)) { $path .= "/misc/{$source}"; if (file_exists($path)) { $options = jsonToArray($path); if (!empty($options)) { return $options[$id] ?? false; } } } } return false; } 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 printEditAtto($codice_atto = 0,$tipologia = null) { return $this->includeView("/views/form-atto.php",$codice_atto,$tipologia); } private function includeView($view,$codice_riferimento=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_cpn_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_cpn"=>$this->info["codice"]]; $sql = "SELECT * FROM r_cpn_moduli WHERE gara_cpn = :codice_cpn "; if (!empty($codice_lotto)) { $bind[":codice_lotto"] = $codice_lotto; $sql .= " AND lotto_cpn = :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#"]; $return["gare"] = ["link"=>"/backend/gare/panel.php?codice=#codice_gara#&codice_round=#codice_fase#"]; return $return; } public function saveRelazione($modulo,$codice_gara,$codice_lotto,$lotto_cpn) { $relazioniDisponibili = self::relazioniDisponibili(); if (!empty($relazioniDisponibili[$modulo])) { $relazione = []; $relazione["modulo"] = $modulo; $relazione["codice_gara"] = $codice_gara; $relazione["codice_lotto"] = $codice_lotto; $relazione["gara_cpn"] = $this->info["codice"]; $relazione["lotto_cpn"] = $lotto_cpn; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "r_cpn_moduli"; $salva->operazione = "INSERT"; $salva->oggetto = $relazione; $codice = $salva->save(); if (!empty($codice)) { return true; } } } private static function moduliSuggerimenti() { $moduli = []; $moduli["gare"] = ["titolo"=>"Gare e affidamenti","url"=>"/backend/gare/cpn/suggestions.php"]; $moduli["pcp"] = ["titolo"=>"PCP","url"=>"/backend/pcp/cpn/suggestions.php"]; return $moduli; } public function printSuggerimenti() { $return = false; include __DIR__."/atti/table-suggerimenti.php"; return $return; } public function suggerimenti() { $data = []; global $root; $moduli = self::moduliSuggerimenti(); if (!empty($moduli)) { foreach($moduli AS $modulo => $info) { if (!empty($info["url"]) && file_exists($root.$info["url"])) { foreach($this->getLotti() AS $lotto) { $cig = $lotto["cig"]; if (!empty($cig)) { include($root.$info["url"]); } } } } } return $data; } public function linkAttoAllegato(int $atto, array $allegati) { if (!empty($atto) && !empty($allegati) && !empty($this->getAtti($atto)[0])) { $suggerimenti = $this->suggerimenti(); foreach($suggerimenti AS $suggerimento) { if (in_array($suggerimento["codice"],$allegati) !== false) { $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "r_cpn_atti_files"; $salva->operazione = "INSERT"; $salva->oggetto = [ "codice_atto" => $atto, "codice_allegato" => $suggerimento["codice"], "modulo" => $suggerimento["sourceType"], "riferimento_allegato" => $suggerimento["sourceID"] ]; $salva->save(); } } } } public function saveGara($post,$saveDati) { $return = false; $entiAbilitati = $_SESSION["utente"]->getEntiBeneficiari(false); $checkEnte = false; foreach($entiAbilitati AS $ente) { if ($post["codice_ente"] == $ente["codice"]) { $checkEnte = true; break; } } if ($checkEnte) { $availableDati[] = "idAnac"; $availableDati[] = "cf_sua"; $availableDati[] = "denominazione_sua"; $availableDati[] = "importo"; $availableDati[] = "idAnac"; $availableDati[] = "cigAccQuadro"; $availableDati[] = "ufficio"; $availableDati[] = "tipoProcedura"; $availableDati[] = "settore"; $availableDati[] = "centraleCommittenza"; $availableDati[] = "realizzazione"; $availableDati[] = "cognome"; $availableDati[] = "nome"; $availableDati[] = "cfPiva"; $dati = []; if (!empty($this->info)) { $dati = json_decode($this->info["dati"],true); } foreach($availableDati AS $key) { if (isset($post["dati"][$key])) { $dati[$key] = $post["dati"][$key]; } else { $upper = strtoupper($key); if (isset($post["dati"][$upper])) { $dati[$key] = $post["dati"][$upper]; } else { $dati[$key] = ""; } } } $gara = []; $gara["codice"] = $post["codice"] ?? 0; $gara["codice_ente"] = $post["codice_ente"]; $gara["oggetto"] = $post["oggetto"]; $gara["dati"] = json_encode($dati); $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_cpn"; $salva->operazione = (empty($gara["codice"])) ? "INSERT" : "UPDATE"; $salva->oggetto = $gara; $codice = $salva->save(); if ($codice != false) { $error = false; $gara["codice"] = $codice; $this->info = $gara; $return["esito"] = true; $return["codice"] = $codice; } else { $return["errori"][] = __("Errore nel salvataggio della gara"); } } else { $return["errori"][] = __("Ente non abilitato"); } if (!empty($return["codice"])) { $this->getManagerRegistro()->addToLog("SAVE",__("Dati gara")); if (empty($post["codice"])) { if ($this->modulo != "cpn") { $utenti = ente::getUtentiFromModulo($this->modulo,$_SESSION["ente"]->codice,"",$return["codice"]); if ($_SESSION["utente"]->gerarchia > 15) { $utenti[] = $_SESSION["utente"]->codice; } if (!empty($utenti)) { foreach($utenti AS $utente) { $permesso = []; $permesso["sezione"] = "cpn"; $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) { $return = false; if (!empty($this->info["codice"])) { if (!empty($lotto["cpv"])) { $dbLotto = get_campi("b_cpn_lotti"); if (!empty($lotto["codice"])) { $dbLotto = $this->getLotti($lotto["codice"])[0]; } $dati = []; if (!empty($dbLotto)) { $lotto["codice"] = $dbLotto["codice"]; $dati = json_decode($dbLotto["dati"],true); } if ($saveDati) { $availableDati = []; $availableDati[] = "cupEsente"; $availableDati[] = "idSceltaContraente50"; $availableDati[] = "criterioAggiudicazione"; $availableDati[] = "luogoNuts"; $availableDati[] = "categoria"; $availableDati[] = "classifica"; $availableDati[] = "tipoAppalto"; $availableDati[] = "contrattoEsclusoAlleggerito"; $availableDati[] = "esclusioneRegimeSpeciale"; foreach($availableDati AS $key) { if (isset($lotto["dati"][$key])) { $dati[$key] = $lotto["dati"][$key]; } else { $upper = strtoupper($key); if (isset($lotto["dati"][$upper])) { $dati[$key] = $lotto["dati"][$upper]; } else { $dati[$key] = ""; } } } } $dati["cpv"] = $lotto["cpv"]; if (isset($dati["cupEsente"]) && $dati["cupEsente"] === "1") { $lotto["cup"] = ""; } $lotto["dati"] = json_encode($dati); $lotto["codice_cpn"] = $this->info["codice"]; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_cpn_lotti"; $salva->operazione = (empty($lotto["codice"])) ? "INSERT" : "UPDATE"; $salva->oggetto = $lotto; $codice = $salva->save(); if ($codice != false) { $return["esito"] = true; $return["codice"] = $codice; $this->getManagerRegistro()->addToLog("SAVE",__("Dati lotto"),$lotto["codice"] ?? 0); } else { $return["errori"][] = __("Errore nel salvataggio del lotto"); } } else { $return["errori"][] = __("Selezionare almeno una categoria CPV"); } } else { $return["errori"][] = __("Nessuna gara selezionata"); } return $return; } public function saveAtto($atto,$saveDati = true) { $return = false; if (!empty($this->info["codice"])) { $tipologia = self::getOptions("atti")[$atto["tipo"]]; if (!empty($tipologia)) { $dbAtto = get_campi("b_cpn_atti"); if (!empty($atto["codice"])) { $dbAtto = $this->getAtti($atto["codice"])[0]; } if (!empty($dbAtto)) { $atto["codice"] = $dbAtto["codice"]; } $storico = $this->getAtti(); $continua = true; if (!empty($storico)) { foreach($storico AS $tmp) { if ($tmp["tipo"] == $atto["tipo"] && (empty($atto["codice"]) || $tmp["codice"] != $atto["codice"])) { $continua = false; } } } if ($continua) { if ($saveDati) { $atto["dati"] = json_encode($atto["dati"]); } $atto["codice_cpn"] = $this->info["codice"]; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_cpn_atti"; $salva->operazione = (empty($atto["codice"])) ? "INSERT" : "UPDATE"; $salva->oggetto = $atto; $codice = $salva->save(); if ($codice != false) { $return["esito"] = true; $return["codice"] = $codice; $this->getManagerRegistro()->addToLog("SAVE",$tipologia,$atto["codice"]); } else { $return["errori"][] = __("Errore nel salvataggio dell' atto"); } } else { $return["errori"][] = __("Tipologia giĆ  inserita"); } } else { $return["errori"][] = __("Tipologia non prevista"); } } else { $return["errori"][] = __("Nessuna gara selezionata"); } return $return; } public function getManagerRegistro() { return new registriManager("cpn",$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 getLastCPNLog($method,$codice_lotto = 0) { return $this->db->go("SELECT codice,esito,msg FROM b_cpn_log WHERE codice_cpn = :cpn AND metodo = :method AND codice_lotto = :codice_lotto ORDER BY codice DESC LIMIT 0,1", [":cpn"=>$this->info["codice"],":method"=>$method,":codice_lotto"=>$codice_lotto])->fetch(PDO::FETCH_ASSOC) ?? FALSE; } public function updateCPNLog($method,$esito,$msg,$codice_lotto = 0) { $log = $this->getLastCPNLog($method,$codice_lotto); if (!empty($log)) { $log["esito"] = $esito; $log["msg"] = $msg; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_cpn_log"; $salva->operazione = "UPDATE"; $salva->oggetto = $log; $salva->save(); } } public function getStrutturaGara() { $lotti = $this->getLotti(); if (!empty($lotti)) { $return = []; $info = $this->info; $dati = $this->getDati(); $return = [ "oggetto" => $info["oggetto"], "idAnac" => $dati["idAnac"], "codiceFiscaleSA" => $dati["cf_sua"], "cigAccQuadro" => $dati["cigAccQuadro"], "tipoProcedura" => $dati["tipoProcedura"], "centraleCommittenza" => $dati["centraleCommittenza"], "importoGara" => $dati["importo"], "settore" => $dati["settore"], "realizzazione" => $dati["realizzazione"], "tecnicoRup" => [ "cognome" => $dati["cognome"], "nome" => $dati["nome"], "cfPiva" => $dati["cfPiva"] ], "lotti" => [] ]; $count = 0; foreach ($lotti AS $lottoDb) { $count++; $datiLotto = json_decode($lottoDb["dati"],true); if (!empty($datiLotto["cpv"])) { $cpvs = cpvManager::getInfo($datiLotto["cpv"]); $cpvPrimaria = null; $cpvSecondarie = []; foreach($cpvs AS $cpv) { if (isset($cpvPrimaria)) { $cpvSecondarie[] = $cpv["codice_completo"]; } else { $cpvPrimaria = $cpv["codice_completo"]; } } } $lotto = [ "oggetto" => $lottoDb["oggetto"], "importoLotto" => $lottoDb["importo"], "numeroLotto" => $count, "cig" => $lottoDb["cig"], "cup" => $lottoDb["cup"], "cpv" => $cpvPrimaria, "idSceltaContraente50" => $datiLotto["idSceltaContraente50"] ?? "", "categoria" => $datiLotto["categoria"] ?? "", "classe" => $datiLotto["classifica"] ?? "" ?? "", "tipoAppalto" => $datiLotto["tipoAppalto"] ?? "", "criterioAggiudicazione" => $datiLotto["criterioAggiudicazione"] ?? "", "luogoNuts" => $datiLotto["luogoNuts"] ?? "", "cupEsente" => $datiLotto["cupEsente"] ?? "", "contrattoEsclusoAlleggerito" => $datiLotto["contrattoEsclusoAlleggerito"] ?? "", "esclusioneRegimeSpeciale" => $datiLotto["esclusioneRegimeSpeciale" ?? ""] ]; if (!empty($cpvSecondarie)) { $lotto["cpvSecondari"] = []; foreach($cpvSecondarie AS $cpv) { $lotto["cpvSecondari"][] = ["cpv"=>$cpv]; } } $return["lotti"][] = $lotto; } if (!empty($info["id_cpn"])) { $return["idRicevuto"] = $info["id_cpn"]; } return $return; } } public function getStrutturaAtto($codice_atto) { global $config; $atto = $this->getAtti($codice_atto)[0] ?? null; if (!empty($atto)) { $dati = json_decode($atto["dati"],true); $documenti = $this->getAllegati($atto["codice"]); if (!empty($dati) && !empty($documenti)) { $return = [ "tipoDocumento" => $atto["tipo"], "eventualeSpecificazione" => $dati["note"] ?? "", "dataPubblicazione" => $dati["dataPubblicazione"] ?? "", "dataScadenza" => $dati["dataScadenza"] ?? "", "dataProvvedimento" => $dati["dataProvvedimento"] ?? "", "numeroProvvedimento" => $dati["numeroProvvedimento"] ?? "", "dataStipula" => $dati["dataStipula"] ?? "", "numeroRepertorio" => $dati["numeroRepertorio"] ?? "", "ribassoAggiudicazione" => $dati["ribassoAggiudicazione"] ?? "", "offertaAumento" => $dati["offertaAumento"] ?? "", "importoAggiudicazione" => $dati["importoAggiudicazione"] ?? "", "dataAggiudicazione" => $dati["dataAggiudicazione"] ?? "" ]; $docs = []; $link = $config["protocollo"] . $_SESSION["ente"]->getInfo()["dominio"]; if (!empty($documenti["allegati"])) { foreach($documenti["allegati"] AS $allegato) { $docs[] = [ "titolo" => $allegato["titolo"], "url" => $link.filesManager::getAttachURL($allegato,$atto["codice"],"cpn-public",false) ]; } } if (!empty($documenti["refs"])) { foreach($documenti["refs"] AS $allegato) { $docs[] = [ "titolo" => $allegato["titolo"], "url" => $link.$allegato["href"] ]; } } $return["documenti"] = $docs; $return["gara"] = $this->getStrutturaGara(); if (!empty($atto["idRicevuto"])) { $return["idRicevuto"] = $atto["idRicevuto"]; } return $return; } } } public function getRequest($method,$codice_riferimento = null) { $dati = null; if ($method == "sendGara") { $dati = ["method"=>"inviaGara","data"=>$this->getStrutturaGara()]; } else if ($method == "sendAtto" && !empty($codice_riferimento)) { $dati = ["method"=>"inviaAtto","data"=>$this->getStrutturaAtto($codice_riferimento)]; } return $dati; } public function getDati() { $return = json_decode($this->info["dati"],true); return $return; } public static function getStati() { return jsonToArray(__DIR__."/stati.json"); } public function getLotti($codice = null) { $bind = [":codice_cpn"=>$this->info["codice"]]; $sql = "SELECT * FROM b_cpn_lotti WHERE codice_cpn = :codice_cpn 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 getAtti($codice = null) { $bind = [":codice_cpn"=>$this->info["codice"]]; $sql = "SELECT * FROM b_cpn_atti WHERE codice_cpn = :codice_cpn AND eliminato = 'N' "; if ($codice !== null) { $bind[":codice"] = $codice; $sql .= " AND codice = :codice "; } return $this->db->go($sql . " ORDER BY codice",$bind)->fetchAll(PDO::FETCH_ASSOC); } public function getAllegati(int $atto) { if (!empty($this->getAtti($atto)) && !empty($atto)) { $refs = $this->getRefsAllegati($atto); $allegati = filesManager::listFiles($atto,"cpn-public"); if (!empty($refs) || !empty($allegati)) { return ["refs"=>$refs,"allegati"=>$allegati]; } } } public function getRefsAllegati($atto = null) { if (empty($atto)) { $bind = [":codice" => $this->info["codice"]]; $sql = "SELECT * FROM r_cpn_atti_files WHERE codice_atto IN (SELECT codice FROM b_cpn_atti WHERE codice_cpn = :codice)"; } else { $bind = [":codice_atto"=>$atto]; $sql = "SELECT * FROM r_cpn_atti_files WHERE codice_atto = :codice_atto "; } $allegati = $this->db->go($sql . " ORDER BY codice",$bind)->fetchAll(PDO::FETCH_ASSOC); $return = []; if (!empty($allegati)) { foreach($allegati AS $allegato) { $codice_relazione = $allegato["codice"]; $allegato = filesManager::listFiles($allegato["riferimento_allegato"],$allegato["modulo"],"A",[$allegato["codice_allegato"]])[0]; $allegato["codice_relazione"] = $codice_relazione; $allegato["href"] = filesManager::getAttachURL($allegato,$allegato["sourceID"],$allegato["sourceType"],true); $return[] = $allegato; } } return $return; } 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_cpn WHERE codice = :codice "; 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,"cpn"); $ids = implode(",",$ids); $sql .= " AND b_cpn.codice IN ({$ids}) "; } $cpn = $pdo->go($sql,$bind)->fetch(PDO::FETCH_ASSOC); if (!empty($cpn)) { $continua = true; if ($_SESSION["utente"]->codice_ente != $_SESSION["ente"]->codice && $_SESSION["utente"]->codice_ente != $cpn["codice_ente"] && $_SESSION["utente"]->gerarchia > 9) { $continua = false; } if ($continua) { $instance = new attiCPN(); $instance->info = $cpn; $instance->version = self::getVersion($cpn["data_invio_cpn"]); 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) { if (($stato >= 0) && !empty($id_cmd) && $_SESSION["utente"]->unlockSupporto()) { $cmd = self::getInfoModulo($id_cmd); if ($cmd !== false) { $loa = $cmd["authenticationLevel"] ?? self::defaultAutenticationLevel(); if ($_SESSION["utente"]->authenticationLevel < $loa) { return true; } if (($stato >= $cmd["stato_minimo"] || $cmd["stato_minimo"] == null) && ($stato <= $cmd["stato_massimo"] || $cmd["stato_massimo"] === null)) { $return = false; } } } } return $return; } static function getModuli($stato = null) { global $config; $moduli = jsonToArray($config["jsonFolder"]."/cpn-panel.json"); $tmp = []; foreach($moduli AS $id_modulo => $modulo) { $insert = true; 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(); if (!empty($moduli[$radice])) { $return = $moduli[$radice]; $return["id"] = $radice; $return["titolo"] = __($return["titolo"]); $return["descrizione"] = __($return["descrizione"]); } } return $return; } static function getOptions($sorgente, $data = null) { $path = self::getVersionPath(self::getVersion($data)); $sorgente .= ".json"; if (!empty($path)) { $path .= "/sources/{$sorgente}"; if (file_exists($path)) { $data = jsonToArray($path); if (!empty($data["data"])) { $return = []; foreach($data["data"] AS $option) { $return[$option["code"]] = $option["value"]; } ksort($return); return $return; } } } return false; } }