db = $pdo; $this->codice_ente = $_SESSION["ente"]->codice ?? 0; } public static function init(stipula $contratto) { $instance = new RichiestaDocumentale(); $instance->contratto = $contratto; return $instance; } /** * $operation * l'array opertation deve essere inizializzato in questo modo * ['tipo operazione','colonna']; * es: ['GROUP BY','classe_documentale'] */ public static function getRichieste(array $filters = null, array $operation = null) { global $pdo; $bind = []; $sql = "SELECT b_contratti_richiesta_documentale.codice, b_contratti_richiesta_documentale.codice_classe_documentale, b_contratti_richiesta_documentale.codice_oe, b_contratti_richiesta_documentale.descrizione, b_contratti_richiesta_documentale.invia_comunicazione, b_contratti_richiesta_documentale.bozza, b_contratti_richiesta_documentale.soft_delete, r_contratto_richiesta.codice_contratto, r_contratto_richiesta.bloccante "; $from = " FROM b_contratti_richiesta_documentale "; $join = " JOIN r_contratto_richiesta ON b_contratti_richiesta_documentale.codice = r_contratto_richiesta.codice_richiesta "; $where = " WHERE soft_delete = 'N' "; if (!empty($filters)) { if (!empty($filters["codice"])) { $bind[":codice"] = $filters["codice"]; $where .= " AND b_contratti_richiesta_documentale.codice = :codice "; } if (!empty($filters["codice_richiesta"])) { $bind[":codice_richiesta"] = $filters["codice_richiesta"]; $where .= " AND r_contratto_richiesta.codice_richiesta = :codice_richiesta "; } if (!empty($filters["codici_richiesta"])) { $codici = arrayIsNumeric($filters["codici_richiesta"]); $codici = implode(",",$codici); $where .= " AND r_contratto_richiesta.codice_richiesta IN ($codici) "; } if (!empty($filters["codice_contratto"])) { $bind[":codice_contratto"] = $filters["codice_contratto"]; $where .= " AND r_contratto_richiesta.codice_contratto = :codice_contratto "; } if (!empty($filters["codici_contratti"])) { $ids = arrayIsNumeric($filters["codici_contratti"]); $ids = implode(",",$ids); $where .= " AND r_contratto_richiesta.codice_contratto IN ($ids) "; } if (!empty($filters['codice_oe'])) { $bind[":codice_oe"] = $filters["codice_oe"]; $where .= " AND b_contratti_richiesta_documentale.codice_oe = :codice_oe "; } if (!empty($filters['codice_classe_documentale'])) { $bind[":codice_classe_documentale"] = $filters["codice_classe_documentale"]; $where .= " AND b_contratti_richiesta_documentale.codice_classe_documentale = :codice_classe_documentale"; } if (isset($filters["codici_classi_documentali"])) { $ids = arrayIsNumeric($filters["codici_classi_documentali"]); $ids = implode(",",$ids); $where .= " AND b_contratti_richiesta_documentale.codice_classe_documentale IN ($ids) "; } if(!empty($filters['invia_comunicazioni'])){ $bind[':invia_comunicazioni'] = $filters['invia_comunicazioni']; $where .= " AND b_contratti_richiesta_documentale.invia_comunicazione = :invia_comunicazioni"; } if(!empty($filters['bozza'])){ $bind[':bozza'] = $filters['bozza']; $where .= " AND b_contratti_richiesta_documentale.bozza = :bozza"; } if(!empty($filters['codici_destinatari'])){ $codiciDestinatari = arrayIsNumeric($filters['codici']); $codiciDestinatari = implode(",", $codiciDestinatari); $where .= " AND b_contratti_richiesta_documentale.codice_oe IN ($codiciDestinatari) "; } } if (!empty($operation['max_timestamp_creazione'])) { if ($operation['max_timestamp_creazione'] == 'MAX') { $sql.= ", MAX(b_contratti_richiesta_documentale.timestamp_creazione) as timestamp_creazione "; } }else{ $sql .= ", b_contratti_richiesta_documentale.timestamp_creazione "; } if (!empty($operation['codice_classe_documentale'])) { if ($operation['codice_classe_documentale'] == 'GROUP BY') { $where .= " GROUP BY b_contratti_richiesta_documentale.codice_classe_documentale "; } } if (!empty($operation['timestamp_creazione'])) { if ($operation['timestamp_creazione'] == 'ASC') { $where .= " ORDER BY b_contratti_richiesta_documentale.timestamp_creazione ASC"; }elseif($operation['timestamp_creazione'] == 'DESC'){ $where .= " ORDER BY b_contratti_richiesta_documentale.timestamp_creazione DESC"; } } if (!empty($operation['bloccante'])) { if ( $operation['bloccante'] == 'ASC') { $where .= " ORDER BY r_contratto_richiesta.bloccante ASC "; }else{ $where .= " ORDER BY r_contratto_richiesta.bloccante DESC "; } } if(!empty($operation['descrizione'])){ if($operation['descrizione'] == 'GROUP BY'){ $where .= " GROUP BY b_contratti_richiesta_documentale.descrizione "; } } $query = $sql.=$from.=$join.=$where; return $pdo->go($query, $bind)->fetchAll(PDO::FETCH_ASSOC) ?? []; } public static function salvaRichieste($data) { $returns = []; if(!empty($data['codice_contratto']) && !empty($data['codice_oe']) && !empty($data['richieste'])){ $contratto = stipula::init($data["codice_contratto"]); $oe = oeManager::getOE($data['codice_oe']); if(!empty($contratto->info['codice']) && !empty($oe['codice'])){ $managerRichieste = self::init($contratto); $codiciClassiDocumentali = pluck('codice_classe_documentale', $data['richieste']); $classiDocumentali = ContrattoDocumentale::getAllDocumentali(['codici' => $codiciClassiDocumentali]); foreach ($data['richieste'] as $i => $richiesta) { $key = array_search($richiesta['codice_classe_documentale'], array_column($classiDocumentali, 'codice')); $classeDocumentale = $classiDocumentali[$key]; if(!empty($classeDocumentale['codice']) && $richiesta['codice_classe_documentale'] == $classeDocumentale['codice']){ $post = [ 'codice_contratto' => $contratto->info['codice'], 'codice_classe_documentale' => $classeDocumentale['codice'], 'codice_oe' => $oe['codice'], 'descrizione' => $data['descrizione'], 'invia_comunicazione' => (!empty($richiesta['invia_comunicazione'])) ? 'S' : 'N', 'bozza' => $data['bozza'], 'bloccante' => !empty($richiesta['bloccante']) ? 'S' : 'N', 'allegati' => !empty($data["allegato-{$classeDocumentale['codice']}"]) ? $data["allegato-{$classeDocumentale['codice']}"] : [], ]; if($classeDocumentale['ambito_validita'] == 'contratto'){ // verifica se non esistono altre richieste della stessa classe documentale e per lo stesso OE $exist = $managerRichieste->getRichieste(['codice_classe_documentale' => $classeDocumentale['codice'], 'codice_oe' => $oe['codice'], 'codice_contratto' => $contratto->info['codice']]); if(empty($exist)){ $codice = $managerRichieste->salvaRichiestaRelazione($post); if (!empty($codice)) { $returns[$i]['save'] = true; $returns[$i]['codice_richiesta'] = $codice; }else{ $returns[$i]['save'] = false; } } }elseif($classeDocumentale['ambito_validita'] == 'oe'){ // esistono altre richieste della stessa classe documentale e per lo stesso OE $exist = $managerRichieste->getRichieste(['codice_classe_documentale' => $classeDocumentale['codice'], 'codice_oe' => $oe['codice'] ]); // se non esistono altre richieste della stessa classe documentae e per lo stesso OE if (empty($exist)) { $codice = $managerRichieste->salvaRichiestaRelazione($post); if (!empty($codice)) { $returns[$i]['save'] = true; $returns[$i]['codice_richiesta'] = $codice; }else{ $returns[$i]['save'] = false; } }else{ // se non esistono richieste per lo stesso contratto if (empty($managerRichieste->getRichieste(['codice_contratto' => $contratto->info['codice'] ,'codice_classe_documentale' => $classeDocumentale['codice'],'codice_oe' => $oe['codice']]))) { $post['codice_richiesta'] = $exist[0]['codice']; $post['allegati'] = !empty($data["allegato-{$post['codice_richiesta']}"]) ? $data["allegato-{$post['codice_richiesta']}"] : []; $codice = $managerRichieste->salvaRelazione($post); if (!empty($codice)) { $returns[$i]['save'] = true; $returns[$i]['codice_richiesta'] = $post['codice_richiesta']; }else{ $returns[$i]['save'] = false; } } } } if ($contratto->info['stato'] <= '15' && $data['bozza'] == 'N') { $contratto->updateStato('15'); } } } $esitoComunicazione = 'notvalue'; if(!empty($returns)){ $richieste = pluck('codice_richiesta', $returns); $richieste = self::getRichieste(['codici_richiesta' => $richieste, 'invia_comunicazioni' => 'S', 'bozza' => 'N']); // script per inviare le comunicazioni // le comunicazioni, saranno inviate solo se invia_comunicazioni = S e bozza = N if(!empty($richieste)){ // ragruppa le richieste in base alla descrizione $corpo = $data['descrizione']; $corpo .= "

" . __("Effettuate la connessione alla piattaforma per effettuare il caricamento del documentale richiesto"); $esitoComunicazione = $managerRichieste->inviaComunicazione($oe['codice'], ['corpo' => $corpo]); } } return [ 'save' => $returns, 'comunicazione' => $esitoComunicazione ]; } } return $returns; } public static function gestisciBozze($data) { global $pdo; $returns = []; if(!empty($data['codice_contratto']) && !empty($data['richieste'])){ $contratto = stipula::init($data["codice_contratto"]); $oe = oeManager::getOE($data['codice_oe']); if(!empty($contratto->info['codice']) && !empty($oe['codice'])){ foreach ($data['richieste'] as $richiesta) { if(!empty($richiesta['codice_richiesta'])){ $bind = [ ':codice_richiesta' => $richiesta['codice_richiesta'], ':descrizione' => $data['descrizione'], ':bloccante' => !empty($richiesta['bloccante']) ? 'S' : 'N', ':invia_comunicazione' => !empty($richiesta['invia_comunicazione']) ? 'S' : 'N', ':bozza' => 'N', ':utente' => $_SESSION['utente']->codice, 'allegati' => !empty($data["allegato-{$richiesta['codice_richiesta']}"]) ? $data["allegato-{$richiesta['codice_richiesta']}"] : [], ]; // Aggiorna Richieste $sql = "UPDATE b_contratti_richiesta_documentale SET descrizione = :descrizione, invia_comunicazione = :invia_comunicazione, bozza = :bozza, utente_modifica = :utente WHERE codice = :codice_richiesta "; $ris = $pdo->go($sql,$bind); // Aggiorna Contratto if ($contratto->info['stato'] <= '15') { $contratto->updateStato('15'); } if($ris->rowCount() === 1){ // aggiorna relazione se esiste $sql = "UPDATE r_contratto_richiesta SET bloccante = :bloccante WHERE codice_richiesta = :codice_richiesta"; $ris = $pdo->go($sql,$bind); // salva file if(!empty($bind['allegati'])){ foreach ($bind['allegati'] as $allegato) { filesManager::saveFile($allegato["filename"], $richiesta['codice_richiesta'], "richiesta-documentale", $allegato["nome"] ?? "", "A", $allegato["classificazione"] ?? ""); } } }else{ return false; } } } $richieste = pluck('codice_richiesta', $data['richieste']); $richieste = self::getRichieste(['codici_richiesta' => $richieste, 'invia_comunicazioni' => 'S', 'bozza' => 'N']); // script per inviare le comunicazioni // le comunicazioni, saranno inviate solo se invia_comunicazioni = S e bozza = N if(!empty($richieste)){ $managerRichieste = self::init($contratto); // ragruppa le richieste in base alla descrizione $corpo = $data['descrizione']; $corpo .= "

" . __("Effettuate la connessione alla piattaforma per effettuare il caricamento del documentale richiesto"); $managerRichieste->inviaComunicazione($oe['codice'], ['corpo' => $corpo]); } return true; } } } private function salvaRichiestaRelazione($data) { $salva = null; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_contratti_richiesta_documentale"; $salva->operazione = "INSERT"; $salva->oggetto = array( "codice_classe_documentale" => $data['codice_classe_documentale'], 'codice_oe' => $data['codice_oe'], 'descrizione' => $data['descrizione'], 'invia_comunicazione' => $data['invia_comunicazione'], 'bozza' => $data['bozza'], 'utente_modifica' => $_SESSION["utente"]->codice, 'timestamp_creazione' => date("d-m-Y H:i:s") ); $codice = $salva->save(); if(!empty($codice)){ $data['codice_richiesta'] = $codice; if($this->salvaRelazione($data)){ return $codice; } } return false; } private function salvaRelazione($data) { $salva = null; $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "r_contratto_richiesta"; $salva->operazione = "INSERT"; $salva->oggetto = array( 'codice_contratto' => $data['codice_contratto'], 'codice_richiesta' => $data['codice_richiesta'], 'bloccante' => $data['bloccante'], ); $codice = $salva->save(); if (!empty($codice)) { if (isset($data['allegati'])) { foreach($data["allegati"] as $allegato) { filesManager::saveFile($allegato["filename"], $data['codice_richiesta'], "richiesta-documentale" ,$allegato["nome"] ?? "","A",$allegato["classificazione"] ?? ""); } } return $codice; } return false; } public function getInfo($codice) { return $this->getRichieste(["codice"=>$codice])[0] ?? []; } /** * Specificare se sa o oe * sa = Stazione Appaltante * oe = Operatore Economico */ static function getStati($parte) { return rispostaDocumentale::getStati($parte); } /** * La invia comunicazione invia le richieste per tutte le modifiche fatte lato stazione appaltante */ public function inviaComunicazione($destinatario, array $fields = null) { $oggetto = __("Richiesta documentale contratti"); $corpo = __("Effettuate la connessione alla piattaforma per effettuare il caricamento del documentale richiesto"); if (!empty($fields)) { if (!empty($fields['oggetto'])) { $oggetto = $fields['oggetto']; } if (!empty($fields['corpo'])) { $corpo = $fields['corpo']; } } $mailer = new Communicator(); $mailer->oggetto = $oggetto; $mailer->corpo = $corpo; $mailer->corpo .= "

" . $_SESSION["config"]["link_sito"]."/contratti/documentale/index.php?modulo=contratti&codice_elemento=".$this->contratto->info['codice']; $mailer->codice_pec = $this->contratto->info['codice_pec']; $mailer->comunicazione = true; $mailer->sezione = "contratti"; $mailer->codice_gara = $this->contratto->info['codice']; $mailer->coda = false; $mailer->destinatari = $destinatario; return $mailer->send(); } public static function getBadgeGruppoColore($rBadges) { if(!empty($rBadges)){ if (!empty($rBadges['statoLabel'])) { $stato = $rBadges['statoLabel']['key']; if($stato == '20' || $stato == '30'){ return "text-danger"; }elseif($stato == '5' || $stato == '10' || $stato == '25'){ return "text-warning"; }elseif($stato == '15'){ return "text-success"; } }else{ if (!empty($rBadges['statoBadges'])) { $badges = $rBadges['statoBadges']; }else{ $badges = $rBadges; } $array = []; foreach ($badges as $key => $badge) { if ($badge['contatori'] > 0) { $array[] = $key; } } if(in_array('20', $array) || in_array('30', $array)){ return "text-danger"; }elseif(in_array('5', $array) || in_array('10', $array) || in_array('25', $array)){ return "text-warning"; }elseif(in_array('15', $array)){ return "text-success"; } } } return null; } }