/**
  * Palauttaa kokonaisuuden tiivistelmän Html-koodina, johon on lisätty
  * myös sammutuspainike. Tämän avulla kokonaisuuden Html-koodia päästään
  * tarkastelemaan ilman muokkaukseen menoa. Helpottaa esim. kopiointia.
  */
 function hae_tiivistelmakoodi()
 {
     $sulkemisnappi = "<button onclick='sulje_esikatselu()' title='" . Painikkeet::$KOODIKATSELU_SULJE_TITLE . "'>" . Painikkeet::$KOODIKATSELU_SULJE_VALUE . "</button>";
     $koodi = Html::luo_div($sulkemisnappi, array(Attr::style("text-align: center")));
     $id = $this->get_parametriolio()->id_kokon;
     $kokonaisuus = new Kokonaisuusolio($id, $this->get_tietokantaolio());
     if ($kokonaisuus->olio_loytyi_tietokannasta) {
         $koodi .= nl2br(htmlspecialchars($kokonaisuus->getTiivis()));
     } else {
         $koodi .= Tekstit::$ilm_kokon_ei_loytynyt . ". ID=" . $id;
     }
     return $koodi;
 }
 /**
  * Palauttaa html-lomakkeen, jonka avulla voidaan tallentaa uuden
  * kokonaisuuden tiedot tietokantaan tai muokata vanhoja. Lomakkeen html-id on
  * 'kokonaisuuslomake'.
  *
  * @param <type> $id_kokon
  * @param <type> $omaid
  * @param <type> $uusi
  * @param <type> $ilmoitus_kokon
  * @param Tietokantaolio $tietokantaolio
  * @param <type> $oppiaine_kokon
  * @param <type> $otsikko_kokon
  * @param <type> $tiivis_kokon
  * @param <type> $selitys_kokon
  * @param <type> $taso_kokon
  * @param <type> $jarjestysnro_kokon
  * @param <type> $laajennetun_id_kokon
  * @param <type> $ylakokonaisuuden_id_kokon
  * @param <type> $kieli_id
  * @param <type> $toiminnan_name_arvo
  * @param Kokonaisuuskontrolleri $kokonaisuuskontrolleri Tämä vähän
  * suurellinen, mutten äkkiä parempaa keinoa keksinyt (15.1.2015)
  * @param int $kaavakieli viittaa käytettävään matematiikan kaavakieleen
  * (28.11.2015)
  * @param Elementti $elementti on Elementti-luokan olio, johon tämä
  * kokonaisuus kuuluu, tai sitten Elementti::$MUUTTUJAA_EI_MAARITELTY,
  * ellei tulla koosteesta.
  * (20.2.2016)
  * @return <type>
  */
 function nayta_kokonaisuuslomake($id_kokon, $omaid, $uusi, $ilmoitus_kokon, $tietokantaolio, &$oppiaine_kokon, &$otsikko_kokon, &$tiivis_kokon, &$selitys_kokon, &$taso_kokon, &$jarjestysnro_kokon, &$laajennetun_id_kokon, &$ylakokonaisuuden_id_kokon, &$kieli_id, &$nakyvyys_kokon, $toiminnan_name_arvo, $kokonaisuuskontrolleri, $kaavakieli, $elementti, $elemryhma)
 {
     $mj = "";
     // Lomakkeen html-koodi.
     $otsikon_maxpituus = 150;
     $submitnappi = "";
     $perunappi = "";
     $uusi_kuva_tiivis = "";
     $uusi_kuva_seli = "";
     $tulo_koosteesta = false;
     // True, if coming from Kooste (Package).
     $kokonaisuus = "";
     // Tämä haetaan tietokannasta.
     /*$uusi_kuva_tiivis = "";
       $uusi_kuva_seli = "";*/
     $submit_kesken_nappi = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$TALLENNA_KESKEN_KOKON_VALUE . "' " . "title='" . Painikkeet::$TALLENNA_KESKEN_KOKON_TITLE . "'/>";
     $esikatselunappi = "<button type='button' " . "onclick='nayta_kokonaisuuden_esikatselu(" . $id_kokon . ")'" . "title='" . Painikkeet::$ESIKATSELU_TITLE . "'/>" . Painikkeet::$ESIKATSELU_VALUE . "</button>";
     $elementtitiedot = "";
     // urliin lisättävät koosteen ja elementin idt
     if ($uusi) {
         $submitnappi = "<input type='submit'\n            name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$TALLENNA_UUSI_KOKON_VALUE . "'/>";
         $perunappi = "<input type='submit'\n                    name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$PERU_UUDEN_KOKON_TALLENNUS_VALUE . "'/>";
     } else {
         // Haetaan ajantasalla olevat tiedot tietokannasta. Aiemmin
         // tiedot tuotiin kiinteästi painikelomakkeeseen, mutta tällöin
         // tämän jälkeen olioon tehdyt muutokset eivät näkyneet, jos
         // alkoi tehdä muutoksia olioon.
         $kokonaisuus = new Kokonaisuusolio($id_kokon, $tietokantaolio);
         if ($kokonaisuus->olio_loytyi_tietokannasta) {
             $oppiaine_kokon = $kokonaisuus->getOppiaine();
             // Alla ovat tärkeitä, jotta esim. JS-koodi toimii, eikä
             // ala kehittämään mitään ylimääräistä muokatessa. Huom:
             // stripslash pilaa latex-koodin, eikä ilm tarpeellinen.
             $otsikko_kokon = htmlspecialchars($kokonaisuus->getOtsikko(), ENT_QUOTES, "UTF-8", true);
             $tiivis_kokon = htmlspecialchars($kokonaisuus->getTiivis(), ENT_QUOTES, "UTF-8", true);
             $selitys_kokon = htmlspecialchars($kokonaisuus->getSelitys(), ENT_QUOTES, "UTF-8", true);
             /*$otsikko_kokon = stripslashes($kokonaisuus->getOtsikko());
               $tiivis_kokon = stripslashes($kokonaisuus->getTiivis());
               $selitys_kokon = stripslashes($kokonaisuus->getSelitys());*/
             $taso_kokon = $kokonaisuus->getTaso();
             $jarjestysnro_kokon = $kokonaisuus->getJarjestysnro();
             $laajennetun_id_kokon = $kokonaisuus->getLaajennetun_id();
             $ylakokonaisuuden_id_kokon = $kokonaisuus->getYlakokonaisuuden_id();
             $nakyvyys_kokon = $kokonaisuus->getNakyvyys();
             $submitnappi = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$TALLENNA_MUOKKAUS_KOKON_VALUE . "'" . "title='" . Painikkeet::$TALLENNA_MUOKKAUS_KOKON_TITLE . "'/>";
             $perunappi = "<input type='submit'\n                    name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$PERU_KOKON_MUUTOSTEN_TALLENNUS_VALUE . "'/>";
             //==============================================================
             // Täällä katsotaan, onko käyttäjä tulossa koosteesta ja
             // mahdollistetaan kätevä paluu takaisin.=======================
             if ($elementti instanceof Elementti) {
                 $kooste_id = $elementti->get_arvo(Elementti::$sarakenimi_kooste_id);
                 $elem_id = $elementti->get_id();
                 //$koostenakymat = new Koostenakymat();
                 //$perunappi = $koostenakymat->
                 //        nayta_inputpainike_paluu_koosteeseen_no_form();
                 $elementtitiedot = "&" . Koostekontrolleri::$kooste_name_id . "=" . $kooste_id . "&" . Koostekontrolleri::$elementti_name_id . "=" . $elem_id;
                 $tulo_koosteesta = true;
             }
             if ($elemryhma instanceof Elementtiryhma) {
                 $elemryhma_id = $elemryhma->get_id();
                 $elementtitiedot .= "&" . Koostekontrolleri::$elemryhma_name_id . "=" . $elemryhma_id . "&";
                 $tulo_koosteesta = true;
             }
             //========= Kuvan lisäyspainikkeet: paluu vanhaan ideaan ===========
             /* Uuden kuvan lisäyspainike tiivistelmään*/
             $uusi_kuva_tiivis = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$LISAA_KUVA_MANUAALI_TIIVIS_KOKON_VALUE . "'" . "title='" . Painikkeet::$LISAA_KUVA_MANUAALI_TIIVIS_KOKON_TITLE . "'/>";
             /* Uuden kuvan lisäyspainike selitykseen:*/
             $uusi_kuva_seli = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$LISAA_KUVA_MANUAALI_SELITYS_KOKON_VALUE . "'" . "title='" . Painikkeet::$LISAA_KUVA_MANUAALI_SELITYS_KOKON_TITLE . "'/>";
             //==================================================================
         } else {
             $this->lisaa_virheilmoitus(Tekstit::$ilm_kokon_ei_loytynyt);
             return $this->tulosta_virheilmoitukset() . $perunappi;
         }
     }
     // End of päivitetään vanhaa.
     // NÄkyvyysvalikko: ====================================================
     $oletusarvo = $nakyvyys_kokon;
     $nakyvyydet = new Nakyvyys();
     $select_maaritteet = array(Attr::name(Kokonaisuuskontrolleri::$kokon_name_nakyvyys), Attr::title(Tekstit::$nakyvyys_valikko_otsikko_title));
     $option_maaritteet = array();
     $nakyvyysvalikko = $nakyvyydet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $oletusarvo, Tekstit::$nakyvyys_valikko_otsikko);
     //======================================================================
     // Ilmoitus otetaan mukaan, jos ei tyhjä:
     if ($ilmoitus_kokon != "") {
         $ilmoitus_kokon = "<span class='kokonaisuuslomakeilmoitus'>" . $ilmoitus_kokon . "</span><br />";
     }
     $oppiainehtml = Tekstit::$oppiainevalikko_otsikko . ": <b>" . Oppiaineet::hae_oppiaineen_nimi($oppiaine_kokon) . "</b>";
     $koulutasohtml = Tekstit::$tasovalikko_otsikko . ": <b>" . Koulutasot::hae_koulutason_nimi($taso_kokon, false) . "</b>";
     // Kielivalintavalikko: VALINTA POISTETTU toimintavaikeuksien takia!
     //$kielivalintahtml = nayta_kielivalikko($kieli_id);
     $kielivalintahtml = Tekstit::$kielivalikko_otsikko . ": <b>" . Kielet::hae_kielen_nimi($kieli_id) . "</b>";
     // Ylempi kokonaisuustaso
     $ylakokonvalikko = $this->nayta_ylakokonaisuusvalikko($id_kokon, $tietokantaolio, $ylakokonaisuuden_id_kokon, $oppiaine_kokon, $kieli_id, $taso_kokon, $uusi, $omaid, $kokonaisuuskontrolleri);
     // Tekstinmuokkaus tiivistelmää varten:
     $muokattavan_elementin_id_tii = "tiivis_tekstiruutu";
     $alasvetovalikon_id = "merkit1_tiivis";
     $tekstityokaluolio = new Tekstityokalupalkki($muokattavan_elementin_id_tii, $alasvetovalikon_id);
     // Nykyään nämä toimii sekä tiivistelmälle että selitykselle.
     // Lomake osaa huomata, kunpaa ollaan muokkaamassa:
     $tekstimuokkauspainikkeet = $tekstityokaluolio->luo_painikkeet(Tekstityokalupalkki::$PERUSPAINIKKEET_JA_MATEMAATTISET, $kaavakieli);
     // Tekstinmuokkaus selitystä varten:
     $muokattavan_elementin_id_sel = "selitys_tekstiruutu";
     // Kaavakielivalikko:==================================================
     $kaavakielet = new Kaavakieli();
     $select_maaritteet = array(Attr::onchange("muuta_kaavakieli", array("this.value", Yleiset_arvot::$kaavakieli_name, $muokattavan_elementin_id_tii, $alasvetovalikon_id)));
     $option_maaritteet = array();
     $kaavakielivalikko = $kaavakielet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $kaavakieli, Tekstit::$kaavakieli_otsikko);
     //=====================================================================
     if ($uusi) {
         // Ellei id-kokon-arvoa määritellä täällä, tulee sessiomuuttujasta vanha.
         $id_kokon = Kokonaisuusolio::$kokon_ei_maaritelty;
     }
     // Vanha ylakokon_id otetaan talteen, jotta lapsiasiat pysyvät
     // oikealla tolalla. Haetaan mahdollisimman tuoreet tiedot.
     $ylakokonaisuuden_id_vanha = $ylakokonaisuuden_id_kokon;
     if ($kokonaisuus instanceof Kokonaisuusolio) {
         $ylakokonaisuuden_id_vanha = $kokonaisuus->getYlakokonaisuuden_id();
     }
     /*lisaaTagit(elementin_id, elementin_tunnus, class_arvo, id_arvo*/
     // Sitten palat yhteen:
     $mj = "<form align='left' method='post' id='kokonaisuuslomake'" . "action='index.php?id_kokon=" . $id_kokon . "&ylakokonaisuuden_id_vanha=" . $ylakokonaisuuden_id_vanha . "&taso_kokon=" . $taso_kokon . "&kieli_id=" . $kieli_id . "&uusi=" . $uusi . $elementtitiedot . "'/>" . $ilmoitus_kokon . "<b>" . Tekstit::$kokonlomake_ohje . "</b>" . $esikatselunappi . "<table summary='uudet_tiedot'>" . "<tr><td>" . Tekstit::$kokonlomake_otsikko . ": </td><td><input type='text'\n            size='55' maxlength='{$otsikon_maxpituus}'" . "name='otsikko_kokon' value='{$otsikko_kokon}'" . "id='otsikkotekstikentta'" . "title='" . Tekstit::$kokonlomake_otsikkotitle . "'/>" . "</tr>" . "<tr><td></td>" . "<td>" . " " . $ylakokonvalikko . " " . $nakyvyysvalikko . "</td>" . "</tr>" . "<tr><td></td><td>" . $kaavakielivalikko . " " . $oppiainehtml . " " . $koulutasohtml . " " . $kielivalintahtml . "</td></tr>" . "<tr><td></td><td colspan='2'>" . $tekstimuokkauspainikkeet . "</td></tr>" . "<tr><td>" . Tekstit::$kokonlomake_tiivis . ":</td>" . "<td colspan='2'><textarea cols='80' rows='18' maxlength = '10000'\n            id='" . $muokattavan_elementin_id_tii . "' name='tiivis_kokon' \n            onfocus='kirjoituskentta_onfocus(\"tiivis_tekstiruutu\")'>" . $tiivis_kokon . "</textarea></td></tr>" . "<tr><td>" . Tekstit::$kokonlomake_selitys . ":</td>" . "<td colspan='2'><textarea cols='80' rows='9' maxlength = '10000'\n            id='" . $muokattavan_elementin_id_sel . "' name='selitys_kokon'\n            onfocus='kirjoituskentta_onfocus(\"selitys_tekstiruutu\")'>" . $selitys_kokon . "</textarea></td></tr>" . "<tr><td></td><td align='left'>" . $submitnappi . $submit_kesken_nappi . $uusi_kuva_tiivis . $uusi_kuva_seli . $perunappi . "</td></tr>" . "</table>" . "</form>";
     return $mj;
 }
 function testaa_toteuta_metodeita()
 {
     /*********** Testataan "toteuta"-kokonaisuustoiminnot tarkemmin  ************/
     $this->lisaa_lihava_kommentti("Testataan kaikki 'toteuta'-toiminnot, jotka liittyvät\n                    kokonaisuuksiin:");
     $tallennetun_id = Kokonaisuusolio::$MUUTTUJAA_EI_MAARITELTY;
     if ($this->testihenkilo1 instanceof Henkilo) {
         $this->parametriolio->set_omaid($this->testihenkilo1->get_id());
     } else {
         $this->parametriolio->set_omaid(1);
         // Arvataan vain..
         $this->lisaa_kommentti("Testihenkiloa nro 1 ei loytynyt, omaid on 1," . " mikä voi onnistua tai sitten ei..");
     }
     $kokon2_id = Kokonaisuusolio::$MUUTTUJAA_EI_MAARITELTY;
     $kokon3_id = Kokonaisuusolio::$MUUTTUJAA_EI_MAARITELTY;
     $this->lisaa_lihava_kommentti("toteuta_uuden_kokon_tallennus:");
     // Järjestysluku on pantu -1:ksi, jotta korjauskin testataan. Asetetaan
     // nämä kokonaisuudet yllä luodun kokonaisuuden alle, jotta testausidea
     // toimii paremmin.
     if ($this->kokon1 instanceof Kokonaisuusolio) {
         //==========================
         $this->parametriolio->set_oppiaine_kokon(Oppiaineet::$FY);
         $this->parametriolio->set_otsikko_kokon("Kokon 1.1");
         $this->parametriolio->set_tiivis_kokon("Tämä on ihan uusi testitiivistelmä");
         $this->parametriolio->set_selitys_kokon(KokonTehtRatkTestaus::$testikokon_selitys);
         $this->parametriolio->set_taso_kokon(Koulutasot::$PERUSKOULU);
         $this->parametriolio->set_jarjestysnro_kokon(-1);
         $this->parametriolio->set_laajennetun_id_kokon(-1);
         $this->parametriolio->set_kieli_id(Kielet::$SUOMI);
         $this->parametriolio->set_ylakokonaisuuden_id_kokon($this->kokon1->get_id());
         $this->parametriolio->set_valtuudet(Valtuudet::$HALLINTA);
         //=========================
         $palauteolio = new Palaute();
         $this->kokonaisuuskontrolleri->toteuta_tallenna_uusi($palauteolio);
         if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
             $this->lisaa_virheilmoitus("Uuden kokon tallennus 1: VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus());
         } else {
             $this->lisaa_kommentti("Virheita ei havaittu!");
         }
         $kokon2_id = $palauteolio->get_muokatun_id();
         $tallennetun_id = $kokon2_id;
     } else {
         $this->lisaa_virheilmoitus("Virhe: kokon1 ei olio!");
     }
     /*============================= 2 ======================================*/
     if ($this->kokon1 instanceof Kokonaisuusolio) {
         $this->lisaa_kommentti("<b>Luodaan toinen uusi kokonaisuus\n                    (toteuta_uuden_kokon_tallennus):</b><br />");
         $this->parametriolio->set_otsikko_kokon("Ja taas uusi testikokonaisuus");
         $this->parametriolio->set_tiivis_kokon("Tämä on jotakin hassua!");
         $this->parametriolio->set_selitys_kokon(KokonTehtRatkTestaus::$testikokon_selitys);
         $this->kokonaisuuskontrolleri->toteuta_tallenna_uusi($palauteolio);
         if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
             $this->lisaa_virheilmoitus("Kohta 2: VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus());
         } else {
             $this->lisaa_kommentti("Virheita ei havaittu! Testikokonaisuudet:");
         }
         $kokon3_id = $palauteolio->get_muokatun_id();
         $this->lisaa_kommentti($this->nayta_testikokonaisuudet($tallennetun_id));
     } else {
         $this->lisaa_virheilmoitus("Virhe: kokon2 ei olio!");
     }
     /*=================================3===================================*/
     $this->lisaa_kommentti("<b>toteuta_korjaa_jarjestysnro:</b>");
     $this->kokonaisuuskontrolleri->toteuta_korjaa_jarjestysnro($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("Kohta 3: VIRHEKOODI (toteuta_korjaa_jarjestysnro)=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus());
     } else {
         $this->lisaa_kommentti("Virheita ei havaittu!");
     }
     /*=================================3===================================*/
     $this->lisaa_kommentti("<b>toteuta_nayta_selitys:</b><br />");
     $this->parametriolio->set_id_kokon($kokon2_id);
     $this->kokonaisuuskontrolleri->toteuta_nayta_selitys($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("VIRHEKOODI (toteuta_nayta_selitys)=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus());
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     /*=================================3===================================*/
     $this->lisaa_kommentti("<b>toteuta_sulje_selity:</b><br />");
     $this->kokonaisuuskontrolleri->toteuta_sulje_selitys($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("VIRHEKOODI (toteuta_sulje_selitys)=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus());
     } else {
         $this->lisaa_kommentti("Virheita ei havaittu!");
     }
     /*=================================3===================================*/
     $this->lisaa_kommentti("<b>toteuta_nayta_kokonaisuuslomake:</b><br />");
     $this->parametriolio->set_uusi(true);
     $this->kokonaisuuskontrolleri->toteuta_nayta_kokonaisuuslomake($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     /*=================================3===================================*/
     $this->lisaa_kommentti("<b>toteuta_peru_uuden_kokonaisuuden_tallennus:</b><br />");
     $this->kokonaisuuskontrolleri->toteuta_peru_uuden_kokonaisuuden_tallennus($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //$this->lisaa_kommentti($palauteolio->get_sisalto());
     /*=================================3===================================*/
     $this->lisaa_kommentti("<b>toteuta_nayta_kokonaisuuden_poistovarmistus:</b><br />");
     $this->kokonaisuuskontrolleri->toteuta_nayta_poistovarmistus($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //$this->lisaa_kommentti($palauteolio->get_sisalto());
     /*=================================3===================================*/
     $this->lisaa_kommentti("<b>toteuta_peru_kokonaisuuden_poisto:</b><br />");
     $this->kokonaisuuskontrolleri->toteuta_peru_kokonaisuuden_poisto($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     /*=================================3===================================*/
     // Luodaan poistettava kokonaisuus:
     $this->lisaa_kommentti("<b>Luodaan uusi kokonaisuus, joka sitten poistetaan:\n               :</b><br />");
     $this->parametriolio->set_otsikko_kokon("Poistettava testikokonaisuus");
     $this->parametriolio->set_tiivis_kokon("Puhdasta roskaa!");
     $this->kokonaisuuskontrolleri->toteuta_tallenna_uusi($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     $kokon4_id = $palauteolio->get_muokatun_id();
     /*=================================3===================================*/
     $this->lisaa_kommentti("<b>\$this->kokonaisuuskontrolleri->toteuta_kokon_poisto:</b><br />");
     $this->parametriolio->set_id_kokon($kokon4_id);
     $this->kokonaisuuskontrolleri->toteuta_poista($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //==========================================================================
     $this->lisaa_kommentti("<b>toteuta_nayta_kokonaisuuslomake (uusi kokon):</b><br />");
     $this->parametriolio->set_uusi(true);
     $this->kokonaisuuskontrolleri->toteuta_nayta_kokonaisuuslomake($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
         $this->lisaa_kommentti($palauteolio->get_sisalto());
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //=========================================================================
     // HUOM tämä suorittaa myös kokonaisuuden lukitsemisen muokkausta varten:
     $this->lisaa_kommentti("<b>toteuta_nayta_kokonaisuuslomake (muokkaus):</b>");
     $this->parametriolio->set_uusi(false);
     $this->kokonaisuuskontrolleri->toteuta_nayta_kokonaisuuslomake($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus());
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //=========================================================================
     $this->lisaa_kommentti("<b>toteuta_tallenna_kokonaisuuden_muokkaus:</b>");
     // Haetaan vanha selitys, jotta nähdään, muuttuuko:
     $kokon_alkup = new Kokonaisuusolio($tallennetun_id, $this->tietokantaolio);
     $tii_alkup = $kokon_alkup->getTiivis();
     $this->lisaa_kommentti("Tiivis alkup: " . $tii_alkup . ". Tarkoitus" . " on muuttaa muotoon 'Muutettu on tätä hieman!'");
     // Muutetaan vähän:
     $this->parametriolio->id_kokon = $tallennetun_id;
     $this->parametriolio->set_tiivis_kokon("Muutettu on tätä hieman!");
     $this->kokonaisuuskontrolleri->toteuta_tallenna_muokkaus($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("VIRHEKOODI (toteuta_tallenna_kokonaisuuden_muokkaus) =" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus());
         $this->lisaa_kommentti($this->nayta_testikokonaisuudet($tallennetun_id));
     } else {
         $this->lisaa_kommentti("Virheita ei havaittu!");
     }
     $kokon_muok = new Kokonaisuusolio($tallennetun_id, $this->tietokantaolio);
     $tii_muok = $kokon_muok->getTiivis();
     $this->lisaa_kommentti("Muokkauksen jälkeen tiivistelmä on seuraava: " . $tii_muok);
     //
     //=========================================================================§
     // Lukitaan kokonaisuus käsin muokkausta varten. Tämä tehdään oikeasti
     //lomakkeen näytön yhteydessä, mikä testattiin edellisessä kohdassa.
     $id_kokon = $this->parametriolio->get_id_kokon();
     $muokattava = new Kokonaisuusolio($id_kokon, $this->tietokantaolio);
     $lukon_tila = Kokonaisuusolio::$LUKITUS_ON;
     $lukitus = $muokattava->aseta_kokonaisuuden_lukitus($this->parametriolio->get_omaid(), $lukon_tila);
     //=========================================================================§
     $this->lisaa_kommentti("<b>toteuta_peru_kokon_muokkausten_tallennus:</b><br />");
     $this->kokonaisuuskontrolleri->toteuta_peru_kokon_muokkausten_tallennus($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("VIRHEKOODI (toteuta_peru_kokon_muokkausten_tallennus) =" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus());
         $this->lisaa_kommentti($this->nayta_testikokonaisuudet($tallennetun_id));
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //$this->lisaa_kommentti( $palauteolio->get_sisalto());
     //=========================================================================§
     $this->lisaa_kommentti("<b>toteuta_vaihda_kokonaisuuksien_jarjestys:</b><br />");
     $this->parametriolio->set_ed_id_kokon($kokon2_id);
     $this->parametriolio->set_id_kokon($kokon3_id);
     $this->kokonaisuuskontrolleri->toteuta_vaihda_kokonaisuuksien_jarjestys($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //=========================================================================§
     $this->lisaa_kommentti("<b>toteuta_nayta_kuvalomake_kokon_tiivistelma</b><br />");
     $this->kokonaisuuskontrolleri->toteuta_nayta_kuvalomake_kokon($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //$this->lisaa_kommentti( $palauteolio->get_sisalto());
     //=========================================================================§
     $this->lisaa_kommentti("<b>toteuta_nayta_kuvalomake_kokon_selitys:</b><br />");
     $this->kokonaisuuskontrolleri->toteuta_nayta_kuvalomake_kokon($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //$this->lisaa_kommentti( $palauteolio->get_sisalto());
     //=========================================================================§
     $this->lisaa_kommentti("<b>toteuta_nayta_kokonaisuudet:</b><br />");
     $this->kokonaisuuskontrolleri->toteuta_nayta($palauteolio);
     if ($palauteolio->get_virhekoodi() != Palaute::$VIRHEKOODI_KAIKKI_OK) {
         $this->lisaa_virheilmoitus("<div class='virhe'>VIRHEKOODI=" . $palauteolio->get_virhekoodi() . "! " . $palauteolio->get_ilmoitus() . "</div>");
     } else {
         $this->lisaa_kommentti("<div>Virheita ei havaittu!</div>");
     }
     //$this->lisaa_kommentti( $palauteolio->get_sisalto());
     //=========================================================================§
     $this->testaa_uloskirjaus();
     $this->lisaa_kommentti("<b>****************************TOTEUTA-METODIT LOPPU*********</b>");
 }