progetto = $progetto; $this->ente = Ente::getInfoFromID($progetto->info["codice_ente"])[0]; $this->codice_sistema = "01850570746TUTTOGARE"; $this->codice_locale = $this->ente["cf"] . $this->codice_sistema . ($this->progetto->info["id_monitoraggio"] ?? $this->progetto->info["codice"]); $this->db = $pdo; } public function sendPack($codice,$username,$password) { $pack = $this->getPacks($codice); if (!empty($pack)) { $ftp_connection = ftp_connect("sts.mef.gov.it"); if ($ftp_connection) { if (@ftp_login($ftp_connection,$username,$password)) { $local_path = $this->getPackStoreDir() . "/".$pack["nome"]; $remote_path = "Outbox/".$pack["nome"]; if (ftp_put($ftp_connection, $remote_path, $local_path, FTP_BINARY)) { ftp_close($ftp_connection); $this->db->go("UPDATE b_progetti_mop_pack SET timestamp_invio = CURRENT_TIMESTAMP, utente_invio = :utente WHERE codice = :codice",[":codice"=>$pack["codice"],":utente"=>$_SESSION["utente"]->codice??-1]); self::updateStato($pack["codice"],50); return true; } } } } } public function downloadEsito($codice,$username,$password) { $pack = $this->getPacks($codice); if (!empty($pack)) { $ftp_connection = ftp_connect("sts.mef.gov.it"); if ($ftp_connection) { if (@ftp_login($ftp_connection,$username,$password)) { $local_path = $this->getPackStoreDir() . "/".$pack["nome"] . "-esito.txt"; $remote_path = "Inbox/".$pack["nome"]; if (ftp_get($ftp_connection, $local_path, $remote_path, FTP_BINARY)) { ftp_close($ftp_connection); if (file_exists($local_path)) { return file_get_contents($local_path); } } } } } } public function checkPack($codice,$esito) { $pack = $this->getPacks($codice); if (!empty($pack) && !empty($esito)) { $file_lines = preg_split("/((\r?\n)|(\r\n?))/", $esito); $errors = array(); $line_errors = array(); $line = 0; $file_lines = array_filter($file_lines); $mismatch = false; if (!empty($file_lines)) { foreach($file_lines AS $report) { $line++; $string = explode("|",$report); $nome_file = substr($string[0], strpos($string[0], '_')+1); if ($nome_file != $pack["nome"]) { $error = array(); $error["livello"] = "ERRORE"; $error["codice_errore"] = "0x12"; $error["descrizione_errore"] = "Il report alla riga " . $line . " non è riferito al tracciato selezionato"; $errors[] = $error; $mismatch = true; break; } else { if ($string[1]!="FNFOK") { $error = array(); $error["livello"] = "ERRORE"; $error["codice_errore"] = $string[1]; $error["descrizione_errore"] = $string[2] . " - Riga (".$string[5].")"; $error["scheda"] = $string[4]; if (empty($line_errors[$string[5]])) { $line_errors[$string[5]] = array(); } $errors[] = $error; $line_errors[$string[5]][] = $error; } } } if ($mismatch) { return false; } else { $matches = json_decode($pack["matches"],TRUE); if (!empty($errors)) { if (count($line_errors) < count($matches)) { $stato = 95; } else { $stato = 90; } } else { $stato = 100; } self::updateStato($pack["codice"],$stato,json_encode($errors)); if (!empty($matches) && !empty($line_errors)) { $upd = $this->db->prepare("UPDATE b_progetti_monitoraggio SET stato = :stato, errori = :errori WHERE codice = :codice"); $updTrasmesso = $this->db->prepare("UPDATE b_progetti_monitoraggio SET trasmesso = 1 WHERE codice = :codice"); foreach($matches AS $line => $code) { $upd->bindValue(":codice",$code); $upd->bindValue(":errori",""); $updTrasmesso->bindValue(":codice",$code); if (!empty($line_errors[$line])) { $upd->bindValue(":stato",90); $upd->bindValue(":errori",json_encode($line_errors[$line])); $upd->execute(); } else { $upd->bindValue(":stato",100); $upd->execute(); $updTrasmesso->execute(); } } } } } } } public static function updateStato($codice,$stato,$errori = "") { global $pdo; $pack = $pdo->go("SELECT * FROM b_progetti_mop_pack WHERE codice = :codice",[":codice"=>$codice])->fetch(PDO::FETCH_ASSOC); if (!empty($pack)) { $matches = json_decode($pack["matches"],true); if (!empty($matches)) { $upd = $pdo->prepare("UPDATE b_progetti_monitoraggio SET stato = :stato WHERE codice = :codice"); $upd->bindValue(":stato",$stato); foreach($matches AS $match) { $upd->bindValue(":codice",$match); $upd->execute(); } } $pdo->go("UPDATE b_progetti_mop_pack SET stato = :stato, esito = :esito WHERE codice = :codice",[":codice"=>$codice,":stato"=>$stato,":esito"=>$errori]); return true; } if (isset($_SESSION["ente"])) { $_SESSION["ente"]->manageUpdates("mop",$codice); } } public function getPackStoreDir() { global $config; return $config["mediaFolder"]."/{$_SESSION["ente"]->codice}/progetti/mop/{$this->progetto->info["codice_ente"]}/{$this->progetto->info["codice"]}"; } public function createPack($codici) { if (!empty($codici)) { $tmp = $this->getScheda(); $schede = []; foreach($tmp AS $scheda) { if (in_array($scheda["codice"],$codici) && ($scheda["stato"] == 0 || $scheda["stato"] == 1 || $scheda["stato"] == 2)) { $schede[] = ["tipo"=>$scheda["tipo"],"codice"=>$scheda["codice"],"stato"=>$scheda["stato"],"data"=>$scheda["data"]]; } } if (!empty($schede)) { $date = date("dmY_H.i.s"); $matches = []; $tracciato = "HH#".count($schede)."#".date("dmY")."#".PHP_EOL; $count = 1; foreach($schede AS $scheda) { $matches[$count] = $scheda["codice"]; switch($scheda["stato"]) { case 1: $stato = "M"; break; case 2: $stato = "C"; break; default: $stato = "I"; } $row = substr($scheda["tipo"],0,3) . "#" . $count . "#" . $this->codice_sistema . "#" . $scheda["data"] . "#" . $stato . "#"; $tracciato .= $row . PHP_EOL; $count++; } $tracciato .= "FF#"; $dir = $this->getPackStoreDir(); $filename= "dati_attuazione" . (($_SESSION["ente"]->getInfo()["ambienteTest"] == "S") ? "_test" : "") . "_{$this->codice_sistema}_{$date}.txt"; if (!is_dir($dir)) { mkdir($dir,0777,true); } if (file_put_contents($dir."/".$filename,$tracciato)) { $pack = []; $pack["codice_progetto"] = $this->progetto->info["codice"]; $pack["stato"] = 10; $pack["nome"] = $filename; $pack["matches"] = json_encode($matches); $pack["utente_creazione"] = $_SESSION["utente"]->codice ?? -1; $pack["timestamp_creazione"] = date("d/m/Y H:i:s"); $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_progetti_mop_pack"; $salva->operazione = "INSERT"; $salva->oggetto = $pack; if ($salva->save()) { $updateStato = $this->db->prepare("UPDATE b_progetti_monitoraggio SET stato = 10 WHERE codice = :codice"); foreach($matches AS $codice) { $updateStato->bindValue(":codice",$codice); $updateStato->execute(); } return true; } } } } } public static function stati() { return [ 0 => [ "label" => "Pronto", "color" => "#ffd700" ], 1 => [ "label" => "Da aggiornare", "color" => "#ffeA00" ], 2 => [ "label" => "Da cancellare", "color" => "#CC2200" ], 10 => [ "label" =>"Da inviare", "color" => "#40e0d0" ], 50 => [ "label" =>"In valutazione", "color" => "#98fb98" ], 60 => [ "label" =>"Da controllare", "color" => "#ff8c00" ], 90 => [ "label" =>"Respinto", "color" => "#ff0000" ], 95 => [ "label" =>"Trasmesso con errori", "color" => "#ff5500" ], 100 => [ "label" => "Trasmesso", "color" => "#9acd32" ] ]; } public function checkTimingVerifica($pack) { if ($pack["stato"] == 50 && strtotime($pack["timestamp_invio"]) < strtotime("-2 days")) { mop::updateStato($pack["codice"],60); return true; } return false; } public function getPacks($codice = null) { $bind = [":progetto" => $this->progetto->info["codice"]]; $sql = "SELECT * FROM b_progetti_mop_pack WHERE codice_progetto = :progetto "; if (!empty($codice)) { $sql .= " AND codice = :codice "; $bind[":codice"] = $codice; } $sql .= " ORDER BY codice DESC"; $tmp = $this->db->go($sql,$bind); if (!empty($tmp->rowCount())) { $return = []; while($pack = $tmp->fetch(PDO::FETCH_ASSOC)) { if ($this->checkTimingVerifica($pack)) { $pack["stato"] = 60; } if (empty($codice)) { $return[] = $pack; } else { $return = $pack; } } return $return; } } public function getScheda($tipologia = null) { $bind = [":progetto"=>$this->progetto->info["codice"]]; $sql = "SELECT * FROM b_progetti_monitoraggio WHERE codice_progetto = :progetto "; if (!empty($tipologia)) { $bind[":tipo"] = $tipologia; $sql .= " AND tipo = :tipo"; } return $this->db->go($sql,$bind)->fetchAll(PDO::FETCH_ASSOC); } public function getA0() { return [$this->progetto->info["cup"],strip_tags($this->progetto->info["oggetto"])]; } public function getA9() { $dotazioni = $this->progetto->getDotazione(); $return = []; if (!empty($dotazioni)) { foreach($dotazioni AS $dotazione) { $dotazioneInfo = json_decode($dotazione["extraInfo"],true); $row = []; $row[] = $dotazioneInfo["fonte"] ?? "007"; $row[] = number_format($dotazione["importo"],2,".",""); $row[] = (!empty($dotazioneInfo["numeroNorma"])) ? $dotazioneInfo["numeroNorma"] : "99999"; $row[] = (!empty($dotazioneInfo["annoNorma"])) ? $dotazioneInfo["annoNorma"] : "99999"; $row[] = (!empty($dotazioneInfo["tipo"])) ? $dotazioneInfo["tipo"] : "99999"; $row[] = (!empty($dotazioneInfo["numeroDeliberaCipe"])) ? $dotazioneInfo["numeroDeliberaCipe"] : "99999"; $row[] = (!empty($dotazioneInfo["annoDeliberaCipe"])) ? $dotazioneInfo["annoDeliberaCipe"] : "99999"; $row[] = (!empty($dotazioneInfo["estremiProvvedimento"])) ? $dotazioneInfo["estremiProvvedimento"] : "99999"; $row[] = $dotazioneInfo["istat"] ?? ""; // REGIONE $row[] = $dotazioneInfo["istat"] ?? ""; // PROVINCIA $row[] = $dotazioneInfo["istat"] ?? ""; // COMUNE $row[] = $dotazioneInfo["descrizioneCofinanziatore"] ?? ""; $row[] = $dotazioneInfo["codiceFiscaleCofinanziatore"] ?? ""; $row[] = $dotazioneInfo["criticita"] ?? ""; $row[] = $dotazioneInfo["economie"] > 0 ? "S" : "N"; $row["_idRiferimento"] = $dotazione["codice"]; $return[] = $row; } } return $return; } public function getA31() { $return = []; if (!empty($this->progetto->info["cup"])) { $dotazioni = $this->progetto->getDotazione(); if (!empty($dotazioni)) { foreach($dotazioni AS $dotazione) { if (!empty($dotazione["codice_immobile"])) { $immobile = progetto::getImmobili(null,$dotazione["codice_immobile"]); $extraInfo = json_decode($immobile["extraInfo"],true); if (!empty($extraInfo["miur"])) { $row = []; $row["cup"] = $this->progetto->info["cup"]; $row["miur"] = $extraInfo["miur"]; $row["fonte"] = 14; $row["_idRiferimento"] = $immobile["codice"]; $return[] = $row; } } } } } return $return; } public function getA12() { $dotazioni = $this->progetto->getDotazione(); $return = []; if (!empty($dotazioni)) { foreach($dotazioni AS $dotazione) { $dotazioneInfo = json_decode($dotazione["extraInfo"],true); if ($dotazioneInfo["economie"] > 0) { $row = []; $row[] = $dotazione["anno"]; $row[] = $dotazioneInfo["fonte"] ?? "007"; $row[] = number_format($dotazione["importo"],2,".",""); $row["_idRiferimento"] = $dotazione["codice"]; $return[] = $row; } } } return $return; } public function getA13() { $cig = $this->progetto->getCIG(); $return = []; if (!empty($cig)) { foreach($cig AS $pro) { if ($pro["percentuale_ribasso"] > 0 && $pro["importo_ribasso"] > 0) { $return[] = ["cig"=>$pro["cig"],"percentuale"=>$pro["percentuale_ribasso"],"importo"=>$pro["importo_ribasso"],"_idRiferimento"=>$pro["codice"]]; } } } return $return; } public function getA28() { $cig = $this->progetto->getCIG(); $return = []; if (!empty($cig)) { foreach($cig AS $pro) { $pro["_idRiferimento"] = $pro["codice"]; $return[] = $pro; } } return $return; } public function getA29() { $cig = $this->progetto->getCIG(); $return = []; if (!empty($cig)) { foreach($cig AS $pro) { $steps = json_decode($pro["step"],true); if (!empty($steps)) { foreach($steps AS $idStep => $step) { if (!empty($step["prevista"])) { $step["cig"] = $pro["cig"]; $step["step"] = $idStep; $step["_idRiferimento"] = $pro["codice"]; $step["_extraInfo"] = $idStep; $return[] = $step; } } } } } return $return; } public function getA30() { $cig = $this->progetto->getCIG(); $return = []; if (!empty($cig)) { foreach($cig AS $pro) { $pro["_idRiferimento"] = $pro["codice"]; $pro["data_associazione"] = mysql2date($pro["data_associazione"]); $return[] = $pro; } } return $return; } public function prepareDataset($dato,$dataset = [],$count = 0) { $array = json_decode($dato,true); if (is_array($array)) { foreach($array AS $index => $value) { $dataset[$index] = $value; } } else { $dataset[$count] = $dato; } return $dataset; } public function createRecord($tipologia) { $scheda = self::tipologiaSchede()[$tipologia] ?? null; if (!empty($scheda)) { if ($tipologia == "A11P" || $tipologia == "A11E") { $scheda["multiple"] = true; $tmp = $this->progetto->getInfo("quadro-economico-".(($tipologia == "A11P") ? "previsto" : "effettivo")); $dati = []; if (!empty($tmp["value"])) { $voci = json_decode($tmp["value"],true); foreach($voci AS $idVoce => $importoVoce) { $dati[] = [($tipologia == "A11P") ? "P" : "E",$idVoce,$importoVoce,"_idRiferimento"=>$tmp["codice"],"_extraInfo"=>$idVoce]; } } } else if ($tipologia == "A21") { $scheda["multiple"] = true; $tmp = $this->progetto->getInfo("iter-progetto"); $dati = []; if (!empty($tmp["value"])) { $iter = json_decode($tmp["value"],true); foreach($iter AS $idFase => $infoFase) { $r = ["_idRiferimento"=>$tmp["codice"],"_extraInfo"=>$idFase]; $r[] = $idFase; $r[] = $infoFase["inizio_prevista"]; $r[] = $infoFase["inizio_effettiva"]; $r[] = $infoFase["fine_prevista"]; $r[] = $infoFase["fine_effettiva"]; $r[] = $infoFase["soggetto"]; $r[] = $infoFase["motivo"]; $r[] = $infoFase["note"]; $dati[] = $r; } } } else if (isset($scheda["dati-richiesti"])) { $continue = true; $dati = []; if (count($scheda["dati-richiesti"]) == 1 && $scheda["multiple"]) { $key = $scheda["dati-richiesti"][0]; $keyInfo = progetto::getKeyInfo($key); if ($keyInfo["multiple"]) { $continue = false; $source = $this->progetto->getInfo($key); if (!empty($source)) { foreach($source AS $dato) { $dataset = $this->prepareDataset($dato["value"] ?? ""); $dataset["_idRiferimento"] = $dato["codice"]; $dati[] = $dataset; } } } } if ($continue) { $count = 0; $dataset = []; foreach($scheda["dati-richiesti"] AS $key) { $dataset = $this->prepareDataset($this->progetto->getInfo($key)["value"] ?? "",$dataset,$count); $count++; } $dati[] = $dataset; } } else { if ($tipologia == "A0") { $dati = [$this->getA0()]; } else if ($tipologia == "A9") { $dati = $this->getA9(); } else if ($tipologia == "A12") { $dati = $this->getA12(); } else if ($tipologia == "A13") { $dati = $this->getA13(); } else if ($tipologia == "A28") { $dati = $this->getA28(); } else if ($tipologia == "A29") { $dati = $this->getA29(); } else if ($tipologia == "A30") { $dati = $this->getA30(); } else if ($tipologia == "A31") { $dati = $this->getA31(); } } if (isset($scheda["structure"]) && !empty($dati)) { foreach($dati as $dataset) { $record = []; $count = 0; $codice_riferimento = $dataset["_idRiferimento"] ?? null; $extraInfo_riferimento = $dataset["_extraInfo"] ?? null; foreach($scheda["structure"] AS $info) { if (!empty($info["locale"])) { $record[] = $this->codice_locale; } else { $key = (!empty($info["key"])) ? $info["key"] : $count; $insert = $dataset[$key] ?? ""; if (!empty($info["date"])) { $insert = str_replace("/","",$insert); } $record[] = substr($insert,$info["start"]??0,$info["max"]); $count++; } } $operazione = "INSERT"; $codice = null; $stato = 0; $dbScheda = $this->getScheda($tipologia); $record = implode("|",$record); if (!empty($dbScheda)) { if (!$scheda["multiple"]) { $dbs = $dbScheda[0]; $operazione = "UPDATE"; $codice = $dbs["codice"]; if ($dbs["trasmesso"] > 0) { $stato = 1; } } else if (!empty($codice_riferimento)) { foreach($dbScheda AS $dbs) { if ($dbs["codice_riferimento"] == $codice_riferimento && ($dbs["extraInfo"] == $extraInfo_riferimento || $extraInfo_riferimento === null)) { $operazione = "UPDATE"; $codice = $dbs["codice"]; if ($dbs["trasmesso"] > 0) { $stato = 1; } break; } } } if (!empty($codice) && $dbs["data"] == $record) { continue; } } $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_progetti_monitoraggio"; $salva->operazione = $operazione; $salva->oggetto = ["codice"=>$codice,"stato"=>$stato,"codice_progetto"=>$this->progetto->info["codice"],"tipo"=>$tipologia,"data"=>$record,"codice_riferimento"=>$codice_riferimento,"extraInfo"=>$extraInfo_riferimento]; $salva->save(); } } $this->checkDelete($tipologia); } } public function checkDelete($tipologia) { $scheda = self::tipologiaSchede()[$tipologia] ?? null; if (!empty($scheda) && !empty($scheda["multiple"])) { $records = $this->getScheda($tipologia); if (!empty($records)) { $sendDelete = $this->db->prepare("UPDATE b_progetti_monitoraggio SET stato = '2', trasmesso = '2', codice_riferimento = codice_riferimento * -1 WHERE codice = :codice"); $delete = $this->db->prepare("DELETE FROM b_progetti_monitoraggio WHERE codice = :codice"); $checkExist = $this->db->prepare("SELECT codice FROM b_progetti_info WHERE codice = :codice"); $tipologieDotazione = ["A9","A12","A31"]; $tipologieCIG = ["A13","A28","A29","A30"]; if (!empty($scheda["auto"])) { if (in_array($tipologia,$tipologieDotazione) !== false) { $riferimento = $this->progetto->getDotazione(); } else if (in_array($tipologia,$tipologieCIG) !== false) { $riferimento = $this->progetto->getCIG(); } } foreach($records AS $rec) { if ($rec["codice_riferimento"] > 0) { if (empty($scheda["auto"])) { $deleted = false; $checkExist->bindValue(":codice",$rec["codice_riferimento"]); $checkExist->execute(); if (empty($checkExist->rowCount())) { $deleted = true; } } else if (isset($riferimento)) { $deleted = true; if (!empty($riferimento)) { foreach($riferimento AS $ref) { if ($rec["codice_riferimento"] == $ref["codice"]) { $deleted = false; break; } } } } if ($deleted) { if ($rec["trasmesso"] === 1) { $sendDelete->bindValue(":codice",$rec["codice"]); $sendDelete->execute(); } else { $delete->bindValue(":codice",$rec["codice"]); $delete->execute(); } } } } } } } } ?>