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