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.
 
 
 
 
 

1739 righe
75 KiB

<?
class oeManager {
private $db;
public $generalFilter;
public $ratingMinimo;
public $categorie;
public $soa;
public $servizi_tecnici;
public $elenco;
public $advanced;
public $estesa;
public $conteggio_rotazione;
public $ambito_rotazione;
public $includiNonQualificati;
public $countInviti;
public $countAggiudicato;
public $operatoriSorteggio;
private Array $neededChecks = [];
private Array $obtainedChecks = [];
/**
* Alimenta i check che l'operatore economico deve ottenere tramite i filtri per il controllo dei filtri in AND
*
* @param String $checkID
* @return void
*/
private function addNeedCheck(String $checkID) {
if (!in_array($checkID,$this->neededChecks)) {
$this->neededChecks[] = $checkID;
}
}
/**
* Alimenta i check ottenuti dall'operatore economico a seguito del controllo tramite i filtri in AND
*
* @param String $checkID
* @return void
*/
private function addObtainedCheck(String $checkID,$oe) {
if (!isset($this->obtainedChecks[$oe])) {
$this->obtainedChecks[$oe] = [];
}
if (!in_array($checkID,$this->obtainedChecks[$oe])) {
$this->obtainedChecks[$oe][] = $checkID;
}
}
public static function getStandardForms($tipo,$codice_ente) {
$forms = [];
if ($tipo == "IMP" || $tipo == "ALL") {
$forms[] = "attivita-imp";
$forms[] = "registri-imp";
}
if ($tipo == "PRO" || $tipo == "ALL") {
$forms[] = "attivita-pro";
$forms[] = "registri-professionali";
}
$forms[] = "info-oe";
$forms[] = "organizzazione-oe";
$forms[] = "certificazioni";
return $forms;
}
public static function getIdFromPEC(string $pec) {
global $pdo;
$bind = [":valore"=>$pec];
$sql = "SELECT codice FROM b_operatori_economici WHERE pec = :valore ";
$ris = $pdo->go($sql,$bind);
return ($ris->rowCount() === 1) ? $ris->fetchColumn() : false;
}
public static function checkPEC($pec,$codice = 0) {
global $pdo;
$bind = [":valore"=>$pec];
$sql = "SELECT codice FROM b_operatori_economici WHERE pec = :valore ";
if (!empty($codice)) {
$bind[":codice"] = $codice;
$sql .= " AND codice <> :codice";
}
$ris = $pdo->go($sql,$bind);
return ($ris->rowCount() === 0) ? true : false;
}
public static function getCpvs($requested) {
global $pdo;
$cpvs = $pdo->prepare("SELECT codice FROM r_cpv_operatori WHERE codice_operatore = :request");
$codici = $requested;
if (!is_array($requested)) { $codici = [$requested]; }
$return = [];
foreach($codici AS $request) {
$cpvs->bindValue(":request",$request);
$cpvs->execute();
if ($cpvs->rowCount() > 0) {
while($cpv = $cpvs->fetch(PDO::FETCH_ASSOC)) {
if (!isset($return[$request])) { $return[$request] = []; }
$return[$request][] = $cpv["codice"];
}
}
}
if (!empty($return)) {
if (is_array($requested)) {
return $return;
} else {
return $return[$requested];
}
}
return false;
}
public static function tipiElenco() {
return array("b_bandi_albo"=>"Elenco fornitori");
}
public static function tabelleElenco() {
return array("b_bandi_albo"=>"r_partecipanti_albo");
}
/**
* checkVerificaOE
*
* @param mixed (String|Array) $codici_fiscali
*
* @return Array
*/
public function checkVerificaOE($codici_fiscali) : ?Array {
global $pdo;
$check = [];
if(! empty($_SESSION["ente"]) && $_SESSION["ente"]->hasModulo("verifica-art-80")) {
if(empty($_SESSION["articolo80"])) {
$ente = $_SESSION["ente"]->getInfo();
$_SESSION["articolo80"] = Articolo80::init($ente);
$stati = $_SESSION["articolo80"]->stati ?? null;
}
if(! empty($_SESSION["articolo80"])) {
if(! is_array($codici_fiscali)) { $codici_fiscali = [$codici_fiscali]; }
$params = [];
$bind = [];
for($i = 0; $i < count($codici_fiscali); $i++) {
$params[] = ":cf_{$i}";
$bind[":cf_{$i}"] = $codici_fiscali[$i];
}
$params = implode(", ", $params);
$result = $pdo->go("SELECT codice_fiscale, stato FROM b_verifiche_articolo_80 WHERE codice_fiscale IN ({$params})", $bind);
if($result->rowCount() > 0) {
$stati = $_SESSION["articolo80"]->stati;
while($stato = $result->fetch(PDO::FETCH_ASSOC)) {
$check[$stato["codice_fiscale"]] = $stati[$stato["stato"]];
}
}
if(count($codici_fiscali) == 1) {
return $check[$codici_fiscali[0]] ?? null;
}
return $check;
}
}
return null;
}
public static function getElenchi($codice_ente,$specificSource = null, $filterTipologia = null) {
global $pdo;
$sources = self::tipiElenco();
$bind = [":codice_ente"=>$codice_ente];
if (!empty($specificSource)) {
if (!empty($sources[$specificSource])) {
$sources = [$specificSource => $sources[$specificSource]];
} else {
$sources = [];
}
} else {
$elenchi = ["b_bandi_albo"=>[["codice"=>"0","denominazione"=>__("Qualsiasi elenco dei fornitori")]]];
}
if (!empty($sources)) {
foreach($sources AS $source => $label) {
$whereTipologia = "";
if (!empty($filterTipologia)) {
$whereTipologia = " AND {$source}.tipologia = :tipologia ";
$bind[":tipologia"] = $filterTipologia;
}
$sql_bando = "SELECT {$source}.* FROM {$source} WHERE {$source}.stato >= 20 {$whereTipologia} ORDER BY {$source}.id, {$source}.oggetto, {$source}.codice DESC";
$risultato_bando = $pdo->go($sql_bando,$bind);
if ($risultato_bando->rowCount()>0) {
while($bando = $risultato_bando->fetch(PDO::FETCH_ASSOC)) {
$label = "Elenco";
if ($source == "b_bandi_albo") {
$label = AlboFornitori::getTipologie()[$bando["tipologia"]];
}
$denominazione = __($label) . " - ";
$denominazione .= $bando["oggetto"];
if (isset($bando["data_scadenza"]) && mysql2date($bando["data_scadenza"]) != "") { $denominazione .= " - " . __("data_scadenza") . ":" . mysql2date($bando["data_scadenza"]); }
$elenchi[$source][] = ["codice"=>$bando["codice"],"id"=>$bando["id"],"denominazione"=>$denominazione];
}
}
}
}
return $elenchi;
}
public static function getFatturatiSOA($requested) {
global $pdo;
$risultato = $pdo->prepare("SELECT codice,codice_categoria FROM b_certificazioni_soa WHERE codice_operatore = :request AND codice_classifica = 0");
$fatturato = $pdo->prepare("SELECT * FROM b_fatturato_soa WHERE codice_attestazione = :codice");
$codici = $requested;
if (!is_array($requested)) { $codici = [$requested]; }
$return = [];
foreach($codici AS $request) {
$risultato->bindValue(":request",$request);
$risultato->execute();
if ($risultato->rowCount() > 0) {
while($attestazione = $risultato->fetch(PDO::FETCH_ASSOC)) {
$fatturato->bindValue(":codice",$attestazione["codice"]);
$fatturato->execute();
if ($fatturato->rowCount() > 0) {
while($record = $fatturato->fetch(PDO::FETCH_ASSOC)) {
if (!isset($return[$request])) { $return[$request] = []; }
$return[$request][$attestazione["codice_categoria"]][$record["anno"]] = $record["fatturato"];
}
}
}
}
}
if (!empty($return)) {
if (is_array($requested)) {
return $return;
} else {
return $return[$requested];
}
}
return false;
}
public static function getServiziTecnici($requested) {
global $pdo;
$risultato = $pdo->prepare("SELECT * FROM b_oe_servizi_tecnici WHERE codice_operatore = :request");
$servizi = $pdo->prepare("SELECT * FROM r_oe_servizi_tecnici WHERE codice_servizio = :servizio");
$codici = $requested;
if (!is_array($requested)) { $codici = [$requested]; }
$return = [];
foreach($codici AS $request) {
$risultato->bindValue(":request",$request);
$risultato->execute();
if ($risultato->rowCount() > 0) {
while($record = $risultato->fetch(PDO::FETCH_ASSOC)) {
if (!isset($return[$request])) { $return[$request] = []; }
$servizi->bindValue(":servizio",$record["codice"]);
$servizi->execute();
$record["servizi"] = $servizi->fetchAll(PDO::FETCH_ASSOC);
$return[$request][$record["codice"]] = $record;
}
}
}
if (!empty($return)) {
if (is_array($requested)) {
return $return;
} else {
return $return[$requested];
}
}
return false;
}
public static function getSOA($requested) {
global $pdo;
$risultato = $pdo->prepare("SELECT * FROM b_certificazioni_soa WHERE codice_operatore = :request AND codice_classifica > 0");
$codici = $requested;
if (!is_array($requested)) { $codici = [$requested]; }
$return = [];
foreach($codici AS $request) {
$risultato->bindValue(":request",$request);
$risultato->execute();
if ($risultato->rowCount() > 0) {
while($record = $risultato->fetch(PDO::FETCH_ASSOC)) {
if (!isset($return[$request])) { $return[$request] = []; }
$return[$request][] = $record;
}
}
}
if (!empty($return)) {
if (is_array($requested)) {
return $return;
} else {
return $return[$requested];
}
}
return false;
}
public static function getUser($requested) {
global $pdo;
$user = $pdo->prepare("SELECT b_utenti.* FROM b_utenti JOIN r_oe_utenti ON b_utenti.codice = r_oe_utenti.codice_utente WHERE r_oe_utenti.codice_operatore = :request ");
$codici = $requested;
if (!is_array($requested)) { $codici = [$requested]; }
$return = [];
foreach($codici AS $request) {
$user->bindValue(":request",$request);
$user->execute();
if ($user->rowCount() > 0) {
if (is_array($requested)) {
$return[$request] = $user->fetch();
} else {
return $user->fetch();
}
}
}
if (!empty($return)) {
return $return;
}
return false;
}
public static function getOE($requested) {
global $pdo;
if (!empty($requested)) {
$codici = $requested;
if (!is_array($requested)) { $codici = [$requested]; }
$return = [];
$count = 0;
$bind_string = [];
$bind = [];
foreach($codici AS $request) {
$bind_string[] = ":id_{$count}";
$bind[":id_{$count}"] = $request;
$count++;
}
if (!empty($bind_string)) {
$user = $pdo->prepare("SELECT * FROM b_operatori_economici WHERE codice IN (".implode(",",$bind_string).") ");
} else {
$user = $pdo->prepare("SELECT * FROM b_operatori_economici");
}
$user->execute($bind);
if ($user->rowCount() > 0) {
if (is_array($requested)) {
while ($tmp = $user->fetch(PDO::FETCH_ASSOC)) {
$return[$tmp["codice"]] = $tmp;
}
} else {
return $user->fetch(PDO::FETCH_ASSOC);
}
}
if (!empty($return)) {
return $return;
}
}
return false;
}
public static function validateCreate($params,$spidCode = null) {
$msg = [];
$user = ["nome","cognome","email","password"];
$oe = ["tipo","stato_legale","codice_fiscale_impresa","pec"];
$required = ["user"=>$user,"oe"=>$oe];
foreach($required AS $key => $checks) {
if (empty($params[$key])) {
$msg[] = $key;
} else {
if (is_array($checks)) {
foreach($checks AS $check) {
if (empty($params[$key][$check])) {
$msg[] = $check;
}
}
}
}
}
if (empty($msg)) {
if ($params["oe"]["tipo"] == "IMP" && empty($params["oe"]["ragione_sociale"])) {
$msg[] = "ragione_sociale";
}
if (!utente::checkEmail($params["user"]["email"])) {
$msg[] = "email";
}
if (!empty($spidCode) && !utente::checkSpidCode($spidCode)) {
$msg[] = "ID Spid";
}
if (!self::checkPEC($params["oe"]["pec"])) {
$msg[] = "pec";
}
}
if (empty($msg)) {
return true;
} else {
return $msg;
}
}
// Path relativo dell'archivio documenti
private const ARCHIVIO_DOCUMENTI = '/archivio-documenti/';
/**
* Ottiene la lista di documenti in archivio per un oe. Ritorna false se non ve se sono
*
* @param array $oe
* @return \FilesystemIterator|false
*/
public static function getArchiveDocumentList($oe) {
global $config;
// Se l'OE non ha un vecchio codice non c'è archivio documenti
if(empty($oe["vecchio_codice"])) return false;
// Prendiamo la cartella di base
$folder = realpath($config["mediaFolder"] . self::ARCHIVIO_DOCUMENTI . $oe["vecchio_codice"]);
if($folder === false) return false;
$iterator = new \FilesystemIterator($folder);
// Se il filesystemiterator è invalido la cartella è vuota
if(!$iterator->valid()) return false;
return $iterator;
}
/**
* Ritorna il path assoluto di un documento per un oe
*
* @param array $oe
* @param string $baseName
* @return string|false
*/
public static function getArchiveDocumentPath($oe, $baseName) {
$iterator = self::getArchiveDocumentList($oe);
if($iterator === false) return false;
foreach($iterator as $file) {
if($file->getBasename() === $baseName)
return $file->getRealPath();
}
}
/**
* Verifica che un oe abbia documenti in archivio
*
* @param array $oe
* @return boolean
*/
public static function hasAnyArchiveDocument($oe) {
return self::getArchiveDocumentList($oe) !== false;
}
public static function validateUpdate($params) {
$msg = [];
$user = ["codice","nome","cognome","email"];
$oe = ["codice","stato_legale","codice_fiscale_impresa","pec"];
$required = ["user"=>$user,"oe"=>$oe,"cpv"=>true];
foreach($required AS $key => $checks) {
if (empty($params[$key])) {
$msg[] = $key;
} else {
if (is_array($checks)) {
foreach($checks AS $check) {
if (empty($params[$key][$check])) {
$msg[] = $check;
}
}
}
}
}
if (empty($msg)) {
if (!utente::checkEmail($params["user"]["email"],$params["user"]["codice"])) {
$msg[] = "email";
}
if (!self::checkPEC($params["oe"]["pec"],$params["oe"]["codice"])) {
$msg[] = "pec";
}
}
if (empty($msg)) {
return true;
} else {
return $msg;
}
}
public static function update($params) {
global $pdo;
$error = true;
$msg = "";
$validation = self::validateUpdate($params);
if ($validation === true) {
$oe = $params["oe"];
$user = $params["user"];
if (empty($oe["ragione_sociale"])) { $oe["ragione_sociale"] = $user["cognome"] . " " . $user["nome"]; }
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_operatori_economici";
$salva->operazione = "UPDATE";
$salva->oggetto = $oe;
$salva->expect = array("codice","tipo","ragione_sociale","stato_legale","codice_fiscale_impresa","partita_iva","pec");
$codice_oe = $salva->save();
if (!empty($codice_oe)) {
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_utenti";
$salva->operazione = "UPDATE";
$salva->expect = ["codice","email","cognome","nome","cf","indirizzo","citta","provincia","cap","telefono","cellulare"];
if (!empty($user["password"])) {
$user["password"] = password_hash(md5($user["password"]), PASSWORD_BCRYPT);
$salva->expect[] = "password";
}
$salva->oggetto = $user;
$codice_utente = $salva->save();
if (!empty($codice_utente)) {
if (!empty($user["password"])) {
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_password_log";
$salva->operazione = "INSERT";
$salva->oggetto = array("codice_utente"=>$codice_utente);
$salva->save();
}
$params["cpv"] = array_unique($params["cpv"]);
$pdo->go("DELETE FROM r_cpv_operatori WHERE codice_operatore = :codice",[":codice"=>$codice_oe]);
foreach($params["cpv"] as $cpv) {
if (!empty($cpv)) {
$insert_cpv = [];
$insert_cpv["codice"] = $cpv;
$insert_cpv["codice_operatore"] = $codice_oe;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_cpv_operatori";
$salva->operazione = "INSERT";
$salva->oggetto = $insert_cpv;
$salva->save();
}
}
$pdo->go("DELETE FROM b_certificazioni_soa WHERE codice_operatore = :codice AND codice_classifica > 0",[":codice"=>$codice_oe]);
if (!empty($params["soa"])) {
foreach($params["soa"] as $soa) {
if (!empty($soa)) {
$soa["codice_operatore"] = $codice_oe;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_certificazioni_soa";
$salva->operazione = "INSERT";
$salva->oggetto = $soa;
$salva->save();
}
}
}
$pdo->go("DELETE FROM b_certificazioni_soa WHERE codice_operatore = :codice AND codice_classifica = 0",[":codice"=>$codice_oe]);
$pdo->go("DELETE FROM b_fatturato_soa WHERE codice_operatore = :codice ",[":codice"=>$codice_oe]);
if (!empty($params["fatturato"])) {
foreach($params["fatturato"] as $fatturato) {
if (!empty($fatturato)) {
$soa = [];
$soa["codice_categoria"] = $fatturato["codice_categoria"];
$soa["codice_classifica"] = 0;
$soa["codice_operatore"] = $codice_oe;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_certificazioni_soa";
$salva->operazione = "INSERT";
$salva->oggetto = $soa;
$codice_attestazione = $salva->save();
if (!empty($codice_attestazione)) {
foreach($fatturato["anni"] AS $anno => $importo) {
$insert = [];
$insert["codice_operatore"] = $codice_oe;
$insert["codice_attestazione"] = $codice_attestazione;
$insert["anno"] = $anno;
$insert["fatturato"] = $importo;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_fatturato_soa";
$salva->operazione = "INSERT";
$salva->oggetto = $insert;
$salva->save();
}
}
}
}
}
$pdo->go("DELETE FROM b_oe_servizi_tecnici WHERE codice_operatore = :codice",[":codice"=>$codice_oe]);
if (!empty($params["servizioTecnico"])) {
foreach($params["servizioTecnico"] as $servizioTecnico) {
if (!empty($servizioTecnico) && !empty($servizioTecnico["servizi"])) {
$servizioTecnico["codice_operatore"] = $codice_oe;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_oe_servizi_tecnici";
$salva->operazione = "INSERT";
$salva->oggetto = $servizioTecnico;
$codice_servizio = $salva->save();
if (!empty($codice_servizio)) {
foreach($servizioTecnico["servizi"] AS $categoria) {
$categoria["codice_servizio"] = $codice_servizio;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_oe_servizi_tecnici";
$salva->operazione = "INSERT";
$salva->oggetto = $categoria;
$salva->save();
}
}
}
}
}
$error = false;
return true;
}
} else {
$msg = "Errore aggiornamento record OE";
}
} else {
$msg = $validation;
}
if ($error === true) {
return ["error"=>true,"msg"=>$msg];
}
}
public static function create($params,$codice_ente,$spidCode = null) {
$error = true;
$msg = "";
if (!empty($codice_ente)) {
$ente = Ente::getInfoFromID($codice_ente);
$ente = reset($ente);
if ($ente["attivo"] == "S") {
$validation = self::validateCreate($params,$spidCode);
if ($validation === true) {
global $pdo;
$oe = $params["oe"];
$oe["attivo"] = (empty($spidCode)) ? "N" : "S";
$user = $params["user"];
if (empty($oe["ragione_sociale"])) { $oe["ragione_sociale"] = $user["cognome"] . " " . $user["nome"]; }
$oe["timestamp_creazione"] = date("Y-m-d H:i:s");
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_operatori_economici";
$salva->operazione = "INSERT";
$salva->oggetto = $oe;
$salva->expect = array("tipo","attivo","ragione_sociale","stato_legale","codice_fiscale_impresa","partita_iva","pec","vecchio_codice","timestamp_creazione");
$codice_oe = $salva->save();
if (!empty($codice_oe)) {
$user["ruolo"] = "OPE";
$user["attivo"] = (empty($spidCode)) ? "N" : "S";
$user["password"] = password_hash(md5($user["password"]), PASSWORD_BCRYPT);
$user["spidCode"] = $spidCode;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_utenti";
$salva->operazione = "INSERT";
$salva->oggetto = $user;
$salva->expect = array("ruolo","attivo","password","email","cognome","cf","nome","spidCode");
$codice_utente = $salva->save();
if (!empty($codice_utente)) {
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_password_log";
$salva->operazione = "INSERT";
$salva->oggetto = array("codice_utente"=>$codice_utente);
$salva->save();
$r_oe_utenti = [];
$r_oe_utenti["codice_utente"]= $codice_utente;
$r_oe_utenti["codice_operatore"]= $codice_oe;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_oe_utenti";
$salva->operazione = "INSERT";
$salva->oggetto = $r_oe_utenti;
$codice_r = $salva->save();
if ($codice_r > 0) {
$r_enti_operatori = [];
$r_enti_operatori["cod_ente"]= $ente["codice"];
$r_enti_operatori["codice_operatore"]= $codice_oe;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_enti_operatori";
$salva->operazione = "INSERT";
$salva->oggetto = $r_enti_operatori;
$salva->save();
// Inserimento SOA
foreach($params["soa"] as $soa) {
$insert_soa = [];
$insert_soa["codice_categoria"] = $soa["categoria"];
$insert_soa["codice_classifica"] = $soa["classifica"];
$insert_soa["codice_operatore"] = $codice_oe;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_certificazioni_soa";
$salva->operazione = "INSERT";
$salva->expect = ["codice_classifica", "codice_categoria","codice_operatore"];
$salva->oggetto = $insert_soa;
$salva->save();
}
// Inserimento elenchi
$params["elenchi"] = array_unique($params["elenchi"]);
if (!empty($params["elenchi"])) {
foreach($params["elenchi"] as $codice_elenco) {
$elenco = [];
$elenco["codice_elenco"] = $codice_elenco;
$elenco["codice_operatore"] = $codice_oe;
$elenco["conferma"] =
$elenco["ammesso"] =
$elenco["valutato"] =
$elenco["visto"] = "S";
$elenco["utente_creazione"] =
$elenco["utente_aggiornamento"] =
$elenco["utente_abilitazione"] =
$elenco["utente_modifica"] = -1;
$elenco["timestamp_creazione"] =
$elenco["timestamp_aggiornamento"] =
$elenco["timestamp_abilitazione"] =
$elenco["timestamp_modifica"] = date("Y-m-d H:i:s");
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_partecipanti_albo";
$salva->operazione = "INSERT";
$salva->oggetto = $elenco;
$salva->save();
}
}
//
$params["cpv"] = array_unique($params["cpv"]);
foreach($params["cpv"] as $cpv) {
if (!empty($cpv)) {
$insert_cpv = [];
$insert_cpv["codice"] = $cpv;
$insert_cpv["codice_operatore"] = $codice_oe;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_cpv_operatori";
$salva->operazione = "INSERT";
$salva->expect = ["codice","codice_operatore"];
$salva->oggetto = $insert_cpv;
$salva->save();
}
}
return $codice_oe;
} else {
$msg = "Errore salvataggio relazione OE - Utente";
$pdo->go("DELETE FROM b_operatori_economici WHERE codice = :codice",[":codice"=>$codice_oe]);
$pdo->go("DELETE FROM b_utenti WHERE codice = :codice",[":codice"=>$codice_utente]);
}
} else {
$msg = "Errore salvataggio utente";
$pdo->go("DELETE FROM b_operatori_economici WHERE codice = :codice",[":codice"=>$codice_oe]);
}
} else {
$msg = "Errore salvataggio OE";
}
} else {
$msg = $validation;
}
} else {
$msg = "Ente non attivo";
}
} else {
$msg = "Ente non definito";
}
if ($error === true) {
return ["error"=>true,"msg"=>$msg];
}
}
public function setFilters($filters) {
if (!empty($filters["cpv"])) { $this->categorie = $filters["cpv"]; }
if (!empty($filters["soa"])) { $this->soa = $filters["soa"]; }
if (!empty($filters["elenco"])) { $this->elenco = $filters["elenco"]; }
$this->includiNonQualificati = (!empty($filters["includiNonQualificati"]));
if (!empty($filters["servizioTecnico"])) { $this->servizi_tecnici = $filters["servizioTecnico"]; }
if (!empty($filters["dyn-form-input"])) { $this->advanced = $filters["dyn-form-input"]; }
if (!empty($filters["vendorRatingMinimo"])) { $this->ratingMinimo = $filters["vendorRatingMinimo"]; }
if (!empty($filters["conteggio_rotazione"])) { $this->conteggio_rotazione = $filters["conteggio_rotazione"]; }
if (!empty($filters["ambito_rotazione"])) { $this->ambito_rotazione = $filters["ambito_rotazione"]; }
if (!empty($filters["estesa"]) && ($_SESSION["ente"]->hasModulo("albo.extended"))) { $this->estesa = $filters["estesa"]; }
}
public static function getEstrazione($contesto,$codice_elemento,$sub_elemento) {
global $pdo;
$ris = $pdo->go("SELECT * FROM b_estrazioni WHERE contesto = :contesto AND codice_elemento = :elemento AND sub_elemento = :sub_elemento",[":contesto"=>$contesto,":elemento"=>$codice_elemento,":sub_elemento"=>$sub_elemento]);
if ($ris->rowCount() === 1) {
return $ris->fetch(PDO::FETCH_ASSOC);
}
return false;
}
public static function getRelazioniEstrazione($codice_estrazione) {
global $pdo;
return $pdo->go("SELECT * FROM r_estrazioni WHERE codice_estrazione = :codice ORDER BY escluso ASC, identificativo ",[":codice"=>$codice_estrazione])->fetchAll(PDO::FETCH_ASSOC);
}
public static function printSetEstrazione($managerToken,$action,$contesto,$codice_elemento=0,$sub_elemento=0) {
global $root;
include($root."/backend/operatori_economici/random/settings.php");
}
public static function printReportEstrazione($estrazione,$relazioni,$exportVersion = false,$printButton = true) {
global $root;
include($root."/backend/operatori_economici/random/show.php");
}
public static function saveInvito($invito,$cpv,$soa = [],$tecnici = []) {
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_inviti";
$salva->operazione = "INSERT";
$salva->oggetto = $invito;
$codice_invito = $salva->save();
if (!empty($codice_invito)) {
if (!empty($cpv)) {
foreach($cpv AS $cat) {
$salva->nome_tabella = "r_inviti_cpv";
$salva->operazione = "INSERT";
$salva->oggetto = ["codice_invito"=>$codice_invito,"cpv"=>$cat];
$salva->save();
}
}
if (!empty($soa)) {
foreach($soa AS $cat) {
$salva->nome_tabella = "r_inviti_soa";
$salva->operazione = "INSERT";
$salva->oggetto = ["codice_invito"=>$codice_invito,"soa"=>$cat["categoria"],"classifica"=>$cat["classifica"]];
$salva->save();
}
}
if (!empty($tecnici)) {
foreach($tecnici AS $cat) {
$salva->nome_tabella = "r_inviti_servizi_tecnici";
$salva->operazione = "INSERT";
$salva->oggetto = ["codice_invito"=>$codice_invito,"categoria"=>$cat];
$salva->save();
}
}
}
}
public function eseguiEstrazione($codice_ente,$numero,$esclusioni,$descrizione,$contesto,$rotazione=true,$codice_elemento=0,$sub_elemento=0) {
$this->countInviti = ($this->conteggio_rotazione != "disabled");
if (!isset($this->operatoriSorteggio)) {
$relazioni = $this->getOERelations($codice_ente);
$operatori = oeManager::getOE(array_keys($relazioni));
} else {
$operatori = oeManager::getOE($this->operatoriSorteggio);
}
$return = "Non sono presenti operatori";
if (!empty($operatori)) {
$conteggi = [];
$auto = [];
$potenziali = [];
$esclusi = [];
if (!empty($relazioni)) {
if ($rotazione) {
foreach($relazioni AS $codice_oe => $relazione) {
$insert = true;
if (!empty($esclusioni)) {
foreach($esclusioni AS $esclusione) {
if ($operatori[$codice_oe]["codice_fiscale_impresa"] == $esclusione) {
$insert = false;
$esclusi[$codice_oe] = $relazione;
break;
}
}
}
if ($insert) {
if (!isset($relazione["inviti"])) {
$relazione["inviti"] = 0;
}
if (!isset($conteggi[$relazione["inviti"]])) { $conteggi[$relazione["inviti"]] = []; }
if (!isset($conteggioMinimo)) {
$conteggioMinimo = $conteggioMassimo = $relazione["inviti"];
} else {
if (isset($conteggioMinimo) && $conteggioMinimo > $relazione["inviti"]) { $conteggioMinimo = $relazione["inviti"]; }
if (isset($conteggioMassimo) && $conteggioMassimo < $relazione["inviti"]) { $conteggioMassimo = $relazione["inviti"]; }
}
$conteggi[$relazione["inviti"]][$codice_oe] = $relazione;
}
}
} else {
$conteggioMinimo = $conteggioMassimo = 0;
$conteggi[0] = $relazioni;
}
if ($conteggioMinimo == $conteggioMassimo) {
if (count($conteggi[$conteggioMinimo]) <= $numero) {
$auto = $conteggi[$conteggioMinimo];
} else {
$potenziali = $conteggi[$conteggioMinimo];
}
} else {
$stopPotenziali = false;
for($number = $conteggioMinimo;$number <= $conteggioMassimo;$number++) {
if (!empty($conteggi[$number])) {
$relazioni = $conteggi[$number];
if ((count($auto) + count($relazioni) <= $numero) && empty($potenziali)) {
foreach($relazioni AS $oe => $relazione) {
$auto[$oe] = $relazione;
}
} else {
if (!$stopPotenziali) {
foreach($relazioni AS $oe => $relazione) {
$potenziali[$oe] = $relazione;
}
if (count($auto) + count($potenziali) >= $numero) { $stopPotenziali = true; }
} else {
foreach($relazioni AS $oe => $relazione) {
$esclusi[$oe] = $relazione;
}
}
}
}
}
}
} else {
$potenziali = $operatori;
}
$note = [];
$note["descrizione"] = $descrizione;
$note["esclusioni"] = $esclusioni;
if (!empty($this->categorie)) { $note["cpv"] = $this->categorie; }
if (!empty($this->soa)) { $note["soa"] = $this->soa; }
if (!empty($this->elenco)) { $note["elenco"] = $this->elenco; }
if (!empty($this->servizi_tecnici)) { $note["servizioTecnico"] = $this->servizi_tecnici; }
if (!empty($this->advanced)) { $filters["dyn-form-input"] = $this->advanced; }
if (!empty($this->ratingMinimo)) { $note["vendorRatingMinimo"] = $this->ratingMinimo; }
if (!empty($this->conteggio_rotazione)) { $note["conteggio_rotazione"] = $this->conteggio_rotazione; }
if (!empty($this->ambito_rotazione)) { $note["ambito_rotazione"] = $this->ambito_rotazione; }
if (!empty($this->estesa)) { $filters["estesa"] = $this->estesa; }
$estrazione = [];
$estrazione["codice_elemento"] = $codice_elemento;
$estrazione["codice_ente"] = $codice_ente;
$estrazione["sub_elemento"] = $sub_elemento;
$estrazione["contesto"] = $contesto;
$estrazione["note"] = json_encode($note);
$estrazione["numero_partecipanti"] = $numero;
$estrazione["sequenza"] = "";
$estrazione["esclusioni"] = "";
if (!empty($potenziali)) {
$disponibili = $numero - count($auto);
$sequenza = range(1,count($potenziali));
shuffle($sequenza);
$sequenza = array_splice($sequenza,0,$disponibili);
$estrazione["sequenza"] = json_encode($sequenza);
}
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_estrazioni";
$salva->operazione = "INSERT";
$salva->oggetto = $estrazione;
$codice_estrazione = $salva->save();
if (!empty($codice_estrazione)) {
$insert = $this->db->prepare("INSERT INTO r_estrazioni (codice_estrazione,codice_operatore,identificativo,escluso,selezionato,conteggio,utente_modifica,timestamp) VALUES (:codice_estrazione,:codice_operatore,:identificativo,:escluso,:selezionato,:conteggio,:utente_modifica,now())");
$insert->bindValue(':codice_estrazione',$codice_estrazione);
$insert->bindValue(':utente_modifica',$_SESSION["utente"]->codice);
if (!empty($auto)) {
$ooee = array_keys($auto);
foreach($ooee AS $oe) {
$insert->bindValue(':codice_operatore',$oe);
$insert->bindValue(':identificativo',0);
$insert->bindValue(':escluso',"N");
$insert->bindValue(':selezionato',"A");
$insert->bindValue(':conteggio',$auto[$oe]["inviti"]);
$insert->execute();
}
}
if (!empty($esclusi)) {
$ooee = array_keys($esclusi);
foreach($ooee AS $oe) {
$insert->bindValue(':codice_operatore',$oe);
$insert->bindValue(':identificativo',0);
$insert->bindValue(':escluso',"S");
$insert->bindValue(':selezionato',"N");
$insert->bindValue(':conteggio',$esclusi[$oe]["inviti"]);
$insert->execute();
}
}
if (!empty($potenziali)) {
$ooee = array_keys($potenziali);
shuffle($ooee);
$count = 0;
foreach($ooee AS $oe) {
$count++;
$selezionato = "N";
if (in_array($count,$sequenza) !== false) { $selezionato = "S"; }
$insert->bindValue(':codice_operatore',$oe);
$insert->bindValue(':identificativo',$count);
$insert->bindValue(':escluso',"N");
$insert->bindValue(':selezionato',$selezionato);
$insert->bindValue(':conteggio',(isset($potenziali[$oe]["inviti"]) && is_numeric($potenziali[$oe]["inviti"])) ? $potenziali[$oe]["inviti"] : 0);
$insert->execute();
}
}
$return = $codice_estrazione;
} else {
$return = "Errore nel salvataggio dell'estrazione";
}
}
return $return;
}
public static function getFormFromAlbi($codice_albo = null) {
if (isset($codice_albo)) {
global $pdo;
$sql = "SELECT codice_form FROM r_albo_fornitori_form WHERE ";
$bind = [];
if (!empty($codice_albo)) {
$bind = [":elenco"=>$codice_albo];
$sql .= " codice_elenco = :elenco ";
} else {
$sql .= " codice_elenco > 0 ";
}
return $pdo->go($sql,$bind)->fetchAll(PDO::FETCH_COLUMN);
}
}
public function getOERelations($codice_ente,String $logicalOperator = "OR") {
$return = false;
$bind = [];
$andOperator = ($logicalOperator === "AND");
if ($this->estesa == "S") {
$sql = "SELECT r_enti_operatori.* FROM r_enti_operatori
JOIN b_operatori_economici ON r_enti_operatori.codice_operatore = b_operatori_economici.codice
WHERE b_operatori_economici.codice > 0 ";
} else {
$bind = array(":codice_ente"=>$codice_ente);
$sql = "SELECT r_enti_operatori.* FROM r_enti_operatori JOIN b_operatori_economici ON r_enti_operatori.codice_operatore = b_operatori_economici.codice
WHERE r_enti_operatori.cod_ente = :codice_ente ";
}
if (!empty($this->generalFilter)) {
$suddivisione = suddivisione_pdo($this->generalFilter,"b_operatori_economici.codice_fiscale_impresa");
$sql .= " AND ((" . $suddivisione["sql"] . ") OR ";
$bind = array_merge($bind,$suddivisione["bind"]);
$suddivisione = suddivisione_pdo($this->generalFilter,"b_operatori_economici.partita_iva");
$sql .= "(" . $suddivisione["sql"] . ") OR ";
$bind = array_merge($bind,$suddivisione["bind"]);
$suddivisione = suddivisione_pdo($this->generalFilter,"b_operatori_economici.ragione_sociale");
$sql .= "(" . $suddivisione["sql"] . ") OR ";
$bind = array_merge($bind,$suddivisione["bind"]);
$suddivisione = suddivisione_pdo($this->generalFilter,"b_operatori_economici.tipo");
$sql .= "(" . $suddivisione["sql"] . ")) ";
$bind = array_merge($bind,$suddivisione["bind"]);
}
$ris = $this->db->go($sql,$bind);
if ($ris->rowCount() > 0) {
if ($ris->rowCount() > 500) {
ini_set("max_execution_time", "240");
}
$return = [];
$filtered = false;
if (!empty($this->advanced)) {
$filtri_da_applicare = [];
$forms = self::getStandardForms("ALL",$_SESSION["ente"]->codice);
if (!empty($forms)) {
foreach($forms AS $form) {
$infoForm = FormManager::getInfoFromID($form,$_SESSION["ente"]->codice);
if (!empty($infoForm) && isset($this->advanced[$infoForm["codice"]])) {
$filtri_da_applicare[$infoForm["codice"]] = $this->advanced[$infoForm["codice"]];
}
}
}
if (!empty($filtri_da_applicare)) {
$filtered = FormManager::returnElementsFromFilters($filtri_da_applicare,"oe",$andOperator);
}
if ($filtered === false || !empty($filtered)) {
$filtri_da_applicare = [];
$forms = oeManager::getFormFromAlbi(0);
if (!empty($forms)) {
foreach($forms AS $form) {
if (isset($this->advanced[$form])) {
$filtri_da_applicare[$form] = $this->advanced[$form];
}
}
}
$filtered_albi = FormManager::returnElementsFromFilters($filtri_da_applicare,"albo_fornitori-{$codice_ente}",$andOperator);
if ($filtered_albi === false || !empty($filtered_albi)) {
if (!empty($filtered_albi)) {
$albi = [];
$table = AlboFornitori::getOeTable();
$sqlFilterPartecipazione = "SELECT codice_operatore FROM {$table} WHERE codice = :codice AND ";
if ($this->includiNonQualificati) {
$sqlFilterPartecipazione .= "conferma = 'S'";
} else {
$sqlFilterPartecipazione .= "ammesso = 'S'";
}
if (!empty($this->elenco)) {
$filtroElenco = explode("|",$this->elenco);
if ($filtroElenco[1] > 0) {
$sqlFilterPartecipazione .= " AND codice_elenco = :codice_elenco ";
$bindCodiceEleneco = $filtroElenco[1];
}
}
$selectCodiciOperatori = $this->db->prepare($sqlFilterPartecipazione);
if (isset($bindCodiceEleneco)) {
$selectCodiciOperatori->bindValue(":codice_elenco",$bindCodiceEleneco);
}
foreach($filtered_albi AS $partecipante) {
$selectCodiciOperatori->bindValue(":codice",$partecipante);
$selectCodiciOperatori->execute();
if ($selectCodiciOperatori->rowCount() === 1) {
$albi[] = $selectCodiciOperatori->fetch(PDO::FETCH_COLUMN);
}
}
if (!empty($filtered)) {
$filtered = array_intersect($filtered,$albi);
} else {
$filtered = $albi;
}
}
} else {
$filtered = [];
}
}
}
while ($tmp = $ris->fetch(PDO::FETCH_ASSOC)) {
if (!empty($tmp)) {
$tmp_codice = $tmp["codice_operatore"];
$insert = true;
if ($filtered!==false) {
$insert = false;
if (in_array($tmp_codice,$filtered) !== false) { $insert = true; }
}
if ($insert) { $return[$tmp["codice_operatore"]] = $tmp; }
}
}
if (!empty($return) && !empty($this->elenco)) {
$tmp = [];
$filtroElenco = explode("|",$this->elenco);
if (count($filtroElenco) == 2) {
$sources = self::tipiElenco();
$tabellePartecipanti = self::tabelleElenco();
if (in_array($filtroElenco[0],array_keys($sources)) !== false && !empty($tabellePartecipanti[$filtroElenco[0]])) {
$tabellaPartecipanti = $tabellePartecipanti[$filtroElenco[0]];
$sql = "SELECT $tabellaPartecipanti.codice FROM $tabellaPartecipanti JOIN {$filtroElenco[0]} ON $tabellaPartecipanti.codice_elenco = {$filtroElenco[0]}.codice
WHERE codice_operatore = :operatore AND ";
if ($this->includiNonQualificati) {
$sql .= " conferma = 'S'";
} else {
$sql .= " conferma = 'S' AND ammesso = 'S'";
}
if ($filtroElenco[0] == "b_bandi_albo" && $filtroElenco[1] == "0") {
$sql .= " AND b_bandi_albo.tipologia <> 'I' ";
} else {
$sql .= " AND $tabellaPartecipanti.codice_elenco = :codice_elenco ";
}
$check = $this->db->prepare($sql);
if ($filtroElenco[1] != "0") { $check->bindValue(":codice_elenco",$filtroElenco[1]); }
foreach($return AS $relazione) {
$check->bindValue(":operatore",$relazione["codice_operatore"]);
$check->execute();
if ($check->rowCount() > 0) {
$tmp[$relazione["codice_operatore"]] = $relazione;
}
}
}
}
$return = $tmp;
}
if (!empty($return) && (!empty($this->servizi_tecnici))) {
$tmp = [];
$servizioTecnico = $this->db->prepare("SELECT r_oe_servizi_tecnici.codice FROM r_oe_servizi_tecnici JOIN b_oe_servizi_tecnici ON r_oe_servizi_tecnici.codice_servizio = b_oe_servizi_tecnici.codice
WHERE b_oe_servizi_tecnici.codice_operatore = :operatore AND r_oe_servizi_tecnici.codice_categoria = :categoria");
foreach($return AS $relazione) {
foreach($this->servizi_tecnici AS $categoria) {
if ($andOperator) {
$checkID = "servizioTecnico-{$categoria}";
$this->addNeedCheck($checkID);
}
$servizioTecnico->bindValue(":operatore",$relazione["codice_operatore"]);
$servizioTecnico->bindValue(":categoria",$categoria);
$servizioTecnico->execute();
if ($servizioTecnico->rowCount() > 0) {
$tmp[$relazione["codice_operatore"]] = $relazione;
if (!$andOperator) {
break;
} else {
$this->addObtainedCheck($checkID,$relazione["codice_operatore"]);
}
}
}
}
$return = $tmp;
}
if (!empty($return) && !empty($this->soa)) {
$onlySOA = $this->db->prepare("SELECT codice FROM b_certificazioni_soa WHERE codice_operatore = :operatore AND codice_categoria = :categoria AND codice_classifica > 0");
$conFatturato = $this->db->prepare("SELECT codice FROM b_certificazioni_soa WHERE codice_operatore = :operatore AND codice_categoria = :categoria AND codice_classifica >= 0");
$fatturato = $this->db->prepare("SELECT fatturato,anno FROM b_fatturato_soa WHERE codice_attestazione = :codice");
$soaClassifica = $this->db->prepare("SELECT codice FROM b_certificazioni_soa WHERE codice_operatore = :operatore AND codice_categoria = :categoria AND codice_classifica = :classifica");
$soaClassificaMinima = $this->db->prepare("SELECT codice FROM b_certificazioni_soa WHERE codice_operatore = :operatore AND codice_categoria = :categoria AND codice_classifica >= :classifica");
$tmp = [];
foreach($return AS $relazione) {
$insert = false;
foreach($this->soa AS $soa) {
if ($andOperator) {
$insert = false;
}
if (!empty($soa["codice_categoria"])) {
if ($andOperator) {
$checkID = "soa-{$soa["codice_categoria"]}";
$this->addNeedCheck($checkID);
}
if (empty($soa["codice_classifica"])) {
$onlySOA->bindValue(":operatore",$relazione["codice_operatore"]);
$onlySOA->bindValue(":categoria",$soa["codice_categoria"]);
$onlySOA->execute();
if ($onlySOA->rowCount() > 0) {
$insert = true;
}
} else {
if ($soa["codice_classifica"] === "-1") {
$conFatturato->bindValue(":operatore",$relazione["codice_operatore"]);
$conFatturato->bindValue(":categoria",$soa["codice_categoria"]);
$conFatturato->execute();
if ($conFatturato->rowCount() > 0) {
$insert = true;
if (!empty($soa["importo"])) {
$insert = false;
$codici = $conFatturato->fetchAll(PDO::FETCH_COLUMN);
$totale = 0;
foreach($codici AS $codice) {
$anno_riferimento = ((int)date("Y")) - 5;
$fatturato->execute([":codice"=>$codice]);
if ($fatturato->rowCount() > 0) {
while($fatt = $fatturato->fetch(PDO::FETCH_ASSOC)) {
if ($fatt["anno"] >= $anno_riferimento) {
$totale += $fatt["fatturato"];
}
}
}
}
if ($soa["importo"] <= $totale) {
$insert = true;
}
}
}
$soa["codice_classifica"] = 1;
}
if (empty($soa["classifica_minima"])) {
$soaClassifica->bindValue(":operatore",$relazione["codice_operatore"]);
$soaClassifica->bindValue(":categoria",$soa["codice_categoria"]);
$soaClassifica->bindValue(":classifica",$soa["codice_classifica"]);
$soaClassifica->execute();
if ($soaClassifica->rowCount() > 0) {
$insert = true;
}
} else {
$soaClassificaMinima->bindValue(":operatore",$relazione["codice_operatore"]);
$soaClassificaMinima->bindValue(":categoria",$soa["codice_categoria"]);
$soaClassificaMinima->bindValue(":classifica",$soa["codice_classifica"]);
$soaClassificaMinima->execute();
if ($soaClassificaMinima->rowCount() > 0) {
$insert = true;
}
}
}
}
if ($insert) {
$tmp[$relazione["codice_operatore"]] = $relazione;
if ($andOperator) {
$this->addObtainedCheck($checkID,$relazione["codice_operatore"]);
} else {
break;
}
}
}
}
$return = $tmp;
}
if (!empty($return) && !empty($this->ratingMinimo)) {
$tmp = [];
foreach($return AS $relazione) {
if ($relazione["feedback"] >= $this->ratingMinimo) {
$tmp[$relazione["codice_operatore"]] = $relazione;
}
}
$return = $tmp;
}
if (!empty($return) && !empty($this->categorie)) {
$strsql = "SELECT codice FROM r_cpv_operatori WHERE codice_operatore = :codice_operatore AND (";
$bind = [];
$n_cat = 0;
foreach($this->categorie as $codice) {
$n_cat++;
if ($codice != "") {
$bind[":cat_".$n_cat] = $codice;
$strsql .= "(r_cpv_operatori.codice = :cat_".$n_cat ." ";
if (strlen($codice)>2) {
$diff = strlen($codice) - 2;
$n_sub_cat = 0;
for($i=1;$i<=$diff;$i++) {
$n_sub_cat++;
$bind[":cat_".$n_cat."_".$n_sub_cat] = substr($codice,0,$i*-1);
$strsql .= "OR r_cpv_operatori.codice = :cat_".$n_cat."_".$n_sub_cat . " ";
}
}
$strsql.=") OR ";
}
}
$strsql = substr($strsql,0,-4);
$strsql .= ")";
$cpv = $this->db->prepare($strsql);
$tmp = [];
foreach($bind AS $idBind => $valueBind) {
$cpv->bindValue($idBind,$valueBind);
}
$tmp = [];
foreach($return AS $relazione) {
$cpv->bindValue(":codice_operatore",$relazione["codice_operatore"]);
$cpv->execute();
if ($cpv->rowCount() > 0) {
$tmp[$relazione["codice_operatore"]] = $relazione;
}
}
$return = $tmp;
}
if (empty($return)) {
$return = false;
} else {
if ($andOperator) {
$tmp = [];
foreach($return AS $relazione) {
$insert = true;
foreach($this->neededChecks AS $checkID) {
if (!in_array($checkID, $this->obtainedChecks[$relazione["codice_operatore"]])) {
$insert = false;
break;
}
}
if ($insert) {
$tmp[$relazione["codice_operatore"]] = $relazione;
}
}
$return = $tmp;
}
if (!empty($return)) {
if ($this->countInviti && count($return) < 5000) {
$inviti = $this->getInviti(array_keys($return),$codice_ente);
foreach($return AS $relazione) {
$return[$relazione["codice_operatore"]]["inviti"] = $inviti[$relazione["codice_operatore"]]["generali"];
$return[$relazione["codice_operatore"]]["invitiSolari"] = $inviti[$relazione["codice_operatore"]]["anno"];
}
}
}
}
}
return $return;
}
public function getInviti($operatori,$codice_ente) {
if (is_numeric($operatori)) { $operatori = [$operatori]; }
$operatori = self::getOE($operatori);
$return = [];
if (strpos($this->conteggio_rotazione,"cpv") === 0) {
if (!empty($this->categorie)) {
$join = $this->db->prepare("SELECT codice FROM r_inviti_cpv WHERE codice_invito = :codice AND cpv LIKE :cpv");
}
} else if (strpos($this->conteggio_rotazione,"soa") === 0) {
if (!empty($this->soa)) {
if ($this->conteggio_rotazione == "soa") {
$join = $this->db->prepare("SELECT codice FROM r_inviti_soa WHERE codice_invito = :codice AND soa = :categoria");
} else {
$join = $this->db->prepare("SELECT codice FROM r_inviti_soa WHERE codice_invito = :codice AND soa = :categoria AND classifica = :classifica");
}
}
} else if ($this->conteggio_rotazione == "servizi_tecnici" && !empty($this->servizi_tecnici)) {
$join = $this->db->prepare("SELECT codice FROM r_inviti_soa WHERE codice_invito = :codice AND categoria = :categoria");
}
$error = true;
if (empty($this->conteggio_rotazione) || !empty($join)) {
$error = false;
if (!empty($this->elenco) && $this->ambito_rotazione == "elenco") {
$elencoFiltro = explode("|",$this->elenco);
if (count($elencoFiltro) == 2 && $elencoFiltro[1] > 0) {
$allInviti = $this->db->prepare("SELECT codice, data_invito FROM b_inviti WHERE tipo_elenco = :tipo AND codice_elenco = :elenco AND codice_fiscale_operatore = :cf AND codice_ente = :codice_ente");
$allInviti->bindValue(":tipo",$elencoFiltro[0]);
$allInviti->bindValue(":elenco",$elencoFiltro[1]);
}
}
if (empty($allInviti)) { $allInviti = $this->db->prepare("SELECT codice, data_invito FROM b_inviti WHERE codice_fiscale_operatore = :cf AND codice_ente = :codice_ente"); }
$allInviti->bindValue(":codice_ente",$codice_ente);
foreach($operatori AS $operatore) {
$allInviti->bindValue(":cf",$operatore["codice_fiscale_impresa"]);
$allInviti->execute();
$return[$operatore["codice"]]["generali"] = 0;
$return[$operatore["codice"]]["anno"] = 0;
if ($allInviti->rowCount() > 0) {
$inviti = $allInviti->fetchALL(PDO::FETCH_ASSOC);
foreach($inviti AS $invito) {
$count = true;
if (!empty($this->conteggio_rotazione)) {
$join->bindValue(":codice",$invito["codice"]);
$count = false;
if (strpos($this->conteggio_rotazione,"cpv") === 0) {
$length = explode("_",$this->conteggio_rotazione);
$length = $length[1];
if (!empty($this->categorie)) {
foreach($this->categorie as $codice) {
if (!empty($codice)) {
$codice = substr($codice,0,$length);
$join->bindValue(":cpv",$codice."%");
$join->execute();
if ($join->rowCount() > 0) {
$count = true;
break;
}
}
}
}
} else if (strpos($this->conteggio_rotazione,"soa") === 0) {
if (!empty($this->soa)) {
foreach($this->soa AS $soa) {
if (!empty($soa["codice_categoria"])) {
$join->bindValue(":categoria",$soa["codice_categoria"]);
if ($this->conteggio_rotazione != "soa") {
$error = true;
if (!empty($soa["codice_classifica"])) {
$error = false;
$join->bindValue(":classifica",$soa["codice_classifica"]);
}
}
if (!$error) {
$join->execute();
if ($join->rowCount() > 0) {
$count = true;
break;
}
}
} else {
$error = true;
}
}
}
} else if ($this->conteggio_rotazione == "servizi_tecnici" && !empty($this->servizi_tecnici)) {
foreach($this->servizi_tecnici AS $categoria) {
if (!empty($categoria)) {
$join->bindValue(":categoria",$categoria);
$join->execute();
if ($join->rowCount() > 0) {
$count = true;
break;
}
} else {
$error = true;
break;
}
}
}
if ($error) {
break(2);
}
}
if ($count) {
$return[$operatore["codice"]]["generali"] += 1;
if (substr($invito["data_invito"],0,4) == date("Y")) { $return[$operatore["codice"]]["anno"] += 1; }
}
}
}
}
}
if ($error) {
foreach($operatori AS $operatore) {
$return[$operatore["codice"]]["generali"] = "n/a";
$return[$operatore["codice"]]["anno"] = "n/a";
}
}
return $return;
}
public function exportInfo($codici_fornitore,$codice_ente,$ignore_allegati = false,$withForm = true) {
if (!is_array($codici_fornitore)) { $codici_fornitore = [$codici_fornitore]; }
if (!empty($codici_fornitore)) {
$keys = ["codice","stato_legale","codice_fiscale_impresa","partita_iva","ragione_sociale","pec"];
$aziende = oeManager::getOE($codici_fornitore);
$relazioni = $this->getOERelations($codice_ente);
if(!empty($aziende)) {
$cpvs = self::getCpvs($codici_fornitore);
$fatturatiSoa = self::getFatturatiSOA($codici_fornitore);
$soaFornitore = self::getSOA($codici_fornitore);
$servizi_tecniciFornitore = self::getServiziTecnici($codici_fornitore);
ini_set("memory_limit", "999M");
ini_set("max_execution_time", "999");
$return = [];
$allegati = [];
$forms = self::getStandardForms("ALL", $codice_ente);
$forms = array_unique($forms);
foreach($aziende AS $codice => $azienda) {
$fornitore = [];
foreach($keys AS $key) {
$fornitore[$key] = $azienda[$key] ?? "";
}
$fornitore["inviti"] = $relazioni[$codice]["inviti"] ?? "n.a.";
$fornitore["feedback"] = $relazioni[$codice]["feedback"] ?? "n.a.";
$fornitore["categorie"] = $cpvs[$codice] ?? [];
$fornitore["soa"] = $soaFornitore[$codice] ?? [];
$fornitore["fatturatiLavori"] = $fatturatiSoa[$codice] ?? [];
$fornitore["serviziTecnici"] = $servizi_tecniciFornitore[$codice] ?? [];
if (count($forms) > 0 && $withForm) {
$fornitore["forms"] = [];
foreach($forms AS $tmp) {
$tmp = FormManager::getInfoFromID($tmp,$codice_ente);
if (!empty($tmp)) {
$form["codice"] = $tmp["codice"];
$form["titolo"] = json_decode($tmp["titolo"]);
$form["descrizione"] = json_decode($tmp["descrizione"]);
$compilazione = new FormManager();
$compilazione->init($form["codice"],"oe",$azienda["codice"]);
$data = $compilazione->getValues();
$form["data"] = [];
if (!empty($data)) {
$gruppi = [];
foreach($data AS $gruppo_compilazione => $inputs) {
foreach($inputs AS $valore) {
$gruppo = [];
$inputInfo = $compilazione->getInputInfo($valore["codice"]);
if (!empty($inputInfo)) {
$gruppo["codice"] = $inputInfo["gruppo"]["codice"];
if (empty($gruppi[$gruppo["codice"]])) {
$gruppo["titolo"] = json_decode($inputInfo["gruppo"]["titolo"]);
$gruppo["descrizione"] = json_decode($inputInfo["gruppo"]["descrizione"]);
$gruppi[$gruppo["codice"]] = $gruppo;
}
$gruppo = $gruppi[$gruppo["codice"]];
$input["codice"] = $inputInfo["input"]["codice"];
if (empty($gruppo["data"][$input["codice"]])) {
$input["titolo"] = json_decode($inputInfo["input"]["titolo"]);
$input["descrizione"] = json_decode($inputInfo["input"]["descrizione"]);
$input["tipo"] = $inputInfo["input"]["tipo"];
$gruppo["inputs"][$input["codice"]]["info"] = $input;
$gruppo["inputs"][$input["codice"]]["data"] = [];
}
$data = $gruppo["inputs"][$input["codice"]]["data"];
if ($inputInfo["input"]["tipo"] == "file" && !$ignore_allegati) {
$tmp = json_decode($valore["value"],true);
$valore["value"] = [];
if (!empty($tmp)) {
$file = filesManager::fileInfo($tmp["codice"],$tmp["filename"],$azienda["codice"],"form-oe",true);
if (!empty($file)) {
$file["path"] = "{$azienda["codice"]}/$gruppo_compilazione/{$valore["codice"]}/{$file["name"]}";
$allegati[] = ["path"=>$file["path"],"content"=>$file["content"]];
unset($file["content"]);
$valore["value"] = $file;
}
}
}
$data[$gruppo_compilazione] = $valore["value"];
$gruppo["inputs"][$input["codice"]]["data"] = $data;
$gruppi[$gruppo["codice"]] = $gruppo;
}
}
}
$form["data"] = $gruppi;
}
$fornitore["forms"][] = $form;
}
}
}
$return[] = $fornitore;
}
if (!empty($return)) {
return ["data"=>$return,"allegati"=>$allegati];
}
}
}
return false;
}
public static function exportCSV($alloperatori, $extended = false)
{
if($alloperatori){
global $pdo;
$manager = new oeManager;
$manager->countInviti = true;
$manager->countAggiudicato = true;
$ooee = $manager->exportInfo($alloperatori,$_SESSION["ente"]->codice,true,!empty($extended));
$keys = [
"codice",
"stato_legale",
"codice_fiscale_impresa",
"partita_iva",
"ragione_sociale",
"pec",
"inviti",
"feedback",
"categorie",
"soa",
"indirizzo_legale",
"citta_legale",
"provincia_legale",
"regione_legale",
"stato_legale",
"indirizzo_operativa",
"citta_operativa",
"provincia_operativa",
"regione_operativa",
"stato_operativa"
];
if (!empty($extended)) {
$keysForm = [];
$keysValues = [];
foreach($ooee["data"] AS $oe) {
foreach($oe["forms"] AS $form) {
if (!empty($form["data"])) {
foreach($form["data"] AS $group => $data) {
if (!empty($data["inputs"])) {
foreach($data["inputs"] AS $input => $info) {
if (!empty($info["info"])) {
if (!isset($keysForm[$info["info"]["codice"]])) {
$keysForm[$info["info"]["codice"]] = $data["titolo"]->IT . " - ". $info["info"]["titolo"]->IT;
}
if (!isset($keysValues[$oe["codice"]])) {
$keysValues[$oe["codice"]] = [];
}
if (is_array($info["data"])) {
$keysValues[$oe["codice"]][$info["info"]["codice"]] = reset($info["data"]);
if (is_array($keysValues[$oe["codice"]][$info["info"]["codice"]])) {
$keysValues[$oe["codice"]][$info["info"]["codice"]] = implode("/",$keysValues[$oe["codice"]][$info["info"]["codice"]]);
}
}
}
}
}
}
}
}
}
}
$data = [];
$row = [];
foreach($keys AS $key) {
$row[] = $key;
}
if (!empty($extended)) {
foreach($keysForm AS $key) {
$row[] = $key;
}
$keysIDS = array_keys($keysForm);
}
$data[] = $row;
$risSoa = $pdo->prepare("SELECT id FROM b_categorie_soa WHERE codice = :codice");
$risClassifica = $pdo->prepare("SELECT id FROM b_classifiche_soa WHERE codice = :codice");
$risLegale = $pdo->prepare("SELECT valore FROM b_form_data WHERE type='oe' AND id = :id AND codice_input = 3 AND soft_delete = 'N'");
$risOperativa = $pdo->prepare("SELECT valore FROM b_form_data WHERE type='oe' AND id = :id AND codice_input = 6 AND soft_delete = 'N'");
foreach($ooee["data"] AS $oe) {
$row = [];
$legale = null;
$operativa = null;
$risLegale->execute([":id"=>$oe["codice"]]);
if ($risLegale->rowCount() > 0) {
$legale = json_decode($risLegale->fetch(PDO::FETCH_COLUMN) ?? "",true);
}
$risOperativa->execute([":id"=>$oe["codice"]]);
if ($risOperativa->rowCount() > 0) {
$operativa = json_decode($risOperativa->fetch(PDO::FETCH_COLUMN) ?? "",true);
}
foreach($keys AS $key) {
if ($key == "soa") {
if (!empty($oe[$key])) {
$soa = [];
foreach($oe[$key] AS $cat) {
if ($risSoa->execute([":codice"=>$cat["codice_categoria"]])) {
$categoria = $risSoa->fetch(PDO::FETCH_COLUMN);
if ($risClassifica->execute([":codice"=>$cat["codice_classifica"]])) {
$classifica = $risClassifica->fetch(PDO::FETCH_COLUMN);
$soa[] = $categoria . "-" . $classifica;
}
}
}
$row[] = implode("/",$soa);
} else {
$row[] = "";
}
} else if (strpos($key,"_legale") !== false) {
$key = str_replace("_legale","",$key);
$row[] = $legale[$key] ?? "";
} else if (strpos($key,"_operativa") !== false) {
$key = str_replace("_operativa","",$key);
$row[] = $operativa[$key] ?? "";
} else {
$row[] = (is_array($oe[$key])) ? implode("/",$oe[$key]) : ($oe[$key] ?? "");
}
}
if (!empty($keysIDS)) {
foreach($keysIDS AS $id) {
$row[] = $keysValues[$oe["codice"]][$id] ?? "";
}
}
$data[] = $row;
}
return $data;
}
return false;
}
public function __construct() {
global $pdo;
$this->db = $pdo;
$this->estesa = "N";
$this->countInviti = false;
$this->countAggiudicato = false;
$this->ambito_rotazione = "elenco";
$this->operatoriSorteggio = null;
}
}