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.
 
 
 
 
 

481 righe
20 KiB

<?
class Commissione {
public $modulo;
private $gestore;
public $elemento;
public $tipologia;
public $lock;
public $oggetto;
private $object;
private $admin;
private $forceModalita;
private $forceRiparametra;
private $valutatore;
public $viewPath;
public $db;
public static function moduliAbilitati() {
$return = [];
$return["pcp"] = ["titolo"=>"Appalti pre-commerciali","script"=>"/pcp/commissione/init.php","returnURL"=>"/backend/pcp/panel.php"];
$return["gare"] = ["titolo"=>"Gare e Affidamenti","script"=>"/gare/commissione/init.php","returnURL"=>"/backend/gare/panel.php"];
$return["concorsi"] = ["titolo"=>"Concorsi di progettazione","script"=>"/concorsi/commissione/init.php","returnURL"=>"/backend/concorsi/panel.php"];
$return["omc"] = ["titolo"=>"Consultazioni","script"=>"/omc/relatori/init.php","returnURL"=>"/backend/omc/panel.php"];
$return["matchmaking"] = ["titolo"=>"Fabbisogni di innovazione","script"=>"/matchmaking/commissione/init.php","returnURL"=>"/backend/matchmaking/panel.php"];
return $return;
}
public static function tipologie() {
return ["seggio","commissione","monitoraggio","relatori"];
}
public static function modalita() {
return [
"R" => "Classico",
"C" => "A coppie"
];
}
public function __construct($modulo,$elemento,$tipologia)
{
if (!empty($modulo) && !empty($elemento) && !empty($tipologia) && in_array($tipologia,self::tipologie()) !== false) {
if (!empty(self::moduliAbilitati()[$modulo])) {
global $pdo;
$this->modulo = $modulo;
$this->elemento = $elemento;
$this->tipologia = $tipologia;
$this->gestore = $_SESSION["ente"]->codice;
$this->db = $pdo;
return $this;
}
}
return false;
}
public function getInfo() {
if (!empty($this->db)) {
$sql = "SELECT * FROM b_commissioni WHERE codice_gestore = :codice_gestore AND modulo = :modulo AND codice_elemento = :elemento AND tipologia = :tipologia";
$return = $this->db->go($sql,[":codice_gestore"=>$this->gestore,":modulo"=>$this->modulo,":elemento"=>$this->elemento,":tipologia"=>$this->tipologia]);
if ($return->rowCount() == 1) {
$return = $return->fetch(PDO::FETCH_ASSOC);
} else {
$return = get_campi("b_commissioni");
$return["arrotonda"] = "N";
$return["riparametra"] = "S";
}
if (!empty($this->forceModalita)) {
$return["modalita"] = $this->forceModalita;
}
if (!empty($this->forceRiparametra)) {
$return["riparametra"] = $this->forceRiparametra;
}
return $return;
}
}
public function getEstrazioniCommissione($codice = null) {
$bind = [":elemento"=>$this->elemento,":modulo"=>$this->modulo];
$sqlCodice = "";
if (isset($codice)) {
$sqlCodice = " AND codice = :codice";
$bind[":codice"] = $codice;
}
$return = $this->db->go("SELECT * FROM b_estrazioni_commissioni WHERE codice_elemento = :elemento AND contesto = :modulo {$sqlCodice}",$bind)->fetchAll(PDO::FETCH_ASSOC);
if (!empty($return) && isset($codice)) {
$return = $return[0];
}
return $return;
}
public static function numeroNomine($codice_utente) {
global $pdo;
return $pdo->go("SELECT r_commissione.codice FROM r_commissione JOIN b_commissioni ON r_commissione.codice_commissione = b_commissioni.codice WHERE b_commissioni.tipologia = 'commissione' AND r_commissione.codice_utente = :utente",[":utente"=>$codice_utente])->rowCount();
}
public function estraiDaAlbo($codice_albo,$numero,$ruolo) {
$error = true;
$albo = AlboCommissione::init($codice_albo);
if (!empty($albo)) {
$partecipanti = $albo->getPartecipanti(["stato"=>"ammessi"],[],0,-1);
if (!empty($partecipanti)) {
$esclusioni = [];
$esistenti = $this->getCommissari();
if (!empty($esistenti)) {
$esclusioni = array_column($esistenti,"codice_utente");
$esclusioni = array_filter($esclusioni);
}
$obj = $this->getObject(null);
if (method_exists($obj,"getPartecipanti")) {
if (method_exists($obj,"getLotti")) {
$lotti = $obj->getLotti();
} else {
$lotti = [0];
}
foreach($lotti AS $lotto) {
if (!empty($lotto)) {
$obj->setLotto($lotto["codice"]);
}
$tmp = $obj->getPartecipanti();
if (!empty($tmp)) {
foreach($tmp AS $p) {
if (!empty($p["codice_operatore"])) {
$userInfo = oeManager::getUser($p["codice_operatore"]);
if (!empty($userInfo)) {
$esclusioni[] = $userInfo["codice"];
}
}
}
}
}
}
$conteggi = [];
$auto = [];
$potenziali = [];
$esclusi = [];
foreach($partecipanti AS $partecipante) {
$nomine = static::numeroNomine($partecipante["codice_operatore"]);
$partecipante["nomine"] = $nomine;
if (in_array($partecipante["codice_operatore"],$esclusioni) === false) {
if (!isset($conteggi[$nomine])) { $conteggi[$nomine] = []; }
if (!isset($conteggioMinimo)) {
$conteggioMinimo = $conteggioMassimo = $nomine;
} else {
if (isset($conteggioMinimo) && $conteggioMinimo > $nomine) { $conteggioMinimo = $nomine; }
if (isset($conteggioMassimo) && $conteggioMassimo < $nomine) { $conteggioMassimo = $nomine; }
}
$conteggi[$nomine][$partecipante["codice_operatore"]] = $partecipante;
} else {
$esclusi[$partecipante["codice_operatore"]] = $partecipante;
}
}
if (isset($conteggioMinimo)) {
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 $soggetto => $relazione) {
$auto[$soggetto] = $relazione;
}
} else {
if (!$stopPotenziali) {
foreach($relazioni AS $soggetto => $relazione) {
$potenziali[$soggetto] = $relazione;
}
if (count($auto) + count($potenziali) >= $numero) { $stopPotenziali = true; }
} else {
foreach($relazioni AS $soggetto => $relazione) {
$esclusi[$soggetto] = $relazione;
}
}
}
}
}
}
$estrazione = [];
$estrazione["codice_elemento"] = $this->elemento;
$estrazione["contesto"] = $this->modulo;
$estrazione["codice_albo"] = $albo->info["codice"];
$estrazione["componenti"] = $numero;
$estrazione["sequenza"] = "";
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_commissioni";
$salva->operazione = "INSERT";
$salva->oggetto = $estrazione;
$codice_estrazione = $salva->save();
if (!empty($codice_estrazione)) {
$insert = $this->db->prepare("INSERT INTO r_estrazioni_commissioni (codice_estrazione,codice_commissario,identificativo,escluso,selezionato,conteggio,utente_modifica,timestamp) VALUES (:codice_estrazione,:codice_commissario,:identificativo,:escluso,:selezionato,:conteggio,:utente_modifica,now())");
$insert->bindValue(':codice_estrazione',$codice_estrazione);
$insert->bindValue(':utente_modifica',$_SESSION["utente"]->codice);
if (!empty($auto)) {
$soggetti = array_keys($auto);
foreach($soggetti AS $soggetto) {
$insert->bindValue(':codice_commissario',$soggetto);
$insert->bindValue(':identificativo',0);
$insert->bindValue(':escluso',"N");
$insert->bindValue(':selezionato',"A");
$insert->bindValue(':conteggio',$auto[$soggetto]["nomine"]);
$insert->execute();
$this->createCommissarioFromUser($soggetto,$ruolo);
}
}
if (!empty($esclusi)) {
$soggetti = array_keys($esclusi);
foreach($soggetti AS $soggetto) {
$insert->bindValue(':codice_commissario',$soggetto);
$insert->bindValue(':identificativo',0);
$insert->bindValue(':escluso',"S");
$insert->bindValue(':selezionato',"N");
$insert->bindValue(':conteggio',$esclusi[$soggetto]["nomine"]);
$insert->execute();
}
}
if (!empty($potenziali)) {
$soggetti = array_keys($potenziali);
shuffle($soggetti);
$count = 0;
foreach($soggetti AS $soggetto) {
$count++;
$selezionato = "N";
if (in_array($count,$sequenza) !== false) {
$selezionato = "S";
$this->createCommissarioFromUser($soggetto,$ruolo);
}
$insert->bindValue(':codice_commissario',$soggetto);
$insert->bindValue(':identificativo',$count);
$insert->bindValue(':escluso',"N");
$insert->bindValue(':selezionato',$selezionato);
$insert->bindValue(':conteggio',(isset($potenziali[$soggetto]["nomine"]) && is_numeric($potenziali[$soggetto]["nomine"])) ? $potenziali[$soggetto]["nomine"] : 0);
$insert->execute();
}
}
$error = false;
}
}
}
}
return !$error;
}
public function getCommissari($codice_utente = NULL) {
$info = $this->getInfo();
if (!empty($info["codice"])) {
$bind = [":codice_commissione"=>$info["codice"]];
$sql = "SELECT r_commissione.*
FROM r_commissione
WHERE codice_commissione = :codice_commissione ";
if ($codice_utente !== NULL) {
$bind[":codice_utente"] = $codice_utente;
$sql .= " AND r_commissione.codice_utente = :codice_utente ";
}
$sql .= " ORDER BY codice";
return $this->db->go($sql,$bind)->fetchAll(PDO::FETCH_ASSOC);
}
return false;
}
public function printPublic() {
if (!empty($this->getCommissari())) {
include(__DIR__."/public-view.php");
}
}
public function checkAdminPermission() {
global $beRoot;
$valutatore = NULL;
$returnObject = false;
$path = $beRoot . self::moduliAbilitati()[$this->modulo]["script"];
if (file_exists($path)) {
include($path);
return $return;
}
return false;
}
public function getObject($valutatore = "commissione") {
if (empty($this->object)) {
global $beRoot;
$returnObject = true;
$path = $beRoot . self::moduliAbilitati()[$this->modulo]["script"];
if (file_exists($path)) {
include($path);
if (!empty($return)) {
$this->object = $return;
}
}
}
if (!empty($this->object)) {
return $this->object;
}
return false;
}
public function printEditor() {
if ($this->checkAdminPermission()) {
$this->admin = true;
include (__DIR__."/backend-manage.php");
}
return false;
}
public function printMonitor($codice_utente = null) {
if ($this->checkAdminPermission()) {
$this->admin = true;
include (__DIR__."/monitor.php");
}
return false;
}
public function getCoefficientiValutazione($codice_criterio=NULL,$codice_utente=NULL) {
$return = false;
$commissione = $this->getInfo();
if (!empty($commissione)) {
$bind = [];
$bind[":codice_commissione"] = $commissione["codice"];
$sql = "SELECT * FROM b_coefficienti_commissari WHERE codice_commissione = :codice_commissione ";
if (!empty($codice_criterio)) {
$bind[":codice_criterio"] = $codice_criterio;
$sql .= " AND codice_criterio = :codice_criterio ";
}
if (!empty($codice_utente)) {
$bind[":codice_utente"] = $codice_utente;
$sql .= " AND codice_utente = :codice_utente ";
}
$results = $this->db->go($sql,$bind);
if ($results->rowCount() > 0) {
$return = [];
while($coef = $results->fetch(PDO::FETCH_ASSOC)) {
if ((!empty($codice_criterio)) && (!empty($codice_utente))) {
$return[$coef["codice_partecipante"]] = $coef["coefficiente"];
} else if (!empty($codice_utente)) {
$return[$coef["codice_criterio"]][$coef["codice_partecipante"]] = $coef["coefficiente"];
} else if (!empty($codice_criterio)) {
$return[$coef["codice_utente"]][$coef["codice_partecipante"]] = $coef["coefficiente"];
} else {
$return[$coef["codice_criterio"]][$coef["codice_utente"]][$coef["codice_partecipante"]] = $coef["coefficiente"];
}
}
}
}
return $return;
}
public function createCommissarioFromUser($user,$ruolo = "MEMBRO") {
$userInfo = Utente::getInfoFromID($user);
if (!empty($userInfo)) {
$commissario = [];
$commissario["ruolo"] = $ruolo;
$commissario["nome"] = $userInfo["nome"];
$commissario["cognome"] = $userInfo["cognome"];
$commissario["email"] = $userInfo["email"];
$this->saveCommissario("i_",$commissario);
}
}
public function saveCommissario($id_commissario,$commissario) {
$codice_commissione = $this->getInfo()["codice"];
if (!empty($codice_commissione)) {
$checkUser = $this->db->prepare("SELECT codice FROM b_utenti WHERE email = :email");
$checkCollaborazione = $this->db->prepare("SELECT codice FROM r_collaborazioni WHERE codice_utente = :codice_utente AND codice_ente = :codice_ente");
$checkCollaborazione->bindValue(":codice_ente",$_SESSION["ente"]->codice);
$checkModulo = $this->db->prepare("SELECT codice FROM r_permessi_collaborazioni WHERE cod_relazione = :cod_collaborazione AND id_modulo = \"commissione\"");
if (is_numeric($id_commissario)) { $found[] = $id_commissario; }
$codice_utente = 0;
$checkUser->bindValue(":email",$commissario["email"]);
$checkUser->execute();
if ($checkUser->rowCount() > 0) {
if ($checkUser->rowCount() == 1) {
$tmpCheckUtent = $checkUser->fetch(PDO::FETCH_ASSOC);
if (!empty($tmpCheckUtent)) {
$type = Utente::getInfoFromID($tmpCheckUtent["codice"]);
$gerarchia = Utente::ruoli()[$type["ruolo"]]["gerarchia"] ?? 0;
if ($gerarchia > 9) {
$codice_utente = $tmpCheckUtent["codice"];
}
}
}
} else if ($this->tipologia == "commissione" || $this->tipologia == "monitoraggio" || $this->tipologia == "relatori") {
$user = [];
$user["password"] = password_hash(md5(base64_encode(rand(100000,20000))), PASSWORD_BCRYPT);
$user["email"] = $commissario["email"];
$user["ruolo"] = "USR";
$user["cognome"] = $commissario["cognome"];
$user["nome"] = $commissario["nome"];
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_utenti";
$salva->operazione = "INSERT";
$salva->oggetto = $user;
$codice_utente = $salva->save();
}
if (($this->tipologia == "commissione" || $this->tipologia == "monitoraggio" || $this->tipologia == "relatori") && !empty($codice_utente)) {
$checkCollaborazione->bindValue(":codice_utente",$codice_utente);
$checkCollaborazione->execute();
if ($checkCollaborazione->rowCount() > 0) {
$collaborazione = $checkCollaborazione->fetch(PDO::FETCH_ASSOC)["codice"];
} else {
$rel = [];
$rel["gruppo"] = "COM";
$rel["codice_utente"] = $codice_utente;
$rel["codice_ente"] = $_SESSION["ente"]->codice;
$rel["attivo"] = "S";
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_collaborazioni";
$salva->operazione = "INSERT";
$salva->oggetto = $rel;
$collaborazione = $salva->save();
}
$checkModulo->bindValue(":cod_collaborazione",$collaborazione);
$checkModulo->execute();
if ($checkModulo->rowCount() == 0) {
$relazione = [];
$relazione["id_modulo"] = $this->tipologia;
$relazione["cod_relazione"] = $collaborazione;
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_permessi_collaborazioni";
$salva->operazione = "INSERT";
$salva->oggetto = $relazione;
$salva->save();
}
}
$relazione = [];
if (is_numeric($id_commissario)) { $relazione["codice"] = $id_commissario; }
$relazione["codice_commissione"] = $codice_commissione;
$relazione["codice_utente"] = $codice_utente;
$relazione["ruolo"] = $commissario["ruolo"];
$relazione["nome"] = $commissario["nome"];
$relazione["cognome"] = $commissario["cognome"];
$relazione["email"] = $commissario["email"];
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_commissione";
$salva->operazione = !empty($relazione["codice"]) ? "UPDATE" : "INSERT";
$salva->oggetto = $relazione;
$found[] = $salva->save();
if ($this->tipologia == "commissione" || $this->tipologia == "monitoraggio" || $this->tipologia == "relatori") {
if (!is_numeric($id_commissario)) {
$infoCommissione = $this->getInfo();
$url = $_SESSION["config"]["link_sito"];
$oggettoComunicazione = __("Nomina commissario") . " - " . $infoCommissione["oggetto"];
$messaggio = __("Collegati al link sottostante per effettuare le operazioni.");
$messaggio .= "<br><br><strong><a href='{$url}' title='".__("Link esterno")."'>" . $url . "</a></strong>";
$messaggio .= "<br><br>" . __("Se necessario potete recuperare la password d'accesso tramite l'apposita funzione disponibile in piattaforma.");
$mailer = new Communicator();
$mailer->oggetto = $oggettoComunicazione;
$mailer->corpo = $messaggio;
$mailer->codice_pec = $this->object->info["codice_pec"] ?? -1;
$mailer->comunicazione = false;
$mailer->coda = false;
$mailer->destinatari = $commissario["email"];
$mailer->send();
}
}
return $id_commissario;
}
}
}
?>