if (!empty($elabora_coda) && (!empty($_SESSION["ente"]))) {
// esegui il cron solo se il tenant ha i moduli contratto e monitoraggio documentale attivo
if(!empty($_SESSION['ente']->moduli['contratti']) && !empty($_SESSION['ente']->moduli['contratti.documentale'])){
alertManager::printCliInfo("Preavvisi Monitoraggio Documentale");
if (empty(getQueueLog($_SESSION["ente"]->codice,"monitoraggioDocumentale"))) {
$current_time = (int) date('H');
if($current_time >= 8){
// analizza solo quei contratti che hanno delle richieste che non sono in modalità bozza
$r_contratti_richieste = $pdo->go("SELECT r_contratto_richiesta.codice_contratto,
r_contratto_richiesta.codice_richiesta,
r_contratto_richiesta.bloccante,
b_contratti_richiesta_documentale.codice_classe_documentale,
b_contratti_richiesta_documentale.codice_oe,
b_contratti_richiesta_documentale.bozza
FROM r_contratto_richiesta
JOIN b_contratti_richiesta_documentale ON r_contratto_richiesta.codice_richiesta = b_contratti_richiesta_documentale.codice
WHERE b_contratti_richiesta_documentale.soft_delete = 'N'
AND b_contratti_richiesta_documentale.bozza = 'N' ")
->fetchAll(PDO::FETCH_ASSOC);
if (!empty($r_contratti_richieste)) {
$codiciClassiDocumentali = array_unique(pluck('codice_classe_documentale', $r_contratti_richieste));
$codiciClassiDocumentali = implode(",", $codiciClassiDocumentali);
$classiDocumentali = $pdo->go("SELECT codice, ambito_validita, soggetto, titolo, scadenza FROM b_classe_documentale WHERE codice IN ($codiciClassiDocumentali) AND soft_delete = 'N' ")
->fetchAll(PDO::FETCH_ASSOC);
$preavvisi = $pdo->go("SELECT codice_classe_documentale, preavviso FROM b_preavvisi WHERE codice_classe_documentale IN ($codiciClassiDocumentali) ORDER BY preavviso DESC")->fetchAll(PDO::FETCH_ASSOC);
$codiciContratti = array_values(array_unique(pluck('codice_contratto', $r_contratti_richieste)));
global $pdo;
// sistema contratti e relative richieste
$contratti = [];
foreach($codiciContratti as $key => $codiceContratto){
$bind = [
":codice"=>$codiceContratto,
":codice_gestore"=>$_SESSION["ente"]->codice
];
$sql = "SELECT * FROM b_contratti WHERE codice = :codice AND codice_gestore = :codice_gestore";
$contratti[$key] = $pdo->go($sql,$bind)->fetch(PDO::FETCH_ASSOC);
foreach ($r_contratti_richieste as $key2 => $value) {
if ($value['codice_contratto'] == $codiceContratto) {
$contratti[$key]['richieste'][] = [
'codice_richiesta' => $value['codice_richiesta'],
'codice_classe_documentale' => $value['codice_classe_documentale'],
'codice_oe' => $value['codice_oe'],
'bloccante' => $value['bloccante']
];
}
}
}
// sistema classi documentali e relativi preavvisi
foreach ($classiDocumentali as $key => $classeDocumentale) {
foreach ($preavvisi as $key2 => $preavviso) {
if($classeDocumentale['codice'] == $preavviso['codice_classe_documentale']){
$classiDocumentali[$key]['preavvisi'][] = $preavviso['preavviso'];
}
}
}
foreach ($contratti as $key => $contratto) {
foreach ($contratto['richieste'] as $key2 => $richiesta) {
foreach ($classiDocumentali as $key3 => $classeDocumentale) {
if ($richiesta['codice_classe_documentale'] == $classeDocumentale['codice']) {
$updateBadge = false;
// aggiungi data odierna che sarebbe 0 in tutti i preavvisi
$codice_richiesta = $richiesta['codice_richiesta'];
$risposte = $pdo->go("SELECT *
FROM b_contratti_risposta_documentale
WHERE codice_richiesta = {$codice_richiesta}
AND stato != '20'
AND stato != '30'
AND data_scadenza IS NOT NULL
AND b_contratti_risposta_documentale.codice IN (
SELECT MAX(codice) as codice
FROM b_contratti_risposta_documentale
GROUP BY codice_richiesta, codice_soggetto_oe
)")
->fetchAll(PDO::FETCH_ASSOC);
if(!empty($risposte)){
foreach ($risposte as $key => $risposta) {
$date1 = new DateTime($risposta['data_scadenza']);
$date2 = new DateTime(date('Y-m-d'));
$update = $pdo->prepare("UPDATE b_contratti_risposta_documentale SET stato = :stato WHERE codice = :codice_risposta ");
$mailDestinatari = [
"sa" => $contratto['codice_pec'],
"oe" => $richiesta["codice_oe"],
];
// se data di scadenza risposta è <= oggi
if ($date1->diff($date2)->invert == 0) { //SCADUTA
// imposta risposta su scaduta
$update->bindValue(":stato", '30');
$update->bindValue(":codice_risposta", $risposta['codice']);
$update->execute();
$updateBadge = true;
foreach ($mailDestinatari as $key => $mailDestinatario) {
if($richiesta['bloccante'] == 'S'){
$oggetto = __('Attenzione!, documento Scaduto');
}else{
$oggetto = __('Documento Scaduto');
}
$corpo = "Si informa la S.V. che il ".date('d-m-Y').", una risposta di una richiesta documentale '".$classeDocumentale['titolo']."' è scaduta ";
$corpo.= "
Link sito:";
$mailer = new Communicator();
if ($key == 'sa') {
$href = "https://".$_SESSION["ente"]->getInfo()["dominio"]."/backend/contratti/documentale/panel.php?codice=".$contratto["codice"];
$destinatari = [Communicator::getPecAddress($contratto["codice_pec"])];
$tmp = Ente::getUtentiFromModulo("contratti",$_SESSION["ente"]->codice,"",$contratto["codice"]);
$utenti = Utente::getInfoFromID($tmp);
if (!empty($utenti)) {
foreach($utenti AS $utente) {
$destinatari[] = $utente["email"];
}
}
// se il contratto è stato generato da una gara,
// aggiungi nei destinatari della comunicazione, tutti gli incaricati della gara che hanno il seguento ruolo
// - responsabile unico del procedimento
// - direttore dell'esecuzione del contratto
// - direttori dei lavori
if( !empty($contratto['modulo_origine']) && !empty($contratto['codice_elemento']) && $contratto['modulo_origine'] == 'gare' ){
$sql = "SELECT b_gare.codice
FROM b_contratti
LEFT JOIN b_gare_lotti ON b_contratti.codice_elemento = b_gare_lotti.codice
LEFT JOIN b_gare ON b_gare_lotti.codice_gara = b_gare.codice
WHERE b_contratti.modulo_origine = :modulo_origine
AND b_contratti.codice = :codice_contratto";
$codice_gara = $pdo->go($sql, [
':modulo_origine' => 'gare',
'codice_contratto' => $contratto['codice']
]
)->fetch(PDO::FETCH_COLUMN);
if(!empty($codice_gara)){
$gara = gara::init($codice_gara);
if(!empty($gara->info['codice'])){
$tmpIncaricati = $gara->getManagerIncarichi();
$tmpIncaricati = $tmpIncaricati->getIncaricati() ?? [];
if(!empty($tmpIncaricati)){
$incaricati = [];
foreach ($tmpIncaricati as $tmpIncaricato) {
if(in_array($tmpIncaricato['ruolo'], ['14', '5', '8'])){
$incaricati[] = $tmpIncaricato;
}
}
// finire gestione degli incaricati a cui inviare la comunicazione
// se l'incaricato ha il campo email valorizzato, inseriscilo nei destinatari
// altrimenti vai a cercare l'email nella b_utenti tramite CF
// altrimenti passa avanti
if(!empty($incaricati)){
foreach ($incaricati as $incaricato) {
if(!empty($incaricato['email'])){
$destinatari[] = $incaricato['email'];
}elseif(!empty($incaricato['codice_fiscale'])){
$getEmail = $pdo->prepare("SELECT email FROM b_utenti WHERE cf = :cf AND attivo = 'S'");
$getEmail->bindValue(':cf', $incaricato['codice_fiscale']);
$getEmail->execute();
if($getEmail->rowCount() > 0){
$destinatari[] = $getEmail->fetch(PDO::FETCH_COLUMN);
}
}
}
}
}
}
}
}
$mailer->destinatari = $destinatari;
}else{
$href = "https://".$_SESSION["ente"]->getInfo()["dominio"]."/contratti/documentale/index.php?modulo=contratti&codice_elemento=".$contratto["codice"];
$mailer->destinatari = $richiesta['codice_oe'];
}
$corpo.= "" . $href . "
";
$corpo.= "Distinti Saluti
";
$mailer->oggetto = $oggetto;
$mailer->corpo = "