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.
 
 
 
 
 

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) ?? [];
}
}
?>