source = $source; $this->target = $target; $this->db = $pdo; $this->matchLotti = []; $this->matchCriteri = []; $this->matchBuste = []; } public static function clonableInfo(Gara $source) : Array { $domande = []; if (!empty($source->getManagerIncarichi()->getIncaricati())) { $domande["incarichi"]="Incarichi"; } $rounds = $source->getRounds(); if (!empty($rounds)) { $source->round = reset($rounds); if (!empty($source->getRisposteElaborazione())) { $domande["elaborazione"] = "Risposte elaborazione"; } if (!empty($source->getManagerDGUE()->getRequestedCriteria())) { $domande["dgue"] = "DGUE"; } if ($source->info["modalita"] == "telematica") { if (!empty($source->getRichieste())) { $domande["buste"] = "Configurazione Buste"; } } if (!empty($source->getLotti())) { foreach($source->getLotti() AS $lotto) { $source->setLotto($lotto["codice"]); if (!empty($source->getCriteri())) { $domande["criteri"] = "Criteri di valutazione"; } if (!empty($source->getSOA($lotto["codice"]))) { $domande["soa"] = "Qualificazione lavori"; } if (!empty($source->getProgettazione($lotto["codice"]))) { $domande["progettazione"] = "Qualificazione progettazione"; } if ($source->info["modalita"] != "telematica") { if (!empty($source->getPartecipanti())) { $domande["partecipanti"] = "Partecipanti"; } if (!empty($source->getAggiudicatari())) { $domande["aggiudicatari"] = "Aggiudicatari"; } } else { if (!empty($source->getInvitati())) { $domande["invitati"] = "Invitati"; } } $source->lotto = null; } } } $domande = array_unique($domande); return $domande; } private function initTargetFase() { if (empty($this->target->getRounds())) { $rounds = $this->source->getRounds(); if (!empty($rounds)) { $round = reset($rounds); $this->target->inizializzaFase($round["id"],$this->source->getProcedura()["fasi"][$round["id"]]); $rounds = $this->target->getRounds(); $this->target->round = reset($rounds); return true; } } } public function clone() : Bool { $clonableInfo = ["lotti"=>"Lotti"]; $clonableInfo += self::clonableInfo($this->source); $this->settings = $this->target->getExtraInfo()["gara"]["copyInfo"] ?? null; if (!empty($clonableInfo)) { foreach($clonableInfo AS $info => $label) { if ($info == "lotti" || (isset($this->settings[$info]) && $this->settings[$info] == "S")) { if (method_exists("CloneGara",$info)) { if (!$this->{$info}()) { $this->errori[] = $label; } } } } } $quickPanel = $this->source->getExtraInfo()["gara"]["quickPanel"] ?? null; if (!empty($quickPanel)) { $this->target->saveExtraInfo("quickPanel",$quickPanel); } return true; } private function setMatchLotti() { $sourceLotti = $this->source->getLotti(); if (!empty($sourceLotti)) { $targetLotti = $this->target->getLotti(); if (!empty($targetLotti)) { foreach($sourceLotti AS $sLotto) { foreach($targetLotti AS $tLotto) { if ($sLotto["numero"] == $tLotto["numero"]) { $this->matchLotti[$sLotto["codice"]] = $tLotto["codice"]; break; } } } } } } private function incarichi() : Bool { if (empty($this->target->getManagerIncarichi()->getIncaricati())) { $incarichi = $this->source->getManagerIncarichi()->getIncaricati(); if (!empty($incarichi)) { $targetManager = $this->target->getManagerIncarichi(); foreach($incarichi AS $incarico) { $incarico["codice"] = null; $targetManager->saveIncaricato($incarico); } } } return true; } private function lotti() : Bool { if (empty($this->target->getLotti())) { $lotti = $this->source->getLotti(); if (!empty($lotti)) { foreach($lotti AS $lotto) { unset($lotto["codice"]); $lotto["cig"] = ""; $lotto["extraInfo"] = []; unset($lotto["numero"]); if (empty($this->settings["aggiudicatari"])) { unset($lotto["importoAggiudicazione"]); } $this->target->saveLotto($lotto); } } } $this->setMatchLotti(); $this->initTargetFase(); return true; } private function elaborazione() : Bool { if (empty($this->target->getExtraInfo()["round"]["elaborazione"])) { $this->target->saveExtraInfo("elaborazione",$this->source->getExtraInfo()["round"]["elaborazione"],"round"); $this->target->validaElaborazione(); } return true; } private function dgue() : Bool { if (!empty($this->target->round["id"]) && empty($this->target->getManagerDGUE()->getRequestedCriteria())) { $criteria = $this->source->getManagerDGUE()->getRequestedCriteria(); if (!empty($criteria)) { $criteria = array_column($criteria,"codice"); $manager = $this->target->getManagerDGUE(); $manager->saveRequest($criteria); } } return true; } private function soa() : Bool { $sourceLotti = $this->source->getLotti(); foreach($sourceLotti AS $sLotto) { $sLotto = $sLotto["codice"]; $tLotto = $this->matchLotti[$sLotto]; $soa = $this->source->getSOA($sLotto); if (!empty($soa) && empty($this->target->getSOA($tLotto))) { $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_gare_soa"; foreach($soa AS $categoria) { $categoria["codice_lotto"] = $tLotto; $categoria["codice"] = null; $salva->operazione = "INSERT"; $salva->oggetto = $categoria; $codici[] = $salva->save(); } $this->db->go("DELETE FROM b_gare_soa WHERE codice_lotto = :lotto AND codice NOT IN (" . implode(",",$codici) . ")",[":lotto"=>$tLotto]); } } return true; } private function progettazione() : Bool { $sourceLotti = $this->source->getLotti(); foreach($sourceLotti AS $sLotto) { $sLotto = $sLotto["codice"]; $tLotto = $this->matchLotti[$sLotto]; $soa = $this->source->getSOA($sLotto); if (!empty($soa) && empty($this->target->getSOA($tLotto))) { $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "b_gare_progettazione"; foreach($soa AS $categoria) { $categoria["codice_lotto"] = $tLotto; $categoria["codice"] = null; $salva->operazione = "INSERT"; $salva->oggetto = $categoria; $codici[] = $salva->save(); } $this->db->go("DELETE FROM b_gare_progettazione WHERE codice_lotto = :lotto AND codice NOT IN (" . implode(",",$codici) . ")",[":lotto"=>$tLotto]); } } return true; } private function copyCriterio(Array $criterio) : ?Int { $newCode = $this->matchCriteri[$criterio["codice"]] ?? null; $new = $criterio; $sub = false; $subCriteri = $this->source->getSubCriteri($criterio["codice"]); $lotti = $this->source->getLottiFromCriterio($criterio["codice"]); if (empty($newCode)) { $new["codice"] = "i_0"; if (!empty($subCriteri)) { $new["auto"] = null; } if (!empty($criterio["codice_padre"])) { $sub = true; $criterio["codice_padre"] = $this->matchCriteri[$criterio["codice_padre"]] ?? null; } $newCode = $this->target->saveCriterio($new); if (!empty($newCode)) { $this->matchCriteri[$criterio["codice"]] = $newCode; } } if (!empty($newCode)) { if (!empty($subCriteri)) { foreach($subCriteri AS $sub) { if (empty($this->matchCriteri[$sub["codice"]])) { $this->copyCriterio($sub); } } } else { $ep = $this->source->getElencoPrezzi($criterio["codice"]); if (!empty($ep)) { $newEP = []; $count = 0; foreach($ep AS $articolo) { $count++; unset($articolo["codice"]); $newEP["i_{$count}"] = $articolo; } $this->target->saveVociEP($newCode,$newEP); } $form = $this->source->getFormCriterio($criterio["codice"]); if (!empty($form)) { $salva_form = new salva(); $salva_form->debug = false; $salva_form->nome_tabella = "b_gare_form"; foreach($form AS $input) { unset($input["codice"]); $input["codice_criterio"] = $newCode; $salva_form->operazione = "INSERT"; $salva_form->oggetto = $input; $salva_form->save(); } } } if (!$sub) { if (!empty($lotti)) { $newLotti = []; foreach($lotti AS $lotto) { if (!empty($lotto)) { $newLotti[] = $this->matchLotti[$lotto]; } else { $newLotti = 0; break; } } $this->target->bindCriterio($newCode,$newLotti); } } } return $newCode; } private function criteri() : Bool { $sourceLotti = $this->source->getLotti(); if (!empty($sourceLotti)) { $targetLotti = $this->target->getLotti(); if (!empty($targetLotti)) { foreach($sourceLotti AS $sLotto) { $sLotto = $sLotto["codice"]; $tLotto = $this->matchLotti[$sLotto] ?? null; $this->source->setLotto($sLotto); $this->target->setLotto($tLotto); $macro = $this->source->getMacroCriteri(); if (!empty($macro) && empty($this->target->getCriteri())) { foreach($macro AS $mCriterio) { $this->copyCriterio($mCriterio); } } $this->source->lotto = $this->target->lotto = null; } } } return true; } private function buste() : Bool { $sourceLotti = $this->source->getLotti(); if (!empty($sourceLotti)) { $targetLotti = $this->target->getLotti(); if (!empty($targetLotti)) { foreach($sourceLotti AS $sLotto) { $sLotto = $sLotto["codice"]; $tLotto = $this->matchLotti[$sLotto] ?? null; $this->source->setLotto($sLotto); $this->target->setLotto($tLotto); $richieste = $this->source->getRichieste(); if (!empty($richieste)) { foreach($richieste AS $richiesta) { if (empty($this->matchBuste[$richiesta["codice"]]) && $richiesta["locked"] == "N") { $lotti = $this->source->getLottiFromRichiesta($richiesta["codice"]); $oldCodice = $richiesta["codice"]; unset($richiesta["codice"]); $newBusta = $this->target->saveRichiesta($richiesta); if (!empty($newBusta)) { $this->matchBuste[$oldCodice] = $newBusta; $newLotti = []; foreach($lotti AS $lotto) { if (!empty($lotto)) { $newLotti[] = $this->matchLotti[$lotto]; } else { $newLotti = 0; break; } } $this->target->bindRichiesta($newBusta,$newLotti); } } } } $this->source->lotto = $this->target->lotto = null; } } } return true; } private function invitati() : Bool { if (empty($this->target->getInvitati())) { $invitati = $this->source->getInvitati(); if (!empty($invitati)) { $salva = new salva(); $salva->debug = false; $salva->nome_tabella = "r_inviti_gare"; foreach($invitati AS $invitato) { unset($invitato["id"]); $invitato["codice_round"] = $this->target->round["codice"]; $invitato["codice_lotto"] = ($invitato["codice_lotto"] > 0) ? $this->matchLotti[$invitato["codice_lotto"]] : 0; $salva->operazione = "INSERT"; $salva->oggetto = $invitato; $salva->save(); } } } return true; } private function partecipanti(Bool $onlyAggiudicatari = false) : Bool { $sourceLotti = $this->source->getLotti(); if (!empty($sourceLotti)) { $targetLotti = $this->target->getLotti(); if (!empty($targetLotti)) { foreach($sourceLotti AS $sLotto) { $sLotto = $sLotto["codice"]; $tLotto = $this->matchLotti[$sLotto] ?? null; $this->source->setLotto($sLotto); $this->target->setLotto($tLotto); $partecipanti = $this->source->getPartecipanti(); $aggiudicato = false; if (!empty($partecipanti) && empty($this->target->getPartecipanti())) { foreach($partecipanti AS $partecipante) { if (!$onlyAggiudicatari || $partecipante["aggiudicatario"] == "S") { $oldCode = $partecipante["codice"]; if (!isset($this->settings["aggiudicatari"]) || $this->settings["aggiudicatari"] == "N") { $partecipante["aggiudicatario"] = "N"; } if ($partecipante["aggiudicatario"] == "S") { $aggiudicato = true; } unset($partecipante["codice"]); $partecipante["codice_round"] = $this->target->round["codice"]; $partecipante["codice_lotto"] = $tLotto; $raggruppamento = $this->source->getRaggruppamento($oldCode); if (!empty($raggruppamento)) { $partecipante["raggruppamento"] = []; foreach($raggruppamento AS $membro) { unset($membro["codice"]); $partecipante["raggruppamento"][] = $membro; } } $avvalimento = $this->source->getAvvalimento($oldCode); if (!empty($avvalimento)) { $partecipante["avvalimento"] = []; foreach($avvalimento AS $membro) { unset($membro["codice"]); $partecipante["avvalimento"][] = $membro; } } $newCode = $this->target->savePartecipante($partecipante); } } } $this->target->updateStatoLotto($aggiudicato ? 30 : 21, true); $this->source->lotto = $this->target->lotto = null; } } } return true; } private function aggiudicatari() : Bool { $this->partecipanti(true); return true; } } ?>