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.
 
 
 
 
 

183 righe
6.8 KiB

<?
if (isset($this) && is_a($this,"gara") && isset($settings)) {
$partecipanti = $this->getPartecipantiForAnomalia();
usort($partecipanti,"sortPartecipantiTotale");
if (!empty($partecipanti)) {
$numero_partecipanti = count($partecipanti);
$numSoglia = ceil($numero_partecipanti * 10 /100);
$taglioAli = [];
$i = 0;
$contatore = 0;
$punteggioAttuale = "";
while($i < $numSoglia) {
$partecipante = $partecipanti[$contatore];
$taglioAli[] = $partecipante["codice"];
if ($punteggioAttuale != $partecipante["totale"]) {
$punteggioAttuale = $partecipante["totale"];
$i++;
}
$contatore++;
}
if (isset($partecipanti[$contatore]) && $partecipanti[$contatore]["totale"] === $punteggioAttuale) {
while($partecipanti[$contatore]["totale"] === $punteggioAttuale) {
$partecipante = $partecipanti[$contatore];
$taglioAli[] = $partecipante["codice"];
$contatore++;
}
}
$i = 0;
$contatore = $numero_partecipanti -1;
$punteggioAttuale = "";
while($i < $numSoglia) {
$partecipante = $partecipanti[$contatore];
$taglioAli[] = $partecipante["codice"];
if ($punteggioAttuale != $partecipante["totale"]) {
$punteggioAttuale = $partecipante["totale"];
$i++;
}
$contatore--;
}
if (isset($partecipanti[$contatore]) && $partecipanti[$contatore]["totale"] === $punteggioAttuale) {
while($partecipanti[$contatore]["totale"] === $punteggioAttuale) {
$partecipante = $partecipanti[$contatore];
$taglioAli[] = $partecipante["codice"];
$contatore--;
}
}
reset($partecipanti);
$somma = 0;
$contatore = 0;
foreach($partecipanti AS $partecipante) {
if (in_array($partecipante["codice"],$taglioAli) === false) {
$somma += $partecipante["totale"];
$contatore++;
}
}
$media = $somma / $contatore;
if (!$soloSoglia) {
if ($arrotondamento) {
$somma = number_format($somma,$decimali);
$media = number_format($media,$decimali);
} else {
$somma = truncate($somma,$decimali);
$media = truncate($media,$decimali);
}
}
reset($partecipanti);
$contatore = 0;
$sommaSuperiore = 0;
foreach($partecipanti AS $partecipante) {
if (in_array($partecipante["codice"],$taglioAli) === false && $partecipante["totale"] > $media) {
$sommaSuperiore += $partecipante["totale"];
$contatore++;
}
}
$scarto_medio = ($sommaSuperiore - ($media * $contatore)) / $contatore;
if (!$soloSoglia) {
if ($arrotondamento) {
$scarto_medio = number_format($scarto_medio,$decimali);
} else {
$scarto_medio = truncate($scarto_medio,$decimali);
}
}
$soglia_anomalia = ($media + $scarto_medio);
$somma = strval($somma);
$perDecSomma = 0;
$posDecimale = strpos($somma,".");
$limit = strlen($somma);
if ($posDecimale!==false) {
$decimali_somma = explode(".",$somma);
$limit = strlen($decimali_somma[0]) + 2;
$decimali_somma = $decimali_somma[1];
$first = (int)substr($decimali_somma,0,1);
$second = (int)substr($decimali_somma,1,1);
$perDecSomma = $first * $second;
}
$valoreE = 0;
$sommaRiferimento = str_replace(".","",$somma);
for($i = 0; $i < $limit; $i++) {
$valoreE += (int)substr($sommaRiferimento, $i, 1);
}
$ribasso_soglia = $scarto_medio * $perDecSomma / 100;
if (!$soloSoglia) {
if ($arrotondamento) {
$ribasso_soglia = number_format($ribasso_soglia,$decimali);
} else {
$ribasso_soglia = truncate($ribasso_soglia,$decimali);
}
}
if ($valoreE % 2 == 0) {
if (empty($settings["interpretazione"]) || $settings["interpretazione"] == "M") {
$soglia_anomalia -= $ribasso_soglia;
} else if ($settings["interpretazione"] == "T") {
$soglia_anomalia = $soglia_anomalia - (($soglia_anomalia * $ribasso_soglia) / 100);
}
} else {
if (empty($settings["interpretazione"]) || $settings["interpretazione"] == "M") {
$soglia_anomalia += $ribasso_soglia;
} else if ($settings["interpretazione"] == "T") {
$soglia_anomalia = $soglia_anomalia + (($soglia_anomalia * $ribasso_soglia) / 100);
}
}
if ($arrotondamento) {
$soglia_anomalia = number_format($soglia_anomalia,$decimali);
} else {
$soglia_anomalia = truncate($soglia_anomalia,$decimali);
}
$esclusione_automatica = $this->getSogliaGara() == "sottosoglia";
reset($partecipanti);
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "r_partecipanti_gare";
$salva->operazione = "UPDATE";
$max = 0;
$second_max = 0;
foreach($partecipanti AS $partecipante) {
if ($partecipante["totale"] > $soglia_anomalia) {
$partecipante["anomalia"] = "S";
$partecipante["a_facoltativa"] = "N";
$partecipante["motivazione_anomalia"] = "Calcolo automatico";
if ($esclusione_automatica) {
$partecipante["escluso"] = "S";
$partecipante["esclusione_automatica"] = "S";
$partecipante["motivazione"] = "Calcolo automatico anomalia";
}
$salva->oggetto = $partecipante;
$salva->save();
} else {
if ($max < $partecipante["totale"]) {
$max = $partecipante["totale"];
}
if ($second_max < $partecipante["totale"] && $partecipante["totale"] < $max) {
$second_max = $partecipante["totale"];
}
}
}
$infoAnomalia = [];
$infoAnomalia["somma"] = $somma;
$infoAnomalia["media"] = $media;
$infoAnomalia["scarto_medio"] = $scarto_medio;
$infoAnomalia["decremento"] = $ribasso_soglia;
$infoAnomalia["soglia"] = $soglia_anomalia;
$infoAnomalia["esclusione_automatica"] = $esclusione_automatica;
$infoAnomalia["riepilogo"] = "Anomalia calcolata ai sensi dell'allegato II.2 del D.Lgs 36/2023 - Metodo B - Sommatoria: {$somma} - Somma cifre: {$valoreE} - Media: {$media} - Scarto medio: {$scarto_medio} - Variazione: {$ribasso_soglia} - Soglia individuata: {$soglia_anomalia} - Ribasso di aggiudicazione: {$second_max}";
$extraInfo = ["set-anomalia-{$this->round["codice"]}"=>json_encode($settings,JSON_PRETTY_PRINT),"info-anomalia-{$this->round["codice"]}"=>json_encode($infoAnomalia,JSON_PRETTY_PRINT)];
$extraInfo["ribassoAggiudicazione-{$this->round["codice"]}"] = $second_max ?? 0;
$errors = "";
} else {
$errors = __("Nessun partecipante ammesso");
}
}
?>