create table tetel_egyedi
(kod              serial not null,
 egyedi_azonosito varchar(40) not null,
 gyartas_datum    date,
 muszak           varchar(10),
 munkatars        integer,
 minosites        varchar(10),
 minosito         integer,
 megjegyzes       varchar(100),
 primary key (kod),
 constraint tetel_egyedi_u1 unique (egyedi_azonosito),
 constraint tetel_egyedi_fk1 foreign key (munkatars) references munkatars (kod),
 constraint tetel_egyedi_fk2 foreign key (minosito) references munkatars (kod));


create table tetel_raktar_egyedi
(kod                  serial not null,
 raktar_kod           integer not null,
 tetel_kod            integer not null,
 egyedi_azonosito_kod integer not null,
 mennyiseg            double precision not null,
 foglalt              double precision not null,
 szabad               double precision not null,
 primary key (kod),
 constraint tetel_raktar_egyedi_u1 unique (raktar_kod, tetel_kod, egyedi_azonosito_kod),
 constraint tetel_raktar_egyedi_ch1 check (mennyiseg>=0),
 constraint tetel_raktar_egyedi_ch2 check (foglalt>=0),
 constraint tetel_raktar_egyedi_ch3 check (szabad>=0),
 constraint tetel_raktar_egyedi_fk1 foreign key (raktar_kod, tetel_kod) references tetel_raktar (raktar_kod, tetel_kod),
 constraint tetel_raktar_egyedi_fk2 foreign key (egyedi_azonosito_kod) references tetel_egyedi (kod));


create table raktar_mozgas_egyedi
(kod                  serial not null,
 rm_kod               integer not null,
 egyedi_azonosito_kod integer not null,
 mennyiseg            double precision not null,
 primary key (kod),
 constraint raktar_mozgas_egyedi_fk1 foreign key (rm_kod) references raktar_mozgas (kod),
 constraint raktar_mozgas_egyedi_fk2 foreign key (egyedi_azonosito_kod) references tetel_egyedi (kod));

CREATE OR REPLACE FUNCTION tr_raktar_mozgas_egyedi()
  RETURNS "trigger" AS
'declare

  v_forras_raktar_kod raktar_mozgas_fej.forras_raktar_kod%type;
  v_cel_raktar_kod    raktar_mozgas_fej.cel_raktar_kod%type;
  v_tetel_kod         raktar_mozgas.tetel_kod%type;
  v_mennyiseg         tetel_raktar_egyedi.mennyiseg%type;
  v_db                integer;

begin
  -- Bizonylat adatainak meghatarozasa
  select rf.forras_raktar_kod,
         rf.cel_raktar_kod,
         rt.tetel_kod
    into v_forras_raktar_kod,
         v_cel_raktar_kod,
         v_tetel_kod
    from raktar_mozgas_fej rf,
         raktar_mozgas rt
   where rf.kod = rt.fej_kod
     and rt.kod = new.rm_kod;

  -- Forras raktar kezelese
  if v_forras_raktar_kod<>0 then

     select count(*)
       into v_db
       from tetel_raktar_egyedi
      where raktar_kod = v_forras_raktar_kod
        and tetel_kod = v_tetel_kod
        and egyedi_azonosito_kod = new.egyedi_azonosito_kod;

     if v_db = 0 then

       insert into tetel_raktar_egyedi
       (raktar_kod,
        tetel_kod,
        egyedi_azonosito_kod,
        mennyiseg,
        foglalt,
        szabad)

       values

       (v_forras_raktar_kod,
        v_tetel_kod,
        new.egyedi_azonosito_kod,
        - new.mennyiseg,
        0,
        - new.mennyiseg);
        
     else
     
       update tetel_raktar_egyedi
          set mennyiseg = mennyiseg - new.mennyiseg,
              szabad = szabad - new.mennyiseg
        where raktar_kod = v_forras_raktar_kod
          and tetel_kod = v_tetel_kod
          and egyedi_azonosito_kod = new.egyedi_azonosito_kod;
     end if;

     select mennyiseg
       into v_mennyiseg
       from tetel_raktar_egyedi
      where raktar_kod = v_forras_raktar_kod
        and tetel_kod = v_tetel_kod
        and egyedi_azonosito_kod = new.egyedi_azonosito_kod;

     if v_mennyiseg = 0 then

       delete from tetel_raktar_egyedi
        where raktar_kod = v_forras_raktar_kod
          and tetel_kod = v_tetel_kod
          and egyedi_azonosito_kod = new.egyedi_azonosito_kod;
     end if;
  end if;


  -- Cel raktar kezelese
  if v_cel_raktar_kod<>0 then
  
     select count(*)
       into v_db
       from tetel_raktar_egyedi
      where raktar_kod = v_cel_raktar_kod
        and tetel_kod = v_tetel_kod
        and egyedi_azonosito_kod = new.egyedi_azonosito_kod;

     if v_db = 0 then

       insert into tetel_raktar_egyedi
       (raktar_kod,
        tetel_kod,
        egyedi_azonosito_kod,
        mennyiseg,
        foglalt,
        szabad)

       values

       (v_cel_raktar_kod,
        v_tetel_kod,
        new.egyedi_azonosito_kod,
        new.mennyiseg,
        0,
        new.mennyiseg);
        
     else
     
       update tetel_raktar_egyedi
          set mennyiseg = mennyiseg + new.mennyiseg,
              szabad = szabad + new.mennyiseg
        where raktar_kod = v_cel_raktar_kod
          and tetel_kod = v_tetel_kod
          and egyedi_azonosito_kod = new.egyedi_azonosito_kod;
     end if;

     select mennyiseg
       into v_mennyiseg
       from tetel_raktar_egyedi
      where raktar_kod = v_cel_raktar_kod
        and tetel_kod = v_tetel_kod
        and egyedi_azonosito_kod = new.egyedi_azonosito_kod;

     if v_mennyiseg = 0 then

       delete from tetel_raktar_egyedi
        where raktar_kod = v_cel_raktar_kod
          and tetel_kod = v_tetel_kod
          and egyedi_azonosito_kod = new.egyedi_azonosito_kod;
     end if;
  end if;

  return new;
end;'
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER trigger_raktar_mozgas_egyedi
  AFTER INSERT
  ON raktar_mozgas_egyedi
  FOR EACH ROW
  EXECUTE PROCEDURE tr_raktar_mozgas_egyedi();

CREATE TABLE kesziteslista_egyedi
(
  kod serial NOT NULL,
  rm_kod integer NOT NULL,
  egyedi_azonosito_kod integer NOT NULL,
  mennyiseg double precision NOT NULL,
  CONSTRAINT kesziteslista_egyedi_pkey PRIMARY KEY (kod)
)
WITHOUT OIDS;

ALTER TABLE tetel ADD COLUMN egyedi integer;
ALTER TABLE tetel ALTER COLUMN egyedi SET STORAGE PLAIN;
ALTER TABLE tetel ALTER COLUMN egyedi SET DEFAULT 0;
update tetel set egyedi = 0 where egyedi is null;