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; } }