gestione gare pubbliche
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

1715 righe
61 KiB

<?php
abstract class Elenchi
{
public $info;
protected $db;
public $object;
public $directory;
public $mainTable;
public $oeTable;
public $cpvTable;
public $richiesteTable;
public $formTable;
public $modulo;
public $chiarimentiTable;
public $sopralluogoTable;
public $busteTable;
public $managerRichieste;
public $managerIncarichi;
public $managerDGUE;
public $managerAvvisi;
protected $internalUsers;
private function __construct()
{
global $pdo;
$this->db = $pdo;
$this->directory = static::getDirectory();
$this->mainTable = static::getMainTable();
$this->oeTable = static::getOeTable();
$this->cpvTable = static::getCpvTable();
$this->richiesteTable = static::getRichiesteTable();
$this->formTable = static::getFormTable();
$this->chiarimentiTable = static::getChiarimentiTable();
$this->sopralluogoTable = static::getSopralluogoTable();
$this->busteTable = static::getBusteTable();
$this->modulo = static::getModulo();
$this->internalUsers = false;
}
private static function extensionExists($class) {
if (isset($_SESSION["ente"])) {
$pathExtender = $_SESSION["ente"]->getExtensionPath() . DIRECTORY_SEPARATOR . "{$class}.extender.class.php";
$extenderName = "{$class}Extender{$_SESSION["ente"]->codice}";
if (file_exists($pathExtender)) {
include_once $pathExtender;
return $extenderName;
}
}
}
public static function getDirectory()
{
return "";
}
public static function getMainTable()
{
return "";
}
public static function getOeTable()
{
return "";
}
public static function getRichiesteTable()
{
return "";
}
public static function getFormTable()
{
return "";
}
public static function getModulo()
{
return "";
}
public static function getCpvTable()
{
return "";
}
public static function getChiarimentiTable()
{
return "";
}
public static function getSopralluogoTable()
{
return "";
}
public static function getBusteTable()
{
return "";
}
public static function tipologieNoRevisione()
{
return [];
}
public static function tipologieObbligoScadenza()
{
return [];
}
public static function tipologieShowPartecipanti()
{
return [];
}
public static function tipologieConSOA()
{
return [];
}
public static function tipologieConServiziTecnici()
{
return [];
}
public static function tipologieEsitiCumulativi()
{
return [];
}
public static function refPartecipante() {
return "operatore";
}
public function canShowPartecipanti() {
return (in_array($this->info["tipologia"],static::tipologieShowPartecipanti()));
}
public function showPartecipanti() {
if ($this->canShowPartecipanti() && $this->info["visualizza_elenco"] == "S") {
return true;
}
return false;
}
public static function extraPreliminary() {
$return = [];
$return["atto_indizione"] = ["label"=>"Provvedimento di indizione","type"=>"text","rel"=>"N;0;0;A","col"=>"col-12 col-xl-6"];
$return["data_atto_indizione"] = ["label"=>"Data del provvedimento di indizione","type"=>"text","rel"=>"N;10;10;D","col"=>"col-12 col-xl-6","class"=>"datepick"];
$return["servizio"] = ["label"=>"Servizio","type"=>"text","rel"=>"N;0;0;A","col"=>"col-12 col-xl-6"];
$return["responsabile_servizio"] = ["label"=>"Responsabile del servizio","type"=>"text","rel"=>"N;0;0;A","col"=>"col-12 col-xl-6"];
return $return;
}
public static function printEditForm($record, $cpv, $lock = true, $tipologie = [])
{
if (!empty($record)) {
include(__DIR__ . "/views/edit.php");
}
}
public function printElaborazioneForm()
{
include(__DIR__ . "/views/elaborazione.php");
}
public function printPubblicaForm()
{
include(__DIR__ . "/views/pubblica.php");
}
public function printSospendiForm()
{
include(__DIR__ . "/views/sospendi.php");
}
public static function printIndexTable()
{
$print = true;
include(__DIR__ . "/views/table.php");
}
public function printIndexPartecipanti()
{
$print = true;
include(__DIR__ . "/views/partecipanti/table.php");
}
public function printModalAddUser()
{
$print = true;
include(__DIR__ . "/views/partecipanti/searchUser.php");
}
public function printPanelPartecipante($codice)
{
$print = true;
$partecipante = $this->getPartecipante($codice);
if (!empty($partecipante)) {
include(__DIR__ . "/views/partecipanti/dettaglio.php");
} else {
alertManager::printAlertBox(__("Errore richiesta"));
}
}
public function addUser($email) {
$esito = ["error"=>true,"msg"=>"Errore generico"];
if ($this->internalUsers) {
$utente = $this->db->go("SELECT codice FROM b_utenti WHERE ruolo = 'USR' AND email = :email",[":email"=>$email])->fetch(PDO::FETCH_COLUMN);
if (!empty($utente)) {
if ($this->db->go("SELECT codice FROM " . $this->oeTable . " WHERE codice_operatore = :utente AND codice_elenco = :elenco",[":utente"=>$utente,":elenco"=>$this->info["codice"]])->rowCount() === 0) {
$partecipante = array();
$partecipante["codice_elenco"] = $this->info["codice"];
$partecipante["codice_operatore"] = $utente;
$partecipante["ammesso"] = "S";
$partecipante["valutato"] = "S";
$partecipante["conferma"] = "S";
$partecipante["timestamp_creazione"] = date("Y-m-d H:i:s");
$partecipante["utente_creazione"] = $_SESSION["utente"]->codice;
$partecipante["timestamp_abilitazione"] = date("Y-m-d H:i:s");
$partecipante["utente_abilitazione"] = $_SESSION["utente"]->codice;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = $this->oeTable;
$salva->operazione = "INSERT";
$salva->oggetto = $partecipante;
if ($salva->save()) {
$esito["error"] = false;
} else {
$esito["msg"] = "Errore salvataggio";
}
} else {
$esito["msg"] = "Utente già associato";
}
} else {
$esito["msg"] = "Utente sconosciuto";
}
} else {
$esito["msg"] = "Elenco non compatibile";
}
return $esito;
}
public static function getTotaliPartecipanti($elenco) {
global $pdo;
$return = [];
$bind = [":elenco"=>$elenco];
$base = "SELECT COUNT(codice) AS tot FROM " . static::getOeTable() . " WHERE codice_elenco = :elenco ";
$return["nuovi"] = $pdo->go($base . " AND conferma = 'S' AND ammesso = 'N' AND valutato = 'N'",$bind)->fetch(PDO::FETCH_COLUMN);
$return["aggiornamenti"] = $pdo->go($base . " AND conferma = 'S' AND ammesso = 'S' AND valutato = 'N'",$bind)->fetch(PDO::FETCH_COLUMN);
$return["ammessi"] = $pdo->go($base . " AND conferma = 'S' AND ammesso = 'S'",$bind)->fetch(PDO::FETCH_COLUMN);
$return["respinti"] = $pdo->go($base . " AND conferma = 'S' AND ammesso = 'N' AND valutato = 'S'",$bind)->fetch(PDO::FETCH_COLUMN);
$return["integrazioni"] = $pdo->go($base . " AND conferma = 'S' AND integrazioni IS NOT NULL AND integrazioni <> 'N'",$bind)->fetch(PDO::FETCH_COLUMN);
$return["generale"] = $pdo->go($base . " AND conferma = 'S'",$bind)->fetch(PDO::FETCH_COLUMN);
return $return;
}
public static function getDataTableJSON($input) {
if (isset($input["draw"])) {
global $pdo;
$return = array();
$return["draw"] = (int)$input["draw"];
$return["recordsTotal"] = (int)0;
$return["recordsFiltered"] = (int)0;
$filters = [];
if (isset($input["tipologia"]) && $input["tipologia"] !== "") {
$filters[static::getMainTable() . ".tipologia"] = $input["tipologia"];
}
$total = static::getList($filters, [], 0, -1);
if (!empty($total)) {
$tipologie = static::getTipologie();
$return["recordsTotal"] = (int)count($total);
if (!empty($input["search"]["value"])) {
$filters["*"] = $input["search"]["value"];
}
if (isset($input["stato"]) && $input["stato"] !== "") {
$filters[static::getMainTable() . ".stato"] = $input["stato"];
}
if (isset($input["ente"]) && $input["ente"] !== "") {
$filters[static::getMainTable() . ".codice_ente"] = $input["ente"];
}
$order = [];
if (isset($input["order"][0]["column"])) {
switch ($input["order"][0]["column"]) {
case "3":
$orderKey = static::getMainTable() . ".badge";
break;
case "4":
$orderKey = static::getMainTable() . ".tipologia";
break;
case "5":
$orderKey = static::getMainTable() . ".oggetto";
break;
default:
$orderKey = static::getMainTable() . ".id";
break;
}
if ($input["order"][0]["dir"] == "desc") {
$order[$orderKey] = "DESC";
} else {
$order[$orderKey] = "ASC";
}
}
$risultati = static::getList($filters, $order, $input["start"], $input["length"]);
if (count($risultati) > 0) {
if (!empty($input["search"]["value"])) {
$return["recordsFiltered"] = (int)count($risultati);
} else {
$return["recordsFiltered"] = $return["recordsTotal"];
}
$return["data"] = array();
$stati = static::getStati();
foreach ($risultati AS $record) {
$stato = $stati[$record["stato"]];
if ($record["stato"] == 20 && strtotime($record["pubblicazione"]) > time()) {
$stato["titolo"] = "Programmata pubblicazione";
}
$panelHref = "/backend/".static::getDirectory()."/panel.php?codice={$record["codice"]}";
$row = array();
$row[] = '<div id="flag_' . $record["codice"] . '" class="status_flag" style="background-color:' . $stato["color"] . '"></div>';
$row[] = __($stato["titolo"]);
$row[] = $record["id"];
$row[] = ($record["badge"] > 0) ? "<span class='badge badge-danger' style='font-size:1em'>" . $record["badge"] . "</span> " : "";
$row[] = __($tipologie[$record["tipologia"]]);
$row[] = "<strong><a href='{$panelHref}' title='" . __("gestisci") . "'>" . $record["oggetto"] . "</a></strong>";
$count = static::getTotaliPartecipanti($record["codice"]);
foreach($count AS $num) {
$row[] = $num;
}
$row[] = "<a href='{$panelHref}' title='" . __("gestisci") . "' class='btn-info btn-sm'><span class='fa fa-th'></span></a>";
$return["data"][] = $row;
}
} else {
$return["data"] = array();
}
} else {
$return["data"] = array();
}
return $return;
}
}
public static function getList($filters=[],$order=[],$start=0,$length=1) {
$tabella = static::getMainTable();
global $pdo;
$select = "SELECT {$tabella}.codice, {$tabella}.badge, {$tabella}.codice_ente, {$tabella}.id, {$tabella}.stato, {$tabella}.tipologia, {$tabella}.oggetto, {$tabella}.pubblicazione ";
$from = " FROM {$tabella} ";
$bind = [];
$where = " WHERE {$tabella}.codice > 0 ";
if ($_SESSION["utente"]->gerarchia > 10) {
$ids = Utente::getPermissionsInModulo($_SESSION["ente"]->codice,$_SESSION["utente"]->codice,static::getModulo());
$ids = implode(",",$ids);
$where .= " AND {$tabella}.codice IN ({$ids}) ";
}
if (!$_SESSION["utente"]->fromHere()) {
$where .= " AND {$tabella}.codice_ente = :codice_ente";
$bind[":codice_ente"] = $_SESSION["utente"]->codice_ente;
}
if (!empty($filters)) {
$keys = ["{$tabella}.id","{$tabella}.oggetto","{$tabella}.descrizione"];
$addWhere = [];
foreach($keys AS $key) {
if (isset($filters[$key]) || isset($filters["*"])) {
$value = $filters[$key] ?? $filters["*"];
$sudd = suddivisione_pdo($value,$key);
if (!empty($sudd)) {
$bind = $bind + $sudd["bind"];
$addWhere[] = $sudd["sql"];
}
}
}
if (!empty($addWhere)) { $where .= " AND (" . implode(" OR ",$addWhere) . ") "; }
if (isset($filters["{$tabella}.codice_ente"])) {
$bind[":codice_ente"] = (int)$filters["{$tabella}.codice_ente"];
$where .= " AND {$tabella}.codice_ente = :codice_ente ";
}
if (isset($filters["{$tabella}.stato"])) {
$bind[":stato"] = (int)$filters["{$tabella}.stato"];
$where .= " AND {$tabella}.stato = :stato ";
}
if (isset($filters["{$tabella}.tipologia"])) {
$bind[":tipologia"] = $filters["{$tabella}.tipologia"];
$where .= " AND {$tabella}.tipologia = :tipologia ";
}
if (isset($filters["{$tabella}.codice"])) {
$bind[":codice"] = (int)$filters["{$tabella}.codice"];
$where .= " AND {$tabella}.codice = :codice ";
}
}
$sort = "ORDER BY {$tabella}.id DESC ";
if (!empty($order)) {
$keys = ["{$tabella}.id","{$tabella}.badge","{$tabella}.stato","{$tabella}.oggetto"];
$sortArray = [];
foreach($keys AS $key) {
if (isset($order[$key])) {
if (strcmp($order[$key],"ASC") === 0) {
$sortArray[] = "{$key} ASC";
} else {
$sortArray[] = "{$key} DESC";
}
}
}
if (!empty($sortArray)) {
$sort = " ORDER BY " . implode(",",$sortArray);
}
}
$limit = "";
if (is_numeric($start) && is_numeric($length) && $length > 0) {
$start = (int)$start;
$length = (int)$length;
$limit = " LIMIT {$start}, {$length}";
}
$return = $pdo->go($select.$from.$where." GROUP BY {$tabella}.codice ".$sort.$limit,$bind)->fetchAll(PDO::FETCH_ASSOC);
return $return;
}
public function getCategorieMerceologiche()
{
$codici_categoria = [];
$sql_categoria = "SELECT codice FROM {$this->cpvTable} WHERE codice_elenco = :codice ";
$ris_custom = $this->db->go($sql_categoria, array(":codice" => $this->info["codice"]));
if ($ris_custom->rowCount() > 0) {
while ($categoria = $ris_custom->fetch(PDO::FETCH_ASSOC)) {
if (!empty($categoria)) {
$codici_categoria[] = $categoria["codice"];
}
}
}
$codici_categoria = array_unique($codici_categoria);
return $codici_categoria;
}
public static function getIstanzeOE(int $codice_oe) : ?array {
if (!empty(static::getMainTable())) {
$mainTable = static::getMainTable();
$partecipantiTable = static::getOeTable();
global $pdo;
return $pdo->go("SELECT {$partecipantiTable}.*, {$mainTable}.tipologia,{$mainTable}.oggetto FROM
{$partecipantiTable} JOIN {$mainTable} ON {$partecipantiTable}.codice_elenco = {$mainTable}.codice
WHERE {$partecipantiTable}.codice_operatore = :oe AND {$partecipantiTable}.conferma = 'S'",[":oe"=>$codice_oe])->fetchAll(PDO::FETCH_ASSOC);
}
}
public function getIstanzeAffini(int $codice_oe) : ? array {
$return = [];
if (in_array($this->info["tipologia"],static::tipologieEsitiCumulativi())) {
$altreIstanze = static::getIstanzeOE($codice_oe);
if (!empty($altreIstanze)) {
foreach($altreIstanze AS $istanza) {
if ($istanza["tipologia"] == $this->info["tipologia"] && $istanza["valutato"] == "N" && $istanza["codice_elenco"] != $this->info["codice"] && ($_SESSION["utente"]->permission($this->modulo,$istanza["codice_elenco"],"partecipanti"))) {
$return[] = $istanza;
}
}
}
}
return $return;
}
public function saveMainData(array $input) {
$data = ["codice"=>$this->info["codice"]];
$data = $data + $input;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = static::getMainTable();
$salva->operazione = "UPDATE";
$salva->oggetto = $data;
return ($salva->save());
}
public static function save($data)
{
if (!empty(static::getMainTable()) && !empty(static::getCpvTable())) {
global $pdo;
$entiAbilitati = $_SESSION["utente"]->getEntiBeneficiari();
if ($_SESSION["ente"]->checkLimite(static::getModulo()) || $data["codice"] > 0) {
$checkEnte = false;
$return = false;
foreach ($entiAbilitati as $ente) {
if ($data["codice_ente"] == $ente["codice"]) {
$checkEnte = true;
break;
}
}
if ($checkEnte) {
$operazione = empty($data["codice"]) ? "INSERT" : "UPDATE";
if ($operazione == "INSERT") {
$data["id"] = 1;
$data["utente_creazione"] = $_SESSION["utente"]->codice ?? -1;
$data["timestamp_creazione"] = date("Y-m-d H:i:s");
$sql = "SELECT id FROM " . static::getMainTable() . " ORDER BY id DESC LIMIT 0,1 ";
$ris = $pdo->go($sql);
if ($ris->rowCount() === 1) {
$rec = $ris->fetch(PDO::FETCH_ASSOC);
$data["id"] = $rec["id"] + 1;
}
}
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = static::getMainTable();
$salva->operazione = $operazione;
$salva->oggetto = $data;
$codice = $salva->save();
if ($codice !== false) {
if ($operazione == "INSERT") {
if ($_SESSION["utente"]->gerarchia > 15) {
$utenti = [$_SESSION["utente"]->codice];
}
if (!empty($utenti)) {
foreach ($utenti as $utente) {
$permesso = [];
$permesso["sezione"] = static::getModulo();
$permesso["codice_elemento"] = $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();
}
}
}
$elenco = static::init($codice);
if (!empty($elenco)) {
$elenco->addToLog($operazione,__("Dati preliminari") . " #{$codice}");
if (!empty($data["extra"])) {
if (!empty($elenco)) {
foreach($data["extra"] AS $key => $value) {
$elenco->saveExtraInfo($key,$value);
}
}
}
}
$bind = array(":codice" => $codice);
$strsql = "DELETE FROM " . static::getCpvTable() . " WHERE codice_elenco = :codice";
$pdo->go($strsql, $bind);
scriviLog(static::getCpvTable(), "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 " . static::getCpvTable() . " (codice_elenco,codice,utente_modifica) VALUES (:codice,:codice_categoria,:codice_utente)";
$pdo->go($strsql, $bind);
scriviLog(static::getCpvTable(), "INSERT", $pdo->getSQL());
}
}
}
if (!$_SESSION["ente"]->checkLimite(static::getModulo()) && empty($data["codice"])) {
$_SESSION["ente"]->sendAlertLimite(static::getModulo());
}
return $codice;
}
}
}
}
}
public function updateStato($stato)
{
if (!empty($this->mainTable)) {
if ($this->info["stato"] < $stato) {
$this->db->go("UPDATE {$this->mainTable} SET stato = :stato WHERE codice = :codice", [":stato" => $stato, ":codice" => $this->info["codice"]]);
}
if (isset($_SESSION["ente"])) {
$_SESSION["ente"]->manageUpdates($this->modulo,$this->info["codice"],$this);
}
}
}
public function switchShowPartecipanti()
{
if ($this->canShowPartecipanti()) {
$new = ($this->info["visualizza_elenco"] == "S") ? "N" : "S";
$this->db->go("UPDATE {$this->mainTable} SET visualizza_elenco = :stato WHERE codice = :codice", [":stato" => $new, ":codice" => $this->info["codice"]]);
$this->addToLog(($this->info["visualizza_elenco"] == "S") ? "NASCONDI" : "VISUALIZZA",__("Elenco partecipanti"));
return true;
}
}
public function getManagerRegistro()
{
return new registriManager($this->getModulo(), $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 function saveExtraInfo($chiave, $valore)
{
$extraInfo = $this->getExtraInfo();
$extraInfo[$chiave] = $valore;
$this->info["extraInfo"] = $extraInfo = json_encode($extraInfo);
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = $this->mainTable;
$salva->operazione = "UPDATE";
$salva->oggetto = ["codice" => $this->info["codice"], "extraInfo" => $extraInfo];
if (!empty($salva->save())) {
return true;
}
return false;
}
public function getExtraInfo()
{
if (!empty($this->info["extraInfo"])) {
return json_decode($this->info["extraInfo"], true);
}
return false;
}
public static function getStati()
{
global $beRoot;
return jsonToArray($beRoot . "/" . static::getDirectory() . "/stati.json");
}
public function getDestinatari()
{
$destinatari = $this->getPartecipanti([],[],0,-1) ?? [];
return array_column($destinatari,"codice_operatore");
}
public function getDestinatariInterni(bool $onlyCode = false) {
$return = [];
$utenti = $this->getManagerRegistro()->getUtentiCoinvolti();
if (!empty($utenti)) {
$info = Utente::getInfoFromID($utenti);
if (!empty($info)) {
foreach($info AS $u) {
if ($u["ruolo"] == "USR") {
$return[] = ($onlyCode) ? $u["codice"] : $u["email"];
}
}
}
}
return $return;
}
protected static function initInstance($codice,$class)
{
if (!empty($codice) && !empty($_SESSION["ente"]) && !empty($_SESSION["utente"])) {
global $pdo;
$bind = [":codice" => $codice];
$sql = "SELECT * FROM " . static::getMainTable() . " WHERE codice = :codice ";
if (! defined("__CMDS_JOB_EXEC") && ! $_SESSION["utente"]->fromHere()) {
$sql .= " AND codice_ente = :codice_ente";
$bind[":codice_ente"] = $_SESSION["utente"]->codice_ente;
}
$elenco = $pdo->go($sql, $bind)->fetch(PDO::FETCH_ASSOC);
if (!empty($elenco)) {
if (!defined("__CMDS_JOB_EXEC")) {
$continua = $_SESSION["utente"]->permission(static::getModulo(),$elenco["codice"],"0",true);
} else {
$continua = true;
}
if ($continua) {
$extensionClass= self::extensionExists($class);
if (!empty($extensionClass)) {
$instance = new $extensionClass();
} else {
$instance = new $class();
}
$instance->info = $elenco;
if (isset($instance->info) && $instance->info["stato"] == 20 && !empty($instance->info["scadenza"]) && strtotime($instance->info["scadenza"]) < time()) {
$instance->updateStato(21);
}
return $instance;
}
}
}
return false;
}
private static function defaultAutenticationLevel() {
return $_SESSION["ente"]->defaultAutenticationLevel();
}
public function checkLock($id_cmd)
{
$return = true;
$stato = $this->info["stato"];
if ($_SESSION["utente"]->readOnly) {
return true;
} else {
if ($_SESSION["utente"]->hasSuperPowers()) {
$return = false;
} else {
if (($stato >= 0) && !empty($id_cmd) && $_SESSION["utente"]->unlockSupporto()) {
$cmd = $this->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;
}
public function soaObbligatorie() {
return $this->info["obbligo_soa"] == "S";
}
public function serviziTecniciObbligatori() {
return $this->info["obbligo_servizi_tecnici"] == "S";
}
public function soaRichiedibili() {
$tipolgie = static::tipologieConSOA();
return (in_array($this->info["tipologia"],$tipolgie));
}
public function serviziTecniciRichiedibili() {
$tipolgie = static::tipologieConServiziTecnici();
return (in_array($this->info["tipologia"],$tipolgie));
}
public function getForms()
{
return $this->db->go("SELECT codice_form FROM " . $this->getFormTable() . " WHERE codice_elenco = :elenco",[":elenco"=>$this->info["codice"]])->fetchAll(PDO::FETCH_COLUMN);
}
public function getRichiestaQuestionari() {
$richieste = $this->getRichieste();
foreach($richieste AS $richiesta) {
if ($richiesta["locked"] == "S") {
return $richiesta;
}
}
}
public function associaForm($forms,string $requireSignature = "N") {
$this->db->go("DELETE FROM " . $this->getFormTable() . " WHERE codice_elenco = :elenco",[":elenco"=>$this->info["codice"]]);
$this->db->go("UPDATE ". $this->getMainTable(). " SET richiedi_firma = 'N' WHERE codice = :elenco",[":elenco"=>$this->info["codice"]]);
$richiestaQuestionari = $this->getRichiestaQuestionari();
$deleteRequestQuestionari = false;
if (!empty($forms)) {
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = $this->getFormTable();
$salva->operazione = "INSERT";
foreach($forms AS $form) {
$salva->oggetto = ["codice_elenco"=>$this->info["codice"],"codice_form"=>$form];
$salva->save();
}
if ($requireSignature == "S") {
$this->db->go("UPDATE ". $this->getMainTable(). " SET richiedi_firma = 'S' WHERE codice = :elenco",[":elenco"=>$this->info["codice"]]);
if (empty($richiestaQuestionari)) {
$this->saveRichiesta([
"ordinamento" => 0,
"titolo" => "Questionari sottoscritti",
"descrizione" => "Carica la versione sottoscritta del PDF contenente i questionari compilati",
"controllo" => "F",
"locked" => "S"
]);
} else if (isset($richiestaQuestionari["archiviato"]) && $richiestaQuestionari["archiviato"] == "S") {
$this->db->go("UPDATE " . $this->richiesteTable . " SET archiviato = 'N' WHERE codice = :codice", [":codice"=>$richiestaQuestionari["codice"]]);
}
} else {
$deleteRequestQuestionari = true;
}
} else {
$deleteRequestQuestionari = true;
}
if ($deleteRequestQuestionari) {
if (!empty($richiestaQuestionari)) {
if (isset($richiestaQuestionari["archiviato"])) {
$this->db->go("UPDATE " . $this->richiesteTable . " SET archiviato = 'S' WHERE codice = :codice", [":codice"=>$richiestaQuestionari["codice"]]);
} else {
$this->db->go("DELETE FROM " . $this->richiesteTable . " WHERE codice = :codice", [":codice"=>$richiestaQuestionari["codice"]]);
}
}
}
$this->valutaElaborazione();
}
public function getRichieste()
{
$bind = [":codice" => $this->info["codice"]];
$sql = "SELECT {$this->richiesteTable}.* FROM {$this->richiesteTable} WHERE codice_elenco = :codice ORDER BY {$this->richiesteTable}.ordinamento, {$this->richiesteTable}.codice ";
return $this->db->go($sql, $bind)->fetchAll(PDO::FETCH_ASSOC);
}
public function getRichiesta($codice) {
$richieste = $this->getRichieste();
if (!empty($richieste)) {
foreach($richieste AS $richiesta) {
if ($richiesta["codice"] == $codice) {
return $richiesta;
}
}
}
return false;
}
public function addDGUERequest()
{
if (!$this->checkLock("elaborazione") &&
$this->db->go("SELECT codice FROM {$this->richiesteTable} WHERE titolo = 'DGUE' AND codice_elenco = :codice", [":codice" => $this->info["codice"]])
->rowCount() == 0
) {
$richiesta = [];
$richiesta["ordinamento"] = 0;
$richiesta["titolo"] = "DGUE";
$richiesta["descrizione"] = __("Documento di Gara Unico Europeo");
$richiesta["controllo"] = "F";
return $this->saveRichiesta($richiesta);
}
}
public function deleteDGUERequest()
{
if (!$this->checkLock("elaborazione")) {
$this->db->go("DELETE FROM {$this->richiesteTable} WHERE titolo = 'DGUE' AND codice_elenco = :codice", [":codice" => $this->info["codice"]]);
}
}
public function saveRichiesta($richiesta,$allegati = []) {
$richiesta["codice_elenco"] = $this->info["codice"];
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = $this->richiesteTable;
$salva->operazione = (!empty($richiesta["codice"])) ? "UPDATE" : "INSERT";
$salva->oggetto = $richiesta;
$cod_richiesta = $salva->save();
if (!empty($cod_richiesta)) {
if (!empty($allegati)) {
foreach($allegati as $allegato) {
filesManager::saveFile($allegato["filename"],$cod_richiesta,$this->getModulo()."-richiesta",$allegato["nome"] ?? "","A",$allegato["classificazione"] ?? "");
}
}
$this->addToLog($salva->operazione,__("Richiesta").": " . $richiesta["titolo"]);
$this->valutaElaborazione();
return $cod_richiesta;
}
}
public function valutaElaborazione() {
if ($this->info["stato"] < 10) {
if (!empty($this->getRichieste()) || !empty($this->getForms())) {
$this->updateStato(10);
}
}
}
public function getManagerRichieste($partecipante)
{
$managerRichieste = new richiesteOE($this->modulo, $this->info["codice"],$partecipante);
if (!empty($managerRichieste)) {
$this->managerRichieste = $managerRichieste;
}
return $this->managerRichieste;
}
public function getPartecipanti($filters = [],$order = [], $start=0, $length = 1)
{
$bind = [":codice_elenco" => $this->info["codice"]];
$sql = "SELECT * FROM {$this->oeTable} WHERE codice_elenco = :codice_elenco AND conferma = 'S' ";
if (!empty($filters["codice"])) {
$sql .= " AND codice = :codice_partecipante ";
$bind[":codice_partecipante"] = $filters["codice"];
}
if (!empty($filters["stato"])) {
switch($filters["stato"]) {
case "nuovi": $sql .= " AND ammesso = 'N' AND valutato = 'N' "; break;
case "aggiornamenti": $sql .= " AND ammesso = 'S' AND valutato = 'N' "; break;
case "ammessi": $sql .= " AND ammesso = 'S' "; break;
case "respinti": $sql .= " AND ammesso = 'N' AND valutato = 'S' "; break;
case "integrazioni": $sql .= " AND integrazioni IS NOT NULL AND integrazioni <> 'N' "; break;
default: break;
}
}
if (!empty($filters["stato_integrazioni"])) {
switch($filters["stato_integrazioni"]) {
case "no-richieste": $sql .= " AND (integrazioni IS NULL OR integrazioni = 'N') "; break;
case "richieste": $sql .= " AND integrazioni IS NOT NULL AND integrazioni <> 'N' "; break;
case "no-risposte": $sql .= " AND integrazioni = 'S' "; break;
case "risposte": $sql .= " AND integrazioni = 'R' "; break;
default: break;
}
}
$tmp = $this->db->go($sql, $bind)->fetchAll(PDO::FETCH_ASSOC);
$return = [];
if (!empty($tmp)) {
$ids = array_column($tmp,"codice_operatore");
}
if (!empty($ids)) {
if (static::refPartecipante() == "operatore") {
$infos = oeManager::getOE($ids);
} else {
$usrs = Utente::getInfoFromID($ids);
$infos = [];
if (!empty($usrs)) {
foreach($usrs AS $usr) {
$infos[$usr["codice"]] = $usr;
}
}
}
foreach($tmp AS $partecipazione) {
$infoPartecipante = $infos[$partecipazione["codice_operatore"]];
$insert = true;
if (!empty($filters["*"])) {
$insert = false;
if (static::refPartecipante() == "operatore") {
if (stripos($infoPartecipante["codice_fiscale_impresa"],$filters["*"]) !== false || stripos($infoPartecipante["ragione_sociale"],$filters["*"]) !== false) {
$insert = true;
}
} else {
if (stripos($infoPartecipante["cf"],$filters["*"]) !== false || stripos($infoPartecipante["cognome"],$filters["*"]) !== false || stripos($infoPartecipante["nome"],$filters["*"]) !== false) {
$insert = true;
}
}
}
if ($insert) {
if (static::refPartecipante() == "operatore") {
$partecipazione["codice_fiscale"] = $infoPartecipante["codice_fiscale_impresa"];
$partecipazione["ragione_sociale"] = $infoPartecipante["ragione_sociale"];
$partecipazione["ruolo"] = "OPE";
} else {
$partecipazione["codice_fiscale"] = $infoPartecipante["cf"];
$partecipazione["ragione_sociale"] = $infoPartecipante["cognome"] . " " . $infoPartecipante["nome"];
$partecipazione["ruolo"] = $infoPartecipante["ruolo"];
}
$badgeIntegrazioni = "";
if (isset($filters["stato"]) && $filters["stato"] != "integrazioni") {
if($partecipazione["integrazioni"] == "S") {
$badgeIntegrazioni = "<small class='badge badge-primary'>Richiesta integrazione</small><br>";
}
if($partecipazione["integrazioni"] == "R") {
$badgeIntegrazioni = "<small class='badge badge-success'>Risposto integrazione</small><br>";
}
}
$partecipazione["ragione_sociale"] = $badgeIntegrazioni . $partecipazione["ragione_sociale"];
$partecipazione["timestamp_scadenza"] = "";
$partecipazione["gg"] = "";
if (isset($filters["stato"])) {
if (!empty($this->info["mesi_revisione"]) && $filters["stato"] != "nuovi" && !empty($partecipazione["timestamp_abilitazione"])) {
$time_scadenza = strtotime("+{$this->info["mesi_revisione"]} months",strtotime($partecipazione["timestamp_abilitazione"]));
$partecipazione["timestamp_scadenza"] = date('Y-m-d', $time_scadenza);
$partecipazione["gg"] = floor(($time_scadenza - time()) / 60 / 60 / 24);
if ($filters["stato"] != "respinti") {
if ($partecipazione["gg"] <= 1) {
$partecipazione["rowClass"] = "bg-danger";
} else if ($partecipazione["gg"] <= 10) {
$partecipazione["rowClass"] = "bg-warning";
}
}
} else if ($filters["stato"] == "integrazioni") {
$partecipazione["gg"] = ($partecipazione["integrazioni"] == "R") ? "<span class='badge badge-success'>" . __("Risposto") . "</span>" : "";
} else if ($filters["stato"] == "nuovi") {
$partecipazione["gg"] = floor((time() - strtotime($partecipazione["timestamp_aggiornamento"])) / 60 / 60 / 24);
if ($partecipazione["gg"] > 30) {
$partecipazione["rowClass"] = "bg-danger";
if ($partecipazione["gg"] <= 90) {
$partecipazione["rowClass"] = "bg-warning";
}
}
}
}
unset($partecipazione["visto"]);
$return[] = $partecipazione;
}
}
}
if (!empty($order)) {
foreach($order AS $key => $direction) {
$sort = array_column($return, $key);
array_multisort($sort, ($direction == "DESC") ? SORT_DESC : SORT_ASC, $return);
}
}
if ($length > 0) {
$return = array_slice($return,$start,$length,true);
}
return $return;
}
public function getPartecipante($codice) {
return $this->getPartecipanti(["codice"=>$codice])[0] ?? false;
}
public function getPartecipantiDataTableJSON($input,$returnFullData = false) {
if (isset($input["draw"])) {
$return = array();
$return["draw"] = (int)$input["draw"];
$return["recordsTotal"] = (int)0;
$return["recordsFiltered"] = (int)0;
$total = $this->getPartecipanti([], [], 0, -1);
if (!empty($total)) {
$return["recordsTotal"] = (int)count($total);
$filters = [];
if (!empty($input["search"]["value"])) {
$filters["*"] = $input["search"]["value"];
}
if (isset($input["stato"]) && $input["stato"] !== "") {
$filters["stato"] = $input["stato"];
}
if (isset($input["stato_integrazioni"]) && $input["stato_integrazioni"] !== "") {
$filters["stato_integrazioni"] = $input["stato_integrazioni"];
}
$order = [];
if (isset($input["order"][0]["column"])) {
switch ($input["order"][0]["column"]) {
case "0":
$orderKey = "codice_fiscale";
break;
case "1":
$orderKey = "ragione_sociale";
break;
case "2":
$orderKey = "timestamp_aggiornamento";
break;
case "3":
$orderKey = "timestamp_abilitazione";
break;
case "4":
$orderKey = "timestamp_scadenza";
break;
case "5":
$orderKey = "gg";
break;
case "6":
$orderKey = "timestamp";
break;
default:
$orderKey = "timestamp_aggiornamento";
break;
}
if ($input["order"][0]["dir"] == "desc") {
$order[$orderKey] = "DESC";
} else {
$order[$orderKey] = "ASC";
}
}
$risultati = $this->getPartecipanti($filters, $order, $input["start"], $input["length"]);
if (count($risultati) > 0) {
if (!empty($filters)) {
$return["recordsFiltered"] = (int) count($this->getPartecipanti($filters, $order,0,-1));
} else {
$return["recordsFiltered"] = $return["recordsTotal"];
}
$return["data"] = array();
foreach ($risultati AS $record) {
if ($returnFullData) {
$row = $record;
} else {
$row = array();
if (!empty($record["rowClass"])) {
$row["DT_RowClass"] = $record["rowClass"];
}
$row[] = $record["codice_fiscale"];
$row[] = $record["ragione_sociale"];
$row[] = mysql2datetime($record["timestamp_aggiornamento"]);
$row[] = mysql2datetime($record["timestamp_abilitazione"]);
$row[] = mysql2date($record["timestamp_scadenza"]);
$row[] = $record["gg"];
$row[] = mysql2datetime($record["timestamp"]);
if ($record["ruolo"] == "OPE") {
$row[] = "<a href='/backend/".$this->modulo."/partecipanti/dettaglio.php?codice=".$this->info["codice"]."&codice_partecipante=" . $record["codice"] . "' title='" . __("gestisci") . "' class='btn-info btn-sm'><span class='fa fa-search'></span></a>";
} else {
$row[] = "";
}
}
$return["data"][] = $row;
}
} else {
$return["data"] = array();
}
} else {
$return["data"] = array();
}
return $return;
}
}
private function initForm($form,$partecipante) {
$forms = $this->getForms();
if (!empty($form)) {
if (in_array($form,$forms) !== false) {
$partecipante = $this->getPartecipante($partecipante);
if (!empty($partecipante)) {
$formManager = new FormManager;
$formManager->stripEnte = true;
if ($formManager->init($form,$this->modulo."-".$_SESSION["ente"]->codice,$partecipante["codice"])) {
return $formManager;
}
}
}
}
}
public function showFormPartecipante($form,$partecipante) {
$formManager = $this->initForm($form,$partecipante);
if (!empty($formManager)) {
?><h2><?= json_decode($formManager->info["titolo"],true)[$_SESSION["language"]]; ?></h2><?
$formManager->printForm(false);
return true;
}
return false;
}
public function showVersioneFormPartecipante($form,$partecipante,$codice_versione) {
$formManager = $this->initForm($form,$partecipante);
if (!empty($formManager)) {
$data = $formManager->getVersion($codice_versione);
if (!empty($data["data"])) {
?><h2><?= json_decode($formManager->info["titolo"],true)[$_SESSION["language"]]; ?></h2><?
$formManager->forcedData = $data["data"];
$formManager->printForm(false);
}
return true;
}
return false;
}
public function showDocumento($richiesta,$partecipante) {
$richiesta = $this->getRichiesta($richiesta);
if (!empty($richiesta)) {
$partecipante = $this->getPartecipante($partecipante);
if (!empty($partecipante)) {
$busta = $this->getBusta($partecipante["codice"],$richiesta["codice"],true);
include_once(__DIR__."/views/partecipanti/documento.php");
if (empty($error)) {
return true;
}
}
}
return false;
}
public function showVersioni($richiesta,$partecipante) {
$richiesta = $this->getRichiesta($richiesta);
if (!empty($richiesta)) {
$partecipante = $this->getPartecipante($partecipante);
if (!empty($partecipante)) {
$versioni = $this->getVersionsBusta($partecipante["codice"],$richiesta["codice"]);
include_once(__DIR__."/views/partecipanti/versioni.php");
if (empty($error)) {
return true;
}
}
}
return false;
}
public function showVersioniForm($form,$partecipante) {
$formMananager = $this->initForm($form,$partecipante);
if (!empty($formMananager)) {
$form = $formMananager->info;
$versioni = $formMananager->listVersions();
include_once(__DIR__."/views/partecipanti/versioni-form.php");
if (empty($error)) {
return true;
}
}
return false;
}
/**
* Restituisce un array con le partecipazioni degli OO.EE. specificati
*
* @param Array $ooee
* @return Array
*/
protected function getPartecipantiFromOE(Array $ooee) : Array {
$return = [];
if (!empty($ooee)) {
$qPartecipanti = $this->db->go("SELECT * FROM {$this->oeTable} WHERE codice_elenco = :elenco AND codice_operatore = :oe");
$qPartecipanti->bindValue(":elenco",$this->info["codice"]);
foreach($ooee AS $oe) {
$qPartecipanti->bindValue(":oe",$oe);
$qPartecipanti->execute();
if ($qPartecipanti->rowCount() > 0) {
$return[] = $qPartecipanti->fetch(PDO::FETCH_ASSOC);
}
}
}
return $return;
}
protected function updateStatoIntegrazioni(Array $partecipanti,String $stato) {
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = $this->oeTable ;
$salva->operazione = "UPDATE";
$salva->expect = array("codice","integrazioni","timestamp_modifica");
foreach($partecipanti AS $partecipante) {
$partecipante["integrazioni"] = $stato;
$salva->oggetto = $partecipante;
$salva->save();
}
if ($stato == "N") {
$this->updateBadges();
}
}
/**
* Aggiorna la posizione dell'operatore economico per memorizzare l'avvenuta richiesta di integrazione
*
* @param Array $ooee
* @return void
*/
public function postRichiesteOE(Array $infoRichiesta) {
if (!empty($infoRichiesta["destinatari"])) {
$partecipanti = $this->getPartecipantiFromOE($infoRichiesta["destinatari"]);
if (!empty($partecipanti)) {
$this->updateStatoIntegrazioni($partecipanti,"S");
}
}
}
public function updateBadges()
{
$badge = 0;
$sql_bad = "SELECT {$this->chiarimentiTable}.codice
FROM {$this->chiarimentiTable}
JOIN {$this->mainTable} ON {$this->chiarimentiTable}.codice_elenco = {$this->mainTable}.codice
WHERE ({$this->mainTable}.scadenza >= now() OR {$this->mainTable}.scadenza IS NULL)
AND {$this->chiarimentiTable}.attivo = 'N'
AND {$this->mainTable}.codice = :codice ";
$ris_badge = $this->db->go($sql_bad, [":codice" => $this->info["codice"]]);
$badge += $ris_badge->rowCount();
$sql_bad = "SELECT {$this->sopralluogoTable}.codice
FROM {$this->sopralluogoTable}
JOIN {$this->mainTable} ON {$this->sopralluogoTable}.codice_elenco = {$this->mainTable}.codice
WHERE ({$this->mainTable}.scadenza >= now() OR {$this->mainTable}.scadenza IS NULL)
AND {$this->sopralluogoTable}.attivo = 'P'
AND {$this->mainTable}.codice = :codice ";
$ris_badge = $this->db->go($sql_bad, [":codice" => $this->info["codice"]]);
$badge += $ris_badge->rowCount();
$sql_bad = "SELECT {$this->oeTable}.codice FROM {$this->oeTable} WHERE conferma = 'S' AND (integrazioni = 'R' OR valutato = 'N') AND codice_elenco = :codice";
$ris_badge = $this->db->go($sql_bad, [":codice" => $this->info["codice"]]);
$badge += $ris_badge->rowCount();
$this->db->go("UPDATE {$this->mainTable} SET badge = :badge WHERE codice = :codice", [":badge" => $badge, ":codice" => $this->info["codice"]]);
}
static function getModuli($filters = null, $stato = null)
{
global $config;
$moduli = jsonToArray($config["jsonFolder"] . "/" . static::getModulo() . "-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 && $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 getTipologie() {
return [];
}
static function getTipologiePannello($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"]."/".static::getModulo()."-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 = static::getModuli();
if (!empty($moduli[$radice])) {
$return = $moduli[$radice];
$return["id"] = $radice;
$return["titolo"] = __($return["titolo"]);
$return["descrizione"] = __($return["descrizione"]);
}
}
return $return;
}
public function getManagerIncarichi()
{
$manager = new Incarichi($this->getModulo(), $this->info["codice"]);
if (!empty($manager)) {
$this->managerIncarichi = $manager;
}
return $this->managerIncarichi;
}
public function getManagerDGUE()
{
$manager = new DGUE($this->getModulo(), $this->info["codice"]);
if (!empty($manager)) {
$this->managerDGUE = $manager;
}
return $this->managerDGUE;
}
public function getManagerAvvisi()
{
if (empty($this->managerAvvisi)) {
$avvisiProcedura = new avvisiProcedura($_SESSION["ente"]->codice, $this->getModulo(), $this->info["codice"]);
if (!empty($avvisiProcedura)) {
$this->managerAvvisi = $avvisiProcedura;
}
}
return $this->managerAvvisi;
}
public function getAvvisi()
{
return $this->getManagerAvvisi()->getAvvisi("N");
}
public function printAvvisi()
{
return $this->getManagerAvvisi()->printPublic();
}
public function getChiarimenti(int $codice = NULL)
{
$bind = [":codice_elenco" => $this->info["codice"]];
$sql_chiarimenti = "SELECT {$this->chiarimentiTable}.*
FROM {$this->chiarimentiTable}
WHERE {$this->chiarimentiTable}.codice_elenco = :codice_elenco ";
if (!empty($codice)) {
$sql_chiarimenti .= " AND {$this->chiarimentiTable}.codice = :codice ";
$bind[":codice"] = $codice;
}
$sql_chiarimenti .= " ORDER BY {$this->chiarimentiTable}.timestamp ";
$tmp = $this->db->go($sql_chiarimenti, $bind)->fetchAll(PDO::FETCH_ASSOC);
$return = [];
if (!empty($tmp)) {
$i = 0;
foreach ($tmp as $t) {
$i++;
$t["count"] = $i;
$oeInfo = oeManager::getOE($t["codice_richiedente"]);
$t["ragione_sociale"] = $oeInfo["ragione_sociale"];
$return[] = $t;
}
}
if (!empty($codice) && !empty($return)) {
$return = $return[0];
}
return $return;
}
public function saveRispostaChiarimento($input) {
if (!$this->checkLock("chiarimenti")) {
$record = $this->info;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = $this->chiarimentiTable ;
$salva->operazione = "UPDATE";
$salva->oggetto = $input;
$salva->expect = array("codice","revisione","risposta","attivo");
$codice = $salva->save();
if ($codice !== false) {
$this->updateBadges();
if (isset($input["allegato"])) {
foreach($input["allegato"] as $allegato) {
filesManager::saveFile($allegato["filename"],$codice,$this->modulo."-risposte",$allegato["nome"] ?? "","A",$allegato["classificazione"] ?? "");
}
}
$sql = "SELECT * FROM {$this->chiarimentiTable} WHERE codice = :codice";
$ris = $this->db->go($sql,[":codice"=>$codice]);
if ($ris->rowCount() > 0) {
$error = false;
$chiarimento = $ris->fetch(PDO::FETCH_ASSOC);
if ($chiarimento["attivo"] != "N") {
$corpo = "<h1>" . __("Elenco") . " #" . $record["id"] . "</h1>";
$corpo .= "<h2>" . $record["oggetto"] . "</h2>";
$corpo .= $chiarimento["revisione"] . "<br><br>";
$corpo .= "<strong>" . $chiarimento["risposta"] . "</strong>";
ob_start();
filesManager::printList($chiarimento["codice"],$this->modulo."-risposte","A",0,false);
$files = ob_get_clean();
if (!empty(trim($files))) {
$corpo .= "<br><br>" . $files;
}
$destinatari = $chiarimento["codice_richiedente"];
$mailer = new Communicator();
$mailer->oggetto = __('Risposta a chiarimento');
$mailer->comunicazione_tecnica = false;
$mailer->corpo = $corpo;
$mailer->codice_pec = $record["codice_pec"];
$mailer->comunicazione = true;
$mailer->sezione = $this->modulo;
$mailer->codice_gara = $record["codice"];
$mailer->coda = true;
$mailer->destinatari = $destinatari;
$esito = $mailer->send();
}
$this->addToLog("UPDATE",__("Risposta chiarimento") . " #{$codice}");
return true;
}
}
}
}
public function getSopralluoghi(int $codice = NULL)
{
$bind = [":codice_elenco" => $this->info["codice"]];
$sql_sopralluoghi = "SELECT {$this->sopralluogoTable}.*
FROM {$this->sopralluogoTable}
WHERE {$this->sopralluogoTable}.codice_elenco = :codice_elenco ";
if (!empty($codice)) {
$sql_sopralluoghi .= " AND {$this->sopralluogoTable}.codice = :codice ";
$bind[":codice"] = $codice;
}
$sql_sopralluoghi .= " ORDER BY {$this->sopralluogoTable}.timestamp ";
$tmp = $this->db->go($sql_sopralluoghi, $bind)->fetchAll(PDO::FETCH_ASSOC);
$return = [];
if (!empty($tmp)) {
foreach ($tmp as $t) {
$oeInfo = oeManager::getOE($t["codice_richiedente"]);
$t["ragione_sociale"] = $oeInfo["ragione_sociale"];
$return[] = $t;
}
}
if (!empty($codice) && !empty($return)) {
$return = $return[0];
}
return $return;
}
public function saveRispostaSopralluogo($input) {
if (!$this->checkLock("sopralluogo")) {
$record = $this->info;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = $this->sopralluogoTable;
$salva->operazione = "UPDATE";
$salva->oggetto = $input;
$salva->expect = array("codice","appuntamento","risposta","attivo");
$codice = $salva->save();
if ($codice !== false) {
$this->updateBadges();
if (isset($input["allegato"])) {
foreach($input["allegato"] as $allegato) {
filesManager::saveFile($allegato["filename"],$codice,$this->modulo."-sopralluogo",$allegato["nome"] ?? "","A",$allegato["classificazione"] ?? "");
}
}
$sql = "SELECT * FROM {$this->sopralluogoTable} WHERE codice = :codice";
$ris = $this->db->go($sql,[":codice"=>$codice]);
if ($ris->rowCount() > 0) {
$sopralluogo = $ris->fetch(PDO::FETCH_ASSOC);
$corpo = "<h1>ELENCO #" . $record["id"] . "</h1>";
$corpo .= "<h2>" . $record["oggetto"] . "</h2>";
$corpo .= "<strong>" . $sopralluogo["risposta"] . "</strong>";
ob_start();
filesManager::printList($sopralluogo["codice"],$this->modulo."-sopralluogo","A",0,false);
$files = ob_get_clean();
if (!empty(trim($files))) {
$corpo .= "<br><br>" . $files;
}
$destinatari = $sopralluogo["codice_richiedente"];
if ($sopralluogo["attivo"] == "S") {
$corpo .= "<br><br>".__("Data e ora appuntamento").": <strong>" . $sopralluogo["appuntamento"] . "</strong>";
$mailer = new Communicator();
$mailer->oggetto = __('Appuntamento sopralluogo');
} else if ($sopralluogo["attivo"] == "N") {
$mailer = new Communicator();
$mailer->oggetto = __('Rifiuto richiesta sopralluogo');
}
if (isset($mailer)) {
$mailer->corpo = $corpo;
$mailer->comunicazione_tecnica = false;
$mailer->codice_pec = $record["codice_pec"];
$mailer->comunicazione = true;
$mailer->sezione = $this->modulo;
$mailer->codice_gara = $record["codice"];
$mailer->coda = true;
$mailer->destinatari = $destinatari;
$esito = $mailer->send();
}
$this->addToLog("UPDATE",__("Risposta a richiesta sopralluogo") . " #{$codice}");
return true;
}
}
}
}
public function getVersionsBusta($partecipante, $richiesta)
{
$return = false;
$sql = "SELECT * FROM {$this->busteTable} WHERE codice_partecipante = :partecipante AND codice_richiesta = :richiesta AND soft_delete = 'S' ORDER BY codice DESC";
$bind = [":partecipante" => $partecipante, ":richiesta" => $richiesta];
$return = $this->db->go($sql, $bind)->fetchAll(PDO::FETCH_ASSOC);
return $return;
}
public function getVersionContentBusta($partecipante, $richiesta, $codice)
{
$return = false;
$sql = "SELECT * FROM {$this->busteTable} WHERE codice_partecipante = :partecipante AND codice_richiesta = :richiesta AND codice = :codice AND soft_delete = 'S'";
$bind = [":partecipante" => $partecipante, ":richiesta" => $richiesta, ":codice" => $codice];
$return = $this->db->go($sql, $bind)->fetchAll(PDO::FETCH_ASSOC);
if (!empty($return)) {
$return = $return[0];
$return["path"] = $this->getSpecificBustaPath($return);
adaptMemoryLimitToFile($return["path"]);
$content = file_get_contents($return["path"]);
if (!empty($content)) {
$content = simple_decrypt($content,base64_decode($return["content"]));
$return["content"] = $content;
}
}
return $return;
}
public function getBusta($partecipante, $richiesta, bool $contenuto = false)
{
$return = false;
$select = "*";
$sql = "SELECT {$select} FROM {$this->busteTable} WHERE codice_partecipante = :partecipante AND codice_richiesta = :richiesta AND soft_delete = 'N'";
$bind = [":partecipante" => $partecipante, ":richiesta" => $richiesta];
$return = $this->db->go($sql, $bind)->fetchAll(PDO::FETCH_ASSOC);
if (!empty($return)) {
$return = $return[0];
$return["path"] = $this->getSpecificBustaPath($return);
if ($contenuto) {
adaptMemoryLimitToFile($return["path"]);
$content = file_get_contents($return["path"]);
if (!empty($content)) {
$content = simple_decrypt($content,base64_decode($return["content"]));
$return["content"] = $content;
}
}
}
return $return;
}
public function getSpecificBustaPath($busta) {
return $this->getBustePath($busta["codice_partecipante"])."/{$busta["codice_richiesta"]}-{$busta["sha1"]}";
}
public function getBustePath(int $partecipante = null) {
global $config;
$path = "{$config["mediaFolder"]}/{$_SESSION["ente"]->codice}/{$this->modulo}-buste/{$this->info["codice"]}";
if (!file_exists($path)) {
mkdir($path,0777,true);
}
if (is_dir($path)) {
$return = true;
if (!empty($partecipante)) {
$return = false;
$path .= "/{$partecipante}";
if (!file_exists($path)) {
mkdir($path,0777,true);
}
if (is_dir($path)) {
$return = true;
}
}
if ($return) {
return $path;
}
}
}
public function printPanelIntegrazioni($partecipante) {
$print = true;
$partecipante = $this->getPartecipante($partecipante);
if (!empty($partecipante)) {
include(__DIR__ . "/views/integrazioni/pannello.php");
if (empty($error)) {
return true;
}
}
return false;
}
public function ammetti($partecipante) {
$partecipante = $this->getPartecipante($partecipante);
if (!empty($partecipante)) {
$update = ["codice"=>$partecipante["codice"]];
$update["valutato"]= "S";
$update["motivazione"] = "";
$update["ammesso"]= "S";
$update["integrazioni"]= "N";
$update["timestamp_abilitazione"] = date('Y-m-d H:i:s');
$update["utente_abilitazione"] = $_SESSION["utente"]->codice;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = $this->oeTable;
$salva->operazione = "UPDATE";
$salva->oggetto = $update;
$return = $salva->save();
if (!empty($return)) {
$this->updateBadges();
$this->addToLog(__("AMMESSO"),$partecipante["codice_fiscale"] . " - " . $partecipante["ragione_sociale"]);
$mailer = new Communicator();
$mailer->oggetto = __('Ammissione') . ' elenco #' . $this->info["id"];
$mailer->corpo = __("Si comunica l'ammissione al seguente elenco") . ":<br><strong>#{$this->info["id"]} {$this->info["oggetto"]}</strong>";
$mailer->codice_pec = $this->info["codice_pec"] ?? -1;
$mailer->comunicazione = true;
$mailer->sezione = $this->modulo;
$mailer->codice_gara = $this->info["codice"];
$mailer->coda = true;
$mailer->destinatari = $partecipante["codice_operatore"];
$mailer->send();
return true;
}
}
return false;
}
public function respingi($partecipante,$motivazione) {
$partecipante = $this->getPartecipante($partecipante);
if (!empty($partecipante)) {
$update = ["codice"=>$partecipante["codice"],"valutato"=>"S","motivazione"=>$motivazione,"ammesso"=>"N","integrazioni"=>"N"];
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = $this->oeTable;
$salva->operazione = "UPDATE";
$salva->oggetto = $update;
$return = $salva->save();
if (!empty($return)) {
$this->db->go("UPDATE {$this->oeTable} SET timestamp_abilitazione = NULL, utente_abilitazione = NULL WHERE codice = :codice",[":codice"=>$partecipante["codice"]]);
$this->updateBadges();
$this->addToLog(__("RESPINTO"),$partecipante["codice_fiscale"] . " - " . $partecipante["ragione_sociale"]. " - " . $motivazione);
$mailer = new Communicator();
$mailer->oggetto = __('Respinta istanza') . ' elenco #' . $this->info["id"];
$mailer->corpo = __("Si comunica il respingimento dell'istanza per il seguente elenco") . ":<br><strong>#{$this->info["id"]} {$this->info["oggetto"]}</strong>" . "<br><br>" . __("Motivazione") . ":<br>" . $motivazione;
$mailer->codice_pec = $this->info["codice_pec"] ?? -1;
$mailer->comunicazione = true;
$mailer->sezione = $this->modulo;
$mailer->codice_gara = $this->info["codice"];
$mailer->coda = true;
$mailer->destinatari = $partecipante["codice_operatore"];
$mailer->send();
return true;
}
}
return false;
}
}