info = get_campi('b_contratti_risposta_documentale'); $this->codice_gestore = $_SESSION["ente"]->codice ?? 0; $this->db = $pdo; } static function getRisposte(array $filters = null, array $operation = null) { global $pdo; $bind = []; $sql = "SELECT * FROM b_contratti_risposta_documentale WHERE codice != '0' "; if (!empty($filters)) { if (!empty($filters["codice_richiesta"])) { $bind[":codice_richiesta"] = $filters["codice_richiesta"]; $sql .= " AND codice_richiesta = :codice_richiesta "; } if (!empty($filters["codice_soggetto_oe"])) { $bind[":codice_soggetto_oe"] = $filters["codice_soggetto_oe"]; $sql .= " AND codice_soggetto_oe = :codice_soggetto_oe "; } if(!empty($filters['codici_richieste'])){ $codiciRichiesta = arrayIsNumeric($filters['codici_richieste']); $codiciRichiesta = implode(",", $codiciRichiesta); $sql .= " AND codice_richiesta IN ($codiciRichiesta) "; } } if (!empty($operation)) { if (in_array('ORDER BY ASC', $operation)) { if (in_array('timestamp_creazione', $operation)) { $sql .= " ORDER BY timestamp_creazione"; } } }else{ $sql .= " ORDER BY timestamp_creazione DESC "; } return $pdo->go($sql,$bind)->fetchAll(PDO::FETCH_ASSOC) ?? []; } /** * Specificare se sa o oe * sa = Stazione Appaltante * oe = Operatore Economico * * se oe, lo stato bozza non deve essere visualizzato */ static function getStati($parte) { if($parte == "sa" || $parte == "oe"){ global $root; $tmpStati = jsonToArray($root."/backend/contratti/documentale/statoRisposta.json"); if($parte == 'oe'){ unset($tmpStati[1]); } $stati = []; foreach($tmpStati as $key => $tmpStato){ if($tmpStato['visible']){ $stati[$key] = [ 'titolo' => (is_array($tmpStato['titolo'])) ? $tmpStato['titolo'][$parte] : $tmpStato['titolo'] , 'color' => $tmpStato['color'], 'class' => $tmpStato['class'], 'contatori' => $tmpStato['contatori'], ]; } } return $stati; } return []; } public static function getStato($stato, $type = null, $parte) { global $root; $tmpStati = jsonToArray($root."/backend/contratti/documentale/statoRisposta.json"); $stati = []; foreach($tmpStati as $key => $tmpStato){ $stati[$key] = [ 'titolo' => (is_array($tmpStato['titolo'])) ? $tmpStato['titolo'][$parte] : $tmpStato['titolo'] , 'color' => $tmpStato['color'], 'class' => $tmpStato['class'], 'contatori' => $tmpStato['contatori'], ]; } if ($type == strtolower('color')){ return $stati[$stato]['color']; }elseif ($type == strtolower('class')){ return $stati[$stato]['class']; }else{ return $stati[$stato]['titolo']; } return null; } public static function getGroupBadge($codice_contratto, $richieste = [], $parte) { $stati = []; if(!empty($codice_contratto) && !empty($richieste)){ $tmp = self::getBadge($codice_contratto, $richieste, $parte); $stati = self::getStati($parte); foreach($tmp as $richiestePerOE){ if(!empty($richiestePerOE['statoLabel'])){ foreach($stati as $key => $stato){ if($richiestePerOE['statoLabel']['key'] == $key){ $stati[$key]['contatori']++; } } }else{ foreach($richiestePerOE['statoBadges'] as $key3 => $stato2 ){ if($stato2['contatori'] != 0){ $stati[$key3]['contatori'] += $stato2['contatori']; } } } } } return $stati; } public static function getBadge($codice_contratto, $richieste, $parte) { if(!empty($codice_contratto) && !empty($richieste)){ $codiciClassiDocumentali = pluck('codice_classe_documentale', $richieste); $codiciRichieste = pluck('codice', $richieste); if(!empty($codiciClassiDocumentali) && !empty($codiciRichieste)){ $codiciClassiDocumentali = array_filter(array_unique($codiciClassiDocumentali)); $classiDocumentali = ContrattoDocumentale::getAllDocumentali(['codici' => $codiciClassiDocumentali]); if(!empty($classiDocumentali)){ $codiciRichieste = array_filter(array_unique($codiciRichieste)); $risposte = self::getUltimeRisposteRichiesta($codiciRichieste); foreach ($richieste as $key => $richiesta) { foreach ($risposte as $key2 => $risposta) { if($richiesta['codice'] == $risposta['codice_richiesta']){ $richieste[$key]['risposte'][] = $risposta; } } } foreach ($richieste as $key => $richiesta) { $keyClasseDocumentale = array_search($richiesta['codice_classe_documentale'], array_column($classiDocumentali, 'codice')); if(!empty($classiDocumentali[$keyClasseDocumentale])){ $classeDocumentale = $classiDocumentali[$keyClasseDocumentale]; if($richiesta['bozza'] == 'S'){ $richieste[$key]['statoLabel'] = [ 'key' => "1", 'class' => self::getStato("1", 'class', $parte), 'titolo' => self::getStato("1", 'titolo', $parte), 'color' => self::getStato("1", 'titolo', $parte) ]; }else{ if($richiesta['codice_classe_documentale'] == $classeDocumentale['codice'] && $classeDocumentale['soggetto'] == '5'){ // Se il soggetto della classe documentale è oe if(!empty($richiesta['risposte'])){ // recupera lo stato dell'ultima risposta per questa richiesta $lastRisposta = $richiesta['risposte'][0]; $richieste[$key]['statoLabel'] = [ 'key' => $lastRisposta['stato'], 'class' => self::getStato($lastRisposta['stato'], 'class', $parte), 'titolo' => self::getStato($lastRisposta['stato'], 'titolo', $parte), 'color' => self::getStato($lastRisposta['stato'], 'titolo', $parte) ]; unset($richieste[$key]['risposte']); }else{ $richieste[$key]['statoLabel'] = [ 'key' => "5", 'class' => self::getStato("5", 'class', $parte), 'titolo' => self::getStato("5", 'titolo', $parte), 'color' => self::getStato("5", 'titolo', $parte) ]; } }elseif($richiesta['codice_classe_documentale'] == $classeDocumentale['codice'] && $classeDocumentale['soggetto'] != '5'){ // Se il soggetto della classe documentale non è oe $classeDocumentale['ruoli'] = ContrattoDocumentale::getRuoli($classeDocumentale['codice']); $badges = []; // controllare quanti soggetti sono associati al contratto $soggettiOeAssociati = publicStipula::getSoggettiAssociati($codice_contratto, $richiesta['codice_oe']); // controllo quanti sono compatibili con la richiesta // Bisogna verificare i ruoli associati alla classe documentale della richiesta // e confrontarli con i ruoli dei soggetti_oe abbinati al contratto $tmp = []; foreach($soggettiOeAssociati as $soggetoOeAssociato){ foreach($classeDocumentale['ruoli'] as $codiceRuolo){ if(in_array($codiceRuolo['codice'], $soggetoOeAssociato['ruoli'])){ $tmp[] = $soggetoOeAssociato['codice_soggetto']; break; } } } // se ha soggetti con ruoli compatibili mostra lo stato delle risposte if (!empty($tmp)) { $badges = publicRispostaDocumentale::getStati($parte); // controlla se il soggetto ha almeno una risposta abbinata // prendi l'utima risposta inviata per ogni soggetto foreach($badges as $stato => $badge){ $badges[$stato]['key'] = $stato; // per ogni stato controlla se ci sono i soggetti oe all'interno delle risposte // se si // vedi che stato hanno le risposte // e incrementa il contatore di riferimento // altrimenti // incrementa il contatore dei non inviati foreach ($tmp as $codiceSoggettoOe) { $keyRisposta = array_search($codiceSoggettoOe, array_column($richiesta['risposte'] ?? [], 'codice_soggetto_oe')); if ($keyRisposta !== false) { $risposta = $richiesta['risposte'][$keyRisposta]; if ($stato == $risposta['stato']) { $badges[$risposta['stato']]['contatori'] += 1; } }elseif($stato == '5'){ $badges[$stato]['contatori'] += 1; } } } $richieste[$key]['statoBadges'] = $badges; }else{ // altrimenti mostra stato in attesa di invio o risposta $richieste[$key]['statoLabel'] = [ 'key' => "5", 'class' => self::getStato("5", 'class', $parte), 'titolo' => self::getStato("5", 'titolo', $parte), 'color' => self::getStato("5", 'titolo', $parte) ]; } } unset($richieste[$key]['risposte']); } } } return $richieste; } } } return []; } // ELIMINARE /** * Questa funzione ritorna l'ultima risposta per ogni ogni richiesta * * @var Int $codice_richieste */ public static function getUltimaRispostaRichiesta(Int $codice_richiesta) { global $pdo; $risposte = $pdo->prepare("SELECT codice_richiesta,stato, codice_soggetto_oe, timestamp_creazione FROM b_contratti_risposta_documentale WHERE codice_richiesta = :codice_richiesta AND timestamp_creazione IN ( SELECT MAX(timestamp_creazione) FROM b_contratti_risposta_documentale GROUP BY codice_soggetto_oe ) AND codice_soggetto_oe IS NOT NULL ORDER BY timestamp_creazione DESC"); $risposte->bindValue(":codice_richiesta", $codice_richiesta); $risposte->execute(); return $risposte->fetchAll(PDO::FETCH_ASSOC) ?? []; } /** * Questa funzione ritorna l'ultima risposta per ogni ogni richiesta * * @var Int $codice_richieste */ public static function getUltimeRisposteRichiesta(Array $codice_richieste) { global $pdo; $codice_richieste = arrayIsNumeric($codice_richieste); $ids = implode(",",$codice_richieste); $risposte = $pdo->prepare("SELECT * FROM b_contratti_risposta_documentale WHERE codice IN ( SELECT MAX(codice) AS codice FROM b_contratti_risposta_documentale WHERE codice_richiesta IN ($ids) GROUP BY codice_richiesta, codice_soggetto_oe -- GROUP BY codice_soggetto_oe )"); $risposte->execute(); return $risposte->fetchAll(PDO::FETCH_ASSOC) ?? []; } } ?>