engine->info["sdk_version"]; $translations = json_decode(file_get_contents(__DIR__ . "/../eforms/{$version}/translations/it.json"), true); return $translations; } /** * Send the notice validation * * @return void */ public function noticeValidation() : void { global $config; $notice = $this->toXML(); $params = json_encode([ "notice" => base64_encode($notice), "language" => "en", "validationMode" => "static", "eFormsSdkVersion" => "eforms-sdk-" . $this->getNoticeSDKVersion(), ]); $this->header = []; $this->header[1] = "X-API-Key: {$config["tedesender"]["apikey"]}"; $this->header[2] = "Content-Type: application/json"; $this->header[3] = "accept: application/xml"; $this->curl = curl_init("{$config["tedesender"]["endpoints"]["validation"][$this->environment()]}/v1/notices/validation"); curl_setopt($this->curl, CURLOPT_POST, 1); curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLOPT_POSTFIELDS, $params); $this->response = curl_exec($this->curl); $this->translations = $this->loadTranslations(); $errors = []; $decoded = json_decode($this->response, 1); if (json_last_error() === JSON_ERROR_NONE) { $xml_lines = @preg_split("/\r\n|\n|\r/", @$this->toXML()); if(! empty($decoded["message"])) { $messages = substr($decoded["message"], strpos($decoded["message"], "[")); if(isJson($messages)) { $messages = json_decode($messages, 1); if (is_array($messages)) { foreach($messages as $message) { try { if(!empty($message["line"]) && !empty($xml_lines)) { $affected_lines = implode("\n", array_splice($xml_lines, max(0, $message["line"] - 5), 10)); preg_match_all("//", $affected_lines, $affected_fields, PREG_PATTERN_ORDER); if(!empty($affected_fields)) { $message["message"] .= "
BETA" . __guue("Campi potenzialmente coinvolti:") . " " . implode(" - ", $affected_fields[1]); } } } catch(\Throwable $t) { // Pass } $errors[] = [ "label" => "Linea: {$message["line"]} - {$message["message"]}" ]; } } $this->manageErrors($errors); $this->setStato("BOZZA"); if (empty($this->errors)) { $_SESSION["guue_verified_" . $this->codice] = True; $this->setStato("DA TRASMETTERE"); } return; } } $errors[] = [ "label" => __guue('Struttura XML non valida') ]; } else { if(empty($this->response)) { $error["label"] = "Risposta inattesa dai server di validazione GUUE. Riprova più tardi."; $errors[] = $error; } else { $xml = xmlToArray(simplexml_load_string($this->response)); if (!empty($xml["schematron-output"]["svrl:failed-assert"])) { if (!array_is_list($xml["schematron-output"]["svrl:failed-assert"])) { $xml["schematron-output"]["svrl:failed-assert"] = [$xml["schematron-output"]["svrl:failed-assert"]]; } foreach ($xml["schematron-output"]["svrl:failed-assert"] as &$error) { $error["label"] = $this->translations["rule|text|{$error['@id']}"] ?? $error['@id']; $errors[] = $error; } } } } $this->manageErrors($errors); if (!empty($errors)) { $this->setStato("BOZZA"); } else { $_SESSION["guue_verified_" . $this->codice] = True; $this->setStato("DA TRASMETTERE"); } } public function setStato(string $stato) : void { global $pdo; $pdo->go("UPDATE `b_guue` SET stato = :stato WHERE codice = :codice", [":stato" => $stato, ":codice" => $this->codice]); } /** * Stop notice pubblication * * @return array */ public function stopPubblication() : array { global $config; $this->header = []; $this->header[0] = "Authorization: Bearer {$config['tedesender']['apikey']}"; $this->header[1] = "accept: application/json"; $this->header[2] = 'Content-Type: application/x-www-form-urlencoded'; $business_id = $this->numero_tecnico; $this->curl = curl_init("{$config["tedesender"]["endpoints"]["pubblication"][$this->environment()]}/api/v2/notice/notices/{$business_id}/stop-publication-esentool"); curl_setopt($this->curl, CURLOPT_POST, 1); curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLINFO_HEADER_OUT, true); $this->response = json_decode(curl_exec($this->curl)); $response = [ "error" => false, "data" => $this->response ]; if(!isset($this->response->id)) { $response["error"] = true; } return $response; } public static function getSubmissionID(array $response) : string { $submission_id = explode("/",$response["validationReportUrl"]); return $submission_id[count($submission_id) - 2]; } public function readyForANAC($ready = true) : array { $stati = $this->getStati(); global $pdo; if($ready) { $pdo->go("UPDATE b_guue SET stato = :stato, data_aggiornamento = NOW(), data_trasmissione = NOW() WHERE codice = :codice", [ ":codice" => $this->info["codice"], ":stato" => $stati[2]["title"] // Trasmesso ]); } else { $pdo->go("UPDATE b_guue SET stato = :stato, data_aggiornamento = NOW() WHERE codice = :codice", [ ":codice" => $this->info["codice"], ":stato" => $stati[0]["title"] // Bozza ]); } return [ "error" => false, "data" => [] ]; } /** * Send the notice to TedSimap * * @return array */ public function send() : array { global $config; $notice = $this->toXML(); $stati = $this->getStati(); $this->header = []; $this->header[0] = "Authorization: Bearer {$config['tedesender']['apikey']}"; $this->header[1] = "accept: application/json"; $this->header[2] = "Content-Type: multipart/form-data"; $name = tempnam(sys_get_temp_dir(),"notice"); $file = fopen($name,"w"); file_put_contents($name,$notice); fclose($file); $params = [ 'metadata' => '{ "noticeAuthorEmail": "'.$_SESSION["utente"]->getInfo()["email"].'", "noticeAuthorLocale": "it" }', "notice" => new \CURLFile(realpath($name), "text/xml", "tmp.xml") ]; $this->curl = curl_init("{$config["tedesender"]["endpoints"]["pubblication"][$this->environment()]}/api/v2/notice/notices/submit"); curl_setopt($this->curl, CURLOPT_POST, 1); curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLOPT_POSTFIELDS, $params); curl_setopt($this->curl, CURLINFO_HEADER_OUT, true); $this->response = curl_exec($this->curl); if(! empty($this->response)) { $this->response = json_decode($this->response, TRUE); if(! empty($this->response["success"]) && $this->response["success"]) { $matches = []; preg_match_all("/notices[\/](.*)[\/]validation[-]report/m", $this->response["validationReportUrl"], $matches); $this->numero_tecnico = $matches[1][0]; $this->manageErrors([]); global $pdo; $pdo->go("UPDATE b_guue SET risposta = :risposta, stato = :stato, numero_tecnico = :numero_tecnico, data_aggiornamento = NOW(), data_trasmissione = NOW() WHERE codice = :codice", [ ":codice" => $this->info["codice"], ":risposta" => base64_encode(json_encode($this->response)), ":numero_tecnico" => TedEsender::getSubmissionID($this->response), ":stato" => $stati[2]["title"] ]); return [ "error" => false, "data" => $this->response ]; } else if (isset($this->response["success"]) && !$this->response["success"]){ $this->header = []; $this->header[0] = "Authorization: Bearer {$config['tedesender']['apikey']}"; unset($this->header[1]); unset($this->header[2]); $this->curl = curl_init($this->response["validationReportUrl"]); curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLINFO_HEADER_OUT, true); $this->response = curl_exec($this->curl); $xml = xmlToArray(simplexml_load_string($this->response)); if (!empty($xml["schematron-output"])) { $errors = $xml["schematron-output"]["svrl:failed-assert"]; foreach ($errors as &$error) { if (isset($error["svrl:text"])) { $error["label"] = $error["svrl:text"]; } else { // TODO Gestire questa situazione correttamente $error["label"] = print_r($error, true); } } $this->manageErrors($errors); //TODO: non ritorna uno schematron per i form X01 e X02 return [ "error" => true, "data" => $this->response ]; } } else { return [ "error" => true, "data" => $this->response ]; } } } /** * Get the notice json copy * * @return void */ public function json() { $json = json_encode($this->info["valori"] ?? [],JSON_INVALID_UTF8_IGNORE); $length = strlen($json); header('Content-Description: File Transfer'); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Disposition: attachment; filename=\"{$this->info["codice"]}-{$this->info["form"]}.json\""); header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public"); header("Content-Length: {$length}"); echo $json; } /** * Get the notice pdf copy - LEGACY esender version * * @return void */ public function pdf_legacy() : void { $notice = $this->info["xml"]; // A quanto pare a volte è già b64 $b64decoded = base64_decode($notice, true); if($b64decoded !== false) $notice = $b64decoded; $b64notice = base64_encode($notice); $post = http_build_query([ "coverPage" => false, "notice" => $b64notice, "format" => "PDF", "language" => "IT", ]); $this->curl = curl_init("https://esentool.ted.europa.eu/api/qualification/v1.0/notice/render"); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLOPT_POST, 1); curl_setopt($this->curl, CURLOPT_POSTFIELDS, $post); curl_setopt($this->curl, CURLOPT_USERPWD, "TEDC6:cm827gw6"); $this->response = curl_exec($this->curl); $decoded = json_decode($this->response); if(!valid_json($this->response, $decoded) || empty($decoded->result)) { $pdf = null; header('HTTP/1.0 404 File not found'); ?>

File not found!

result); $length = strlen($pdf); header('Content-Description: File Transfer'); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Disposition: attachment; filename=\"{$this->info["codice"]}-{$this->info["form"]}.pdf\""); header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public"); header("Content-Length: {$length}"); echo ($pdf); } } /** * Get the notice pdf copy * * @return void */ public function pdf() : void { global $config; $notice = $this->info["xml"]; $b64notice = base64_encode($notice); $post = "{\n \"file\": \"{$b64notice}\",\n \"language\": \"it\",\n \"format\": \"PDF\",\n \"textToHighlight\": \"string\",\n \"summary\": false\n}"; $this->curl = curl_init("{$config["tedesender"]["endpoints"]["visualization"][$this->environment()]}/api/v2/notices/render"); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLOPT_POST, 1); curl_setopt($this->curl, CURLOPT_POSTFIELDS, $post); $this->headers = []; $this->headers[] = 'Accept: text/html'; $this->headers[] = "X-Api-Key: {$config["tedesender"]["apikey"]}"; $this->headers[] = 'Content-Type: application/json'; curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->headers); $this->response = curl_exec($this->curl); $decoded = json_decode($this->response); if (json_last_error() === JSON_ERROR_NONE) { $pdf = null; header('HTTP/1.0 404 File not found'); ?>

File not found!

response; $length = strlen($pdf); header('Content-Description: File Transfer'); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Disposition: attachment; filename=\"{$this->info["codice"]}-{$this->info["form"]}.pdf\""); header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public"); header("Content-Length: {$length}"); echo ($pdf); } } /** * Sync all Notices * * @param myPDO $pdo * @param String $settings_path * @param String $xml_path * @param bool $debug * * @return void */ public static function sync(myPDO $pdo, String $settings_path, String $xml_path, bool $debug = false, ?int $codice = 0) : void { $settings = file_get_contents($settings_path); $settings = json_decode($settings, TRUE); $where = ""; $params = []; if (!empty($codice)) { $where = " AND codice = :codice"; $params = [":codice" => $codice]; } $forms = $pdo->go("SELECT version, codice, form, info FROM b_guue WHERE stato IN ('TRASMESSO','IN PUBBLICAZIONE') AND numero_tecnico != '' AND numero_tecnico IS NOT NULL {$where} ORDER BY codice DESC", $params)->fetchAll(PDO::FETCH_OBJ); $_SERVER["HTTP_USER_AGENT"] = "StudioAmica/Queue"; foreach ($forms as $form) { if($form->version === "eForms") { $ted = new TedEsender($form->form, $form->codice, $settings, $xml_path, true); $ted->debug = $debug; $ted->syncNoticeEforms(); } } } /** * Sync notice from TedSimap for eForms version */ public function syncNoticeEforms() { $statuses = [ "DRAFT" => "BOZZA", "SUBMITTED" => "TRASMESSO", "STOPPED" => "BLOCCATO", "PUBLISHED" => "PUBBLICATO", "PUBLISHING" => "IN PUBBLICAZIONE", "DELETED" => "CANCELLATO", "NOT_PUBLISHED" => "NON PUBBLICATO", "ARCHIVED" => "ARCHIVIATO", "VALIDATION_FAILED" => "VALIDAZIONE FALLITA" ]; if (!empty($this->info["numero_tecnico"])) { global $config; $this->header = []; $this->header[0] = "Authorization: Bearer {$config['tedesender']['apikey']}"; $this->header[1] = "accept: application/json"; $uri = "{$config["tedesender"]["endpoints"]["pubblication"][$this->environment()]}/api/v2/notice/notices/search-esentool"; $uri .= "?page=0&size=1&sortProperty=versionId&sortDirection=DESC"; $uri .= "&id=".substr($this->info['numero_tecnico'],0,-3); $this->curl = curl_init($uri); curl_setopt($this->curl, CURLOPT_POST, 0); curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); $this->response = curl_exec($this->curl); $response = json_decode($this->response); if ($response !== false && !empty($response->totalSize)) { $stato = $statuses[$response->content[0]->status]; global $pdo; $pdo->go("UPDATE b_guue SET stato = :stato WHERE codice = :codice",[":stato" => $stato, ":codice" => $this->info["codice"]]); } curl_close($this->curl); $this->header = []; } } /** * Sync Notice from TedSimap for eSender version * * @param String $id * @return void */ public function syncNoticeEsender() { if(! empty($this->info["numero_tecnico"])) { $this->curl = curl_init("{$this->endpoint}/notice/{$this->info["numero_tecnico"]}"); curl_setopt($this->curl, CURLOPT_POST, 0); curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); $this->response = curl_exec($this->curl); if (! curl_errno($this->curl)) { if(! empty($this->response)) { $this->response = json_decode($this->response, 1); if(! empty($this->response["submission_id"])) { $this->info["stato"] = "TRASMESSO"; $unset_number = false; switch ($this->response["status"]) { case 'IN_PROGRESS': $this->info["stato"] = "IN PUBBLICAZIONE"; break; case 'PUBLISHED': $this->info["stato"] = "PUBBLICATO"; if(! empty($this->response["publication_info"]["no_doc_ojs"])) { $this->info["numero_ojs"] = $this->response["publication_info"]["no_doc_ojs"]; } if(! empty($this->response["publication_info"]["publication_date"])) { $this->info["data_pubblicazione"] = date('Y-m-d h:i:s', strtotime($this->response["publication_info"]["publication_date"])); } break; case 'NOT_PUBLISHED': $this->info["stato"] = "NON PUBBLICATO"; break; case 'VALIDATION_ACCEPTED': if(! empty($this->response["validation_rules_report"]["items"])) { $this->info["stato"] = "RIFIUTATO"; $this->info["errori"] = []; foreach ($this->response["validation_rules_report"]["items"] as $v) {{ if(! $v["valid"] && in_array($v["severity"], ["WARNING"])) { #TODO: viene salvato come errore ma in realta dovrebbe essere creata una column a parte $this->info["errori"][] = "{$v["message"]}
{$v["details"]}"; } }} if(! empty($this->info["errori"])) { $this->info["errori"] = base64_encode(json_encode($this->info["errori"])); } } break; case 'RECEPTION_ERROR': case 'QUALIFICATION_ERROR': $this->info["stato"] = "RIFIUTATO"; $this->info["errori"] = []; if(! empty($this->response["technical_validation_report"]["items"])) { foreach ($this->response["technical_validation_report"]["items"] as $v) { if(! $v["valid"] && in_array($v["severity"], ["ERROR", "CRITICAL"])) { $this->info["errori"][] = "{$v["message"]}
{$v["report_details"]}"; } } } if(! empty($this->response["validation_rules_report"]["items"])) { foreach ($this->response["validation_rules_report"]["items"] as $v) { if(! $v["valid"] && in_array($v["severity"], ["ERROR", "CRITICAL"])) { $this->info["errori"][] = "{$v["message"]}
{$v["details"]}"; } } } if(! empty($this->info["errori"])) { $this->info["errori"] = base64_encode(json_encode($this->info["errori"])); } break; default: break; } $parameters = [ ":codice" => $this->info["codice"], ":stato" => $this->info["stato"], ":errori" => $this->info["errori"], ]; $this->pdo->go("UPDATE b_guue SET stato = :stato, errori = :errori WHERE codice = :codice", $parameters); } } } curl_close($this->curl); unset($this->header[3]); } } }