-- ============ TABLE: dok_dokument_potpis ============
CREATE TABLE public.dok_dokument_potpis (
    id integer NOT NULL DEFAULT nextval('dok_dokument_potpis_id_seq'::regclass),
    vraboten_angazman_id integer NOT NULL,
    vraboten_funkcija_id integer,
    generiran_dokument_id integer NOT NULL,
    tip_potpis character varying(255),
    potpis text,
    data timestamp without time zone,
    CONSTRAINT dok_dokument_potpis_pkey PRIMARY KEY (id),
    CONSTRAINT fk_dp_angazman FOREIGN KEY (vraboten_angazman_id) REFERENCES vr_vraboten_angazman(id),
    CONSTRAINT fk_dp_funkcija FOREIGN KEY (vraboten_funkcija_id) REFERENCES vr_vraboten_funkcija(id),
    CONSTRAINT fk_dp_gen_doc FOREIGN KEY (generiran_dokument_id) REFERENCES dok_generiran_dokument(id) ON DELETE CASCADE
);

-- ============ TABLE: dok_dokument_templejt_atributi ============
CREATE TABLE public.dok_dokument_templejt_atributi (
    id integer NOT NULL DEFAULT nextval('dok_dokument_templejt_atributi_id_seq'::regclass),
    dokument_templejt_id integer NOT NULL,
    ime_atribut character varying(255),
    regex character varying(255),
    tip_atribut_id integer NOT NULL,
    zadolzitelen boolean,
    CONSTRAINT dok_dokument_templejt_atributi_pkey PRIMARY KEY (id),
    CONSTRAINT fk_dta_templejt FOREIGN KEY (dokument_templejt_id) REFERENCES dok_dokument_templejti(id),
    CONSTRAINT fk_dta_tip_atr FOREIGN KEY (tip_atribut_id) REFERENCES tip_atribut(id)
);

-- ============ TABLE: dok_dokument_templejti ============
CREATE TABLE public.dok_dokument_templejti (
    id integer NOT NULL DEFAULT nextval('dok_dokument_templejti_id_seq'::regclass),
    tip_dokument_organizaciona_edinica_id integer NOT NULL,
    templejt text,
    aktiven boolean,
    CONSTRAINT dok_dokument_templejti_pkey PRIMARY KEY (id),
    CONSTRAINT fk_dt_tdoe FOREIGN KEY (tip_dokument_organizaciona_edinica_id) REFERENCES dok_tip_dokumenti_organizaciona_edinica(id)
);

-- ============ TABLE: dok_generiran_dokument ============
CREATE TABLE public.dok_generiran_dokument (
    id integer NOT NULL DEFAULT nextval('dok_generiran_dokument_id_seq'::regclass),
    tip_dokument_organizaciona_edinica_id integer NOT NULL,
    dokument_templejt_id integer NOT NULL,
    url character varying(255),
    user_id integer NOT NULL,
    CONSTRAINT dok_generiran_dokument_pkey PRIMARY KEY (id),
    CONSTRAINT fk_gd_tdoe FOREIGN KEY (tip_dokument_organizaciona_edinica_id) REFERENCES dok_tip_dokumenti_organizaciona_edinica(id),
    CONSTRAINT fk_gd_templejt FOREIGN KEY (dokument_templejt_id) REFERENCES dok_dokument_templejti(id)
);

-- ============ TABLE: dok_generiran_dokument_vrednosti ============
CREATE TABLE public.dok_generiran_dokument_vrednosti (
    id integer NOT NULL DEFAULT nextval('dok_generiran_dokument_vrednosti_id_seq'::regclass),
    dokument_templejt_atributi_id integer NOT NULL,
    generiran_dokument_id integer NOT NULL,
    string_vrednost character varying(255),
    numericka_vrednost numeric,
    boolean_vrednost boolean,
    CONSTRAINT dok_generiran_dokument_vrednosti_pkey PRIMARY KEY (id),
    CONSTRAINT fk_gdv_dta FOREIGN KEY (dokument_templejt_atributi_id) REFERENCES dok_dokument_templejt_atributi(id),
    CONSTRAINT fk_gdv_gen_doc FOREIGN KEY (generiran_dokument_id) REFERENCES dok_generiran_dokument(id) ON DELETE CASCADE
);

-- ============ TABLE: dok_tip_dokumenti_organizaciona_edinica ============
CREATE TABLE public.dok_tip_dokumenti_organizaciona_edinica (
    id integer NOT NULL DEFAULT nextval('dok_tip_dokumenti_organizaciona_edinica_id_seq'::regclass),
    dokument_ime character varying(255),
    organizaciona_edinica_id integer NOT NULL,
    tip_naplata_organizaciona_edinica_id integer NOT NULL,
    CONSTRAINT dok_tip_dokumenti_organizaciona_edinica_pkey PRIMARY KEY (id),
    CONSTRAINT fk_tdoe_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_tdoe_tnoe FOREIGN KEY (tip_naplata_organizaciona_edinica_id) REFERENCES fin_tip_naplati_organizaciona_edinica(id)
);

-- ============ TABLE: drzavi ============
CREATE TABLE public.drzavi (
    id integer NOT NULL DEFAULT nextval('drzavi_id_seq'::regclass),
    drzava_kod character varying(255),
    drzava_ime character varying(255),
    CONSTRAINT drzavi_pkey PRIMARY KEY (id)
);

-- ============ TABLE: ent_entiteti ============
CREATE TABLE public.ent_entiteti (
    id integer NOT NULL DEFAULT nextval('ent_entiteti_id_seq'::regclass),
    ime_entitet character varying(255),
    user_id integer NOT NULL,
    CONSTRAINT ent_entiteti_pkey PRIMARY KEY (id),
    CONSTRAINT ent_entiteti_ime_entitet_key UNIQUE (ime_entitet),
    CONSTRAINT fk_ent_user FOREIGN KEY (user_id) REFERENCES korisnici(id)
);

-- ============ TABLE: ent_entiteti_smetki ============
CREATE TABLE public.ent_entiteti_smetki (
    id integer NOT NULL DEFAULT nextval('ent_entiteti_smetki_id_seq'::regclass),
    entitet_id integer NOT NULL,
    transakciska_smetka_id integer NOT NULL,
    aktivna boolean,
    CONSTRAINT ent_entiteti_smetki_pkey PRIMARY KEY (id),
    CONSTRAINT fk_ents_entitet FOREIGN KEY (entitet_id) REFERENCES ent_entiteti(id),
    CONSTRAINT fk_ents_smetka FOREIGN KEY (transakciska_smetka_id) REFERENCES fin_transakciski_smetki(id)
);

-- ============ TABLE: fin_banki ============
CREATE TABLE public.fin_banki (
    id integer NOT NULL DEFAULT nextval('fin_banki_id_seq'::regclass),
    ime_banka character varying(255) NOT NULL,
    swift_bic character varying(255),
    drzava_kod character varying(2),
    CONSTRAINT fin_banki_pkey PRIMARY KEY (id)
);

-- ============ TABLE: fin_finansiska_obvrska ============
CREATE TABLE public.fin_finansiska_obvrska (
    id integer NOT NULL DEFAULT nextval('fin_finansiska_obvrska_id_seq'::regclass),
    user_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    tip_naplata_organizaciona_edinica_id integer NOT NULL,
    tip_naplati_cenovnik_id integer,
    status_finansiska_obvrska_id integer NOT NULL,
    dokument_id integer,
    datum_kreiranje timestamp without time zone NOT NULL,
    datum_dospevanje date,
    originalna_suma numeric(14,2) NOT NULL,
    otvorena_suma numeric(14,2) NOT NULL,
    vid_valuta_id integer NOT NULL,
    opis character varying(255),
    finansiska_obvrska_id integer,
    CONSTRAINT fin_finansiska_obvrska_pkey PRIMARY KEY (id),
    CONSTRAINT chk_fo_originalna_pozitivna CHECK ((originalna_suma > (0)::numeric)),
    CONSTRAINT chk_fo_otvorena_max CHECK ((otvorena_suma <= originalna_suma)),
    CONSTRAINT chk_fo_otvorena_nenegativna CHECK ((otvorena_suma >= (0)::numeric)),
    CONSTRAINT fk_fo_dokument FOREIGN KEY (dokument_id) REFERENCES fin_finansiski_dokument(id),
    CONSTRAINT fk_fo_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_fo_parent_fo FOREIGN KEY (finansiska_obvrska_id) REFERENCES fin_finansiska_obvrska(id),
    CONSTRAINT fk_fo_status FOREIGN KEY (status_finansiska_obvrska_id) REFERENCES fin_status_finansiska_obvrska(id),
    CONSTRAINT fk_fo_tip_cenov FOREIGN KEY (tip_naplati_cenovnik_id) REFERENCES fin_tip_naplati_cenovnik(id),
    CONSTRAINT fk_fo_tip_nap_oe FOREIGN KEY (tip_naplata_organizaciona_edinica_id) REFERENCES fin_tip_naplati_organizaciona_edinica(id),
    CONSTRAINT fk_fo_user FOREIGN KEY (user_id) REFERENCES korisnici(id),
    CONSTRAINT fk_fo_valuta FOREIGN KEY (vid_valuta_id) REFERENCES fin_vid_valuta(id)
);

-- ============ TABLE: fin_finansiska_obvrska_stavka ============
CREATE TABLE public.fin_finansiska_obvrska_stavka (
    id integer NOT NULL DEFAULT nextval('fin_finansiska_obvrska_stavka_id_seq'::regclass),
    finansiska_obvrska_id integer NOT NULL,
    naziv_stavka character varying(255) NOT NULL,
    referenca_tip character varying(255),
    referenca_id integer,
    kolicina numeric(12,2) NOT NULL DEFAULT 1,
    edinicna_cena numeric(14,2) NOT NULL,
    iznos numeric(14,2) NOT NULL,
    CONSTRAINT fin_finansiska_obvrska_stavka_pkey PRIMARY KEY (id),
    CONSTRAINT chk_fos_cena CHECK ((edinicna_cena >= (0)::numeric)),
    CONSTRAINT chk_fos_iznos CHECK ((iznos >= (0)::numeric)),
    CONSTRAINT chk_fos_kolicina CHECK ((kolicina > (0)::numeric)),
    CONSTRAINT fk_fos_fo FOREIGN KEY (finansiska_obvrska_id) REFERENCES fin_finansiska_obvrska(id) ON DELETE CASCADE
);

-- ============ TABLE: fin_finansiski_dokument ============
CREATE TABLE public.fin_finansiski_dokument (
    id integer NOT NULL DEFAULT nextval('fin_finansiski_dokument_id_seq'::regclass),
    finansiski_dokument_tip_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    user_id integer,
    dokument_broj character varying(255) NOT NULL,
    datum_izdavanje date NOT NULL,
    status character varying(255) NOT NULL,
    vid_valuta_id integer NOT NULL,
    vkupen_iznos numeric(14,2) NOT NULL,
    izvoren_tip character varying(255),
    CONSTRAINT fin_finansiski_dokument_pkey PRIMARY KEY (id),
    CONSTRAINT fk_fd_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_fd_tip FOREIGN KEY (finansiski_dokument_tip_id) REFERENCES fin_finansiski_dokument_tip(id),
    CONSTRAINT fk_fd_user FOREIGN KEY (user_id) REFERENCES korisnici(id),
    CONSTRAINT fk_fd_valuta FOREIGN KEY (vid_valuta_id) REFERENCES fin_vid_valuta(id)
);

-- ============ TABLE: fin_finansiski_dokument_tip ============
CREATE TABLE public.fin_finansiski_dokument_tip (
    id integer NOT NULL DEFAULT nextval('fin_finansiski_dokument_tip_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    nasoka character varying(255) NOT NULL,
    CONSTRAINT fin_finansiski_dokument_tip_pkey PRIMARY KEY (id),
    CONSTRAINT fin_finansiski_dokument_tip_kod_key UNIQUE (kod)
);

-- ============ TABLE: fin_finansiski_dokument_vrska ============
CREATE TABLE public.fin_finansiski_dokument_vrska (
    id integer NOT NULL DEFAULT nextval('fin_finansiski_dokument_vrska_id_seq'::regclass),
    parent_dokument_id integer NOT NULL,
    child_dokument_id integer NOT NULL,
    relation_type character varying(255) NOT NULL,
    CONSTRAINT fin_finansiski_dokument_vrska_pkey PRIMARY KEY (id),
    CONSTRAINT fk_fdv_child FOREIGN KEY (child_dokument_id) REFERENCES fin_finansiski_dokument(id),
    CONSTRAINT fk_fdv_parent FOREIGN KEY (parent_dokument_id) REFERENCES fin_finansiski_dokument(id)
);

-- ============ TABLE: fin_isplata_alokacija ============
CREATE TABLE public.fin_isplata_alokacija (
    id integer NOT NULL DEFAULT nextval('fin_isplata_alokacija_id_seq'::regclass),
    isplata_id integer NOT NULL,
    isplatna_obvrska_id integer NOT NULL,
    alocirana_suma numeric(14,2) NOT NULL,
    created_at timestamp without time zone NOT NULL,
    CONSTRAINT fin_isplata_alokacija_pkey PRIMARY KEY (id),
    CONSTRAINT chk_ia_suma CHECK ((alocirana_suma > (0)::numeric)),
    CONSTRAINT fk_ia_io FOREIGN KEY (isplatna_obvrska_id) REFERENCES fin_isplatna_obvrska(id),
    CONSTRAINT fk_ia_isplata FOREIGN KEY (isplata_id) REFERENCES fin_isplati(id) ON DELETE CASCADE
);

-- ============ TABLE: fin_isplati ============
CREATE TABLE public.fin_isplati (
    id integer NOT NULL DEFAULT nextval('fin_isplati_id_seq'::regclass),
    user_id integer NOT NULL,
    korisnik_isplata_id integer NOT NULL,
    transakciska_smetka_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    naplatena_suma numeric(14,2) NOT NULL,
    vid_valuta_id integer NOT NULL,
    status_transakcija_id integer NOT NULL,
    nadvoresna_referenca character varying(255),
    pobarana timestamp without time zone,
    izvrsena timestamp without time zone,
    data date,
    CONSTRAINT fin_isplati_pkey PRIMARY KEY (id),
    CONSTRAINT chk_isplata_suma CHECK ((naplatena_suma > (0)::numeric)),
    CONSTRAINT fk_isp_kor_isp FOREIGN KEY (korisnik_isplata_id) REFERENCES fin_korisnici_isplata(id),
    CONSTRAINT fk_isp_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_isp_smetka FOREIGN KEY (transakciska_smetka_id) REFERENCES fin_transakciski_smetki(id),
    CONSTRAINT fk_isp_stat_trans FOREIGN KEY (status_transakcija_id) REFERENCES fin_status_transakcija(id),
    CONSTRAINT fk_isp_user FOREIGN KEY (user_id) REFERENCES korisnici(id),
    CONSTRAINT fk_isp_valuta FOREIGN KEY (vid_valuta_id) REFERENCES fin_vid_valuta(id)
);

-- ============ TABLE: fin_isplatna_obvrska ============
CREATE TABLE public.fin_isplatna_obvrska (
    id integer NOT NULL DEFAULT nextval('fin_isplatna_obvrska_id_seq'::regclass),
    user_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    tip_isplatna_obvrska_id integer NOT NULL,
    status_isplatna_obvrska_id integer NOT NULL,
    dokument_id integer NOT NULL,
    plata_stavka_vraboten_id integer,
    izvoren_tip character varying(255),
    originalna_suma numeric(14,2) NOT NULL,
    otvorena_suma numeric(14,2) NOT NULL,
    vid_valuta_id integer NOT NULL,
    kreirano_na timestamp without time zone NOT NULL,
    odobreno_na timestamp without time zone,
    due_date date,
    opis character varying(255),
    CONSTRAINT fin_isplatna_obvrska_pkey PRIMARY KEY (id),
    CONSTRAINT chk_io_originalna_pozitivna CHECK ((originalna_suma > (0)::numeric)),
    CONSTRAINT chk_io_otvorena_max CHECK ((otvorena_suma <= originalna_suma)),
    CONSTRAINT chk_io_otvorena_nenegativna CHECK ((otvorena_suma >= (0)::numeric)),
    CONSTRAINT fk_io_dokument FOREIGN KEY (dokument_id) REFERENCES fin_finansiski_dokument(id),
    CONSTRAINT fk_io_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_io_plata_stavka FOREIGN KEY (plata_stavka_vraboten_id) REFERENCES fin_plata_stavka_vraboten(id),
    CONSTRAINT fk_io_status FOREIGN KEY (status_isplatna_obvrska_id) REFERENCES fin_status_isplatna_obvrska(id),
    CONSTRAINT fk_io_tip FOREIGN KEY (tip_isplatna_obvrska_id) REFERENCES fin_tip_isplatna_obvrska(id),
    CONSTRAINT fk_io_user FOREIGN KEY (user_id) REFERENCES korisnici(id),
    CONSTRAINT fk_io_valuta FOREIGN KEY (vid_valuta_id) REFERENCES fin_vid_valuta(id)
);

-- ============ TABLE: fin_korisnici_isplata ============
CREATE TABLE public.fin_korisnici_isplata (
    id integer NOT NULL DEFAULT nextval('fin_korisnici_isplata_id_seq'::regclass),
    transakciska_smetka_id integer NOT NULL,
    user_id integer NOT NULL,
    CONSTRAINT fin_korisnici_isplata_pkey PRIMARY KEY (id),
    CONSTRAINT fk_ki_smetka FOREIGN KEY (transakciska_smetka_id) REFERENCES fin_transakciski_smetki(id),
    CONSTRAINT fk_ki_user FOREIGN KEY (user_id) REFERENCES korisnici(id)
);

-- ============ TABLE: fin_korisnici_naplati ============
CREATE TABLE public.fin_korisnici_naplati (
    id integer NOT NULL DEFAULT nextval('fin_korisnici_naplati_id_seq'::regclass),
    korisnik_vid_naplata_id integer NOT NULL,
    user_id integer NOT NULL,
    CONSTRAINT fin_korisnici_naplati_pkey PRIMARY KEY (id),
    CONSTRAINT fk_kn_user FOREIGN KEY (user_id) REFERENCES korisnici(id),
    CONSTRAINT fk_kn_vid_nap FOREIGN KEY (korisnik_vid_naplata_id) REFERENCES fin_korisnik_vid_naplati(id)
);

-- ============ TABLE: fin_korisnik_naplata_atributi_vrednosti ============
CREATE TABLE public.fin_korisnik_naplata_atributi_vrednosti (
    id integer NOT NULL DEFAULT nextval('fin_korisnik_naplata_atributi_vrednosti_id_seq'::regclass),
    korisnici_naplata_id integer NOT NULL,
    korisnik_vid_naplata_atribut_id integer NOT NULL,
    string_vrednost character varying(255),
    numericka_vrednost numeric,
    boolean_vrednost boolean,
    CONSTRAINT fin_korisnik_naplata_atributi_vrednosti_pkey PRIMARY KEY (id),
    CONSTRAINT fk_knav_kn FOREIGN KEY (korisnici_naplata_id) REFERENCES fin_korisnici_naplati(id),
    CONSTRAINT fk_knav_kvna FOREIGN KEY (korisnik_vid_naplata_atribut_id) REFERENCES fin_korisnik_vid_naplati_attributi(id)
);

-- ============ TABLE: fin_korisnik_vid_naplati ============
CREATE TABLE public.fin_korisnik_vid_naplati (
    id integer NOT NULL DEFAULT nextval('fin_korisnik_vid_naplati_id_seq'::regclass),
    ime_vid character varying(255),
    CONSTRAINT fin_korisnik_vid_naplati_pkey PRIMARY KEY (id)
);

-- ============ TABLE: fin_korisnik_vid_naplati_attributi ============
CREATE TABLE public.fin_korisnik_vid_naplati_attributi (
    id integer NOT NULL DEFAULT nextval('fin_korisnik_vid_naplati_attributi_id_seq'::regclass),
    korisnik_vid_naplata_id integer NOT NULL,
    tip_atribut_id integer NOT NULL,
    ime_atribut character varying(255),
    zadolzitelen boolean,
    CONSTRAINT fin_korisnik_vid_naplati_attributi_pkey PRIMARY KEY (id),
    CONSTRAINT fk_kvna_tip_atr FOREIGN KEY (tip_atribut_id) REFERENCES tip_atribut(id),
    CONSTRAINT fk_kvna_vid_nap FOREIGN KEY (korisnik_vid_naplata_id) REFERENCES fin_korisnik_vid_naplati(id)
);

-- ============ TABLE: fin_naplata_alokacija ============
CREATE TABLE public.fin_naplata_alokacija (
    id integer NOT NULL DEFAULT nextval('fin_naplata_alokacija_id_seq'::regclass),
    naplata_id integer NOT NULL,
    finansiska_obvrska_id integer NOT NULL,
    finansiska_obvrska_stavka_id integer,
    alocirana_suma numeric(14,2),
    created_at timestamp without time zone NOT NULL,
    CONSTRAINT fin_naplata_alokacija_pkey PRIMARY KEY (id),
    CONSTRAINT chk_na_suma CHECK ((alocirana_suma > (0)::numeric)),
    CONSTRAINT fk_na_fo FOREIGN KEY (finansiska_obvrska_id) REFERENCES fin_finansiska_obvrska(id),
    CONSTRAINT fk_na_fos FOREIGN KEY (finansiska_obvrska_stavka_id) REFERENCES fin_finansiska_obvrska_stavka(id),
    CONSTRAINT fk_na_naplata FOREIGN KEY (naplata_id) REFERENCES fin_naplati(id) ON DELETE CASCADE
);

-- ============ TABLE: fin_naplati ============
CREATE TABLE public.fin_naplati (
    id integer NOT NULL DEFAULT nextval('fin_naplati_id_seq'::regclass),
    user_id integer NOT NULL,
    korisnik_naplata_id integer NOT NULL,
    transakciska_smetka_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    naplatena_suma numeric(14,2) NOT NULL,
    vid_valuta_id integer NOT NULL,
    status_transakcija_id integer NOT NULL,
    nadvoresna_referenca character varying(255),
    provider_transaction_id character varying(255),
    requested_at timestamp without time zone,
    confirmed_at timestamp without time zone,
    data date,
    CONSTRAINT fin_naplati_pkey PRIMARY KEY (id),
    CONSTRAINT chk_naplata_suma CHECK ((naplatena_suma > (0)::numeric)),
    CONSTRAINT fk_nap_kor_nap FOREIGN KEY (korisnik_naplata_id) REFERENCES fin_korisnici_naplati(id),
    CONSTRAINT fk_nap_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_nap_smetka FOREIGN KEY (transakciska_smetka_id) REFERENCES fin_transakciski_smetki(id),
    CONSTRAINT fk_nap_stat_trans FOREIGN KEY (status_transakcija_id) REFERENCES fin_status_transakcija(id),
    CONSTRAINT fk_nap_user FOREIGN KEY (user_id) REFERENCES korisnici(id),
    CONSTRAINT fk_nap_valuta FOREIGN KEY (vid_valuta_id) REFERENCES fin_vid_valuta(id)
);

-- ============ TABLE: fin_plata_komponenta ============
CREATE TABLE public.fin_plata_komponenta (
    id integer NOT NULL DEFAULT nextval('fin_plata_komponenta_id_seq'::regclass),
    plata_stavka_vraboten_id integer NOT NULL,
    tip_platna_komponenta_id integer NOT NULL,
    kvantitet numeric(12,2),
    stapka numeric(14,2),
    iznos numeric(14,2) NOT NULL,
    izvoren_tip character varying(255),
    opis character varying(255),
    CONSTRAINT fin_plata_komponenta_pkey PRIMARY KEY (id),
    CONSTRAINT fk_pk_stavka FOREIGN KEY (plata_stavka_vraboten_id) REFERENCES fin_plata_stavka_vraboten(id),
    CONSTRAINT fk_pk_tip FOREIGN KEY (tip_platna_komponenta_id) REFERENCES fin_tip_platna_komponenta(id)
);

-- ============ TABLE: fin_plata_period ============
CREATE TABLE public.fin_plata_period (
    id integer NOT NULL DEFAULT nextval('fin_plata_period_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    datum_od date NOT NULL,
    datum_do date NOT NULL,
    status_plata_period_id integer NOT NULL,
    created_at timestamp without time zone NOT NULL,
    approved_at timestamp without time zone,
    CONSTRAINT fin_plata_period_pkey PRIMARY KEY (id),
    CONSTRAINT chk_pp_period CHECK ((datum_od <= datum_do)),
    CONSTRAINT fk_pp_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_pp_status FOREIGN KEY (status_plata_period_id) REFERENCES fin_status_plata_period(id)
);

-- ============ TABLE: fin_plata_stavka_vraboten ============
CREATE TABLE public.fin_plata_stavka_vraboten (
    id integer NOT NULL DEFAULT nextval('fin_plata_stavka_vraboten_id_seq'::regclass),
    plata_period_id integer NOT NULL,
    vraboten_id integer NOT NULL,
    vraboteni_plata_id integer NOT NULL,
    bruto_vkupno numeric(14,2) NOT NULL,
    neto_vkupno numeric(14,2) NOT NULL,
    danoci_vkupno numeric(14,2) NOT NULL,
    odbivki_vkupno numeric(14,2) NOT NULL,
    vid_valuta_id integer NOT NULL,
    CONSTRAINT fin_plata_stavka_vraboten_pkey PRIMARY KEY (id),
    CONSTRAINT chk_psv_nenegativni CHECK (((bruto_vkupno >= (0)::numeric) AND (neto_vkupno >= (0)::numeric) AND (danoci_vkupno >= (0)::numeric))),
    CONSTRAINT chk_psv_neto_max CHECK ((neto_vkupno <= bruto_vkupno)),
    CONSTRAINT fk_psv_period FOREIGN KEY (plata_period_id) REFERENCES fin_plata_period(id),
    CONSTRAINT fk_psv_plata FOREIGN KEY (vraboteni_plata_id) REFERENCES vr_vraboten_kompensacija(id),
    CONSTRAINT fk_psv_valuta FOREIGN KEY (vid_valuta_id) REFERENCES fin_vid_valuta(id),
    CONSTRAINT fk_psv_vraboten FOREIGN KEY (vraboten_id) REFERENCES vr_vraboten_angazman(id)
);

-- ============ TABLE: fin_plata_vlez ============
CREATE TABLE public.fin_plata_vlez (
    id integer NOT NULL DEFAULT nextval('fin_plata_vlez_id_seq'::regclass),
    plata_period_id integer NOT NULL,
    vraboten_id integer NOT NULL,
    tip_platna_komponenta_id integer NOT NULL,
    kvantitet numeric(12,2),
    stapka numeric(14,2),
    amount numeric(14,2),
    izvoren_tip character varying(255),
    CONSTRAINT fin_plata_vlez_pkey PRIMARY KEY (id),
    CONSTRAINT fk_pv_period FOREIGN KEY (plata_period_id) REFERENCES fin_plata_period(id),
    CONSTRAINT fk_pv_tip_komp FOREIGN KEY (tip_platna_komponenta_id) REFERENCES fin_tip_platna_komponenta(id),
    CONSTRAINT fk_pv_vraboten FOREIGN KEY (vraboten_id) REFERENCES vr_vraboten_angazman(id)
);

-- ============ TABLE: fin_status_finansiska_obvrska ============
CREATE TABLE public.fin_status_finansiska_obvrska (
    id integer NOT NULL DEFAULT nextval('fin_status_finansiska_obvrska_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT fin_status_finansiska_obvrska_pkey PRIMARY KEY (id),
    CONSTRAINT fin_status_finansiska_obvrska_kod_key UNIQUE (kod)
);

-- ============ TABLE: fin_status_isplatna_obvrska ============
CREATE TABLE public.fin_status_isplatna_obvrska (
    id integer NOT NULL DEFAULT nextval('fin_status_isplatna_obvrska_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT fin_status_isplatna_obvrska_pkey PRIMARY KEY (id),
    CONSTRAINT fin_status_isplatna_obvrska_kod_key UNIQUE (kod)
);

-- ============ TABLE: fin_status_plata_period ============
CREATE TABLE public.fin_status_plata_period (
    id integer NOT NULL DEFAULT nextval('fin_status_plata_period_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT fin_status_plata_period_pkey PRIMARY KEY (id),
    CONSTRAINT fin_status_plata_period_kod_key UNIQUE (kod)
);

-- ============ TABLE: fin_status_transakcija ============
CREATE TABLE public.fin_status_transakcija (
    id integer NOT NULL DEFAULT nextval('fin_status_transakcija_id_seq'::regclass),
    ime_status character varying(255),
    CONSTRAINT fin_status_transakcija_pkey PRIMARY KEY (id),
    CONSTRAINT fin_status_transakcija_ime_status_key UNIQUE (ime_status)
);

-- ============ TABLE: fin_tip_isplatna_obvrska ============
CREATE TABLE public.fin_tip_isplatna_obvrska (
    id integer NOT NULL DEFAULT nextval('fin_tip_isplatna_obvrska_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT fin_tip_isplatna_obvrska_pkey PRIMARY KEY (id),
    CONSTRAINT fin_tip_isplatna_obvrska_kod_key UNIQUE (kod)
);

-- ============ TABLE: fin_tip_naplati_cenovnik ============
CREATE TABLE public.fin_tip_naplati_cenovnik (
    id integer NOT NULL DEFAULT nextval('fin_tip_naplati_cenovnik_id_seq'::regclass),
    tip_naplata_organizaciona_edinica_id integer NOT NULL,
    vid_valuta_id integer NOT NULL,
    iznos numeric(14,2) NOT NULL,
    valid_from date NOT NULL,
    valid_to date,
    prioritet integer NOT NULL DEFAULT 1,
    dozvoli_rati boolean NOT NULL DEFAULT false,
    max_rati integer,
    aktivna boolean NOT NULL DEFAULT true,
    CONSTRAINT fin_tip_naplati_cenovnik_pkey PRIMARY KEY (id),
    CONSTRAINT chk_cenovnik_iznos CHECK ((iznos > (0)::numeric)),
    CONSTRAINT chk_cenovnik_period CHECK (((valid_to IS NULL) OR (valid_from <= valid_to))),
    CONSTRAINT fk_tnc_tnoe FOREIGN KEY (tip_naplata_organizaciona_edinica_id) REFERENCES fin_tip_naplati_organizaciona_edinica(id),
    CONSTRAINT fk_tnc_valuta FOREIGN KEY (vid_valuta_id) REFERENCES fin_vid_valuta(id)
);

-- ============ TABLE: fin_tip_naplati_organizaciona_edinica ============
CREATE TABLE public.fin_tip_naplati_organizaciona_edinica (
    id integer NOT NULL DEFAULT nextval('fin_tip_naplati_organizaciona_edinica_id_seq'::regclass),
    ime_tip_naplata character varying(255) NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    aktivna boolean NOT NULL DEFAULT true,
    CONSTRAINT fin_tip_naplati_organizaciona_edinica_pkey PRIMARY KEY (id),
    CONSTRAINT fk_tnoe_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id)
);

-- ============ TABLE: fin_tip_platna_komponenta ============
CREATE TABLE public.fin_tip_platna_komponenta (
    id integer NOT NULL DEFAULT nextval('fin_tip_platna_komponenta_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    kategorija character varying(255) NOT NULL,
    default_sign integer NOT NULL,
    CONSTRAINT fin_tip_platna_komponenta_pkey PRIMARY KEY (id),
    CONSTRAINT fin_tip_platna_komponenta_kod_key UNIQUE (kod)
);

-- ============ TABLE: fin_transakciski_smetki ============
CREATE TABLE public.fin_transakciski_smetki (
    id integer NOT NULL DEFAULT nextval('fin_transakciski_smetki_id_seq'::regclass),
    banka_id integer,
    account_holder_ime character varying(255),
    iban character varying(255),
    domestic_account_number character varying(255),
    routing_code character varying(255),
    account_type character varying(255) NOT NULL,
    vid_valuta_id integer NOT NULL,
    aktivna boolean NOT NULL DEFAULT true,
    CONSTRAINT fin_transakciski_smetki_pkey PRIMARY KEY (id),
    CONSTRAINT fk_ts_banka FOREIGN KEY (banka_id) REFERENCES fin_banki(id),
    CONSTRAINT fk_ts_valuta FOREIGN KEY (vid_valuta_id) REFERENCES fin_vid_valuta(id)
);

-- ============ TABLE: fin_vid_valuta ============
CREATE TABLE public.fin_vid_valuta (
    id integer NOT NULL DEFAULT nextval('fin_vid_valuta_id_seq'::regclass),
    iso_code character varying(3) NOT NULL,
    ime_valuta character varying(255) NOT NULL,
    simbol character varying(255),
    decimali_kvantitet integer NOT NULL DEFAULT 2,
    aktivna boolean NOT NULL DEFAULT true,
    CONSTRAINT fin_vid_valuta_pkey PRIMARY KEY (id),
    CONSTRAINT fin_vid_valuta_iso_code_key UNIQUE (iso_code)
);

-- ============ TABLE: gradovi ============
CREATE TABLE public.gradovi (
    id integer NOT NULL DEFAULT nextval('gradovi_id_seq'::regclass),
    grad_kod character varying(255),
    grad_ime character varying(255),
    drzava_id integer NOT NULL,
    CONSTRAINT gradovi_pkey PRIMARY KEY (id),
    CONSTRAINT fk_gradovi_drzava FOREIGN KEY (drzava_id) REFERENCES drzavi(id)
);

-- ============ TABLE: korisnici ============
CREATE TABLE public.korisnici (
    id integer NOT NULL DEFAULT nextval('korisnici_id_seq'::regclass),
    username character varying(255),
    password character varying(255),
    lice_id integer NOT NULL,
    created_at timestamp without time zone,
    updated_at timestamp without time zone,
    CONSTRAINT korisnici_pkey PRIMARY KEY (id),
    CONSTRAINT fk_korisnici_lice FOREIGN KEY (lice_id) REFERENCES lice(id)
);

-- ============ TABLE: lice ============
CREATE TABLE public.lice (
    id integer NOT NULL DEFAULT nextval('lice_id_seq'::regclass),
    ime character varying(255),
    prezime character varying(255),
    datum_ragjanje date,
    pol character varying(255),
    email character varying(255),
    telefon character varying(255),
    grad_id integer NOT NULL,
    aktiven boolean,
    CONSTRAINT lice_pkey PRIMARY KEY (id),
    CONSTRAINT fk_lice_grad FOREIGN KEY (grad_id) REFERENCES gradovi(id)
);

-- ============ TABLE: or_mapa_objekt ============
CREATE TABLE public.or_mapa_objekt (
    id integer NOT NULL DEFAULT nextval('or_mapa_objekt_id_seq'::regclass),
    map_object_type_id integer NOT NULL,
    spatial_tekst text,
    CONSTRAINT or_mapa_objekt_pkey PRIMARY KEY (id),
    CONSTRAINT fk_mapa_obj_tip FOREIGN KEY (map_object_type_id) REFERENCES or_tip_mapa_objekt(id)
);

-- ============ TABLE: or_mapa_objekt_organizacija ============
CREATE TABLE public.or_mapa_objekt_organizacija (
    id integer NOT NULL DEFAULT nextval('or_mapa_objekt_organizacija_id_seq'::regclass),
    tip_objekt_organizacija_id integer NOT NULL,
    ime character varying(255),
    mapa_objekt_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    mapa_objekt_organizacija_id integer,
    CONSTRAINT or_mapa_objekt_organizacija_pkey PRIMARY KEY (id),
    CONSTRAINT fk_moo_mapa_obj FOREIGN KEY (mapa_objekt_id) REFERENCES or_mapa_objekt(id),
    CONSTRAINT fk_moo_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_moo_parent FOREIGN KEY (mapa_objekt_organizacija_id) REFERENCES or_mapa_objekt_organizacija(id),
    CONSTRAINT fk_moo_tip_obj FOREIGN KEY (tip_objekt_organizacija_id) REFERENCES or_tip_objekt_organizacija(id)
);

-- ============ TABLE: or_organizaciona_edinica ============
CREATE TABLE public.or_organizaciona_edinica (
    id integer NOT NULL DEFAULT nextval('or_organizaciona_edinica_id_seq'::regclass),
    toe_id integer NOT NULL,
    oe_id integer,
    ime character varying(255),
    mapa_objekt_id integer,
    CONSTRAINT or_organizaciona_edinica_pkey PRIMARY KEY (id),
    CONSTRAINT fk_org_ed_mapa FOREIGN KEY (mapa_objekt_id) REFERENCES or_mapa_objekt(id),
    CONSTRAINT fk_org_ed_oe FOREIGN KEY (oe_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_org_ed_toe FOREIGN KEY (toe_id) REFERENCES or_tipovi_organizaciona_edinica(id)
);

-- ============ TABLE: or_organizaciona_edinica_atributi_vrednosti ============
CREATE TABLE public.or_organizaciona_edinica_atributi_vrednosti (
    id integer NOT NULL DEFAULT nextval('or_organizaciona_edinica_atributi_vrednosti_id_seq'::regclass),
    tip_organizaciona_edinica_atribut integer NOT NULL,
    organizaciona_edinica integer NOT NULL,
    string_vrednost character varying(255),
    numericka_vrednost numeric,
    boolean_vrednost boolean,
    CONSTRAINT or_organizaciona_edinica_atributi_vrednosti_pkey PRIMARY KEY (id),
    CONSTRAINT fk_oeav_oe FOREIGN KEY (organizaciona_edinica) REFERENCES or_organizaciona_edinica(id) ON DELETE CASCADE,
    CONSTRAINT fk_oeav_toea FOREIGN KEY (tip_organizaciona_edinica_atribut) REFERENCES or_tipovi_organizaciona_edinica_atributi(id)
);

-- ============ TABLE: or_organizaciona_edinica_smetki ============
CREATE TABLE public.or_organizaciona_edinica_smetki (
    id integer NOT NULL DEFAULT nextval('or_organizaciona_edinica_smetki_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    transakciska_smetka_id integer NOT NULL,
    aktivna boolean,
    CONSTRAINT or_organizaciona_edinica_smetki_pkey PRIMARY KEY (id),
    CONSTRAINT fk_oes_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_oes_smetka FOREIGN KEY (transakciska_smetka_id) REFERENCES fin_transakciski_smetki(id)
);

-- ============ TABLE: or_tip_mapa_objekt ============
CREATE TABLE public.or_tip_mapa_objekt (
    id integer NOT NULL DEFAULT nextval('or_tip_mapa_objekt_id_seq'::regclass),
    name character varying(255),
    CONSTRAINT or_tip_mapa_objekt_pkey PRIMARY KEY (id),
    CONSTRAINT or_tip_mapa_objekt_name_key UNIQUE (name)
);

-- ============ TABLE: or_tip_objekt_organizacija ============
CREATE TABLE public.or_tip_objekt_organizacija (
    id integer NOT NULL DEFAULT nextval('or_tip_objekt_organizacija_id_seq'::regclass),
    ime character varying(255),
    CONSTRAINT or_tip_objekt_organizacija_pkey PRIMARY KEY (id)
);

-- ============ TABLE: or_tipovi_organizaciona_edinica ============
CREATE TABLE public.or_tipovi_organizaciona_edinica (
    id integer NOT NULL DEFAULT nextval('or_tipovi_organizaciona_edinica_id_seq'::regclass),
    ime character varying(255),
    CONSTRAINT or_tipovi_organizaciona_edinica_pkey PRIMARY KEY (id)
);

-- ============ TABLE: or_tipovi_organizaciona_edinica_atributi ============
CREATE TABLE public.or_tipovi_organizaciona_edinica_atributi (
    id integer NOT NULL DEFAULT nextval('or_tipovi_organizaciona_edinica_atributi_id_seq'::regclass),
    tip_organizaciona_edinica_id integer NOT NULL,
    ime character varying(255),
    regex character varying(255),
    tip_atribut_id integer NOT NULL,
    zadolzitelen boolean,
    CONSTRAINT or_tipovi_organizaciona_edinica_atributi_pkey PRIMARY KEY (id),
    CONSTRAINT fk_toea_tip_atr FOREIGN KEY (tip_atribut_id) REFERENCES tip_atribut(id),
    CONSTRAINT fk_toea_toe FOREIGN KEY (tip_organizaciona_edinica_id) REFERENCES or_tipovi_organizaciona_edinica(id)
);

-- ============ TABLE: sm_akademska_godina ============
CREATE TABLE public.sm_akademska_godina (
    id integer NOT NULL DEFAULT nextval('sm_akademska_godina_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    oznaka character varying(255),
    datum_od date NOT NULL,
    datum_do date NOT NULL,
    aktivna boolean DEFAULT true,
    CONSTRAINT sm_akademska_godina_pkey PRIMARY KEY (id),
    CONSTRAINT sm_akademska_godina_oznaka_key UNIQUE (oznaka),
    CONSTRAINT chk_ag_period CHECK ((datum_od <= datum_do)),
    CONSTRAINT fk_ag_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id)
);

-- ============ TABLE: sm_akademski_semestar ============
CREATE TABLE public.sm_akademski_semestar (
    id integer NOT NULL DEFAULT nextval('sm_akademski_semestar_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    akademska_godina_id integer NOT NULL,
    tip_akademski_semestar_id integer NOT NULL,
    period_akademski_semestar_id integer NOT NULL,
    tip_naplata_organizaciona_edinica_id integer NOT NULL,
    name character varying(255),
    CONSTRAINT sm_akademski_semestar_pkey PRIMARY KEY (id),
    CONSTRAINT fk_as_godina FOREIGN KEY (akademska_godina_id) REFERENCES sm_akademska_godina(id),
    CONSTRAINT fk_as_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_as_period FOREIGN KEY (period_akademski_semestar_id) REFERENCES sm_period_akademski_semestar(id),
    CONSTRAINT fk_as_tip FOREIGN KEY (tip_akademski_semestar_id) REFERENCES sm_tip_akademski_semestar(id),
    CONSTRAINT fk_as_tip_naplata FOREIGN KEY (tip_naplata_organizaciona_edinica_id) REFERENCES fin_tip_naplati_organizaciona_edinica(id)
);

-- ============ TABLE: sm_akademski_semestar_smer_kvota ============
CREATE TABLE public.sm_akademski_semestar_smer_kvota (
    id integer NOT NULL DEFAULT nextval('sm_akademski_semestar_smer_kvota_id_seq'::regclass),
    akademski_semestar_id integer NOT NULL,
    smer_verzija_id integer NOT NULL,
    tip_kvota_id integer NOT NULL,
    tip_naplata_oe_id integer NOT NULL,
    aktivna boolean DEFAULT true,
    CONSTRAINT sm_akademski_semestar_smer_kvota_pkey PRIMARY KEY (id),
    CONSTRAINT fk_assk_kvota FOREIGN KEY (tip_kvota_id) REFERENCES sm_tip_kvota(id),
    CONSTRAINT fk_assk_semestar FOREIGN KEY (akademski_semestar_id) REFERENCES sm_akademski_semestar(id),
    CONSTRAINT fk_assk_tip_naplata FOREIGN KEY (tip_naplata_oe_id) REFERENCES fin_tip_naplati_organizaciona_edinica(id),
    CONSTRAINT fk_assk_verzija FOREIGN KEY (smer_verzija_id) REFERENCES sm_smer_verzija(id)
);

-- ============ TABLE: sm_akreditacija ============
CREATE TABLE public.sm_akreditacija (
    id integer NOT NULL DEFAULT nextval('sm_akreditacija_id_seq'::regclass),
    tip_akreditacija_id integer NOT NULL,
    predmet_id integer NOT NULL,
    naziv_verzija character varying(255),
    opis_sodrzina text,
    krediti integer NOT NULL,
    status_akreditacija_id integer NOT NULL,
    akreditacisko_telo_id integer NOT NULL,
    validen_od date NOT NULL,
    validen_do date,
    broj_odluka character varying(255),
    aktiven boolean DEFAULT true,
    CONSTRAINT sm_akreditacija_pkey PRIMARY KEY (id),
    CONSTRAINT chk_ak_krediti CHECK ((krediti > 0)),
    CONSTRAINT fk_akr_predmet FOREIGN KEY (predmet_id) REFERENCES sm_predmet(id),
    CONSTRAINT fk_akr_status FOREIGN KEY (status_akreditacija_id) REFERENCES sm_status_akreditacija(id),
    CONSTRAINT fk_akr_telo FOREIGN KEY (akreditacisko_telo_id) REFERENCES sm_akreditacisko_telo(id),
    CONSTRAINT fk_akr_tip FOREIGN KEY (tip_akreditacija_id) REFERENCES sm_tip_akreditacija(id)
);

-- ============ TABLE: sm_akreditacija_fond ============
CREATE TABLE public.sm_akreditacija_fond (
    id integer NOT NULL DEFAULT nextval('sm_akreditacija_fond_id_seq'::regclass),
    tip_fond character varying(255),
    fond integer,
    akreditacija_id integer NOT NULL,
    CONSTRAINT sm_akreditacija_fond_pkey PRIMARY KEY (id),
    CONSTRAINT fk_af_akr FOREIGN KEY (akreditacija_id) REFERENCES sm_akreditacija(id)
);

-- ============ TABLE: sm_akreditacija_predmet_grupa_preduslov ============
CREATE TABLE public.sm_akreditacija_predmet_grupa_preduslov (
    id integer NOT NULL DEFAULT nextval('sm_akreditacija_predmet_grupa_preduslov_id_seq'::regclass),
    akreditacija_id integer NOT NULL,
    logicki_operator character varying(255),
    CONSTRAINT sm_akreditacija_predmet_grupa_preduslov_pkey PRIMARY KEY (id),
    CONSTRAINT fk_apgp_akr FOREIGN KEY (akreditacija_id) REFERENCES sm_akreditacija(id)
);

-- ============ TABLE: sm_akreditacija_predmet_preduslov ============
CREATE TABLE public.sm_akreditacija_predmet_preduslov (
    id integer NOT NULL DEFAULT nextval('sm_akreditacija_predmet_preduslov_id_seq'::regclass),
    akreditacija_predmet_grupa_preduslov_id integer NOT NULL,
    predmet_id integer,
    krediti_preduslov integer,
    CONSTRAINT sm_akreditacija_predmet_preduslov_pkey PRIMARY KEY (id),
    CONSTRAINT fk_app_grupa FOREIGN KEY (akreditacija_predmet_grupa_preduslov_id) REFERENCES sm_akreditacija_predmet_grupa_preduslov(id),
    CONSTRAINT fk_app_predmet FOREIGN KEY (predmet_id) REFERENCES sm_predmet(id)
);

-- ============ TABLE: sm_akreditacija_telo_clen ============
CREATE TABLE public.sm_akreditacija_telo_clen (
    id integer NOT NULL DEFAULT nextval('sm_akreditacija_telo_clen_id_seq'::regclass),
    akreditacisko_telo_id integer NOT NULL,
    vraboten_angazman_id integer,
    tip_uloga_akreditacija_telo_id integer NOT NULL,
    datum_od date,
    datum_do date,
    aktiven boolean NOT NULL DEFAULT true,
    CONSTRAINT sm_akreditacija_telo_clen_pkey PRIMARY KEY (id),
    CONSTRAINT fk_atc_angazman FOREIGN KEY (vraboten_angazman_id) REFERENCES vr_vraboten_angazman(id),
    CONSTRAINT fk_atc_telo FOREIGN KEY (akreditacisko_telo_id) REFERENCES sm_akreditacisko_telo(id),
    CONSTRAINT fk_atc_uloga FOREIGN KEY (tip_uloga_akreditacija_telo_id) REFERENCES sm_tip_uloga_akreditacija_telo(id)
);

-- ============ TABLE: sm_akreditacisko_telo ============
CREATE TABLE public.sm_akreditacisko_telo (
    id integer NOT NULL DEFAULT nextval('sm_akreditacisko_telo_id_seq'::regclass),
    tip_akreditacisko_telo_id integer NOT NULL,
    organizaciona_edinica_id integer,
    ime character varying(255) NOT NULL,
    opis character varying(255),
    aktiven boolean NOT NULL DEFAULT true,
    CONSTRAINT sm_akreditacisko_telo_pkey PRIMARY KEY (id),
    CONSTRAINT fk_at_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_at_tip FOREIGN KEY (tip_akreditacisko_telo_id) REFERENCES sm_tip_akreditacisko_telo(id)
);

-- ============ TABLE: sm_ispitna_sesija ============
CREATE TABLE public.sm_ispitna_sesija (
    id integer NOT NULL DEFAULT nextval('sm_ispitna_sesija_id_seq'::regclass),
    akademski_semestar_id integer NOT NULL,
    naziv character varying(255) NOT NULL,
    datum_od date NOT NULL,
    datum_do date NOT NULL,
    status character varying(255),
    CONSTRAINT sm_ispitna_sesija_pkey PRIMARY KEY (id),
    CONSTRAINT chk_sesija_period CHECK ((datum_od <= datum_do)),
    CONSTRAINT fk_is_semestar FOREIGN KEY (akademski_semestar_id) REFERENCES sm_akademski_semestar(id)
);

-- ============ TABLE: sm_kurs_realizacija ============
CREATE TABLE public.sm_kurs_realizacija (
    id integer NOT NULL DEFAULT nextval('sm_kurs_realizacija_id_seq'::regclass),
    akreditacija_id integer NOT NULL,
    akademski_semestar_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    kapacitet_studenti integer,
    minimalen_broj integer,
    status character varying(255),
    CONSTRAINT sm_kurs_realizacija_pkey PRIMARY KEY (id),
    CONSTRAINT chk_kr_kapacitet CHECK (((kapacitet_studenti IS NULL) OR (kapacitet_studenti > 0))),
    CONSTRAINT fk_kr_akr FOREIGN KEY (akreditacija_id) REFERENCES sm_akreditacija(id),
    CONSTRAINT fk_kr_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_kr_semestar FOREIGN KEY (akademski_semestar_id) REFERENCES sm_akademski_semestar(id)
);

-- ============ TABLE: sm_kurs_realizacija_nastaven_kadar ============
CREATE TABLE public.sm_kurs_realizacija_nastaven_kadar (
    id integer NOT NULL DEFAULT nextval('sm_kurs_realizacija_nastaven_kadar_id_seq'::regclass),
    vraboten_angazman_id integer NOT NULL,
    tip_uloga_nastaven_kadar_id integer NOT NULL,
    fond_casovi_nedelno numeric(5,2),
    datum_od date NOT NULL,
    datum_do date,
    primaren boolean NOT NULL DEFAULT false,
    aktiven boolean NOT NULL DEFAULT true,
    CONSTRAINT sm_kurs_realizacija_nastaven_kadar_pkey PRIMARY KEY (id),
    CONSTRAINT chk_krnk_fond CHECK (((fond_casovi_nedelno IS NULL) OR (fond_casovi_nedelno > (0)::numeric))),
    CONSTRAINT chk_krnk_period CHECK (((datum_do IS NULL) OR (datum_od <= datum_do))),
    CONSTRAINT fk_krnk_angazman FOREIGN KEY (vraboten_angazman_id) REFERENCES vr_vraboten_angazman(id),
    CONSTRAINT fk_krnk_uloga FOREIGN KEY (tip_uloga_nastaven_kadar_id) REFERENCES vr_tip_uloga_nastaven_kadar(id)
);

-- ============ TABLE: sm_kurs_realizacija_paralelka ============
CREATE TABLE public.sm_kurs_realizacija_paralelka (
    id integer NOT NULL DEFAULT nextval('sm_kurs_realizacija_paralelka_id_seq'::regclass),
    kurs_realizacija_id integer NOT NULL,
    oznaka character varying(255) NOT NULL,
    kapacitet_studenti integer NOT NULL,
    aktiven boolean DEFAULT true,
    CONSTRAINT sm_kurs_realizacija_paralelka_pkey PRIMARY KEY (id),
    CONSTRAINT fk_krp_realizacija FOREIGN KEY (kurs_realizacija_id) REFERENCES sm_kurs_realizacija(id)
);

-- ============ TABLE: sm_organizaciona_edinica_diplomirani ============
CREATE TABLE public.sm_organizaciona_edinica_diplomirani (
    id integer NOT NULL DEFAULT nextval('sm_organizaciona_edinica_diplomirani_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    student_id integer NOT NULL,
    diploma_dokument_id integer NOT NULL,
    smer_id integer NOT NULL,
    akademska_godina_id integer NOT NULL,
    CONSTRAINT sm_organizaciona_edinica_diplomirani_pkey PRIMARY KEY (id),
    CONSTRAINT fk_oedip_ag FOREIGN KEY (akademska_godina_id) REFERENCES sm_akademska_godina(id),
    CONSTRAINT fk_oedip_dok FOREIGN KEY (diploma_dokument_id) REFERENCES dok_generiran_dokument(id),
    CONSTRAINT fk_oedip_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_oedip_smer FOREIGN KEY (smer_id) REFERENCES sm_smer(id),
    CONSTRAINT fk_oedip_stud FOREIGN KEY (student_id) REFERENCES sm_studenti(id)
);

-- ============ TABLE: sm_organizaciona_edinica_dostignuvanja ============
CREATE TABLE public.sm_organizaciona_edinica_dostignuvanja (
    id integer NOT NULL DEFAULT nextval('sm_organizaciona_edinica_dostignuvanja_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    tip_dostignuvanje_id integer NOT NULL,
    opis character varying(255),
    aktiven boolean,
    CONSTRAINT sm_organizaciona_edinica_dostignuvanja_pkey PRIMARY KEY (id),
    CONSTRAINT fk_oed_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_oed_tip FOREIGN KEY (tip_dostignuvanje_id) REFERENCES sm_tip_dostignuvanje(id)
);

-- ============ TABLE: sm_organizaciona_edinica_student_atributi ============
CREATE TABLE public.sm_organizaciona_edinica_student_atributi (
    id integer NOT NULL DEFAULT nextval('sm_organizaciona_edinica_student_atributi_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    ime character varying(255),
    regex character varying(255),
    tip_atribut_id integer NOT NULL,
    zadolzitelen boolean,
    CONSTRAINT sm_organizaciona_edinica_student_atributi_pkey PRIMARY KEY (id),
    CONSTRAINT fk_oesa_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_tipovi_organizaciona_edinica(id),
    CONSTRAINT fk_oesa_tip_atr FOREIGN KEY (tip_atribut_id) REFERENCES tip_atribut(id)
);

-- ============ TABLE: sm_organizaciona_edinica_student_atributi_vrednosti ============
CREATE TABLE public.sm_organizaciona_edinica_student_atributi_vrednosti (
    id integer NOT NULL DEFAULT nextval('sm_organizaciona_edinica_student_atributi_vrednosti_id_seq'::regclass),
    organizaciona_edinica_student_atribut integer NOT NULL,
    student_id integer NOT NULL,
    string_vrednost character varying(255),
    numericka_vrednost numeric,
    boolean_vrednost boolean,
    CONSTRAINT sm_organizaciona_edinica_student_atributi_vrednosti_pkey PRIMARY KEY (id),
    CONSTRAINT fk_oesav_oesa FOREIGN KEY (organizaciona_edinica_student_atribut) REFERENCES sm_organizaciona_edinica_student_atributi(id),
    CONSTRAINT fk_oesav_stud FOREIGN KEY (student_id) REFERENCES sm_studenti(id)
);

-- ============ TABLE: sm_organizaciona_edinica_upis_pravilo ============
CREATE TABLE public.sm_organizaciona_edinica_upis_pravilo (
    id integer NOT NULL DEFAULT nextval('sm_organizaciona_edinica_upis_pravilo_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    templejt character varying(255),
    validaciski_regex character varying(255),
    strategija character varying(255),
    CONSTRAINT sm_organizaciona_edinica_upis_pravilo_pkey PRIMARY KEY (id),
    CONSTRAINT fk_oeup_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id)
);

-- ============ TABLE: sm_paralelka_nastaven_kadar ============
CREATE TABLE public.sm_paralelka_nastaven_kadar (
    id integer NOT NULL DEFAULT nextval('sm_paralelka_nastaven_kadar_id_seq'::regclass),
    kurs_realizacija_paralelka_id integer NOT NULL,
    kurs_realizacija_kadar_id integer NOT NULL,
    CONSTRAINT sm_paralelka_nastaven_kadar_pkey PRIMARY KEY (id),
    CONSTRAINT fk_pnk_kadar FOREIGN KEY (kurs_realizacija_kadar_id) REFERENCES sm_kurs_realizacija_nastaven_kadar(id) ON DELETE CASCADE,
    CONSTRAINT fk_pnk_paralelka FOREIGN KEY (kurs_realizacija_paralelka_id) REFERENCES sm_kurs_realizacija_paralelka(id)
);

-- ============ TABLE: sm_period_akademski_semestar ============
CREATE TABLE public.sm_period_akademski_semestar (
    id integer NOT NULL DEFAULT nextval('sm_period_akademski_semestar_id_seq'::regclass),
    ime_period character varying(255),
    CONSTRAINT sm_period_akademski_semestar_pkey PRIMARY KEY (id),
    CONSTRAINT sm_period_akademski_semestar_ime_period_key UNIQUE (ime_period)
);

-- ============ TABLE: sm_predmet ============
CREATE TABLE public.sm_predmet (
    id integer NOT NULL DEFAULT nextval('sm_predmet_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    kratenka character varying(255),
    ime_predmet character varying(255) NOT NULL,
    opis text,
    CONSTRAINT sm_predmet_pkey PRIMARY KEY (id),
    CONSTRAINT sm_predmet_kratenka_key UNIQUE (kratenka),
    CONSTRAINT fk_pred_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id)
);

-- ============ TABLE: sm_sistem_ocenuvanje ============
CREATE TABLE public.sm_sistem_ocenuvanje (
    id integer NOT NULL DEFAULT nextval('sm_sistem_ocenuvanje_id_seq'::regclass),
    organicationa_edinica_id integer NOT NULL,
    ime_sistem character varying(255),
    CONSTRAINT sm_sistem_ocenuvanje_pkey PRIMARY KEY (id),
    CONSTRAINT fk_so_org_ed FOREIGN KEY (organicationa_edinica_id) REFERENCES or_organizaciona_edinica(id)
);

-- ============ TABLE: sm_sistem_ocenuvanje_vrednost ============
CREATE TABLE public.sm_sistem_ocenuvanje_vrednost (
    id integer NOT NULL DEFAULT nextval('sm_sistem_ocenuvanje_vrednost_id_seq'::regclass),
    sistem_ocenuvanje_id integer NOT NULL,
    ocena_labela character varying(255),
    ocena_vrednost integer,
    polozitelna boolean,
    CONSTRAINT sm_sistem_ocenuvanje_vrednost_pkey PRIMARY KEY (id),
    CONSTRAINT chk_sov_vrednost CHECK (((ocena_vrednost IS NULL) OR (ocena_vrednost >= 0))),
    CONSTRAINT fk_sov_sistem FOREIGN KEY (sistem_ocenuvanje_id) REFERENCES sm_sistem_ocenuvanje(id) ON UPDATE CASCADE ON DELETE CASCADE
);

-- ============ TABLE: sm_smer ============
CREATE TABLE public.sm_smer (
    id integer NOT NULL DEFAULT nextval('sm_smer_id_seq'::regclass),
    organizaciona_edinica_id integer NOT NULL,
    ime_smer character varying(255),
    tip_smer_id integer NOT NULL,
    akademski_stepen_id integer NOT NULL,
    vid_kvalifikacija_id integer NOT NULL,
    pole_kvalifikacija_id integer NOT NULL,
    CONSTRAINT sm_smer_pkey PRIMARY KEY (id),
    CONSTRAINT fk_smer_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_smer_pole_kval FOREIGN KEY (pole_kvalifikacija_id) REFERENCES vr_pole_kvalifikacija(id),
    CONSTRAINT fk_smer_stepen FOREIGN KEY (akademski_stepen_id) REFERENCES vr_akademski_stepen(id),
    CONSTRAINT fk_smer_tip FOREIGN KEY (tip_smer_id) REFERENCES sm_tip_smer(id),
    CONSTRAINT fk_smer_vid_kval FOREIGN KEY (vid_kvalifikacija_id) REFERENCES vr_vid_kvalifikacija(id)
);

-- ============ TABLE: sm_smer_diplomiranje_grupa_preduslov ============
CREATE TABLE public.sm_smer_diplomiranje_grupa_preduslov (
    id integer NOT NULL DEFAULT nextval('sm_smer_diplomiranje_grupa_preduslov_id_seq'::regclass),
    smer_verzija_id integer NOT NULL,
    logicki_operator character varying(255),
    CONSTRAINT sm_smer_diplomiranje_grupa_preduslov_pkey PRIMARY KEY (id),
    CONSTRAINT fk_sdgp_verzija FOREIGN KEY (smer_verzija_id) REFERENCES sm_smer_verzija(id)
);

-- ============ TABLE: sm_smer_diplomiranje_preduslov ============
CREATE TABLE public.sm_smer_diplomiranje_preduslov (
    id integer NOT NULL DEFAULT nextval('sm_smer_diplomiranje_preduslov_id_seq'::regclass),
    smer_diplomiranje_grupa_preduslov_id integer NOT NULL,
    krediti integer,
    organizaciona_edinica_dostignuvanje_id integer,
    CONSTRAINT sm_smer_diplomiranje_preduslov_pkey PRIMARY KEY (id),
    CONSTRAINT fk_sdp_dostignuvanje FOREIGN KEY (organizaciona_edinica_dostignuvanje_id) REFERENCES sm_organizaciona_edinica_dostignuvanja(id),
    CONSTRAINT fk_sdp_grupa FOREIGN KEY (smer_diplomiranje_grupa_preduslov_id) REFERENCES sm_smer_diplomiranje_grupa_preduslov(id)
);

-- ============ TABLE: sm_smer_upis_grupa_preduslov ============
CREATE TABLE public.sm_smer_upis_grupa_preduslov (
    id integer NOT NULL DEFAULT nextval('sm_smer_upis_grupa_preduslov_id_seq'::regclass),
    smer_verzija_id integer NOT NULL,
    logicki_operator character varying(255),
    CONSTRAINT sm_smer_upis_grupa_preduslov_pkey PRIMARY KEY (id),
    CONSTRAINT fk_sugp_verzija FOREIGN KEY (smer_verzija_id) REFERENCES sm_smer_verzija(id)
);

-- ============ TABLE: sm_smer_upis_preduslov ============
CREATE TABLE public.sm_smer_upis_preduslov (
    id integer NOT NULL DEFAULT nextval('sm_smer_upis_preduslov_id_seq'::regclass),
    smer_upis_grupa_preduslov_id integer NOT NULL,
    vid_kvalifikacija_id integer NOT NULL,
    pole_kvalifikacija_id integer NOT NULL,
    CONSTRAINT sm_smer_upis_preduslov_pkey PRIMARY KEY (id),
    CONSTRAINT fk_sup_grupa FOREIGN KEY (smer_upis_grupa_preduslov_id) REFERENCES sm_smer_upis_grupa_preduslov(id),
    CONSTRAINT fk_sup_pole_kval FOREIGN KEY (pole_kvalifikacija_id) REFERENCES vr_pole_kvalifikacija(id),
    CONSTRAINT fk_sup_vid_kval FOREIGN KEY (vid_kvalifikacija_id) REFERENCES vr_vid_kvalifikacija(id)
);

-- ============ TABLE: sm_smer_verzija ============
CREATE TABLE public.sm_smer_verzija (
    id integer NOT NULL DEFAULT nextval('sm_smer_verzija_id_seq'::regclass),
    smer_id integer NOT NULL,
    ime_smer_verzija character varying(255),
    aktiven boolean DEFAULT true,
    CONSTRAINT sm_smer_verzija_pkey PRIMARY KEY (id),
    CONSTRAINT fk_sv_smer FOREIGN KEY (smer_id) REFERENCES sm_smer(id)
);

-- ============ TABLE: sm_smer_verzija_semestar ============
CREATE TABLE public.sm_smer_verzija_semestar (
    id integer NOT NULL DEFAULT nextval('sm_smer_verzija_semestar_id_seq'::regclass),
    smer_verzija_id integer NOT NULL,
    reden_broj integer NOT NULL,
    period_akademski_semestar_id integer NOT NULL,
    vkupno_ects_potrebni integer DEFAULT 30,
    min_izborni_krediti integer,
    aktiven boolean DEFAULT true,
    CONSTRAINT sm_smer_verzija_semestar_pkey PRIMARY KEY (id),
    CONSTRAINT fk_svs_period FOREIGN KEY (period_akademski_semestar_id) REFERENCES sm_period_akademski_semestar(id),
    CONSTRAINT fk_svs_verzija FOREIGN KEY (smer_verzija_id) REFERENCES sm_smer_verzija(id)
);

-- ============ TABLE: sm_smer_verzija_semestar_kurs ============
CREATE TABLE public.sm_smer_verzija_semestar_kurs (
    id integer NOT NULL DEFAULT nextval('sm_smer_verzija_semestar_kurs_id_seq'::regclass),
    smer_verzija_semestar_id integer NOT NULL,
    akreditacija_id integer NOT NULL,
    zadolzitelen boolean NOT NULL DEFAULT true,
    izborna_grupa_kod character varying(255),
    aktiven boolean DEFAULT true,
    CONSTRAINT sm_smer_verzija_semestar_kurs_pkey PRIMARY KEY (id),
    CONSTRAINT fk_svsk_akr FOREIGN KEY (akreditacija_id) REFERENCES sm_akreditacija(id),
    CONSTRAINT fk_svsk_svs FOREIGN KEY (smer_verzija_semestar_id) REFERENCES sm_smer_verzija_semestar(id)
);

-- ============ TABLE: sm_status_akreditacija ============
CREATE TABLE public.sm_status_akreditacija (
    id integer NOT NULL DEFAULT nextval('sm_status_akreditacija_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT sm_status_akreditacija_pkey PRIMARY KEY (id),
    CONSTRAINT sm_status_akreditacija_kod_key UNIQUE (kod)
);

-- ============ TABLE: sm_student_dostignuvanje ============
CREATE TABLE public.sm_student_dostignuvanje (
    id integer NOT NULL DEFAULT nextval('sm_student_dostignuvanje_id_seq'::regclass),
    organizaciona_edinica_dostignuvanje_id integer NOT NULL,
    odobreno_od_vraboten_id integer NOT NULL,
    student_id integer NOT NULL,
    datum_postignato timestamp without time zone NOT NULL,
    status character varying(255) NOT NULL,
    opis_detali character varying(255),
    CONSTRAINT sm_student_dostignuvanje_pkey PRIMARY KEY (id),
    CONSTRAINT fk_sd_oed FOREIGN KEY (organizaciona_edinica_dostignuvanje_id) REFERENCES sm_organizaciona_edinica_dostignuvanja(id),
    CONSTRAINT fk_sd_stud FOREIGN KEY (student_id) REFERENCES sm_studenti(id),
    CONSTRAINT fk_sd_vraboten FOREIGN KEY (odobreno_od_vraboten_id) REFERENCES vr_vraboten_angazman(id)
);

-- ============ TABLE: sm_student_ispit_prijava ============
CREATE TABLE public.sm_student_ispit_prijava (
    id integer NOT NULL DEFAULT nextval('sm_student_ispit_prijava_id_seq'::regclass),
    student_upisan_kurs_id integer NOT NULL,
    ispitna_sesija_id integer NOT NULL,
    datum_prijava timestamp without time zone NOT NULL,
    status character varying(255) NOT NULL,
    CONSTRAINT sm_student_ispit_prijava_pkey PRIMARY KEY (id),
    CONSTRAINT fk_sip_sesija FOREIGN KEY (ispitna_sesija_id) REFERENCES sm_ispitna_sesija(id),
    CONSTRAINT fk_sip_suk FOREIGN KEY (student_upisan_kurs_id) REFERENCES sm_student_upisan_kurs(id)
);

-- ============ TABLE: sm_student_ocena_zapis ============
CREATE TABLE public.sm_student_ocena_zapis (
    id integer NOT NULL DEFAULT nextval('sm_student_ocena_zapis_id_seq'::regclass),
    student_upisan_kurs_id integer NOT NULL,
    ispitna_sesija_id integer NOT NULL,
    datum_zapis timestamp without time zone NOT NULL,
    osvoeni_poeni numeric(5,2),
    sistem_ocenuvanje_vrednost_id integer NOT NULL,
    kurs_realizacija_nastaven_kadar_id integer NOT NULL,
    CONSTRAINT sm_student_ocena_zapis_pkey PRIMARY KEY (id),
    CONSTRAINT chk_soz_poeni CHECK (((osvoeni_poeni IS NULL) OR ((osvoeni_poeni >= (0)::numeric) AND (osvoeni_poeni <= (100)::numeric)))),
    CONSTRAINT fk_soz_kadar FOREIGN KEY (kurs_realizacija_nastaven_kadar_id) REFERENCES sm_kurs_realizacija_nastaven_kadar(id),
    CONSTRAINT fk_soz_sesija FOREIGN KEY (ispitna_sesija_id) REFERENCES sm_ispitna_sesija(id),
    CONSTRAINT fk_soz_suk FOREIGN KEY (student_upisan_kurs_id) REFERENCES sm_student_upisan_kurs(id),
    CONSTRAINT fk_soz_vrednost FOREIGN KEY (sistem_ocenuvanje_vrednost_id) REFERENCES sm_sistem_ocenuvanje_vrednost(id)
);

-- ============ TABLE: sm_student_paralelka_raspredelba ============
CREATE TABLE public.sm_student_paralelka_raspredelba (
    id integer NOT NULL DEFAULT nextval('sm_student_paralelka_raspredelba_id_seq'::regclass),
    student_upisan_kurs_id integer NOT NULL,
    kurs_realizacija_paralelka_id integer NOT NULL,
    datum_raspredelba timestamp without time zone NOT NULL,
    CONSTRAINT sm_student_paralelka_raspredelba_pkey PRIMARY KEY (id),
    CONSTRAINT fk_spr_paralelka FOREIGN KEY (kurs_realizacija_paralelka_id) REFERENCES sm_kurs_realizacija_paralelka(id),
    CONSTRAINT fk_spr_suk FOREIGN KEY (student_upisan_kurs_id) REFERENCES sm_student_upisan_kurs(id)
);

-- ============ TABLE: sm_student_semestar_upis ============
CREATE TABLE public.sm_student_semestar_upis (
    id integer NOT NULL DEFAULT nextval('sm_student_semestar_upis_id_seq'::regclass),
    studenti_smerovi_id integer NOT NULL,
    akademski_semestar_id integer NOT NULL,
    smer_verzija_semestar_id integer NOT NULL,
    datum_upis timestamp without time zone NOT NULL,
    status character varying(255) NOT NULL,
    CONSTRAINT sm_student_semestar_upis_pkey PRIMARY KEY (id),
    CONSTRAINT fk_ssu_semestar FOREIGN KEY (akademski_semestar_id) REFERENCES sm_akademski_semestar(id),
    CONSTRAINT fk_ssu_stud_smer FOREIGN KEY (studenti_smerovi_id) REFERENCES sm_studenti_smerovi(id),
    CONSTRAINT fk_ssu_svs FOREIGN KEY (smer_verzija_semestar_id) REFERENCES sm_smer_verzija_semestar(id)
);

-- ============ TABLE: sm_student_upisan_kurs ============
CREATE TABLE public.sm_student_upisan_kurs (
    id integer NOT NULL DEFAULT nextval('sm_student_upisan_kurs_id_seq'::regclass),
    student_semestar_upis_id integer NOT NULL,
    kurs_realizacija_id integer NOT NULL,
    status_slushanje character varying(255) NOT NULL,
    CONSTRAINT sm_student_upisan_kurs_pkey PRIMARY KEY (id),
    CONSTRAINT fk_suk_kr FOREIGN KEY (kurs_realizacija_id) REFERENCES sm_kurs_realizacija(id),
    CONSTRAINT fk_suk_upis FOREIGN KEY (student_semestar_upis_id) REFERENCES sm_student_semestar_upis(id)
);

-- ============ TABLE: sm_studenti ============
CREATE TABLE public.sm_studenti (
    id integer NOT NULL DEFAULT nextval('sm_studenti_id_seq'::regclass),
    user_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    indeks character varying(255),
    aktiven boolean DEFAULT true,
    CONSTRAINT sm_studenti_pkey PRIMARY KEY (id),
    CONSTRAINT fk_stud_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_stud_user FOREIGN KEY (user_id) REFERENCES korisnici(id)
);

-- ============ TABLE: sm_studenti_smerovi ============
CREATE TABLE public.sm_studenti_smerovi (
    id integer NOT NULL DEFAULT nextval('sm_studenti_smerovi_id_seq'::regclass),
    student_id integer NOT NULL,
    smer_verzija_id integer NOT NULL,
    kvota_id integer NOT NULL,
    primaren boolean DEFAULT true,
    aktiven boolean DEFAULT true,
    CONSTRAINT sm_studenti_smerovi_pkey PRIMARY KEY (id),
    CONSTRAINT fk_ss_kvota FOREIGN KEY (kvota_id) REFERENCES sm_tip_kvota(id),
    CONSTRAINT fk_ss_stud FOREIGN KEY (student_id) REFERENCES sm_studenti(id),
    CONSTRAINT fk_ss_verzija FOREIGN KEY (smer_verzija_id) REFERENCES sm_smer_verzija(id)
);

-- ============ TABLE: sm_tip_akademski_semestar ============
CREATE TABLE public.sm_tip_akademski_semestar (
    id integer NOT NULL DEFAULT nextval('sm_tip_akademski_semestar_id_seq'::regclass),
    ime_tip character varying(255),
    CONSTRAINT sm_tip_akademski_semestar_pkey PRIMARY KEY (id),
    CONSTRAINT sm_tip_akademski_semestar_ime_tip_key UNIQUE (ime_tip)
);

-- ============ TABLE: sm_tip_akreditacija ============
CREATE TABLE public.sm_tip_akreditacija (
    id integer NOT NULL DEFAULT nextval('sm_tip_akreditacija_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT sm_tip_akreditacija_pkey PRIMARY KEY (id),
    CONSTRAINT sm_tip_akreditacija_kod_key UNIQUE (kod)
);

-- ============ TABLE: sm_tip_akreditacisko_telo ============
CREATE TABLE public.sm_tip_akreditacisko_telo (
    id integer NOT NULL DEFAULT nextval('sm_tip_akreditacisko_telo_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT sm_tip_akreditacisko_telo_pkey PRIMARY KEY (id),
    CONSTRAINT sm_tip_akreditacisko_telo_kod_key UNIQUE (kod)
);

-- ============ TABLE: sm_tip_dostignuvanje ============
CREATE TABLE public.sm_tip_dostignuvanje (
    id integer NOT NULL DEFAULT nextval('sm_tip_dostignuvanje_id_seq'::regclass),
    kod character varying(255),
    ime character varying(255) NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    CONSTRAINT sm_tip_dostignuvanje_pkey PRIMARY KEY (id),
    CONSTRAINT sm_tip_dostignuvanje_kod_key UNIQUE (kod),
    CONSTRAINT fk_td_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id)
);

-- ============ TABLE: sm_tip_kvota ============
CREATE TABLE public.sm_tip_kvota (
    id integer NOT NULL DEFAULT nextval('sm_tip_kvota_id_seq'::regclass),
    kod character varying(255),
    organizaciona_edinica_id integer NOT NULL,
    ime character varying(255),
    CONSTRAINT sm_tip_kvota_pkey PRIMARY KEY (id),
    CONSTRAINT sm_tip_kvota_kod_key UNIQUE (kod),
    CONSTRAINT fk_tk_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id)
);

-- ============ TABLE: sm_tip_smer ============
CREATE TABLE public.sm_tip_smer (
    id integer NOT NULL DEFAULT nextval('sm_tip_smer_id_seq'::regclass),
    ime_tip character varying(255),
    CONSTRAINT sm_tip_smer_pkey PRIMARY KEY (id),
    CONSTRAINT sm_tip_smer_ime_tip_key UNIQUE (ime_tip)
);

-- ============ TABLE: sm_tip_uloga_akreditacija_telo ============
CREATE TABLE public.sm_tip_uloga_akreditacija_telo (
    id integer NOT NULL DEFAULT nextval('sm_tip_uloga_akreditacija_telo_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT sm_tip_uloga_akreditacija_telo_pkey PRIMARY KEY (id),
    CONSTRAINT sm_tip_uloga_akreditacija_telo_kod_key UNIQUE (kod)
);

-- ============ TABLE: sm_upis_pravilo_brojac ============
CREATE TABLE public.sm_upis_pravilo_brojac (
    id integer NOT NULL DEFAULT nextval('sm_upis_pravilo_brojac_id_seq'::regclass),
    pravilo_id integer NOT NULL,
    opseg_vrednost character varying(255),
    posledna_sekvenca integer NOT NULL DEFAULT 0,
    updated_at timestamp without time zone,
    CONSTRAINT sm_upis_pravilo_brojac_pkey PRIMARY KEY (id),
    CONSTRAINT fk_upb_pravilo FOREIGN KEY (pravilo_id) REFERENCES sm_organizaciona_edinica_upis_pravilo(id)
);

-- ============ TABLE: tip_atribut ============
CREATE TABLE public.tip_atribut (
    id integer NOT NULL DEFAULT nextval('tip_atribut_id_seq'::regclass),
    ime character varying(255),
    CONSTRAINT tip_atribut_pkey PRIMARY KEY (id),
    CONSTRAINT tip_atribut_ime_key UNIQUE (ime)
);

-- ============ TABLE: tmp_salary_truth ============
CREATE TABLE public.tmp_salary_truth (
    plata_period_id integer,
    vraboten_id integer,
    true_bruto numeric,
    true_odbivki numeric,
    true_danok numeric
);

-- ============ TABLE: vr_akademski_stepen ============
CREATE TABLE public.vr_akademski_stepen (
    id integer NOT NULL DEFAULT nextval('vr_akademski_stepen_id_seq'::regclass),
    ime character varying(255),
    CONSTRAINT vr_akademski_stepen_pkey PRIMARY KEY (id),
    CONSTRAINT vr_akademski_stepen_ime_key UNIQUE (ime)
);

-- ============ TABLE: vr_akademsko_zvanje ============
CREATE TABLE public.vr_akademsko_zvanje (
    id integer NOT NULL DEFAULT nextval('vr_akademsko_zvanje_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    redosled integer,
    aktivno boolean NOT NULL DEFAULT true,
    CONSTRAINT vr_akademsko_zvanje_pkey PRIMARY KEY (id),
    CONSTRAINT vr_akademsko_zvanje_kod_key UNIQUE (kod)
);

-- ============ TABLE: vr_lice_kvalifikacija ============
CREATE TABLE public.vr_lice_kvalifikacija (
    id integer NOT NULL DEFAULT nextval('vr_lice_kvalifikacija_id_seq'::regclass),
    lice_id integer NOT NULL,
    vid_kvalifikacija_id integer NOT NULL,
    pole_kvalifikacija_id integer,
    naziv_kvalifikacija character varying(255) NOT NULL,
    institucija_izdavac character varying(255),
    drzava_id integer NOT NULL,
    datum_izdavanje date,
    dokument_url character varying(255),
    CONSTRAINT vr_lice_kvalifikacija_pkey PRIMARY KEY (id),
    CONSTRAINT fk_lk_drzava FOREIGN KEY (drzava_id) REFERENCES drzavi(id),
    CONSTRAINT fk_lk_lice FOREIGN KEY (lice_id) REFERENCES lice(id),
    CONSTRAINT fk_lk_pole_kval FOREIGN KEY (pole_kvalifikacija_id) REFERENCES vr_pole_kvalifikacija(id),
    CONSTRAINT fk_lk_vid_kval FOREIGN KEY (vid_kvalifikacija_id) REFERENCES vr_vid_kvalifikacija(id)
);

-- ============ TABLE: vr_pole_kvalifikacija ============
CREATE TABLE public.vr_pole_kvalifikacija (
    id integer NOT NULL DEFAULT nextval('vr_pole_kvalifikacija_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT vr_pole_kvalifikacija_pkey PRIMARY KEY (id),
    CONSTRAINT vr_pole_kvalifikacija_kod_key UNIQUE (kod)
);

-- ============ TABLE: vr_pozicija_preduslov ============
CREATE TABLE public.vr_pozicija_preduslov (
    id integer NOT NULL DEFAULT nextval('vr_pozicija_preduslov_id_seq'::regclass),
    pozicija_preduslov_grupa_id integer NOT NULL,
    tip_preduslov character varying(255) NOT NULL,
    minimalen_akademski_stepen_id integer,
    vid_kvalifikacija_id integer,
    pole_kvalifikacija_id integer,
    min_godini_iskustvo integer,
    obvrzna_verifikacija boolean NOT NULL DEFAULT false,
    zadolzitelen boolean NOT NULL DEFAULT true,
    CONSTRAINT vr_pozicija_preduslov_pkey PRIMARY KEY (id),
    CONSTRAINT fk_pp_grupa FOREIGN KEY (pozicija_preduslov_grupa_id) REFERENCES vr_pozicija_preduslov_grupa(id),
    CONSTRAINT fk_pp_pole_kval FOREIGN KEY (pole_kvalifikacija_id) REFERENCES vr_pole_kvalifikacija(id),
    CONSTRAINT fk_pp_stepen FOREIGN KEY (minimalen_akademski_stepen_id) REFERENCES vr_akademski_stepen(id),
    CONSTRAINT fk_pp_vid_kval FOREIGN KEY (vid_kvalifikacija_id) REFERENCES vr_vid_kvalifikacija(id)
);

-- ============ TABLE: vr_pozicija_preduslov_grupa ============
CREATE TABLE public.vr_pozicija_preduslov_grupa (
    id integer NOT NULL DEFAULT nextval('vr_pozicija_preduslov_grupa_id_seq'::regclass),
    rabota_pozicija_id integer NOT NULL,
    logicki_operator character varying(255) NOT NULL,
    CONSTRAINT vr_pozicija_preduslov_grupa_pkey PRIMARY KEY (id),
    CONSTRAINT fk_ppg_rab_poz FOREIGN KEY (rabota_pozicija_id) REFERENCES vr_rabota_pozicija(id)
);

-- ============ TABLE: vr_rabota_pozicija ============
CREATE TABLE public.vr_rabota_pozicija (
    id integer NOT NULL DEFAULT nextval('vr_rabota_pozicija_id_seq'::regclass),
    tip_organizaciona_edinica_id integer NOT NULL,
    kod_pozicija character varying(255) NOT NULL,
    ime_pozicija character varying(255) NOT NULL,
    kategorija character varying(255),
    aktivna boolean NOT NULL DEFAULT true,
    CONSTRAINT vr_rabota_pozicija_pkey PRIMARY KEY (id),
    CONSTRAINT fk_rp_tip_org_ed FOREIGN KEY (tip_organizaciona_edinica_id) REFERENCES or_tipovi_organizaciona_edinica(id)
);

-- ============ TABLE: vr_status_vrabotenje ============
CREATE TABLE public.vr_status_vrabotenje (
    id integer NOT NULL DEFAULT nextval('vr_status_vrabotenje_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT vr_status_vrabotenje_pkey PRIMARY KEY (id),
    CONSTRAINT vr_status_vrabotenje_kod_key UNIQUE (kod)
);

-- ============ TABLE: vr_tip_angazman ============
CREATE TABLE public.vr_tip_angazman (
    id integer NOT NULL DEFAULT nextval('vr_tip_angazman_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT vr_tip_angazman_pkey PRIMARY KEY (id),
    CONSTRAINT vr_tip_angazman_kod_key UNIQUE (kod)
);

-- ============ TABLE: vr_tip_funkcija ============
CREATE TABLE public.vr_tip_funkcija (
    id integer NOT NULL DEFAULT nextval('vr_tip_funkcija_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    mandatna boolean NOT NULL DEFAULT false,
    CONSTRAINT vr_tip_funkcija_pkey PRIMARY KEY (id),
    CONSTRAINT vr_tip_funkcija_kod_key UNIQUE (kod)
);

-- ============ TABLE: vr_tip_organizaciona_uloga ============
CREATE TABLE public.vr_tip_organizaciona_uloga (
    id integer NOT NULL DEFAULT nextval('vr_tip_organizaciona_uloga_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    opis character varying(255),
    CONSTRAINT vr_tip_organizaciona_uloga_pkey PRIMARY KEY (id),
    CONSTRAINT vr_tip_organizaciona_uloga_kod_key UNIQUE (kod)
);

-- ============ TABLE: vr_tip_uloga_nastaven_kadar ============
CREATE TABLE public.vr_tip_uloga_nastaven_kadar (
    id integer NOT NULL DEFAULT nextval('vr_tip_uloga_nastaven_kadar_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    CONSTRAINT vr_tip_uloga_nastaven_kadar_pkey PRIMARY KEY (id),
    CONSTRAINT vr_tip_uloga_nastaven_kadar_kod_key UNIQUE (kod)
);

-- ============ TABLE: vr_vid_kvalifikacija ============
CREATE TABLE public.vr_vid_kvalifikacija (
    id integer NOT NULL DEFAULT nextval('vr_vid_kvalifikacija_id_seq'::regclass),
    kod character varying(255) NOT NULL,
    ime character varying(255) NOT NULL,
    akademski_stepen_id integer NOT NULL,
    CONSTRAINT vr_vid_kvalifikacija_pkey PRIMARY KEY (id),
    CONSTRAINT vr_vid_kvalifikacija_kod_key UNIQUE (kod),
    CONSTRAINT fk_vk_stepen FOREIGN KEY (akademski_stepen_id) REFERENCES vr_akademski_stepen(id)
);

-- ============ TABLE: vr_vraboten_akademsko_zvanje ============
CREATE TABLE public.vr_vraboten_akademsko_zvanje (
    id integer NOT NULL DEFAULT nextval('vr_vraboten_akademsko_zvanje_id_seq'::regclass),
    vraboten_angazman_id integer NOT NULL,
    akademsko_zvanje_id integer NOT NULL,
    datum_od date NOT NULL,
    datum_do date,
    dokument_id integer,
    aktivno boolean NOT NULL DEFAULT true,
    CONSTRAINT vr_vraboten_akademsko_zvanje_pkey PRIMARY KEY (id),
    CONSTRAINT chk_vaz_period CHECK (((datum_do IS NULL) OR (datum_od <= datum_do))),
    CONSTRAINT fk_vaz_angazman FOREIGN KEY (vraboten_angazman_id) REFERENCES vr_vraboten_angazman(id),
    CONSTRAINT fk_vaz_dokument FOREIGN KEY (dokument_id) REFERENCES dok_generiran_dokument(id),
    CONSTRAINT fk_vaz_zvanje FOREIGN KEY (akademsko_zvanje_id) REFERENCES vr_akademsko_zvanje(id)
);

-- ============ TABLE: vr_vraboten_angazman ============
CREATE TABLE public.vr_vraboten_angazman (
    id integer NOT NULL DEFAULT nextval('vr_vraboten_angazman_id_seq'::regclass),
    lice_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    rabota_pozicija_id integer NOT NULL,
    status_vrabotenje_id integer NOT NULL,
    tip_angazman_id integer NOT NULL,
    datum_od date NOT NULL,
    datum_do date,
    primaren boolean NOT NULL DEFAULT true,
    fte numeric(5,2),
    nadreden_angazman_id integer,
    aktiven boolean NOT NULL DEFAULT true,
    CONSTRAINT vr_vraboten_angazman_pkey PRIMARY KEY (id),
    CONSTRAINT chk_va_fte CHECK (((fte IS NULL) OR ((fte > (0)::numeric) AND (fte <= (1)::numeric)))),
    CONSTRAINT chk_va_period CHECK (((datum_do IS NULL) OR (datum_od <= datum_do))),
    CONSTRAINT fk_va_lice FOREIGN KEY (lice_id) REFERENCES lice(id),
    CONSTRAINT fk_va_nadreden FOREIGN KEY (nadreden_angazman_id) REFERENCES vr_vraboten_angazman(id),
    CONSTRAINT fk_va_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_va_rab_poz FOREIGN KEY (rabota_pozicija_id) REFERENCES vr_rabota_pozicija(id),
    CONSTRAINT fk_va_stat_vrab FOREIGN KEY (status_vrabotenje_id) REFERENCES vr_status_vrabotenje(id),
    CONSTRAINT fk_va_tip_ang FOREIGN KEY (tip_angazman_id) REFERENCES vr_tip_angazman(id)
);

-- ============ TABLE: vr_vraboten_funkcija ============
CREATE TABLE public.vr_vraboten_funkcija (
    id integer NOT NULL DEFAULT nextval('vr_vraboten_funkcija_id_seq'::regclass),
    vraboten_angazman_id integer NOT NULL,
    tip_funkcija_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    datum_od date NOT NULL,
    datum_do date,
    dokument_id integer,
    aktivna boolean NOT NULL DEFAULT true,
    CONSTRAINT vr_vraboten_funkcija_pkey PRIMARY KEY (id),
    CONSTRAINT chk_vf_period CHECK (((datum_do IS NULL) OR (datum_od <= datum_do))),
    CONSTRAINT fk_vf_angazman FOREIGN KEY (vraboten_angazman_id) REFERENCES vr_vraboten_angazman(id),
    CONSTRAINT fk_vf_dokument FOREIGN KEY (dokument_id) REFERENCES dok_generiran_dokument(id),
    CONSTRAINT fk_vf_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_vf_tip_func FOREIGN KEY (tip_funkcija_id) REFERENCES vr_tip_funkcija(id)
);

-- ============ TABLE: vr_vraboten_kompensacija ============
CREATE TABLE public.vr_vraboten_kompensacija (
    id integer NOT NULL DEFAULT nextval('vr_vraboten_kompensacija_id_seq'::regclass),
    vraboten_angazman_id integer NOT NULL,
    valid_from date NOT NULL,
    valid_to date,
    tip_osnova character varying(255) NOT NULL,
    bruto_osnova numeric(14,2),
    neto_osnova numeric(14,2),
    vid_valuta_id integer NOT NULL,
    fond_casovi numeric(10,2),
    aktivna boolean NOT NULL DEFAULT true,
    CONSTRAINT vr_vraboten_kompensacija_pkey PRIMARY KEY (id),
    CONSTRAINT chk_vk_bruto CHECK ((bruto_osnova >= (0)::numeric)),
    CONSTRAINT chk_vk_period CHECK (((valid_to IS NULL) OR (valid_from <= valid_to))),
    CONSTRAINT fk_vk_angazman FOREIGN KEY (vraboten_angazman_id) REFERENCES vr_vraboten_angazman(id),
    CONSTRAINT fk_vk_valuta FOREIGN KEY (vid_valuta_id) REFERENCES fin_vid_valuta(id)
);

-- ============ TABLE: vr_vraboten_organizaciona_uloga ============
CREATE TABLE public.vr_vraboten_organizaciona_uloga (
    id integer NOT NULL DEFAULT nextval('vr_vraboten_organizaciona_uloga_id_seq'::regclass),
    vraboten_angazman_id integer NOT NULL,
    tip_organizaciona_uloga_id integer NOT NULL,
    organizaciona_edinica_id integer NOT NULL,
    datum_od date NOT NULL,
    datum_do date,
    aktivna boolean NOT NULL DEFAULT true,
    CONSTRAINT vr_vraboten_organizaciona_uloga_pkey PRIMARY KEY (id),
    CONSTRAINT fk_vou_angazman FOREIGN KEY (vraboten_angazman_id) REFERENCES vr_vraboten_angazman(id),
    CONSTRAINT fk_vou_org_ed FOREIGN KEY (organizaciona_edinica_id) REFERENCES or_organizaciona_edinica(id),
    CONSTRAINT fk_vou_tip_uloga FOREIGN KEY (tip_organizaciona_uloga_id) REFERENCES vr_tip_organizaciona_uloga(id)
);
