modulo di integrazione * - sottomodulo => sottomodulo di integrazione * - data => dati del modulo * - title => titolo dell'helper * * @var array */ protected $integrationHelperData = []; public function appendIntegrationHelper(string $modulo, string $sottomodulo, array $data, string $title, string $section, int $subsection = 0, string $position = "floating", bool $data_is_array = false) { $target = &$this->integrationHelperData[$section][$subsection][$title]; // Se lo slot è vuoto lo creiamo if(empty($target)) { $target["modulo"] = $modulo; $target["sottomodulo"] = $sottomodulo; $target["title"] = $title; $target["position"] = $position; // Flag per gestire aggiunte $target["is_array"] = $data_is_array; $target["data"] = $data_is_array ? [$data] : $data; } // Altrimenti appendiamo i dati else { // Se stiamo aggiungendo, rendiamo i dati un array in modo da passarli come lista // al renderer if(!$target["is_array"]) { $target["is_array"] = true; $target["data"] = [$target["data"]]; } $target["data"][] = $data; } } /** * Carica i suggerimenti dall'integrazione * * @return void */ public function setSuggestions() { $this->loadSuggestions(); // Verifichiamo che il form attuale abbia una sezione risultati $hasResults = false; foreach ($this->sections as $section) { if ($section["id"] === "GR-Result") { $hasResults = true; break; } } // Importazione prima organizzazione che è sempre il CONTRACTING BODY if (isset($this->suggestions["CONTRACTING_BODY"])) { $contracting_body = $this->suggestions["CONTRACTING_BODY"]; // Verifichiamo che in values sia vuota in modo da riempire e obbligare l'autocompilazione $empty = (empty($this->info["valori"]["eforms2"]["GR-Organisations-Section"]["values"]["GR-Organisations"][0])); if ($empty) { $this->info["valori"]["eforms2"]["GR-Organisations-Section"]["values"]["GR-Organisations"][0] = []; } // Puntatore alla prima organizzazione negli integration_values $first_organization = &$this->info["valori"]["eforms2"]["GR-Organisations-Section"]["integration_values"]["GR-Organisations"][0]; // ID GUUE $first_organization["OPT-200-Organization-Company"] = ["forced" => true, "value" => "ORG-0001"]; // Nome $first_organization["BT-500-Organization-Company"] = ["forced" => true, "value" => $contracting_body["OFFICIALNAME"]]; // Codice fiscale[0] $first_organization["GR-Organisation-Identifier"][0]["BT-501-Organization-Company"] = ["forced" => true, "value" => $contracting_body["IDENTIFIER_NUM"]]; // URL $first_organization["BT-505-Organization-Company"] = ["forced" => false, "value" => $contracting_body["URL_GENERAL"]]; // Località (TODO -> dizionario per le altre nazioni) if ($contracting_body["COUNTRY"] === "IT") { $first_organization["BT-514-Organization-Company"] = ["forced" => true, "value" => "ITA"]; } // Codice postale $first_organization["BT-512-Organization-Company"] = ["forced" => false, "value" => $contracting_body["POSTAL_CODE"]]; // Telefono $first_organization["BT-503-Organization-Company"] = ["forced" => false, "value" => $contracting_body["PHONE"]]; // Email $first_organization["BT-506-Organization-Company"] = ["forced" => false, "value" => $contracting_body["E_MAIL"]]; // FAX $first_organization["BT-739-Organization-Company"] = ["forced" => false, "value" => $contracting_body["FAX"]]; // Indirizzo $first_organization["BT-510(a)-Organization-Company"] = ["forced" => false, "value" => $contracting_body["ADDRESS"]]; // Città $first_organization["BT-513-Organization-Company"] = ["forced" => false, "value" => $contracting_body["TOWN"]]; // Importiamo ORG-0001 come buyer $buyer_values_path = "valori.eforms2.GR-Buyer.values.GR-ContractingAuthority.0.GR-ContractingAuthority-Buyer"; $buyer_ivalues_path = "valori.eforms2.GR-Buyer.integration_values.GR-ContractingAuthority.0.GR-ContractingAuthority-Buyer.OPT-300-Procedure-Buyer"; $empty = empty(self::get($this->info, $buyer_values_path)); if ($empty) { self::set($this->info, $buyer_values_path, []); } self::set($this->info, $buyer_ivalues_path, ["forced" => false, "value" => "ORG-0001"]); } // Importazione altre organizzazioni partecipanti. // Avviene solo se il form corrente prevede risultati, quindi a offerte presentate if (isset($this->suggestions["PARTECIPANTI"])) { // Aggiungiamo il modulo da renderizzare $this->appendIntegrationHelper( $this->suggestions["MODULO"], "organizzazioni", $this->suggestions["PARTECIPANTI"], __guue("Organizzazioni menzionate"), "GR-Organisations-Section", 0, "GR-Organisations", ); } // Importazione info sulla gara su GR-Procedure if (isset($this->suggestions["GENERAL"])) { $gara = &$this->suggestions["GENERAL"]; // Popoliamo GR-Procedure se è vuota $empty = (empty($this->info["valori"]["eforms2"]["GR-Procedure"]["values"])); if ($empty) { $this->info["valori"]["eforms2"]["GR-Procedure"]["values"] = []; } // Creiamo i valori di integrazione $procedure = &$this->info["valori"]["eforms2"]["GR-Procedure"]["integration_values"]; // Oggetto della gara $procedure["BT-21-Procedure"] = ["forced" => true, "value" => $gara["oggetto"]]; if(isset($gara["prezzoRiferimento"])) { // Valore della gara $procedure["BT-27-Procedure"] = [ "forced" => true, "value" => [ "value" => round($gara["prezzoRiferimento"], 2), "type" => "EUR", ], ]; } if (!empty($gara["CPV_CODES"])) { // CPV $procedure["BT-26(m)-Procedure"] = ["forced" => true, "value" => "cpv"]; $procedure["BT-262-Procedure"] = ["forced" => true, "value" => $gara["CPV_CODES"][0]]; } if (isset($this->suggestions["LOT"])) { if($this->info["lotto_riferimento"] > 0) { $codice_lotto = $this->info["lotto_riferimento"]; $this->suggestions["LOT"] = array_filter($this->suggestions["LOT"], function ($value) use ($codice_lotto) { return $value["codice"] == $codice_lotto; }); $this->suggestions["LOT"] = array_values($this->suggestions["LOT"]); } } $codiceAppalto = $this->suggestions["GENERAL"]["codiceAppalto"]; if (!empty($this->npa->fascicolo["revisione_fascicolo"])) { $codiceAppalto .= "_v{$this->npa->fascicolo['revisione_fascicolo']}"; } $procedure["BT-22-Procedure"] = ["forced" => true, "value" => $codiceAppalto]; // Tipologia della gara $tipologia_gara = $gara["tipologia"] ?? null; if ($tipologia_gara) { // Passiamo la tipologia della gara anche ai lotti if (isset($this->suggestions["LOT"])) { foreach ($this->suggestions["LOT"] as $index => $lot) { $this->suggestions["LOT"][$index]["tipologia"] = $tipologia_gara; } } // Popoliamo il campo $procedure["BT-23-Procedure"] = [ "forced" => true, "value" => $tipologia_gara, ]; } } // Importazione lotti if (isset($this->suggestions["LOT"])) { if ($this->enable_forced_suggestions) { // Forziamo il numero di ripetizione dei lotti $this->info["valori"]["settings"]["reps"]["GR-Lot"] = count($this->suggestions["LOT"]); // Impediamo all'utente di modificarlo $this->info["valori"]["settings"]["reps_locked"]["GR-Lot"] = true; // Forziamo il numero di ripetizione dei gruppi di lotti a 0 $this->info["valori"]["settings"]["reps"]["GR-LotsGroup"] = 0; // Impediamo all'utente di modificarlo $this->info["valori"]["settings"]["reps_locked"]["GR-LotsGroup"] = true; } // Autopopolazione dei lotti foreach ($this->suggestions["LOT"] as $index => $lot) { // Puntatore ai valori di integrazione $lot_integration = &$this->info["valori"]["eforms2"]["GR-Lot"]["integration_values"][$index]; // Se questo lotto è vuoto creiamo un valore dummy per popolarlo forzatamente $empty = (empty($this->info["valori"]["eforms2"]["GR-Lot"]["values"][$index])); if ($empty) { $this->info["valori"]["eforms2"]["GR-Lot"]["values"][$index] = []; } $lotReference = &$this->info["valori"]["eforms2"]["GR-Lot"]["values"][$index]; if (!empty($lot["CRITERI"])) { $this->appendIntegrationHelper( $this->suggestions["MODULO"], "criteri", $lot["CRITERI"], __guue("Criteri per il lotto ") . "\"{$lot['oggetto']}\"", "GR-Lot", $index, "floating" ); } if (!empty($this->suggestions["GENERAL"]["round"])) { $this->appendIntegrationHelper( $this->suggestions["MODULO"], "round_scadenze", $this->suggestions["GENERAL"]["round"], __guue("Riepilogo delle scadenze"), "GR-Lot", $index, "GR-Lot-PlannedDuration", true, ); } if ($hasResults) { if (!empty($lot["VINCITORI"])) { $this->appendIntegrationHelper( $this->suggestions["MODULO"], "vincitori", $lot, __guue("Aggiudicatari della gara"), "GR-Result", 0, "floating", true ); } } // Identificativo $lotIdentifier = "LOT-" . str_pad($lot["numero"], 4, "0", STR_PAD_LEFT); //$lotIdentifierLocal = "LOT-" . str_pad($index+1, 4, "0", STR_PAD_LEFT); $lot_integration["BT-137-Lot"] = ["forced" => true, "value" => $lotIdentifier]; $lotReference["BT-137-Lot"] = $lotIdentifier; // Titolo e descrizione $lot_integration["BT-21-Lot"] = ["forced" => true, "value" => $lot["oggetto"]]; $lot_integration["BT-22-Lot"] = ["forced" => true, "value" => "$codiceAppalto/$lotIdentifier"]; $lot_integration["BT-24-Lot"] = ["forced" => true, "value" => $lot["descrizione"]]; // CPV $lot_integration["BT-26(m)-Lot"] = ["forced" => true, "value" => "cpv"]; $lot_integration["BT-262-Lot"] = ["forced" => true, "value" => $lot["cpv"]]; // Italia ? $lot_integration["BT-5141-Lot"] = ["forced" => false, "value" => "ITA"]; // URL Documenti $lot_integration["BT-15-Lot"] = ["forced" => false, "value" => $this->suggestions["PUBLIC_URL"]]; $lot_integration["OPT-301-Lot-AddInfo"] = ["forced" => false, "value" => "ORG-0001"]; // Tipologia $tipologia_gara = $lot["tipologia"] ?? null; if ($tipologia_gara) { $lot_integration["BT-23-Lot"] = [ "forced" => false, "value" => $tipologia_gara, ]; } // Importo $lot_integration["BT-27-Lot"] = [ "forced" => false, "value" => [ "value" => round($lot["importoBase"] + $lot["importoManodopera"] + $lot["oneriNoRibasso"] + $lot["importoOpzioni"], 2), "type" => "EUR", ], ]; /*// Importazione risultati relativi ai lotti if ($hasResults) { $result_integration = &$this->info["valori"]["eforms2"]["GR-Result"]["integration_values"]["GR-LotResult-Section"]["GR-LotResult"][$index]; // Se questo risultato è vuoto creiamo un valore dummy per popolarlo forzatamente $empty = (empty($this->info["valori"]["eforms2"]["GR-Result"]["values"]["GR-LotResult-Section"]["GR-LotResult"][$index])); if ($empty) { $this->info["valori"]["eforms2"]["GR-Result"]["values"]["GR-LotResult-Section"]["GR-LotResult"][$index] = []; } // Identificativo $result_integration["OPT-322-LotResult"] = ["forced" => true, "value" => "RES-" . str_pad($index + 1, 4, "0", STR_PAD_LEFT)]; // Identificativo del lotto $result_integration["BT-13713-LotResult"] = ["forced" => true, "value" => "LOT-" . str_pad($index + 1, 4, "0", STR_PAD_LEFT)]; // Se c'è almeno un vincitore if (!empty($lot["VINCITORI"])) { $result_integration["BT-142-LotResult"] = ["forced" => true, "value" => "selec-w"]; } }*/ } } elseif($this->info["modulo"] == "albo_fornitori") { $lot_integration = &$this->info["valori"]["eforms2"]["GR-Lot"]["integration_values"][0]; $lot_integration["BT-137-Lot"] = ["forced" => true, "value" => "LOT-0001"]; } } public function loadSuggestions() { if (empty($this->suggestions)) { $suggestions = []; if (!empty($this->info["modulo"]) && !empty($this->info["codice_elemento"])) { global $beRoot; $path = self::moduliCollegati()[$this->info["modulo"]] ?? false; if ($path) { $path = $beRoot . $path; } if (file_exists($path)) { // Wrappo in una funzione perchè PHP non capisce il concetto di scope // delle variabili $callIntegration = function ($path) use (&$suggestions) { $contents = require($path); if (is_array($contents)) { $suggestions += $contents; } }; $callIntegration($path); } } if (empty($this->info["codice"])) { if (!empty($suggestions["GENERAL"]["codice_ente"])) { $this->info["codice_ente"] = $suggestions["GENERAL"]["codice_ente"]; } if (!empty($suggestions["__titolo"])) { $this->info["titolo"] = $suggestions["__titolo"]; } } if (!empty($suggestions["PARTECIPANTI"])) { foreach ($suggestions["PARTECIPANTI"] as $index => $partecipante) { if (($partecipante["codice_operatore"] ?? 0) > 0) { $operatore = oeManager::getOE($partecipante["codice_operatore"]); if ($operatore) { $suggestions["PARTECIPANTI"][$index] = $partecipante + $operatore; } } } } $codice_ente = (!empty($this->info["codice_ente"])) ? $this->info["codice_ente"] : $_SESSION["ente"]->codice; $ente = $suggestions["STAZIONEAPPALTANTE"] ?? (ente::getInfoFromID($codice_ente)[0] ?? null); if (!empty($ente) && is_array($ente)) { $suggestions["CONTRACTING_BODY"]["OFFICIALNAME"] = $ente["denominazione"]; $suggestions["CONTRACTING_BODY"]["ADDRESS"] = $ente["indirizzo"]; $suggestions["CONTRACTING_BODY"]["TOWN"] = $ente["citta"]; $suggestions["CONTRACTING_BODY"]["POSTAL_CODE"] = $ente["cap"]; $suggestions["CONTRACTING_BODY"]["COUNTRY"] = "IT"; $suggestions["CONTRACTING_BODY"]["PHONE"] = $ente["telefono"]; $suggestions["CONTRACTING_BODY"]["FAX"] = $ente["fax"]; $suggestions["CONTRACTING_BODY"]["E_MAIL"] = $ente["pec"]; $suggestions["CONTRACTING_BODY"]["URL_GENERAL"] = $ente["url"]; $suggestions["CONTRACTING_BODY"]["IDENTIFIER_NUM"] = $ente["cf"]; $suggestions["CONTRACTING_BODY"]["URL_BUYER"] = "https://" . $_SESSION["ente"]->getInfo()["dominio"]; } $this->suggestions = $suggestions; } } }