/**
  * 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 ========");
 }
 /**
  * Metodi, joka tallentaa muokatun kokonaisuuden tiedot tietokantaan.
  * Palauttaa arvon Malliluokkapohja::$VIRHE, jos tallennus epäonnistuu,
  * muuten arvon Malliluokkapohja::$OPERAATIO_ONNISTUI.
  *
  * Ajaa Malliluokkapohjan vastaavan metodin yli.
  * 
  * Seuraavat arvot asetetaan täällä automaattisesti, joten niistä ei
  * tarvitse muualla huolehtia: 
  * 
  *   ed_muutos_sek
  * 
  * luomishetki_sek-arvoa ei ole syytä muuttaa, vaikka sitä ei estetä täällä.  
  * 
  * Huolehtii myös isikokonaisuuksien on_lapsia-arvojen päivittämisestä silloin, kun
  * isikokonaisuutta vaihdetaan. Tällöin sekä uuden että vanhan isi-
  * kokonaisuuden on_lapsia-arvot tarkistetaan ja päivitetään.
  * 
  * @return int Palauttaa normaalin Malliluokkapohja::$VIRHE tai 
  * Malliluokkapohja::$OPERAATIO_ONNISTUI -arvon.
  * */
 function tallenna_muutokset()
 {
     $this->set_arvo(time(), Kokonaisuusolio::$sarakenimi_ed_muutos_sek);
     // Haetaan tietokannassa olevan olion ylakokonaisuuden_id, koska tämän
     // olion arvoja on jo saatettu muuttaa:
     $vanha = new Kokonaisuusolio($this->get_id(), $this->tietokantaolio);
     $ylakokonaisuuden_id_vanha = $vanha->getYlakokonaisuuden_id();
     $tallennus = parent::tallenna_muutokset();
     if ($tallennus === Malliluokkapohja::$OPERAATIO_ONNISTUI) {
         // Päivitetään on_lapsia, jos kokonaisuus on linkitetty johonkin muuhun:
         $ylakokonaisuuden_id = $this->getYlakokonaisuuden_id();
         if ($ylakokonaisuuden_id != $ylakokonaisuuden_id_vanha) {
             // Jos uusi yläkokonaisuus on olemassaolevan kokonaisuus,
             // varmistetaan, että sillä on lapsia.
             if ($ylakokonaisuuden_id > 0) {
                 $ylakok = new Kokonaisuusolio($ylakokonaisuuden_id, $this->tietokantaolio);
                 if ($ylakok->olio_loytyi_tietokannasta) {
                     $on_lapsia = 1;
                     $onnistuminen = $ylakok->tallenna_on_lapsia_muutos_kokon($on_lapsia);
                     if ($onnistuminen === Kokonaisuusolio::$VIRHE) {
                         $this->lisaa_virheilmoitus(Tekstit::$virheilm_kokon_muutostallennus_lapsimuutos_eiok);
                     }
                 } else {
                     $this->lisaa_virheilmoitus(Tekstit::$ilm_kokon_ei_loytynyt);
                 }
             }
             // Mahdollinen entinen yläkokonaisuus pitää myös tarkistaa, onko
             // sillä vielä lapsia vai ei.  Mutta vain jos id > 0, koska
             // muuten kokonaisuudella ei ennen ollut yläkokonaisuuksia.
             if ($ylakokonaisuuden_id_vanha > 0) {
                 $ylakok_vanha = new Kokonaisuusolio($ylakokonaisuuden_id_vanha, $this->tietokantaolio);
                 if ($ylakok_vanha->olio_loytyi_tietokannasta) {
                     if ($ylakok_vanha->on_lapsia_kokon()) {
                         $on_lapsia = 1;
                     } else {
                         $on_lapsia = 0;
                     }
                     $onnistuminen = $ylakok_vanha->tallenna_on_lapsia_muutos_kokon($on_lapsia);
                     if ($onnistuminen === Kokonaisuusolio::$VIRHE) {
                         $this->lisaa_virheilmoitus(Tekstit::$virheilm_kokon_muutostallennus_lapsimuutos_eiok);
                     }
                 } else {
                     $this->lisaa_virheilmoitus(Tekstit::$ilm_kokon_ei_loytynyt);
                 }
             }
         }
     }
     return $tallennus;
 }