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.
 
 
 
 
 

493 righe
19 KiB

<?
class RichiestaDocumentale {
public $info;
protected $contratto;
public $codice_ente;
protected $db;
private function __construct() {
global $pdo;
$this->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 .= "<br><br>" . __("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 .= "<br><br>" . __("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 .= "<br><br>" . $_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;
}
}