-- baza danych bd/sql/usc.create
-- UDOSTEPNIC na WWW:
-- menu, z ktorego mozna wystwietlic liste wszystkich osob z bazy
--                  oraz wpisac do bazy nowa osobe

-- polaczenie przez http://palette.mimuw.edu.pl/public/plsql/stencel.usc.menu

-- UWAGA: zeby dzialalo owa_util.tablePrint trzeba uzytkownikowi OWA3_OWNER 
--        dac prawo SELECT na tabeli OSOBA

create or replace package USC is
  procedure menu;
  procedure r_menu(Submit IN VARCHAR2);

  procedure wyswietl;
  procedure r_wyswietl(Submit IN VARCHAR2);

  procedure wprowadz;
  procedure r_wprowadz(P_ID IN INTEGER, P_IMIE IN VARCHAR2, 
                       P_NAZWISKO IN VARCHAR2,  P_ID_MATKI IN INTEGER,
                       P_ID_OJCA IN INTEGER, Submit IN VARCHAR2); 

  procedure usuwanie;
  procedure r_usun(P_ID INTEGER, Submit VARCHAR2  );
  procedure BladKasowania;
  procedure BrakRekordu;
  procedure KasowanieOk;

  procedure wybierz_osobe;
  procedure r_wybierz_osobe(lista in owa_util.ident_arr,submit in varchar2);
  procedure edytuj( row in varchar2 );
  procedure r_edytuj(old_id in varchar2, new_id in varchar2, 
                     new_imie in varchar2, new_nazwisko in varchar2, 
                     submit in varchar2);
end USC;
/

create or replace package body USC is
  procedure trescMenu is
  begin
    htp.header(1, 'Wybierz opcje');
    htp.formOpen('http://palette.mimuw.edu.pl/public/plsql/stencel.USC.r_menu');
    htp.formSubmit('Submit', 'Wyswietl osoby');
    htp.formSubmit('Submit', 'Wprowadz nowa osobe');
    htp.formSubmit('Submit', 'Usun osobe');
    htp.formSubmit('Submit', 'Edytuj osobe');
    htp.formClose;
  end;

  procedure menu is
  begin
    htp.htmlOpen;
    htp.headOpen;
    htp.title('USC');
    htp.headClose;
    htp.bodyOpen;
    trescMenu;
    htp.bodyClose;
    htp.htmlClose;
  end;
  
  procedure r_menu(Submit IN VARCHAR2) is
  begin
    if Submit = 'Wyswietl osoby' then
      Wyswietl;
    elsif Submit = 'Wprowadz nowa osobe' then
      Wprowadz;
    elsif Submit = 'Usun osobe' then
      usuwanie;
    elsif Submit = 'Edytuj osobe' then
      wybierz_osobe;
    end if;
  end;

  procedure wyswietl is
    ignore boolean;
  begin
    htp.htmlOpen;
    htp.headOpen;
    htp.title('Lista osob');
    htp.headClose;   
    htp.bodyOpen;    
    htp.header(1, 'Lista osob');
    htp.formOpen('http://palette.mimuw.edu.pl/public/plsql/stencel.USC.r_wyswietl');
    htp.formSubmit('Submit', 'Wroc do glownego menu');
    htp.formClose;
    ignore := owa_util.tablePrint('STENCEL.OSOBA', 'BORDER');
    htp.bodyClose;
    htp.htmlClose;
  end;

  procedure r_wyswietl(Submit IN VARCHAR2) is
  begin
    menu;
  end;

  procedure select_parent is
    CURSOR parent IS SELECT * FROM osoba;
    par osoba%ROWTYPE;
  begin
    OPEN parent; LOOP
       FETCH parent INTO par;
       EXIT WHEN parent%NOTFOUND;
       htp.formSelectOption(par.imie||' '||par.nazwisko,'','VALUE='||par.id);
    END LOOP;
  end;

  procedure wprowadz is 
  begin
    htp.htmlOpen;
    htp.headOpen;
    htp.title('Wprowadzanie danych osoby');
    htp.headClose;
    htp.bodyOpen;    
    htp.header(1, 'Wprowadz nowa osobe');
    htp.formOpen('http://palette.mimuw.edu.pl/public/plsql/stencel.USC.r_wprowadz');
    htp.formText('P_ID', 50, 30);
    htp.prn('ID OSOBY');
    htp.nl;
    htp.formText('P_IMIE', 50, 30);   
    htp.prn('IMIE');
    htp.nl;
    htp.formText('P_NAZWISKO', 50, 30);   
    htp.prn('NAZWISKO');
    htp.nl;
    htp.formSelectOpen('P_ID_MATKI','Matka: ');
    select_parent;
    htp.formSelectClose;
    htp.formSelectOpen('P_ID_OJCA','Ojciec: ');
    select_parent;
    htp.formSelectClose;
    htp.nl;
    htp.formSubmit('Submit', 'Zapisz dane tej osoby');
    htp.formSubmit('Submit', 'Wroc do glownego menu');
    htp.formReset('Wyczysc pola');
    htp.formClose;
    htp.bodyClose; 
    htp.htmlClose;
  end;

  procedure r_wprowadz(P_ID IN INTEGER, P_IMIE IN VARCHAR2,
                       P_NAZWISKO IN VARCHAR2, 
                       P_ID_MATKI IN INTEGER,  
                       P_ID_OJCA IN INTEGER,   
                       Submit IN VARCHAR2) is  
  begin
    if Submit = 'Wroc do glownego menu' then
      menu;
    elsif Submit = 'Zapisz dane tej osoby' then
      insert into osoba (id, imie, nazwisko,id_matki,id_ojca)
        values (p_id, p_imie, p_nazwisko,p_id_matki,p_id_ojca);
      commit;
      menu;  
    end if;  
  end;

  procedure usuwanie is
  begin
    htp.htmlOpen;
    htp.headOpen;
    htp.title('Wprowadzanie danych osoby');
    htp.headClose;
    htp.bodyOpen; 
    htp.header(1, 'Usun osobe');
    htp.formOpen('http://palette.mimuw.edu.pl/public/plsql/stencel.USC.r_usun');
    htp.formText('P_ID', 50, 30);
    htp.prn('ID OSOBY');
    htp.nl;
    htp.formSubmit('Submit', 'Usun osobe');
    htp.formSubmit('Submit', 'Wroc do glownego menu');
    htp.formReset('Wyczysc pola');
    htp.formClose;
    htp.bodyClose;
    htp.htmlClose;
  end;

  procedure r_usun(P_ID IN INTEGER, Submit VARCHAR2 ) is
  jest integer;
  begin
    if Submit = 'Wroc do glownego menu' then
      menu;
    elsif Submit = 'Usun osobe' then
      select count(*) into jest 
        from stencel.osoba 
        where id = p_id;
      if jest = 0 then 
        BrakRekordu; 
        return;
      end if;
      delete from stencel.osoba where (id = p_id );
      commit;
      KasowanieOk;
    end if;
  EXCEPTION
    WHEN OTHERS THEN 
      BladKasowania; 
      return;
  end;

  procedure KasowanieOk is
  begin
    htp.htmlOpen;
    htp.headOpen;
    htp.title('USC');
    htp.headClose;   
    htp.bodyOpen;    
    htp.header(1, 'Kasowanie powiodlo sie!');
    trescMenu;
    htp.bodyClose;
    htp.htmlClose;
  end;

  procedure BladKasowania is
  begin
    htp.htmlOpen;
    htp.headOpen;
    htp.title('USC');
    htp.headClose;   
    htp.bodyOpen;    
    htp.header(1, 'Kasowanie NIE powiodlo sie');
    trescMenu;
    htp.bodyClose;
    htp.htmlClose;
  end;

  procedure BrakRekordu is
  begin
    htp.htmlOpen;
    htp.headOpen;
    htp.title('USC');
    htp.headClose;   
    htp.bodyOpen;    
    htp.header(1, 'Nie ma takiej osoby');
    trescMenu;
    htp.bodyClose;
    htp.htmlClose;
  end;

  procedure wybierz_osobe is
      cursor kur is
         SELECT * 
           FROM stencel.osoba
           order by nazwisko, imie, id;
      o kur%ROWTYPE;
    begin
      htp.htmlOpen;
      htp.headOpen;
      htp.title('Wybierz osobe');
      htp.headClose;
      htp.bodyOpen;
      htp.header(1, 'Wybierz osobe do edycji');
      htp.formOpen('http://palette.mimuw.edu.pl/public/plsql/stencel.USC.r_wybierz_osobe');
      htp.formSelectOpen('Lista', 'Lista', 7);
      for o in kur loop
        htp.formSelectOption(o.id || ' ' || o.imie || ' ' || o.nazwisko);
      end loop;
      htp.formSelectClose;
      htp.formSubmit('Submit', 'Edytuj');
      htp.formSubmit('Submit', 'Rezygnuj');
      htp.formClose;
      htp.bodyClose;
      htp.htmlClose;
    end;

  procedure r_wybierz_osobe(lista IN owa_util.ident_arr, submit in varchar2) is
  begin
    if Submit = 'Rezygnuj' then
      menu;
    elsif Submit = 'Edytuj' then
      edytuj(lista(1));
    end if;
  end;
    
  procedure edytuj(row in varchar2) is
    oldid integer;
    spacja integer;
    i integer;
    pimie stencel.osoba.imie%TYPE;
    pnazwisko stencel.osoba.nazwisko%TYPE;
  begin
    spacja := 0;
    for i in 1..length(row) loop
      if substr(row,i,1) = ' ' then
        if spacja = 0 then
          spacja := i;
        end if;
      end if;
    end loop;
    oldid := TO_NUMBER(substr(row , 1 , spacja - 1));
    select imie, nazwisko into pimie, pnazwisko
      from stencel.osoba
      where id = oldid;
    htp.htmlOpen;
    htp.headOpen;
    htp.title('Edycja danych osoby');
    htp.headClose;
    htp.bodyOpen;
    htp.header(1, 'Edytujemy osobe');
    htp.formOpen('http://palette.mimuw.edu.pl/public/plsql/stencel.USC.r_edytuj');
    htp.formHidden('OLD_ID', TO_CHAR(oldid));
    htp.formText('NEW_ID', 50, 30, TO_CHAR(oldid));
    htp.prn('ID OSOBY');
    htp.nl;
    htp.formText('NEW_IMIE', 50, 30, pimie);   
    htp.prn('IMIE');
    htp.nl;
    htp.formText('NEW_NAZWISKO',50, 30, pnazwisko);   
    htp.prn('NAZWISKO');
    htp.nl;
    htp.formSubmit('Submit', 'Zmien');
    htp.formSubmit('Submit', 'Rezygnuj');
    htp.formClose;
    htp.bodyClose;
    htp.htmlClose;
  end;

  procedure r_edytuj( old_id in varchar2, new_id in varchar2, 
                      new_imie in varchar2, new_nazwisko in varchar2,
                      submit in varchar2) is
  begin
    if submit='Zmien' then
      update stencel.osoba
        set id = TO_NUMBER(new_id), imie = new_imie, nazwisko = new_nazwisko
        where id = TO_NUMBER(old_id);
      commit;
      menu;
    elsif submit='Rezygnuj' then
      menu;
    end if;
  end;

end USC;
/
