info["modulo"]) && ! empty($this->info["codice_elemento"])) { global $beRoot; if (file_exists("{$beRoot}/{$this->info["modulo"]}/panel.php")) { $infoModulo = Modulo::getInfo($this->info["modulo"]); $breadcrumb["/{$this->info["modulo"]}/panel.php?codice={$this->info["codice_elemento"]}"] = __guue($infoModulo["titolo"]) . " - " . __guue("Pannello"); } } return $breadcrumb; } /** * Remove control char from html values * * @param Array $array * @return Array */ public function fixHtmlVaues(Array $array) : Array { foreach ($array as $key => $value) { if(is_string($value) && $this->isHTML($value)) { $array[$key] = preg_replace("/[[:cntrl:]]/", '', $value); } if(is_array($value)) { $array[$key] = $this->fixHtmlVaues($value); } } return $array; } /** * Make multidimensional array from array keys * * @param Array $keys * @param Mixed $value * @param Array $array * @return Array */ private function makeArray($keys, $value, $array = []) : Array { $tmp_array = &$array; while(count($keys) > 0){ $k = array_shift($keys); if(! is_array($tmp_array)) $tmp_array = []; $tmp_array = &$tmp_array[$k]; } $tmp_array = $value; return $array; } /** * Get the id * * @param String $name * @return String */ public function getId(String $name) : String { return strtolower(str_replace(["][", "[", "]"], ["_", "", ""], $name)); } /** * Get key dot separated * * @param String $name * @return String */ public function getKeyFromNameString(String $name) : String { return trim(str_replace(['][', '[', ']'], '.', str_replace("guue", "", $name)), '.'); } /** * Merge multidimensional array ensuring keys order * * @param array $array1 * @param array $array2 * @return array */ private function md_array_merge(array &$array1, array &$array2) { $merged = $array1; foreach ($array2 as $key => &$value) { if (is_array($value) && isset($merged[$key]) && @is_array($merged[$key])) { $merged[$key] = $this->md_array_merge($merged[$key], $value); } else { $merged[$key] = $value; } } return $merged; } /** * Sort values based on provided keys * * @param Array $keys * @return void */ public function sortSections() { if(! empty($this->info["codice"]) && ! empty($this->info["valori"])) { $data = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}"); if(! empty($data)) { $sections = array_merge(["LEGAL_BASIS"], array_column($this->sections, 'name')); $sections = array_intersect($sections, array_keys($data)); self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}", array_replace(array_flip($sections), $data)); } } } /** * Calcola la dimensione del campo * * @param array $settings * @return void */ private function estimateSize(Array $settings = []) { if(! empty($settings["name"]) && ! empty($this->sizes[end($settings["name"])])) { return $this->sizes[end($settings["name"])]; } else if(! empty($settings["object"]) && strpos($settings["object"], "string_") !== false) { $size = (int) substr($settings["object"], 7); if(filter_var($size, FILTER_VALIDATE_INT, ["options" => ["min_range" => 0, "max_range" => 100]])) { return "col-sm-4"; } if(filter_var($size, FILTER_VALIDATE_INT, ["options" => ["min_range" => 101, "max_range" => 200]])) { return "col-sm-4"; } if(filter_var($size, FILTER_VALIDATE_INT, ["options" => ["min_range" => 201, "max_range" => 300]])) { return "col-sm-6"; } if(filter_var($size, FILTER_VALIDATE_INT, ["options" => ["min_range" => 301, "max_range" => 400]])) { return "col-sm-8"; } if(filter_var($size, FILTER_VALIDATE_INT, ["options" => ["min_range" => 401, "max_range" => 500]])) { return "col-sm-10"; } } return 'col-sm-12'; } /** * Check if the string is a valid JSON * * @param [type] $string * @return boolean */ private function isJson($string) { json_decode($string); return json_last_error() === JSON_ERROR_NONE; } /** * Remove one or many array items from a given array using "dot" notation. * * @param array $array * @param array|string $keys * @return void */ public static function forget(&$array, $keys) { DotPath::forget($array, $keys); } /** * Get an item from an array using "dot" notation. * * @param \ArrayAccess|array $array * @param string|int $key * @param mixed $default * @param mixed $dictionary * @return mixed */ public static function get($array, $key, $default = null, $dictionary = false) { return DotPath::get($array, $key, $default, $dictionary); } /** * Unset an array item to a given value using "dot" notation. * * If no key is given to the method, the entire array will be replaced. * * @param array $array * @param string $key * @return array */ public static function unset(&$array, $key) { return DotPath::unset($array, $key); } /** * Set an array item to a given value using "dot" notation. * * If no key is given to the method, the entire array will be replaced. * * @param array $array * @param string $key * @param mixed $value * @return array */ public static function set(&$array, $key, $value) { return DotPath::set($array, $key, $value); } /** * function xml2array * * This function is part of the PHP manual. * * The PHP manual text and comments are covered by the Creative Commons * Attribution 3.0 License, copyright (c) the PHP Documentation Group * * @author k dot antczak at livedata dot pl * @date 2011-04-22 06:08 UTC * @link http://www.php.net/manual/en/ref.simplexml.php#103617 * @license http://www.php.net/license/index.php#doc-lic * @license http://creativecommons.org/licenses/by/3.0/ * @license CC-BY-3.0 */ private function xml2array($xmlObject, $out = []) { foreach ( (array) $xmlObject as $index => $node ) $out[$index] = ( is_object ( $node ) ) ? $this->xml2array ( $node ) : $node; return $out; } /** * Remove overrided keys before process xml * @param ?Array * @return Array */ private function removeOverridedKeys(?Array &$values) { #region [ShowToGaetano] # Ci sono casi come per l'F21 dove una sezione può essere vuota # di conseguenza l'input raggiunge la funzione come NULL #endregion if ($values === null) { $values = []; $values = &$values; } $deletebles = [ /* OVERRIDE */ /* OVERRIDED */ "CA_TYPE_OTHER" => "CA_TYPE", "CA_ACTIVITY_OTHER" => "CA_ACTIVITY" ]; if (is_array($values)) { foreach ($values as $key => &$value) { if(! empty($deletebles[$key]) && ! empty($values[$deletebles[$key]]) && ! empty($value)) { unset($values[$deletebles[$key]]); } if (is_array($value)) { $value = $this->removeOverridedKeys($value); } } } return $values; } /** * Verify pubblication directive and unset if necessary * * @param String $key * @param Array $values * * @return void */ private function fixPubblicationDirective(String $key, Array &$keys, int $index, Array &$values) : void { if (in_array($this->form_section,["F13_2014"])) { $directive = self::get($this->info["valori"],"TED_ESENDERS.FORM_SECTION.{$this->form_section}.LEGAL_BASIS._attributes.VALUE"); $publication = self::get($values[$key],"_attributes.PUBLICATION"); if (!empty($publication) && $directive != "32014L0025") { unset($values[$key]["_attributes"]["PUBLICATION"]); } } } /** * Fix Form array for xml conversion * * @param Array $values * @param boolean $debug * @return void */ private function fixArrayForXml(Array &$values, Bool $debug = false) : void { if(! empty($values)) { $keys = array_keys($values); if($keys !== range(0, count($values) - 1)) { foreach ($keys as $index => $key) { if (in_array($key,["CRITERIA_EVALUATION", "PARTICIPANTS", "WINNERS", "VAL_PRIZE"])) { $this->fixPubblicationDirective($key, $keys, $index, $values); } switch ($key) { case 'DRAFT_SECTIONS': unset($values[$key]); unset($keys[$index]); break; case 'FAX': case 'PHONE': if (!empty($values[$key])){ if (strlen($values[$key]) < 14) { $number = substr($values[$key],strlen($values[$key]) - 10,strlen($values[$key])); $prefix = substr($values[$key],0,strlen($values[$key]) - strlen($number)); $values[$key] = $prefix . " " . $number; } } break; case 'PROCEDURE': if ($this->form_section == "F20_2014") { if (empty($values[$key]["NOTICE_NUMBER_OJ"])) { unset($values[$key]); unset($keys[$index]); } } break; #region APPLY NUTS CODES case 'NUTS': $keys[$index] = "tg-nuts:{$key}"; if(is_string($values[$key])) { $values[$key] = [ "_attributes" => [ "CODE" => $values[$key] ] ]; } break; #endregion #region APPLY CURRENCY VALIDATION case 'CURRENCY': $keys[$index] = "tg-curr:{$key}"; break; #endregion case 'ORIGINAL_OTHER_MEANS': case 'DATE_DISPATCH_ORIGINAL': if(isset($values[$key]["_value"])) { $values[$key]["_value"] = strip_tags($values[$key]["_value"]); $values[$key]["_attributes"]["PUBLICATION"] = "NO"; } break; #region PLUCK MULTIPLE CONTENTS INTO SECTION case 'AWARD_CONTRACT': case 'AC_QUALITY': case 'NON_COMMUNITY_ORIGIN': $keys[$index] = "tg:{$key}"; if (!in_array($this->form_section,["F21_2014","F22_2014","F23_2014"])){ if (isset($values[$key]["£"])) { $values[$key] = array_values($values[$key]["£"]); if (in_array($key,["AWARD_CONTRACT"])) { foreach ($values[$key] as $index => $_) { $values[$key][$index] = array_merge(["_attributes" => ["ITEM" => $index + 1]],$values[$key][$index]); } } } } if (in_array($key, ["AWARD_CONTRACT"])) { if ( isset($values[$key]["RADIO_FOR_AWARD_CONTRACT"]) && $values[$key]["RADIO_FOR_AWARD_CONTRACT"] == "NO_AWARD_CONTRACT" || isset($values[$key]["RADIO_FOR_FRAMEWORK_INFO"]) && "NOTICE_INVOLVES_NO_FRAMEWORK" == $values[$key]["RADIO_FOR_FRAMEWORK_INFO"] ) { unset($values[$key]); unset($keys[$index]); } } #region ADAPT SUBSECTION WHEN IS CHILD OF SELF if (in_array($this->form_section, ["F03_2014","F06_2014","F15_2014","F21_2014","F22_2014","F23_2014","F25_2014"])) { if (!empty($values[$key]) && !empty($values[$key][$key]) && isset($values[$key][$key]["£"])) { $values[$key] = array_values($values[$key][$key]["£"]); unset($values[$key][$key]); if (in_array($key, ["AWARD_CONTRACT"])) { foreach ($values[$key] as $index => $_) { $values[$key][$index] = array_merge(["_attributes" => ["ITEM" => $index + 1]], $values[$key][$index]); } } } } if ($key == "AWARD_CONTRACT" && !empty($values[$key]["AWARD_CONTRACT"]) && $values[$key]["AWARD_CONTRACT"] == "__£__"){ unset($values[$key]); unset($keys[$index]); } #endregion break; #endregion #region ADD ATTRIBUTE CODE case 'CPV_CODE': if(! empty($values[$key]["@CODE"]) && strlen($values[$key]["@CODE"]) < 8) { $values[$key] = [ "_attributes" => [ "CODE" => str_pad($values[$key]["@CODE"], 8, "0") ] ]; } break; #endregion #region ADD ITEM ATTRIBUTE IF KEY case 'OBJECT_CONTRACT': $keys[$index] = "tg:{$key}"; if (in_array($this->form_section, ["F01_2014", "F04_2014","F22_2014"])) { $values[$key] = array_merge([ "_attributes" => [ "ITEM" => 1 ] ], $values[$key]); } #region ADAPT SUBSECTION WHEN IS CHILD OF SELF if (in_array($this->form_section, ["F04_2014","F21_2014","F22_2014"])) { if (!empty($values[$key]) && !empty($values[$key][$key]) && isset($values[$key][$key]["£"])) { $values[$key] = array_values($values[$key][$key]["£"]); unset($values[$key][$key]); if (in_array($key, ["OBJECT_CONTRACT"])) { foreach ($values[$key] as $index => $_) { $values[$key][$index] = array_merge(["_attributes" => ["ITEM" => $index + 1]], $values[$key][$index]); } } } } #endregion break; case 'WINNER': case 'PARTICIPANT_NAME': case 'AC_COST': case 'AC_CRITERION': case 'CHANGE': case 'CONTRACTOR': case 'CONTRACTORS': case 'ADDRESS_CONTRACTING_BODY_ADDITIONAL': case 'QUALIFICATION': $keys[$index] = "tg:{$key}"; if (isset($values[$key]["£"])) { if ($key == "PARTICIPANT_NAME" || $key == "AC_CRITERION" && in_array($this->form_section,["F25_2014","F15_2014"]) ) { foreach ($values[$key]["£"] as $id => $content) { $values[$key]["£"][$id] = ["_value" => $content]; } } $values[$key] = array_values($values[$key]["£"]); } break; case 'OBJECT_DESCR': $keys[$index] = "tg:{$key}"; if(isset($values[$key]["£"]) && !isset($values[$key]["£"]["TITLE"])) { $values[$key] = array_values($values[$key]["£"]); } else if (isset($values[$key]["£"]) && isset($values[$key]["£"]["TITLE"])) { $values[$key] = $values[$key]["£"]; } if($key == "OBJECT_DESCR" && (! in_array($this->form_section, ["F07_2014","F08_2014","F12_2014","F13_2014","F20_2014"]) ) && $values[$key] != "SUBSECTION-HERE") { if(isAssoc($values[$key])) { unset($values[$key]["TITLE"], $values[$key]["LOT_NO"]); $values[$key] = array_merge([ "_attributes" => [ "ITEM" => 1 ] ], $values[$key]); } else { foreach ($values[$key] as $item => &$lot) { $lot = array_merge([ "_attributes" => [ "ITEM" => $item + 1 ] ], $lot); } } } break; #region REMOVE KEYS case 'NUMBER_OF_OBJECT_CONTRACT': case 'NUMBER_OF_AWARD_CONTRACT': case 'NUMBER_OF_LOTS': case 'SECTION_FOR_TIME_FRAME': unset($values[$key]); unset($keys[$index]); break; #endregion #region REMOVE KEYS ON CONDITIONS case 'VAL_PRIZE': if (isset($values[$key]["RADIO_FOR_VAL_PRIZE"]) && $values[$key]["RADIO_FOR_VAL_PRIZE"] == "NO_VAL_PRIZE") { unset($values[$key]); unset($keys[$index]); } break; case 'RADIO_FOR_AWARDED_TO_GROUP': if (($values[$key] == "NO_AWARDED_TO_GROUP" || $values[$key] == "AWARDED_TO_GROUP") && in_array($this->form_section,["F21_2014","F22_2014", "F23_2014"])) { unset($values[$key]); unset($keys[$index]); } break; case 'FRAMEWORK': if ($values[$key] == "__£__") { break; } if( isset($values[$key]["RADIO_FOR_FRAMEWORK_INFO"]) && (in_array($values[$key]["RADIO_FOR_FRAMEWORK_INFO"], ["NOTICE_INVOLVES_NO_FRAMEWORK","NO_FRAMEWORK_INFO"])) || isset($values[$key]["RADIO_FOR_FRAMEWORK"]) && (in_array($values[$key]["RADIO_FOR_FRAMEWORK"], ["NO_FRAMEWORK"])) ) { unset($values[$key]); unset($keys[$index]); } else if (array_keys($values[$key]) == ["JUSTIFICATION"] && empty($values[$key]["JUSTIFICATION"])) { unset($values[$key]); unset($keys[$index]); } break; case 'D_CONTRACT_AWARDED_DESIGN_CONTEST': case 'D_COMMODITY_MARKET': if (isset($values[$key]["supplies"])) { $values[$key] = $values[$key]["supplies"]; } if (isset($values[$key]["services"])) { $values[$key] = $values[$key]["services"]; } if (!isset($values[$key]["attributes"]) || $values[$key]["_attributes"]["CTYPE"] == "") { unset($values[$key]); unset($keys[$index]); } break; case 'OLD_VALUE': case 'NEW_VALUE': unset($values[$key]["SELECTION"]); if(count($values[$key]) == 0) { $values[$key]["NOTHING"] = "__£__"; } if (!empty($values[$key]["CPV_MAIN"]["CPV_MAIN"])) { $values[$key]["CPV_MAIN"] = $values[$key]["CPV_MAIN"]["CPV_MAIN"]; } break; case "D_EXTREME_URGENCY": case "D_ADD_DELIVERIES_ORDERED": case "D_REPETITION_EXISTING": case "D_CONTRACT_AWARDED_DESIGN_CONTEST": case "D_COMMODITY_MARKET": case "D_MANUF_FOR_RESEARCH": if ($values[$key] == "__£__" || (isset($values[$key]["_attributes"]) && isset($values[$key]["_attributes"]["CTYPE"]) && $values[$key]["_attributes"]["CTYPE"]) == "") { unset($values[$key]); unset($keys[$index]); } break; case "CE_ACTIVITY": if ($values[$key] == "__£__" || (isset($values[$key]["_attributes"]) && isset($values[$key]["_attributes"]["VALUE"]) && $values[$key]["_attributes"]["VALUE"]) == "") { unset($values[$key]); unset($keys[$index]); } break; case "VAL_BARGAIN_PURCHASE": if ( empty($values[$key]["_attributes"]) || empty($values[$key]["_attributes"]["CURRENCY"]) || empty($values[$key]["_value"]) ) { unset($values[$key]); unset($keys[$index]); } break; case "VAL_PRICE_PAYMENT": case "VAL_REVENUE": if(!empty($values[$key]["RADIO_FOR_{$key}"]) && $values[$key]["RADIO_FOR_{$key}"] == "NO_{$key}") { unset($values[$key]); unset($keys[$index]); } break; case 'AC': if (!empty($values[$key]["RADIO_FOR_AC"]) && $values[$key]["RADIO_FOR_AC"] == "NO_AC") { unset($values[$key]); unset($keys[$index]); } break; case '_attributes': if (isset($values[$key]["PUBLICATION"])) { if ($values[$key]["PUBLICATION"] == "__£__") { unset($values[$key]["PUBLICATION"]); } } break; #endregion default: if(strpos($key, "RADIO_FOR_") !== false) { $keyignored_for_form = false; $form_name = (string) $this->form->attributes()["name"]; $ignorable_keys = [ "NO_PROCEDURE", "ORIGINAL_OTHER_MEANS", "RADIO_FOR_LIMIT_CANDIDATE", "RADIO_FOR_NB_LIMIT_CANDIDATE_TYPE", "RADIO_FOR_PARTICULAR_PROFESSION_SECTION", "NO_RADIO_FOR_DEPOSIT_GUARANTEE_REQUIRED", "LIMIT_CANDIDATE", "NO_LIMIT_CANDIDATE", "NO_INDEFINITE_DURATION", "D_ACCORDANCE_ARTICLE", "NO_RADIO_FOR_LIKELY_SUBCONTRACTED", "NO_DOCUMENT_URL_MAN", "NO_PROCUREMENT_ADDRESS", "PROCUREMENT_ADDRESS", "NO_LOT", "NO_OPENING_CONDITION", "NO_CONTRACTING_BODY_ADDITIONAL", "NO_DOCUMENT_URL_OPT_SECTION", "NO_ADDESS_PARTICIPATION", "NO_RADIO_FOR_TIME_FRAME", "NO_ADDRESS_REVIEW_BODY", "ADDRESS_REVIEW_BODY", "NO_ADDRESS_MEDIATION_BODY", "NO_ADDRESS_CONTRACTING_BODY", "NO_ADDRESS_CONTRACTING_BODY_ADDITIONAL", "ADDRESS_MEDIATION_BODY", "REVIEW_PROCEDURE", "NO_REVIEW_PROCEDURE", "NO_PT_AWARD_CONTRACT_WITH_PRIOR_PUBLICATION_SEQUENCE", "CONTRACTING_BODY_ADDITIONAL", "NB_MIN_AND_MAX_LIMIT_CANDIDATE", "RADIO_FOR_MAIN_FINANCING_CONDITION", "NO_RADIO_FOR_MAIN_FINANCING_CONDITION", "RADIO_FOR_DEPOSIT_GUARANTEE_REQUIRED", "RADIO_FOR_LEGAL_FORM", "NOTICE_INVOLVES_FRAMEWORK", "SEVERAL_OPERATORS_CHECK", "YES_DOCUMENT_URL_OPT_SECTION", "YES_ADDESS_PARTICIPATION", "YES_AC_PRICE", "NO_AC_PRICE", "YES_PT_AWARD_CONTRACT_WITHOUT_CALL", "ANNEX_D1_PART_1", "ANNEX_D2_PART1", "ANNEX_PART2", "NO_ORIGINAL_OTHER_MEANS", "NO_RADIO_FOR_D_TECHNICAL", "AWARDED_TENDERER_VARIANT_CHOICE", "NO_AWARDED_TENDERER_VARIANT_CHOICE", "TENDERS_EXCLUDED_CHOICE", "NO_TENDERS_EXCLUDED_CHOICE", "CHOICE_DOCUMENT_URL_MAN", "CHOICE_NO_DOCUMENT_URL_MAN", "YES_INFORMATION", "CHOICE_CONTRACTING_ENTITY", "CHOICE_CONTRACTING_AUTHORITY", "CHOICE_PUBLICATION_TED", "NB_RANGE", "PT_AWARD_CONTRACT_WITH_PRIOR_PUBLICATION_SEQUENCE", "ANNEX_D4_PART1", "MULTIPLE_AC_CRITERION", "NO_FRAMEWORK_INFO", "PT_NONE", "NO_RADIO_FOR_D_FROM_WINDING_PROVIDER", "NO_INFORMATION", "LOT_MAX_NUMBER", "CHOICE_PUBLICATION", "NO_CHOICE_PUBLICATION", "AC_PRICE", "NO_LEFTI", "NO_AWARD_CONTRACT", "NO_TIME_FRAME", "YES_TIME_FRAME", "CHOICE_TIME_FRAME", "CHOICE_QS", "CHOICE_NO", "CHOICE_MODIFICATION_ORIGINAL", "CHOICE_PUBLICATION_TED", "YES_FRAMEWORK", "NO_FRAMEWORK", "CHOICE_D_PROC_OPEN", "CHOICE_D_PROC_RESTRICTED", "CHOICE_NO_RADIO_FOR_D_PROC_OPEN", "CHOICE_EU_PROGR_RELATED", "NO_EU_UNION_FUNDS", "YES_EU_UNION_FUNDS", "NO_AC", "YES_AC", "T" ]; if (!in_array($this->form_section,["F03_2014"])) { $ignorable_keys = array_merge($ignorable_keys, ["PT_AWARD_CONTRACT_WITHOUT_CALL"]); } if (in_array($this->form_section,["F01_2014", "F04_2014"])) { $ignorable_keys = array_merge($ignorable_keys, ["NO_OPTIONS"]); } if (in_array($this->form_section,["F24_2014"])) { $ignorable_keys = array_merge($ignorable_keys,["NO_CONTRACT_COVERED_GPA"]); } if ( in_array($this->form_section, ["F01_2014", "F04_2014", "F07_2014", "F22_2014"])) { $ignorable_keys = array_merge($ignorable_keys,["NO_RENEWAL"]); } if ( in_array($this->form_section, ["F22_2014"])) { $ignorable_keys = array_merge($ignorable_keys,["NO_LOT_DIVISION"]); } if ( in_array( $values[$key], $ignorable_keys, ) ) { $keyignored_for_form = true; } if($values[$key] == "__£__" || $keyignored_for_form) { unset($values[$key]); unset($keys[$index]); continue 2; } else { $keys[$index] = $values[$key]; $values[$key] = "__£__"; } } if(strpos($key, "@") === 0) { $keys[$index] = "_attributes"; $values[$key] = [ substr($key, 1) => $values[$key] ]; $key = "_attributes"; } if (strpos($key, "tg:") === false && ! in_array($key, ["_attributes", "_value","P"])) { if ($this->debug && is_array($keys[$index])) { dd("Array to string conversion in fixArrayForXml with at index {$key}"); } $keys[$index] = "tg:{$keys[$index]}"; } break; } } $values = array_combine($keys, $values); } foreach ($values as $key => &$value) { if(! empty($value["__£__"])) { $values[$key] = array_values($value["__£__"]); } if(is_array($value)) { if(! empty($value["COUNTRY"])) { $v = $value; unset($v["COUNTRY"]); if(count(array_filter(array_values($v))) < 2) { unset($values[$key]); } } if(! in_array($key, ["_values", "_attributes"], true)) { $this->fixArrayForXml($value); } } else { if(preg_match('/((([0-2]?)[0-9]|(3)[0-1])(\/)(((0)?[0-9])|((1)[0-2]))(\/)\d{4})(\s)(([0-1]?[0-9]|2[0-3]):[0-5][0-9])$/', $value)) { $value = datetime2mysql($value); } else if (preg_match('/(([0-2]?)[0-9]|(3)[0-1])(\/)(((0)?[0-9])|((1)[0-2]))(\/)\d{4}$/', $value)) { $value = date2mysql($value); } else if ($value == "" || $value == null) { unset($values[$key]); } else if ($value == "__£__") { $values[$key] = []; } else if (is_string($value) && $this->isHTML($value)) { $text = str_replace(["

", "

", "
"], "
", $value); $text = explode("
", $text); $text = array_filter($text); $text = array_map("strip_tags", $text); $text = array_map("html_entity_decode", $text); $text = implode("",$text); if ($key != "P") { $values[$key] = ["P" => $text]; } else { $values[$key] = $text; } } } } } } /** * Compare current form and check if same as given notice type * @return bool */ private function isNotice(String $notice) : bool { return ($notice == self::get($this->info["valori"],"TED_ESENDERS.FORM_SECTION.{$this->form_section}.NOTICE._attributes.TYPE")); } /** * Check if FORM value is valorized * * @return bool */ private static function unvalid($value) : bool { if (empty($value)) { return true; } if (is_array($value) && (empty($value["_attributes"]) || empty($value["_attributes"]["VALUE"]))) { return true; } return false; } private function getNoticeRefFormat() : string { return "il numero di riferimento dell'avviso non rispetta il formato: 'AAAA-000000' (es. 2022-123456)"; } /** * Form Validation * * @return String|null */ public function validate() : ? Array { #region Check for MAIN CPVS if (empty(self::get($this->info["valori"],"TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_CONTRACT"))) { if (empty(self::get($this->info["valori"],"TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.CPV_MAIN"))) { return [ "title" => __guue("Codice CPV non specificato"), "text" => __guue("Attenzione, è necessario specificare il codice CPV all'interno dell'Oggetto del Contratto") ]; } } else { foreach (self::get($this->info["valori"],"TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_CONTRACT.£") as $object_contract) { if (empty($object_contract["CPV_MAIN"])) { return [ "title" => __guue("Codice CPV non specificato"), "text" => __guue("Attenzione, è necessario specificare il codice CPV all'interno dell'Oggetto del Contratto") ]; } } } #endregion #region Check Changes $changes = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.CHANGES"); if(!empty($changes) && empty($changes["INFO_ADD"])) { if (!isset($changes["CHANGE"]) || isset($changes["CHANGE"]["£"]) && count($changes["CHANGE"]["£"]) < 1) { return [ "title" => __guue("Nessuna modifica presente!"), "text" => __guue("Attezione, è necessario specificare almeno una modifica all'interno della sezione VII) Modifiche, se non sono specificate informazioni aggiuntive.") ]; } } #endregion #region Check Modification Contract $modifications = self::get($this->info["valori"],"TED_ESENDERS.FORM_SECTION.{$this->form_section}.MODIFICATIONS_CONTRACT"); if (!empty($modifications)) { if ( isset($changes) && isset($changes["DESCRIPTION_PROCUREMENT"]) && isset($changes["DESCRIPTION_PROCUREMENT"]["CONTRACTORS"]) && ( !isset($changes["DESCRIPTION_PROCUREMENT"]["CONTRACTORS"]["CONTRACTOR"]) || !isset($changes["DESCRIPTION_PROCUREMENT"]["CONTRACTORS"]["CONTRACTOR"]["£"]) || count($changes["DESCRIPTION_PROCUREMENT"]["CONTRACTORS"]["CONTRACTOR"]["£"]) < 2 ) ) { return [ "title" => __guue("Aggiudicatari non specificati!"), "text" => __guue("Attezione, all'interno della sezione VII) Modifiche all'appalto/concessione, è necessario specificare almeno due aggiudicatari per indicare un raggruppamento di operatori economici valido.") ]; } } #endregion foreach([ "TED_ESENDERS.FORM_SECTION.{$this->form_section}.CONTRACTING_BODY" => "contractingBodyValidate", "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT" => "objectContractValidate", "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR" => "objectDescrValidate", "TED_ESENDERS.FORM_SECTION.{$this->form_section}.AWARD_CONTRACT" => "awardContractValidate", "TED_ESENDERS.FORM_SECTION.{$this->form_section}.MODIFICATIONS_CONTRACT" => "modificationContractValidate", "TED_ESENDERS.FORM_SECTION.{$this->form_section}.PROCEDURE" => "procedureValidate", "TED_ESENDERS.FORM_SECTION.{$this->form_section}.COMPLEMENTARY_INFO" => "complementaryInfoValidate" ] as $key => $callable) { $s = self::get($this->info["valori"], $key); if(!empty($s)) { if(!empty($s["£"])) { foreach($s["£"] as $i => $sub) { if (!is_array($sub)) { $sub = []; } $results = $this->{$callable}($sub, $i); if (!empty($results)) { return $results; } } } else { if (!is_array($s)) { $s = []; } $results = $this->{$callable}($s); } if (!empty($results)) { return $results; } } } return null; } #region [Validate Sections Functions] private function procedureValidate(Array $section, int $index = null) : ?Array { if (isset($procedure["NOTICE_NUMBER_OJ"]) && !empty($procedure["NOTICE_NUMBER_OJ"])) { $matches = []; preg_match('/(19|20)\d{2}\/S \d{3}-\d{6}/s',$procedure["NOTICE_NUMBER_OJ"],$matches); if (count($matches) !== 2) { return [ "title" => __guue("Numero dell'avviso"), "text" => __guue("Attenzione, il numero dell'avviso non rispetta il formato: 'AAAA/S 000-000000' (es. 2022)") ]; } } if (!empty($section["OPENING_CONDITION"])) { if (!empty($section["OPENING_CONDITION"]["INFO_ADD"])) { if (strlen($section["OPENING_CONDITION"]["INFO_ADD"]) > 1000) { return [ "title" => __guue("Procedura"), "text" => __guue("Attenzione, il contenuto della sezione \"Informazioni Aggiuntive\" eccede la quantità massima di caratteri consentiti (1000)") ]; } } if (!empty($section["OPENING_CONDITION"]["PLACE"])) { if (strlen($section["OPENING_CONDITION"]["PLACE"]) > 400) { return [ "title" => __guue("Procedura"), "text" => __guue("Attenzione, il contenuto della sezione \"Luogo\" eccede la quantità massima di caratteri consentiti (400)") ]; } } } //PROCEDURE_SPECIFIC CHECKS if($this->form_section == "F01_2014") { if($this->isNotice("PRI_CALL_COMPETITION")) { if(self::unvalid($section["DATE_AWARD_SCHEDULED"])) { return [ "title" => __guue("Avviso di indizione di gara"), "text" => __guue("Attenzione, per gli avvisi di indizione di gara è necessario specificare la data prevista per l'avvio della procedura, all'interno della sezione IV) Procedura.") ]; } } } return null; } private function complementaryInfoValidate(Array $section, int $index = null) : ?Array { #region Check Complementary Info Contents foreach(["ADDRESS_REVIEW_BODY","ADDRESS_MEDIATION_BODY", "ADDRESS_REVIEW_INFO"] as $address) { if (isset($section[$address])) { $contact = $section[$address]; foreach (["OFFICIALNAME", "TOWN", "COUNTRY"] as $check) { if (self::unvalid($contact[$check])) { return [ "title" => $this->translate($check . "_UNSPECIFIED"), "text" => "{$this->translate('COMPLEMENTARY_INFO_SECTION')} {$this->translate($check . '_UNSPECIFIED_WARNING')} {$this->translate($address . '_WARNING')}" ]; } } } if ( isset($section["NO_DOC_EXT"]) && isset($section["NO_DOC_EXT"]["_value"]) ) { $matches = []; $content = $section["NO_DOC_EXT"]["_value"]; preg_match('/(20)\d{2}-\d{6}/s', $content, $matches); if (count($matches) !== 2) { return [ "title" => __guue("Numero di riferimento dell'avviso"), "text" => __guue("Attezione, all'interno della sezione informazioni complementari, {$this->getNoticeRefFormat()}") ]; } } } if(in_array($this->form_section,["F01_2014"])) { foreach (["EORDERING","EINVOICING","EPAYMENT"] as $key) { if($this->isNotice("PRI_CALL_COMPETITION")) { if(!isset($section[$key])) { return [ "title" => __guue("Informazioni relative ai flussi di lavoro elettronici"), "text" => __guue( "Attezione, all'interno della sezione informazioni complementari, per gli avvisi di indizione di gara è necessario selezionare i seguenti campi: {$this->translate("EORDERING")}, {$this->translate("EINVOICING")}, {$this->translate("EPAYMENT")}" ) ]; } } } } return null; #endregion } private function modificationContractValidate(Array $section, int $index = null) : ?Array { if ( !empty(self::get($section,"DESCRIPTION_PROCUREMENT.CONTRACTORS.CONTRACTOR.£")) && count(self::get($section,"DESCRIPTION_PROCUREMENT.CONTRACTORS.CONTRACTOR.£")) < 2 ) { return [ "title" => __guue("Aggiudicatari non specificati!"), "text" => __guue("Attezione, all'interno della sezione VII) Modifiche all'appalto/concessione, è necessario specificare almeno due aggiudicatari.") ]; } return null; } private function awardContractValidate(Array $section, int $index = null) : ?Array { if ( isset($section["AWARDED_CONTRACT"]) && isset($section["AWARDED_CONTRACT"]["CONTRACTORS"]) && isset($section["AWARDED_CONTRACT"]["CONTRACTORS"]["CONTRACTOR"]) && isset($section["AWARDED_CONTRACT"]["CONTRACTORS"]["CONTRACTOR"]["£"]) && (count($section["AWARDED_CONTRACT"]["CONTRACTORS"]["CONTRACTOR"]["£"]) < 2) ) { return [ "title" => __guue("Aggiudicatari non specificati!"), "text" => __guue("Attezione, all'interno della sezione V) Aggiudicazione di appalto, è necessario specificare almeno due aggiudicatari per indicare un raggruppamento di operatori economici valido.") ]; } if ( isset($section["AWARD_CONTRACT"]) && isset($section["AWARD_CONTRACT"]["£"]) && count($section["AWARD_CONTRACT"]["£"]) > 0 ) { foreach ($section["AWARD_CONTRACT"]["£"] as $i => $a) { if(self::get($a,"AWARDED_CONTRACT.CONTRACTORS.CONTRACTOR.£") != null) { $contracts = self::get($a,"AWARDED_CONTRACT.CONTRACTORS.CONTRACTOR.£"); foreach ($contracts as $_ => $contract) { $c = $contract["ADDRESS_CONTRACTOR"]; foreach (["OFFICIALNAME", "TOWN", "COUNTRY","NUTS"] as $check) { if (self::unvalid($c[$check])) { return [ "title" => $this->translate($check . "_UNSPECIFIED"), "text" => "{$this->translate('AWARD_CONTRACT_SECTION')} n.{$i} {$this->translate($check . '_UNSPECIFIED_WARNING')}" ]; } } } } if ( isset($a["NO_AWARDED_CONTRACT"]) && isset($a["NO_AWARDED_CONTRACT"]["PROCUREMENT_DISCONTINUED"]) && isset($a["NO_AWARDED_CONTRACT"]["PROCUREMENT_DISCONTINUED"]["NO_DOC_EXT"]) && isset($a["NO_AWARDED_CONTRACT"]["PROCUREMENT_DISCONTINUED"]["NO_DOC_EXT"]["_value"]) ) { $matches = []; $content = $a["NO_AWARDED_CONTRACT"]["PROCUREMENT_DISCONTINUED"]["NO_DOC_EXT"]["_value"]; preg_match('/(20)\d{2}-\d{6}/s', $content, $matches); if (count($matches) !== 2) { return [ "title" => __guue("Numero di riferimento dell'avviso"), "text" => __guue("Attezione, all'interno dell'aggiudicazione d'appalto n. {$i}, {$this->getNoticeRefFormat()}") ]; } } if ( #se esiste la sezione !empty(self::get($a,"AWARDED_CONTRACT.CONTRACTORS")) && ( #ed è selezionata l'aggiudicazione di gruppo (!empty(self::get($a,"AWARDED_CONTRACT.CONTRACTORS.RADIO_FOR_AWARDED_TO_GROUP")) && self::get($a,"AWARDED_CONTRACT.CONTRACTORS.RADIO_FOR_AWARDED_TO_GROUP") != "NO_AWARDED_TO_GROUP") || (!empty(self::get($a,"AWARDED_CONTRACT.CONTRACTORS.RADIO_FOR_AWARDED_TO_SECTION")) && self::get($a,"AWARDED_CONTRACT.CONTRACTORS.RADIO_FOR_AWARDED_TO_SECTION") != "NO_AWARDED_TO_GROUP") ) && ( #ma gli aggiudicatari non sono presenti, o è singolo... empty(self::get($a,"AWARDED_CONTRACT.CONTRACTORS.CONTRACTOR.£")) || count(self::get($a,"AWARDED_CONTRACT.CONTRACTORS.CONTRACTOR.£") ?? []) <= 1 ) ) { return [ "title" => __guue("Aggiudicatari non specificati!"), "text" => __guue("Attezione, all'interno dell'aggiudicazione d'appalto n. {$i}, è necessario specificare almeno due aggiudicatari per indicare un raggruppamento di operatori economici valido.") ]; } if ( isset($a["AWARDED_CONTRACT"]) && isset($a["AWARDED_CONTRACT"]["CONTRACTORS"]) && count($a["AWARDED_CONTRACT"]["CONTRACTORS"]["£"] ?? []) > 0 ) { foreach ($a["AWARDED_CONTRACT"]["CONTRACTORS"]["£"] as $c) { $contact = $c["CONTRACTOR"]["ADDRESS_CONTRACTOR"]; foreach (["OFFICIALNAME", "TOWN", "COUNTRY","NUTS"] as $check) { if (self::unvalid($contact[$check])) { return [ "title" => $this->translate($check . "_UNSPECIFIED"), "text" => "{$this->translate('AWARD_CONTRACT_SECTION')} n.{$i} {$this->translate($check . '_UNSPECIFIED_WARNING')}" ]; } } } } if (self::get($a,"AWARDED_CONTRACT.PCT_SUBCONTRACTING") !== null) { $v = (int) self::get($a,"AWARDED_CONTRACT.PCT_SUBCONTRACTING"); if ($v > 100 || $v < 0) { return [ "title" => __guue("Percentuale Errata!"), "text" => __guue("Attezione, all'interno dell'aggiudicazione d'appalto n. {$i}, è necessario specificare una percentuale compresa tra 0 e 100.") ]; } } if (in_array($this->form_section,["F06_2014"])) { if (!empty(self::get($a,"AWARDED_CONTRACT.COUNTRY_ORIGIN"))) { if(empty(self::get($a,"AWARDED_CONTRACT.COUNTRY_ORIGIN.COMMUNITY_ORIGIN"))) { if( empty(self::get($a, "AWARDED_CONTRACT.COUNTRY_ORIGIN.NON_COMMUNITY_ORIGIN")) || empty(self::get($a, "AWARDED_CONTRACT.COUNTRY_ORIGIN.NON_COMMUNITY_ORIGIN.£")) || count(self::get($a, "AWARDED_CONTRACT.COUNTRY_ORIGIN.NON_COMMUNITY_ORIGIN.£")) < 1 ) { return [ "title" => __guue("Paese di origine del prodotto o del servizione non specificata!"), "text" => __guue("Attenzione, all'interno dell'aggiudicazione d'appalto n. {$i}, è necessario specificare almeno un paese di origine in caso di origine non comunitaria.") ]; } } } } } } else if (in_array($this->form_section,["F03_2014","F25_2014"])) { return [ "title" => __guue('Aggiudicazioni di appalto non presenti!'), "text" => __guue('Attenzione, è necessario inserire almeno un aggiudicazione d\'appalto') ]; } return null; } private function contractingBodyValidate(Array $section, int $index = null) : ?Array { if(empty($section["ADDRESS_CONTRACTING_BODY_ADDITIONAL"]) && isset($section["JOINT_PROCUREMENT_INVOLVED"])) { if (!in_array($this->form_section,["F14_2014"])) { return [ "title" => __guue("Appalto Congiunto"), "text" => __guue("Attenzione, in caso di appalti congiunti è necessario inserire almeno un'altra amministrazione appaltante nella Sezione I) Amministrazione aggiudicatrice") ]; } } #region ADDRESSES CHECK foreach (["ADDRESS_CONTRACTING_BODY", "ADDRESS_PARTICIPATION", "ADDRESS_FURTHER_INFO"] as $address) { if (isset($section[$address])) { $contact = $section[$address]; foreach (["OFFICIALNAME", "TOWN", "COUNTRY", "E_MAIL", "NUTS", "URL_GENERAL"] as $check) { if (self::unvalid($contact[$check])) { return [ "title" => $this->translate($check."_UNSPECIFIED"), "text" => "{$this->translate('CONTRACTING_BODY_SECTION')} {$this->translate($check . '_UNSPECIFIED_WARNING')}. {$this->translate($address . '_WARNING')}" ]; } } } } #endregion #region ADDRESS_CONTRACTING_BODY_ADDITIONAL if ( isset($section["ADDRESS_CONTRACTING_BODY_ADDITIONAL"]) && isset($section["ADDRESS_CONTRACTING_BODY_ADDITIONAL"]["£"]) && count($section["ADDRESS_CONTRACTING_BODY_ADDITIONAL"]["£"]) > 0 ) { $i = 0; foreach ($section["ADDRESS_CONTRACTING_BODY_ADDITIONAL"]["£"] as $_ => $contracting) { $i++; foreach (["OFFICIALNAME", "TOWN", "COUNTRY", "E_MAIL", "NUTS", "URL_GENERAL"] as $check) { if (self::unvalid($contracting[$check])) { return [ "title" => $this->translate($check . "_UNSPECIFIED"), "text" => "{$this->translate('CONTRACTING_BODY_SECTION')} {$this->translate($check . '_UNSPECIFIED_WARNING')}. {$this->translate('ADDRESS_CONTRACTING_BODY_ADDITIONAL_WARNING')} .n {$i}" ]; } } if (in_array($this->form_section,["F08_2014"])) { foreach (["URL_BUYER"] as $check) { if (self::unvalid($contracting[$check])) { return [ "title" => $this->translate($check . "_UNSPECIFIED"), "text" => "{$this->translate('CONTRACTING_BODY_SECTION')} {$this->translate($check . '_UNSPECIFIED_WARNING')}. {$this->translate('ADDRESS_CONTRACTING_BODY_ADDITIONAL_WARNING')} .n {$i}" ]; } } } } } #endregion #region CE_ACTIVITY if(!empty($section["CE_ACTIVITY_OTHER"]) && !empty($section["CE_ACTIVITY"]["_attributes"]["VALUE"])) { return [ "title" => __guue("Errore di compilazione, Principali settori di attività"), "text" => __guue("Attenzione, Principali settori di attività e Altre Attività non possono essere valorizate insieme.") ]; } #endregion #region CA_TYPE if(!empty($section["CA_TYPE_OTHER"]) && !empty($section["CA_TYPE"]["_attributes"]["VALUE"])) { return [ "title" => __guue("Errore di compilazione, Tipo di amministrazione aggiudicatrice"), "text" => __guue("Attenzione, Tipo di amministrazione aggiudicatrice e Altro Tipo non possono essere valorizate insieme.") ]; } #endregion return null; } private function objectContractValidate(Array $section, int $index = null) : ?Array { if (self::get($section,"OBJECT_DESCR") == "SUBSECTION-HERE") { return [ "title" => __guue("Errore compilazione lotti"), "text" => __guue("Attenzione, la compilazione dei lotti non è valida, Sezione II) Oggetto del contratto.") ]; } if (!empty(self::get($section, "OBJECT_CONTRACT.£"))) { foreach (self::get($section, "OBJECT_CONTRACT.£") as $index => $object_contract) { $r = $this->objectDescrValidate($object_contract["OBJECT_DESCR"]); if (!empty($r)) { return $r; } } } if (!empty($section["LOT_DIVISION"]["LOT_MAX_NUMBER"])) { $lot_max_n = (int) $section["LOT_DIVISION"]["LOT_MAX_NUMBER"]; $total_lots = count($section["OBJECT_DESCR"]["£"] ?? []); if ($total_lots <= $lot_max_n) { return [ "title" => __guue("Numero lotti aggiudicabili da singolo operatore errato!"), "text" => __guue("Attenzione il numero di lotti aggiudicabili da un singolo operatore non può essere maggiore o pari al numero totale dei lotti, Sezione II) Oggetto del contratto.") ]; } } if (!empty($section["LOT_DIVISION"]["LOT_MAX_ONE_TENDERER"])) { $lot_max_n = (int) $section["LOT_DIVISION"]["LOT_MAX_ONE_TENDERER"]; $total_lots = count($section["OBJECT_DESCR"]["£"] ?? []); if ($total_lots <= $lot_max_n) { return [ "title" => __guue("Numero massimo di lotti che possono essere aggiudicati ad un singolo offerente errato!"), "text" => __guue("Attenzione il numero di lotti aggiudicabili da un singolo operatore non può essere maggiore o pari al numero totale dei lotti , Sezione II) Oggetto del contratto.") ]; } } if($this->form_section == "F01_2014") { if ($this->isNotice("PRI_CALL_COMPETITION")) { if(self::unvalid($section["DATE_PUBLICATION_NOTICE"])) { return [ "title" => __guue("Avviso di indizione di gara"), "text" => __guue("Attenzione, per gli avvisi di indizione di gara è necessario specificare la data prevista per l'avvio della procedura, all'interno della sezione II) Oggetto del contratto.") ]; } } } if(in_array($this->form_section,["F02_2014","F05_2014"])) { if (isset($section["LOT_DIVISION"])) { #se il contratto è diviso in lotti verifica che sia presente una delle chiavi tra LOT_ALL|LOT_MAX_NUMBER|LOT_ONE_ONLY if(!empty($section["LOT_DIVISION"]["NUMBER_OF_LOTS"]) && (int) $section["LOT_DIVISION"]["NUMBER_OF_LOTS"] > 0) { $s = $section["LOT_DIVISION"]; if(!isset($s["RADIO_FOR_LOT_PARTICIPATION"]) || empty($s["RADIO_FOR_LOT_PARTICIPATION"])) { return [ "title" => __guue("Tipologia di divisione del contratto"), "text" => __guue("Attenzione, all'interno della sezione II) Oggetto del Contratto è necessario scegliere la tipologia di aggiudicazione") ]; } } } } return null; } private function objectDescrValidate(Array $section, int $index = null) : ?Array { if(in_array($this->form_section,["F02_2014","F03_2014","F05_2014","F06_2014","F15_2014","F24_2014","F25_2014"])) { if(in_array($this->form_section, ["F15_2014"])) { if(!empty($section["DIRECTIVE_2014_23_EU"])) { $section = $section["DIRECTIVE_2014_23_EU"]; } if(!empty($section["DIRECTIVE_2014_24_EU"])) { $section = $section["DIRECTIVE_2014_24_EU"]; } if(!empty($section["DIRECTIVE_2014_25_EU"])) { $section = $section["DIRECTIVE_2014_25_EU"]; } if(!empty($section["DIRECTIVE_2009_81_EC"])) { $section = $section["DIRECTIVE_2009_81_EC"]; } } if(empty($section["AC"])) { $s = ""; if (!empty($index)) $s = __guue("(Lotto {$index})"); return [ "title" => __guue("Criteri di valutazione non specificati!"), "text" => __guue("Attenzione è necessario specificare i criteri di valutazione! Sezione II) Oggetto del contratto. {$s}") ]; } } if (!empty($section["AC"])) { if (empty($section["AC"]["RADIO_FOR_AC"]) || $section["AC"]["RADIO_FOR_AC"] == "YES_AC") { if (empty($section["AC"]["RADIO_FOR_AWARD_CRITERIA_DOC"]) || $section["AC"]["RADIO_FOR_AWARD_CRITERIA_DOC"] != "AC_PROCUREMENT_DOC") { if (in_array($this->form_section,["F04_2014"])) { if ( empty(self::get($section,"AC.AC_QUALITY.£")) && empty(self::get($section,"AC.AC_COST.£")) && empty(self::get($section,"AC.AC_PRICE")) ) { if (!empty($index)) { $index = "n.{$index}"; } return [ "title" => __guue("Criteri di aggiudicazione non specificati"), "text" => __guue("Attenzione, all'interno della sezione II) Oggetto del contratto {$index} non è specificato alcun criterio di qualità, o criterio sull'offerta economica"), ]; } } if (empty($section["AC"]["AC_PRICE"]) && empty($section["AC"]["AC_COST"]["£"]) && (!in_array($this->form_section,["F15_2014","F24_2014","F25_2014"]))) { return [ "title" => __guue("Aggiudicazione per Costo o Prezzo non specificati!"), "text" => __guue("Attenzione è necessario specificare una tipologia di aggiudicazione all'interno dei criteri di qualità.") ]; } if ( !empty($section["AC"]["AC_PRICE"]) && !empty($section["AC"]["AC_PRICE"]["AC_WEIGHTING"]) && (int) $section["AC"]["AC_PRICE"]["AC_WEIGHTING"] > 100 ) { return [ "title" => __guue("Definizione Peso Errata!"), "text" => __guue("Attenzione il Peso non può superare il 100%.") ]; } } } } if($this->form_section == "F01_2014") { if($this->isNotice("PRI_CALL_COMPETITION")) { $s = ""; if (!empty($index)) $s = __guue("(Lotto {$index})"); foreach ([ "AC" => [ "title" => __guue("Criteri di valutazione"), "text" => __guue("Attenzione, nel caso di indizione di gara è necessario specificare i criteri di valutazione! Sezione II) Oggetto del contratto. {$s}") ], "VAL_OBJECT" => [ "title" => __guue("Valore del contratto"), "text" => __guue("Attenzione, nel caso di indizione di gara è necessario specificare il valore del contratto! Sezione II) Oggetto del contratto. {$s}") ], "DURATION|DATE_START|DATE_END" => [ "title" => __guue("Durata"), "text" => __guue("Attenzione, nel caso di indizione di gara è necessario specificare la durata dell'appalto o dell'accordo quadro! Sezione II) Oggetto del contratto. {$s}"), "rule" => "or" ], "ACCEPTED_VARIANTS" => [ "title" => __guue("Informazioni sulle varianti"), "text" => __guue("Attenzione, nel caso di indizione di gara le varianti sono obbligatorie! Sezione II) Oggetto del contratto. {$s}") ], "RADIO_FOR_OPTIONS" => [ "title" => __guue("Informazioni relative alle opzioni"), "text" => __guue("Attenzione, nel caso di indizione di gara le opzioni sono obbligatorie! Sezione II) Oggetto del contratto. {$s}") ], "EU_PROGR_RELATED" => [ "title" => __guue("L'appalto è finanziato dai fondi dell'UE"), "text" => __guue("Attenzione, nel caso di indizione di gara il contratto deve essere connesso ad un progetto/programma finanziato da fondi dell'UE! Sezione II) Oggetto del contratto. {$s}") ] ] as $key => $data) { if(!empty($data["rule"]) && $data["rule"] == "or") { $found = false; foreach(explode("|",$key) as $k) { if(!empty($section[$k])) { $found = true; } } if (!$found) { return $data; } } else if (empty($section[$key])) { return $data; } } } } return null; } #endregion public function fixValuesBeforeSend() { global $pdo; $complementary_info = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.COMPLEMENTARY_INFO"); if(! empty($complementary_info["DATE_DISPATCH_NOTICE"])) { self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.COMPLEMENTARY_INFO.DATE_DISPATCH_NOTICE", date('d/m/Y', time())); } //** STORE DATA */ $pdo->go("UPDATE b_guue SET valori = :valori WHERE codice = :codice", [":codice" => $this->info["codice"], ":valori" => json_encode($this->info["valori"])]); //** Check F01_2014 Notice PRI_ONLY */ if($this->form_section == "F01_2014" && self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.NOTICE._attributes.TYPE") == "PRI_ONLY") { $contracting_body = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.CONTRACTING_BODY"); unset($contracting_body["URL_PARTICIPATION"], $contracting_body["RADIO_FOR_ADDRESS_SEND_TENDERS_REQUEST"]); self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.CONTRACTING_BODY", $contracting_body); $object_descr = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR.£"); if(! empty($object_descr) && is_array($object_descr)) { foreach ($object_descr as $i => &$l) { unset($l["AC"], $l["DURATION"], $l["DATE_START"], $l["DATE_END"], $l["ACCEPTED_VARIANTS"], $l["RADIO_FOR_OPTIONS"], $l["OPTIONS_DESCR"], $l["EU_PROGR_RELATED"], $l["RADIO_FOR_EU_UNION_FOUNDS"]); } self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR.£", $object_descr); } else { $object_descr = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR"); if(! empty($object_descr) && is_array($object_descr)) { unset($object_descr["AC"], $object_descr["DURATION"], $object_descr["DATE_START"], $object_descr["DATE_END"], $object_descr["ACCEPTED_VARIANTS"], $object_descr["RADIO_FOR_OPTIONS"], $object_descr["OPTIONS_DESCR"], $object_descr["EU_PROGR_RELATED"], $object_descr["RADIO_FOR_EU_UNION_FOUNDS"]); } self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR", $object_descr); } $procedure = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.PROCEDURE"); unset($procedure["RADIO_FOR_PT_RESTRICTED"], $procedure["DATE_RECEIPT_TENDERS"], $procedure["TIME_RECEIPT_TENDERS"], $procedure["DATE_AWARD_SCHEDULED"], $procedure["LANGUAGES"]); self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.PROCEDURE", $procedure); $form = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}"); unset($form["LEFTI"]); self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}", $form); } //** Check F01_2014 Notice PRI_CALL_COMPETITION */ if($this->form_section == "F01_2014" && self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.NOTICE._attributes.TYPE") == "PRI_CALL_COMPETITION") { $object_contract = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT"); unset($object_contract["DATE_PUBLICATION_NOTICE"]); self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT", $object_contract); $object_descr = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR.£"); if(! empty($object_descr) && is_array($object_descr)) { foreach ($object_descr as $i => &$l) { unset($l["DATE_PUBLICATION_NOTICE"]); } } $object_descr = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR.£"); if(! empty($object_descr) && is_array($object_descr)) { foreach ($object_descr as $i => &$l) { unset($l["DATE_PUBLICATION_NOTICE"]); } self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR.£", $object_descr); } else { $object_descr = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR"); if(! empty($object_descr) && is_array($object_descr)) { unset($object_descr["DATE_PUBLICATION_NOTICE"]); } self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR", $object_descr); } $procedure = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.PROCEDURE"); unset($procedure["DATE_AWARD_SCHEDULED"], ); self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.PROCEDURE", $procedure); } //** Check F01_2014 Notice PRI_REDUCING_TIME_LIMITS */ if($this->form_section == "F01_2014" && self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.NOTICE._attributes.TYPE") == "PRI_REDUCING_TIME_LIMITS") { $procedure = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.PROCEDURE"); unset($procedure["RADIO_FOR_PT_RESTRICTED"], $procedure["DATE_RECEIPT_TENDERS"], $procedure["LANGUAGES"], $procedure["TIME_RECEIPT_TENDERS"]); self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.PROCEDURE", $procedure); } //** Check F01_2014 Notice */ if($this->form_section == "F01_2014") { if(! empty($object_descr) && is_array($object_descr)) { self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR.£", $object_descr); } else { $object_descr = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR"); if(! empty($object_descr) && is_array($object_descr)) { unset($object_descr["NO_OPTIONS"], $object_descr["NO_RENEWAL"]); } self::set($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.OBJECT_CONTRACT.OBJECT_DESCR", $object_descr); } } if($this->form_section == "F13_2014") { $contact = self::get($this->info["valori"], "TED_ESENDERS.FORM_SECTION.{$this->form_section}.CONTRACTING_BODY.ADDRESS_CONTRACTING_BODY.CONTACT_POINT"); if (!empty($contact)) { unset($this->info["valori"]["TED_ESENDERS"]["FORM_SECTION"][$this->form_section]["CONTRACTING_BODY"]["ADDRESS_CONTRACTING_BODY"]["CONTACT_POINT"]); } } } /** * Check if a string is HTML * * @param String $string * @return boolean */ private function isHTML(String $string) { return ! (strip_tags($string) == $string); } private function setMissingTitles(Array &$fields, String $section) { $infos = []; switch ($section) { case 'OBJECT_CONTRACT': $keys = array_flip(array_merge(["info"], array_keys($fields))); $fields = array_replace($keys, $fields); $fields["info"] = [ "title" => $this->translate("OBJECT_OF_CONTRACT") ]; break; case 'OBJECT_DESCR': $keys = array_flip(array_merge(["info"], array_keys($fields))); $fields = array_replace($keys, $fields); $fields["info"] = [ "title" => $this->translate("DESCRIPTION_OF_CONTRACT") ]; break; } } /** * Verify if a subsection exists for given section * @param $section * @return bool */ public function subsectionExists(String $section) : bool { return (count( array_filter($this->settings["subsections"], function($subsection) use ($section) { return $subsection["parent"] == $section; }) ) > 0); } }