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.
1696 righe
57 KiB
1696 righe
57 KiB
<?php |
|
if (! function_exists('array_has_numeric_keys')) { |
|
function array_has_numeric_keys(array $array) { |
|
return count(array_filter(array_keys($array), 'is_numeric')) === count($array); |
|
} |
|
} |
|
if (! function_exists('value')) { |
|
/** |
|
* Return the default value of the given value. |
|
* |
|
* @param mixed $value |
|
* @return mixed |
|
*/ |
|
function value($value) |
|
{ |
|
return $value instanceof Closure ? $value() : $value; |
|
} |
|
} |
|
|
|
if (! function_exists('htmlentitiesdecode')) { |
|
/** |
|
* Decode html entities |
|
* |
|
* @param Array|String $item |
|
* @param String|Int $key |
|
* @return void |
|
*/ |
|
function htmlentitiesdecode(&$item, $key) |
|
{ |
|
if(is_string($item) && ! is_numeric($item)) { |
|
$item = html_entity_decode($item, ENT_QUOTES); |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Raccolta delle helper function |
|
*/ |
|
trait TedEsenderHelpersFuncions |
|
{ |
|
|
|
public function getBreadcrumb($breadcrumb = []) { |
|
|
|
if (! empty($this->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 <http://spdx.org/licenses/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(["<p>", "</p>", "<br />"], "<br>", $value); |
|
$text = explode("<br>", $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); |
|
} |
|
|
|
|
|
|
|
}
|
|
|