ecertis)) { $this->ecertis = jsonToArray(__DIR__ . DIRECTORY_SEPARATOR . "ecertis.json"); } $founds = []; if (!empty($this->ecertis)) { foreach($this->ecertis AS $criterio) { if (($criterio["id"] === $uuid && !$searchParent) || ($criterio["parentId"] === $uuid && $searchParent)) { $founds[] = $criterio; } } } else { Throw new Exception("Configurazione ecertis Mancante"); } if (!empty($founds)) { if (!$returnAllResult) { if (count($founds) > 1) { usort($founds,function($a,$b) { if (isset($a["versionId"]) && isset($b["versionId"])) { return $a["versionId"] < $b["versionId"]; } else { return true; } }); } return reset($founds); } else { return $founds; } } } private static function matchGroupPropertiesWithInputs(Array $properties, Array $inputs) : Bool { $available = array_column($properties,"valueDataTypeCode"); $selected = []; foreach($inputs AS $input) { $selected[] = self::getInputResponseType($input); } $matches = array_intersect($available,$selected); return (count($matches) > 1 || (!empty($matches) && count($selected) === 1)); } private static function getInputResponseType(Array $input) : String { $responseType = reset($input["index"]); $responseType = explode(":",$responseType); $responseType = strtoupper(end($responseType)); if ($responseType == "EVIDENCE") { $responseType .= "_IDENTIFIER"; } return $responseType; } private static function checkEcertisGroup(Array $group,Array $inputs,Array $chain = [],Bool $appendChain = false) : Array { if ($appendChain) { $chain[] = $group["id"]; } if (!empty($group["properties"])) { $check = self::matchGroupPropertiesWithInputs($group["properties"],$inputs); if ($check) { return $chain; } } if (!empty($group["propertiesGroups"])) { foreach($group["propertiesGroups"] AS $sub) { $tmp = self::checkEcertisGroup($sub,$inputs,$chain,true); if (!empty($tmp)) { return $tmp; } } } if (!empty($group["subsidiaryPropertiesGroups"])) { foreach($group["subsidiaryPropertiesGroups"] AS $sub) { $tmp = self::checkEcertisGroup($sub,$inputs,$chain, true); if (!empty($tmp)) { return $tmp; } } } return []; } private function findPropertyChain(Array $ecertis, Array $inputs) : Array { foreach($ecertis AS $info) { $check = self::checkEcertisGroup($info,$inputs); if (!empty($check)) { return $check; } } return []; } public function getRequestArray(Array $criteria) : Array { $dgue = array(); $dgue["@xmlns"] = "urn:oasis:names:specification:ubl:schema:xsd:QualificationApplicationRequest-2"; $dgue["@xmlns:cac"]="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" ; $dgue["@xmlns:cbc"]="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"; // $dgue["@xmlns:xsi"]="http://www.w3.org/2001/XMLSchema-instance"; // $dgue["@xsi:schemaLocation"]="http://www.w3.org/2001/XMLSchema-instance"; $dgue["cbc:UBLVersionID"]["$"] = "2.2"; $dgue["cbc:UBLVersionID"]["@schemeAgencyID"] = "OASIS-UBL-TC"; $dgue["cbc:ProfileID"]["$"] = "41"; $dgue["cbc:ProfileID"]["@schemeAgencyID"] = "CEN-BII"; $dgue["cbc:ProfileID"]["@schemeVersionID"] = "2.1.1"; $dgue["cbc:ProfileExecutionID"]["$"] = "ESPD-EDMv2.1.1-EXTENDED"; $dgue["cbc:ProfileExecutionID"]["@SchemeAgencyID"] = "EU-COM-GROW"; $dgue["cbc:CustomizationID"]["$"] = "urn:www.cenbii.eu:transaction:biitrdm070:ver3.0"; $dgue["cbc:CustomizationID"]["@SchemeAgencyID"] = "CEN-BII"; $dgue["cbc:CustomizationID"]["@schemeVersionID"] = "2.1.1"; $dgue["cbc:ID"]["$"] = hash("sha256","{$this->dgue->modulo}{$this->dgue->oggetto}"); $dgue["cbc:ID"]["@schemeAgencyID"] = $this->dgue->codice_fiscale_ente ?? $_SESSION["ente"]->getInfo()["cf"]; $dgue["cbc:UUID"]["$"] = hash("sha256","{$this->dgue->modulo}{$this->dgue->oggetto}"); $dgue["cbc:UUID"]["@schemeAgencyID"] = $this->dgue->codice_fiscale_ente ?? $_SESSION["ente"]->getInfo()["cf"]; $dgue["cbc:CopyIndicator"] = "false"; $dgue["cbc:ContractFolderID"]["$"] = $this->dgue->id_appalto; $dgue["cbc:UUID"]["@schemeAgencyID"] = $this->dgue->codice_fiscale_ente ?? $_SESSION["ente"]->getInfo()["cf"]; $dgue["cbc:IssueDate"] = date('Y-m-d'); $dgue["cbc:IssueTime"] = date('H:i:s'); $dgue["cbc:VersionID"] = "1.0"; $dgue["cbc:QualificationApplicationTypeCode"]["$"] = "EXTENDED"; $dgue["cbc:QualificationApplicationTypeCode"]["@listID"] = "QualificationApplicationType"; $dgue["cbc:QualificationApplicationTypeCode"]["@listAgencyName"] = "EU-COM-GROW"; $dgue["cbc:QualificationApplicationTypeCode"]["@listVersionID"] = "2.1.1"; $dgue["cac:ContractingParty"]["cac:Party"]["cac:PartyIdentification"]["cbc:ID"] = $this->dgue->codice_fiscale_ente; $dgue["cac:ContractingParty"]["cac:Party"]["cbc:WebsiteURI"] = "https://{$_SESSION["ente"]->getInfo()["dominio"]}"; $dgue["cac:ContractingParty"]["cac:Party"]["cbc:EndPointID"] = "https://{$_SESSION["ente"]->getInfo()["dominio"]}"; $dgue["cac:ContractingParty"]["cac:Party"]["cac:PartyName"]["cbc:Name"] = $this->dgue->ente; $dgue["cac:ContractingParty"]["cac:Party"]["cac:PostalAddress"]["cac:Country"]["cbc:IdentificationCode"]["$"] = "IT"; $dgue["cac:ContractingParty"]["cac:Party"]["cac:PostalAddress"]["cac:Country"]["cbc:IdentificationCode"]["@listID"] = "CountryCodeIdentifier"; $dgue["cac:ContractingParty"]["cac:Party"]["cac:PostalAddress"]["cac:Country"]["cbc:IdentificationCode"]["@listAgencyName"] = "ISO"; $dgue["cac:ContractingParty"]["cac:Party"]["cac:PostalAddress"]["cac:Country"]["cbc:IdentificationCode"]["@listVersionID"] = "1.0"; $dgue["cac:ProcurementProject"]["cac:ProcurementProject"]["cbc:Name"] = strip_tags($this->dgue->oggetto); $dgue["cac:ProcurementProject"]["cac:ProcurementProject"]["cbc:Description"] = strip_tags($this->dgue->descrizione); if (!empty($this->dgue->lotti) && count($this->dgue->lotti) > 1) { $dgue["cac:ProcurementProject"] = []; foreach($this->dgue->lotti AS $lotto) { $dgue["cac:ProcurementProject"][] = ["cbc:ID" => "LOTTO{$lotto["numero"]}"]; } } $dgue["cac:TenderingCriterion"] = array(); $tmp = []; $nationals = []; $i = 0; $nationalI = null; foreach($criteria AS $criterio) { $i++; if ($criterio["taxa"] == "CRITERION.EXCLUSION.NATIONAL") { $nationalI = $i; $tmp[$i] = $criterio; } else if (strpos($criterio["taxa"],".NATIONAL")) { $nationals[] = $criterio; } else { $tmp[$i] = $criterio; } } $criteria = $tmp; foreach($criteria AS $i => $criterio) { $ecertis = $this->getEcertisInfo($criterio["uuid"]); $definitions = []; $captions = []; if ($i !== $nationalI) { $national = false; $definitions = [DGUE::getCriteriaTemplateDefinition($criterio["template"])]; } else { $national = true; foreach($nationals AS $n) { $definitions[$n["codice"]] = DGUE::getCriteriaTemplateDefinition($n["template"]); $captions[$n["codice"]] = $n["nome"]; } } $uuid = $criterio["uuid"]; $subCriterion = []; if (!empty($ecertis)) { $uuid = $ecertis[0]["parentId"]; $subCriterion["cbc:ID"]["@schemeID"]="CriteriaTaxonomy"; $subCriterion["cbc:ID"]["@schemeAgencyID"]="EU-COM-GROW"; $subCriterion["cbc:ID"]["$"] = $criterio["uuid"]; } $criterion = array(); $criterion["cbc:ID"]["@schemeID"]="CriteriaTaxonomy"; $criterion["cbc:ID"]["@schemeAgencyID"]="EU-COM-GROW"; $criterion["cbc:ID"]["$"] = $uuid; $criterion["cbc:CriterionTypeCode"]["@listID"] = "CriteriaTypeCode"; $criterion["cbc:CriterionTypeCode"]["@listAgencyID"] = "EU-COM-GROW"; $criterion["cbc:CriterionTypeCode"]["@listVersionID"] = "2.0.2"; $criterion["cbc:CriterionTypeCode"]["$"] = $criterio["taxa"]; $criterion["cbc:Name"] = $criterio["nome"]; $criterion["cbc:Description"] = strip_tags($criterio["descrizione"]); $criterion["cac:Legislation"]["cbc:ID"]["$"] = self::legislation(); $criterion["cac:Legislation"]["cbc:ID"]["@schemeID"] = "CriteriaTaxonomy"; $criterion["cac:Legislation"]["cbc:ID"]["@schemeAgencyID"] = "EU-COM-GROW"; $criterion["cac:Legislation"]["cbc:ID"]["@schemeVersionID"] = "2.1.1"; $criterion["cac:Legislation"]["cbc:Title"] = "D.lgs {$this->dgue->version}"; $criterion["cac:Legislation"]["@LanguageID"] = "it"; if (!empty($definitions)) { foreach($definitions AS $kd => $definition) { if (!empty($definition) && is_array($definition)) { foreach($definition AS $group_id => $inputs) { if ($national) { $propertiesGroupChain = ["8d79d5f7-dc21-45e9-b188-e02008b854e0","IT-cbb135d8-a0ca-43b1-ba9f-c80e17def684"]; } else if (!empty($ecertis)) { $propertiesGroupChain = $this->findPropertyChain($ecertis,$inputs); } else { $propertiesGroupChain = []; } $properties = $this->getGroupProperties($inputs,$criterio["codice"],$group_id); if ($national) { $properties[] = [ "cbc:TypeCode" => [ "@listID" => "CriterionElementType", "@listAgencyID" => "EU-COM-GROW", "@listVersionID" => "2.1.1", "$" => "CAPTION" ], "cbc:Name" => $captions[$kd], ]; } $criterionVariableName = "criterion"; if (!empty($subCriterion)) { $criterionVariableName = "subCriterion"; } if (empty($propertiesGroupChain)) { $$criterionVariableName["cac:TenderingCriterionPropertyGroup"][] = ["cac:TenderingCriterionProperty"=>$properties]; } else { $first = true; foreach($propertiesGroupChain AS $criterionPropertiesGroupID) { if ($first) { $group = [ "cbc:ID" => [ "$" => $criterionPropertiesGroupID, "@schemeID" => "CriteriaTaxonomy", "@schemeAgencyID" => "EU-COM-GROW", "@schemeVersionID" => "2.1.1", ] ]; $lastGroup = &$group; $first = false; } else { self::aggiungiSottoGruppo($lastGroup,$criterionPropertiesGroupID); $lastGroup = &$lastGroup["cac:SubsidiaryTenderingCriterionPropertyGroup"]; } } $lastGroup["cac:TenderingCriterionProperty"] = $properties; $$criterionVariableName["cac:TenderingCriterionPropertyGroup"][] = $group; } } } } } if (!empty($subCriterion)) { if ($national) { $subCriterion["cbc:ID"] = [ "$" => "41a62578-d8ef-48c7-82e6-16779b32f434", "@schemeID" => "CriteriaTaxonomy", ]; } $criterion["cac:SubTenderingCriterion"] = $subCriterion; } $dgue["cac:TenderingCriterion"][] = $criterion; } $dgue = array("QualificationApplicationRequest"=>$dgue); return $dgue; } private function getGroupProperties(Array $inputs,Int $codiceCriterio, String $group_id) { $properties = []; foreach($inputs AS $input) { $responseType = $this->getInputResponseType($input); $properties[] = [ "cbc:ID" => [ "@schemeID" => "CriteriaTaxonomy", "@schemeAgencyID" => "EU-COM-GROW", "@schemeVersionID" => "2.1.1", "$" => $this->dgue->getUUIDMatches($codiceCriterio)[$group_id][$input["id"]] ?? null ], "cbc:TypeCode" => [ "@listID" => "CriterionElementType", "@listAgencyID" => "EU-COM-GROW", "@listVersionID" => "2.1.1", "$" => "QUESTION" ], "cbc:ValueDataTypeCode" => [ "@listID" => "ResponseDataType", "@listAgencyID" => "EU-COM-GROW", "@listVersionID" => "2.1.1", "$" => $responseType ] ]; } return $properties; } private static function aggiungiSottoGruppo(Array &$group,String $id) { $element = [ "cbc:ID" => [ "$" => $id, "@schemeID" => "CriteriaTaxonomy", "@schemeAgencyID" => "EU-COM-GROW", "@schemeVersionID" => "2.1.1", ] ]; $group["cac:SubsidiaryTenderingCriterionPropertyGroup"] = $element; return $group; } }