gestione gare pubbliche
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

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);
}
}