-- allgemeine Funktionen zu Waren/Warengruppen --
-- [
create function produkt_typ_len()
    returns int4 as '
        DECLARE
            len int4;
        BEGIN
            select INTO len bit_length(produkt_typ) from waren.produkt_typen;

            IF NOT FOUND THEN
                len := 0;
            END IF;

            RETURN len;
        END;
    ' language 'plpgsql';

create function produkt_typ(text, int4)
    returns bit varying as '
        /* 
         * produkt_typ(name, len)
         *
         * ermittelt den produkt_typ zu einem entsprechenden namen.
         *
         * returns: NULL: falls der name nicht in konten_typen existiert
         *          >0: der konten_typ zu dem namen
         */

        DECLARE
            row waren.produkt_typen%ROWTYPE;
            min_len int4 := waren.produkt_typ_len();
            sel text;
        BEGIN
            IF $2 < min_len THEN
                RAISE EXCEPTION ''len is to short'';
            END IF;

            sel := ''select produkt_typ::BIT('' || $2 || '')>>'' || 
                   $2-min_len ||
                   '' from waren.produkt_typen where bezeichnung='' || 
                   quote_literal($1);

            FOR row IN EXECUTE sel LOOP
            END LOOP;

            IF NOT FOUND THEN
                RETURN NULL;
            ELSE
                RETURN row.konto_typ;
            END IF;
        END;
    ' language 'plpgsql';

create function get_warengruppe(text)
    returns warengruppe as '
        DECLARE
            row waren.warengruppe%ROWTYPE;
        BEGIN
            select INTO row * from waren.warengruppe where name=$1;

            IF NOT FOUND THEN
                RETURN NULL;
            ELSE
                RETURN row;
            END IF;
        END;
    ' language 'plpgsql';

create function get_warengruppe(int4)
    returns warengruppe as '
        DECLARE
            row waren.warengruppe%ROWTYPE;
        BEGIN
            select INTO row * from waren.warengruppe where _id_=$1;

            IF NOT FOUND THEN
                RETURN NULL;
            ELSE
                RETURN row;
            END IF;
        END;
    ' language 'plpgsql';

create function warengruppe_id(text)
    returns int4 as '
        DECLARE
            row waren.warengruppe%ROWTYPE;
        BEGIN
            select INTO row * from waren.warengruppe where name=$1;

            IF NOT FOUND THEN
                RETURN NULL;
            ELSE
                RETURN row._id_;
            END IF;
        END;
    ' language 'plpgsql';
-- ]
-- Ende allgemeine Funktionen zu Waren/Warengruppen --
