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.
379 righe
13 KiB
379 righe
13 KiB
<? |
|
class rispostaDocumentale { |
|
|
|
/** |
|
* Risposta |
|
* @var Array |
|
*/ |
|
public $info; |
|
|
|
/** |
|
* Codice Gestore |
|
* @var int |
|
*/ |
|
public $codice_gestore; |
|
|
|
protected $db; |
|
|
|
public function __construct() |
|
{ |
|
global $pdo; |
|
$this->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) ?? []; |
|
} |
|
} |
|
|
|
?>
|