/**
  * Tyhjentää tietokannasta testihenkilöt ja lisävaltuudet (jotka 
  * poistuvat cascade-ominaisuuden vuoksi testihenkilön mukana tietokannasta). 
  */
 public function tee_loppusiivous()
 {
     $this->lisaa_kommentti("======================== SIIVOUS ALKAA =======================");
     $poisto_lkm = $this->tietokantaolio->poista_kaikki_rivit("henkilot", Henkilo::$sarakenimi_syntymavuosi, Kayttajatestaus::$testi_svuosi);
     // Poistetaan testikokonaisuus, jonka poisto poistaa siihen liittyvät
     // tehtävät ja ratkaisut:
     if ($this->testikokonaisuus instanceof Kokonaisuusolio) {
         $poisto_kokon = $this->testikokonaisuus->poista();
         if ($poisto_kokon == Kokonaisuusolio::$OPERAATIO_ONNISTUI) {
             $poisto_kokon_lkm = 1;
         } else {
             $poisto_kokon_lkm = 0;
         }
     } else {
         $poisto_kokon_lkm = 0;
     }
     // Poistetaan testiratkaisut:
     $poisto_lkm_ratkaisut = $this->tietokantaolio->poista_kaikki_rivit("Ratkaisut", "ratkaisu", Kayttajatestaus::$testi_ratkaisu);
     if ($poisto_lkm_ratkaisut == 0) {
         $poisto_kommentti_ratkaisut = "";
         // Kaikki kunnossa:
     } else {
         $poisto_kommentti_ratkaisut = "Virhe: ratkaisuja poistettu" . $poisto_lkm_ratkaisut . " kpl, vaikka piti poistua itse!";
     }
     // Yritetään vielä poistaa testilisävaltuudet, joita ei pitäisi löytyä:
     $poisto_lkm_valtuudet = $this->tietokantaolio->poista_kaikki_rivit("Lisavaltuudet", Lisavaltuudet::$sarakenimi_henkilo_id, $this->testihenkilo->get_id());
     if ($poisto_lkm_valtuudet == 0) {
         $this->lisaa_kommentti("Siivous suoritettu onnistuneesti. \n                                Poistettu " . $poisto_lkm . " henkilöä" . " ja " . $poisto_kokon_lkm . " kokonaisuutta. " . " Lisävaltuudet poistettu automaattisesti. " . $poisto_kommentti_ratkaisut);
     } else {
         $this->lisaa_virheilmoitus("Virhe siivouksessa! \n                                Poistettu " . $poisto_lkm . " henkilöä" . " ja " . $poisto_lkm_ratkaisut . " ratkaisua, mutta " . "myös " . $poisto_lkm_ratkaisut . " lisävaltuutta," . " vaikka niiden pitäisi itsestään poistua!");
     }
     $this->lisaa_kommentti("======================== SIIVOUS TEHTY ========================");
 }
 /**
  * Toteuttaa kokonaisuuden poistotoiminnon ellei kokonaisuudella ole lapsia.
  * Jos on, käsketään poistamaan ensin lapset. Jos kokonaisuus poistetaan,
  * tarkistetaan sen mahdollisen yläkokonaisuuden lapsekkuus.
  *
  * HUOM! On_lapsia kenttä tietokannassa aiheutti tästä aika monimutkaisen.
  * Ajattelin sen kuitenkin kannattavan, koska se vähentää suuresti
  * tietokantahakuja usein toistuvissa hauissa. 
  * 
  * Yllä mainitusta syystä on olennaisen tärkeää käyttää tätä metodia
  * kokonaisuuden poistamiseen.
  *
  * @return Palaute $palauteolio
  */
 function toteuta_poista(&$palauteolio)
 {
     $parametriolio = $this->get_parametriolio();
     $onnistuminen = Palaute::$VIRHEKOODI_YLEINEN;
     $id_kokon = $parametriolio->get_id_kokon();
     $tietokantaolio = $parametriolio->get_tietokantaolio();
     $palauteolio = new Palaute();
     $palaute = "";
     // Tämä tulee palauteolion sisällöksi.
     $poistettava = new Kokonaisuusolio($id_kokon, $tietokantaolio);
     //================== Edellisen kokonaisuuden id_n haku =================
     // Kun kokonaisuus poistetaan, pitää sitä edeltävän kokonaisuuden id
     // hakea, jotta se näätetään ensi kerralla. Ellei edellistä ole,
     // näytetään seuraava.
     $ed_id = Kokonaisuusolio::$kokon_ei_maaritelty;
     $oppiaineindeksi = $parametriolio->oppiaine_kokon;
     $taso = $parametriolio->taso_kokon;
     $kieli_id = $parametriolio->kieli_id;
     $omaid = $parametriolio->get_omaid();
     $ylakokonaisuuden_id = -1;
     // 1. tason kokonaisuudet - ei yläkokonaisuutta.
     $otsikkomerkinta_alussa = "";
     $otsikkotaso_alussa = Kokonaisuusolio::$otsikkotaso_oletus;
     $kokonaisuustaulukko = array();
     // Seuraava on aina taulukko (array), joka voi olla tyhjä:
     $kokonaisuusoliot = $this->hae_kokonaisuusoliopuu($kokonaisuustaulukko, $otsikkomerkinta_alussa, $otsikkotaso_alussa, $kieli_id, $oppiaineindeksi, $taso, $ylakokonaisuuden_id, $tietokantaolio, $omaid);
     // ASetetaan edellisten ja seuraavien kokonaisuuksien id:t:
     $this->aseta_ed_ja_seur_idt_kokonaisuuksiin($kokonaisuusoliot);
     if (!empty($kokonaisuusoliot)) {
         foreach ($kokonaisuusoliot as $kokonolio) {
             if ($kokonolio instanceof Kokonaisuusolio && $kokonolio->get_id() == $id_kokon) {
                 $ed_id = $kokonolio->getEdellisenId_kaikista();
                 if ($ed_id == Kokonaisuusolio::$kokon_edellista_ei_ole) {
                     $ed_id = $kokonolio->getSeuraavanId_kaikista();
                 }
             }
         }
     }
     //=========================================================================
     if ($poistettava->olio_loytyi_tietokannasta) {
         // Poistometodi tarkastaa, onko lapsia ja huolehtii on_lapsia-arvoista.
         $palaute = $poistettava->poista();
         if ($palaute === Malliluokkapohja::$OPERAATIO_ONNISTUI) {
             // Poistetaan mahdolliset tyhjään osoittavat kooste-elementit:
             if (Elementti::poista_elementit($tietokantaolio, Oliotyyppi::$KOKONAISUUS, $id_kokon) === Malliluokkapohja::$OPERAATIO_ONNISTUI) {
                 $palaute = Tekstit::$ilm_kokon_poisto_ok;
                 //Aktiivisuusmerkintä:
                 $aktiivisuuspalaute = paivita_aktiivisuus($omaid, $tietokantaolio, time(), Aktiivisuus::$KOKONAISUUDEN_POISTO);
                 if (!$aktiivisuuspalaute) {
                     $this->lisaa_virheilmoitus(Tekstit::$virheilm_aktiivisuuden_tallennus_eiok);
                 } else {
                     $onnistuminen = Palaute::$VIRHEKOODI_KAIKKI_OK;
                 }
             } else {
                 $palaute = Tekstit::$kooste_virheilm_elementtien_poistosiivous_ei_ok;
             }
         } else {
             $palaute = Tekstit::$virheilm_kokonaisuuden_poisto;
         }
     } else {
         $palaute = Tekstit::$ilm_kokon_poisto_eiok_kokonaisuutta_ei_loytynyt;
     }
     $parametriolio->set_id_kokon($ed_id);
     // Jotta osaa näyttää edellisen.
     $this->toteuta_nayta($palauteolio);
     $palauteolio->set_ilmoitus($palaute);
     $palauteolio->set_virhekoodi($onnistuminen);
     $palauteolio->set_valikkonaytto(true);
     $palauteolio->nayta_kiintolinkit();
     return $palauteolio;
 }
 /**
  * Testaa sitä, pysyykö kokonaisuuden on_lapsia-arvo mukana, kun
  * lapsikokonaisuus luodaan, poistetaan tai sen isäntää muutetaan. Lisäksi
  * testaa, antaako metodi on_lapsia_kokon()-metodi oikeat arvot.
  * 
  */
 function testaa_kokon_on_lapsia_muutokset()
 {
     $this->lisaa_lihava_kommentti("============ Testataan on_lapsia-arvon muutokset ==================");
     // Tarkistetaan on_lapsia-arvot kokonaisuuksilta kokon2 ja kokon3,
     // joilla siis ei pitäisi olla lapsia. Tarkistetaan samalla, että
     // funktion on_lapsia_kokon() antaa oikean vastauksen.
     // Huom! Näissä === ei toiminut!
     if ($this->kokon2 instanceof Kokonaisuusolio) {
         if ($this->kokon2->getOn_lapsia() == 0 && $this->kokon3->getOn_lapsia() == 0 && !$this->kokon3->on_lapsia_kokon()) {
             $this->lisaa_kommentti("Oikein! Kokon2 ja kokon3 ovat lapsettomia!" . " Lisäksi on_lapsia_kokon()-metodi antaa oikean vastauksen!");
         } else {
             $this->lisaa_virheilmoitus("Virhe kokon2:n tai kokon3:n " . "on_lapsia-arvossa tai on_lapsia_kokon()-metodin arvossa!" . " Kokon2_on_lapsia=" . $this->kokon2->getOn_lapsia() . " ja kokon3_on_lapsia=" . $this->kokon3->getOn_lapsia());
         }
     } else {
         $this->lisaa_virheilmoitus("Virhe kokon2 ei ole Kokonaisuusolio!");
     }
     // Lisätään uusi kokonaisuus, jonka isäntä on kokon3:
     $ylakokon_id = $this->kokon3->get_id();
     $palauteolio = $this->luo_testikokonaisuus("Huu", "Haa", $ylakokon_id);
     $testilapsikokon = new Kokonaisuusolio($palauteolio->get_muokatun_id(), $this->tietokantaolio);
     if ($testilapsikokon->olio_loytyi_tietokannasta) {
         $this->lisaa_kommentti("Testilapsikokonaisuuden tallennus ok!");
         // Tarkistetaan, että on_lapsia-arvo on muuttunut kokon3:lla ja
         // on_lapsia_kokon näyttää positiivista:
         // Päivitetään ensin arvot tietokannasta:
         $this->kokon3->paivita_olion_tiedot_tietokannasta();
         if ($this->kokon3->getOn_lapsia() == 1 && $this->kokon3->on_lapsia_kokon()) {
             $this->lisaa_kommentti("Oikein! kokon3:n lapsiarvo=1 ja " . "on_lapsia_kokon()-metodi palaute true!");
         } else {
             $this->lisaa_virheilmoitus("Virhe kokon3:n on_lapsia-arvossa! (=" . $this->kokon3->getOn_lapsia() . ") tai " . "on_lapsia_kokon()-metodin palautteessa");
         }
         // Muutetaan isäntä kokon2:seen:
         $this->lisaa_kommentti("Vaihdetaan isäntä kokon2:seen.");
         $uusi_isanta_id = $this->kokon2->get_id();
         $testilapsikokon->setYlakokonaisuuden_id($uusi_isanta_id);
         $testilapsikokon->tallenna_muutokset();
         // Tarkistetaan, että on_lapsia-arvot kohdillaan entisessä
         // ja uudessa isännässä:
         $this->lisaa_kommentti("Tarkistetaan, onko on-lapsia arvot " . " kohdallaan kokon2:ssa ja kokon3:ssa.");
         $this->kokon2->paivita_olion_tiedot_tietokannasta();
         $this->kokon3->paivita_olion_tiedot_tietokannasta();
         if ($this->kokon2->getOn_lapsia() == 1 && $this->kokon3->getOn_lapsia() == 0) {
             $this->lisaa_kommentti("Oikein! Kokon3 on lapseton ja kokon2 ei!");
         } else {
             $this->lisaa_virheilmoitus("Virhe kokon2:n tai kokon3:n " . "on_lapsia-arvossa! Kokon2_on_lapsia=" . $this->kokon2->getOn_lapsia() . " ja kokon3_on_lapsia=" . $this->kokon3->getOn_lapsia());
         }
         // Tehdään vielä poisto ja tarkistetaan isännän lapsettomuus:
         $this->lisaa_kommentti("Poistetaan testilapsi, jolloin kokon2:n" . " pitäisi taas olla lapseton:");
         $testilapsikokon->poista();
         $this->kokon2->paivita_olion_tiedot_tietokannasta();
         if ($this->kokon2->getOn_lapsia() == 0) {
             $this->lisaa_kommentti("Oikein! Kokon2 on taas lapseton!");
         } else {
             $this->lisaa_virheilmoitus("Virhe kokon2:n " . "on_lapsia-arvossa! Kokon2_on_lapsia=" . $this->kokon2->getOn_lapsia());
         }
     } else {
         $this->lisaa_virheilmoitus("Virhe testilapsikokonaisuuden tallennuksessa!");
     }
     $this->lisaa_lihava_kommentti("============ Loppuu on_lapsia-arvon muutosten testaus ========");
 }