WikiPrint - from Polar Technologies

Przykłady workflow

W tym miejscu publikowane będą przykładowe kwerendy użyteczne przy budowaniu warunków, przekazywaniu parametrów do komend itp.

WARUNKI

-- W1. Sprawdzenie czy jest plik
-- Brak
SELECT NOT EXISTS(
  SELECT doc_id FROM attachments WHERE doc_id = 
 (SELECT doc_id FROM documents WHERE procid = {PROCID}))

-- Jest
SELECT EXISTS(
  SELECT doc_id FROM attachments WHERE doc_id = 
 (SELECT doc_id FROM documents WHERE procid = {PROCID}))

-- W2. Sprawdzenie czy są zamieszczone opinie kierowników
-- pobierane jako parametry z bpm_properties.id____ = 1
-- brak
SELECT count(*) = 0 FROM bpm_property_values 
WHERE id____ IN (12,13,14) 
AND procid = {PROCID}
AND value_  != '' 

-- są
SELECT count(*) > 0 FROM bpm_property_values 
WHERE id____ IN (12,13,14) 
AND procid = {PROCID}
AND value_  != ''

W3. 
-- czy dokument JEST dołączony do sprawy i powiązany z innym dokumentem (zakładka Powiązania)
SELECT dlp.prc_id IS NOT NULL AND dld.doc_id IS NOT NULL
FROM documents_view dv
LEFT JOIN doc_link_proc dlp USING(doc_id)
LEFT JOIN doc_link_doc dld ON dv.doc_id = dld.doc_id
WHERE dv.doc_id = {DOC_ID} LIMIT 1

W4.
-- Sprawdzenie czy dokument jest powiązany ze sprawą i dokumentem (zakładka powiązania)
SELECT dlp.prc_id IS NOT NULL AND dld.doc_id IS NOT NULL
FROM documents_view dv
LEFT JOIN doc_link_proc dlp USING(doc_id)
LEFT JOIN doc_link_doc dld ON dv.doc_id = dld.rel_to
WHERE dv.doc_id = {DOC_ID}

W5.
-- Sprawdzenie czy dokument ma wypełnione pozycje (np. zapotrzebowanie, faktura)
SELECT EXISTS (SELECT fk.adddat FROM fk_elements fk INNER JOIN documents d USING (doc_id) 
WHERE d.doc_id = 50856 AND fk.is_del IS FALSE)

W6. 
-- Sprawdzenie czy w sprawie zamknięte są wszystkie zapytania ofertowe (kontrolowane procedurą o prtpid = 5
SELECT sum(res) = 0 FROM 
(SELECT 
(CASE WHEN s.ptsttp = 'END' THEN 0 ELSE 1 END) AS res, d.dscrpt, s.ptstnm, d.prtpid
 FROM documents d
INNER JOIN stages s ON d.is_del IS NOT TRUE AND s.procid = d.procid AND ((s.is_act IS TRUE AND s.is_fix IS FALSE) OR (s.ptsttp = 'END' AND s.is_fix IS TRUE))
WHERE d.prtpid = 5 AND d.prc_id = {PRC_ID}) AS x


W7.
-- Sprawdzenie czy osoba zalogowana jest z określonego działu (wg orunid np. 57)
select substring(get_org_path(orunid), '.57.') IS NOT NULL FROM orgtree_view WHERE usr_id = {LOGGED_USR_ID}

W8.
-- Sprawdzenie wartości faktury z rozpisanymi kosztami
SELECT sum(amount) = (SELECT COALESCE(sum(netto_),0) FROM vatnote WHERE doc_id = {DOC_ID}) FROM vatnote_costs WHERE doc_id = {DOC_ID}

W9.
-- Sprawdzenie typu dokumentu księgowego - czy jest konkretny - 6
SELECT EXISTS(SELECT 1 FROM types_of_accountants_doc INNER JOIN vatnote USING (accdid) WHERE doc_id = {DOC_ID} AND accdid IN (6))

W10.
-- Sprawdzenie czy cechy są ustawione w sprawie (jeśli są to TRUE) - dla warunku przeciwnego należy zamienić "IS NOT NULL AND ..." na "IS NULL OR .. "
SELECT ftv1.data__ IS NOT NULL
AND ftv2.data__ IS NOT NULL
AND ftv3.data__ IS NOT NULL
AND ftv4.data__ IS NOT NULL
FROM processes p LEFT JOIN features_text_view ftv1 ON ftv1.tbl_id = p.prc_id AND ftv1.featid = 29
LEFT JOIN features_text_view ftv2 ON ftv2.tbl_id = p.prc_id AND ftv2.featid = 30
LEFT JOIN features_text_view ftv3 ON ftv3.tbl_id = p.prc_id AND ftv3.featid = 31
	LEFT JOIN features_text_view ftv4 ON ftv4.tbl_id = p.prc_id AND ftv4.featid = 32
WHERE p.prc_id = {PRC_ID}

W11
-- Sprawdzenie globalnej wartości własności procedury (z uwzględnieniem podprocesów).
Jeżeli choć jedna osoba w podprocesie nie wyraziła zgody (przeszło przez przypisanie do FALSE) to zwraca FALSE
SELECT count(*) > 0 AS res FROM (
SELECT CASE WHEN (value_::boolean = TRUE) THEN 1 ELSE 0 END AS result 
FROM bpm_property_values bpv WHERE bpv.id____ = 88 AND bpv.procid IN
(SELECT p.procid 
FROM documents d 
INNER JOIN procedures p ON p.procid = d.procid OR d.procid = p.rootpr
WHERE d.doc_id = {DOC_ID})) x
WHERE result > 0;

W12.
-- Sprawdzenie czy zaznaczona jest cecha 
-- typu Pole zaznaczane (jeśli 1 to zaznaczona)
SELECT COALESCE(f32.data__::int, 0) = 1
FROM documents d
LEFT JOIN features_text_view f32 ON d.doc_id = f32.tbl_id AND f32.featid = 255
WHERE d.doc_id = 541950


W13.
-- sprawdzenie czy zalogowana osoba nie ma ustawionego zastępstwa
SELECT EXISTS(SELECT * FROM global_sys_conf WHERE (SELECT regexp_matches(objnam,  '_(\d+)$'))[1]::int = {LOGGED_USR_ID})

W14. -- sprawdzenie czy są uzupełnione cechy na kliencie, do którego jest kierowana oferta SELECT x.potrzeba IS NOT NULL AND x.segment IS NOT NULL AND x.zrodlo IS NOT NULL AND x.branza IS NOT NULL FROM (

SELECT (SELECT ftopnm FROM features_opt_view fop WHERE fop.featid = 11 AND fop.tbl_id = fod.contid) AS segment, (SELECT ftopnm FROM features_opt_view fop WHERE fop.featid = 17 AND fop.tbl_id = fod.contid) AS zrodlo, (SELECT ftopnm FROM features_opt_view fop WHERE fop.featid = 13 AND fop.tbl_id = fod.contid) AS branza, (SELECT data FROM features_text_view ftv WHERE ftv.featid = 26 AND ftv.tbl_id = fod.contid) AS potrzeba FROM documents d INNER JOIN fk_offer_documents fod USING(doc_id) INNER JOIN contacts c1 ON c1.contid = fod.contid WHERE d.doc_id = {DOC_ID}) x

W15. -- sprawdzenie czy są uzupełnione cechy na fakturze do którego nabywcy (lub odbiorcy jeśli jest uzupełniony) , albo klienta końcowego oznaczonego na cesze faktury jako klient z bazy - jest kierowana faktura - są uzupełnione cechy typ. segment, źródło, branża SELECT x.typ IS NOT NULL AND x.segment IS NOT NULL AND x.zrodlo IS NOT NULL AND x.branza IS NOT NULL FROM ( SELECT

(SELECT text_sum(ftopnm) FROM features_opt_view fop WHERE fop.featid = 12 AND fop.ftopid IN (7,9, 28) AND fop.tbl_id = (COALESCE(ftv.data::int, c1.contid))) AS typ, (SELECT ftopnm FROM features_opt_view fop WHERE fop.featid = 11 AND fop.tbl_id = (COALESCE(ftv.data::int, c1.contid))) AS segment, (SELECT ftopnm FROM features_opt_view fop WHERE fop.featid = 17 AND fop.tbl_id = (COALESCE(ftv.data::int, c1.contid))) AS zrodlo, (SELECT ftopnm FROM features_opt_view fop WHERE fop.featid = 13 AND fop.tbl_id = (COALESCE(ftv.data::int, c1.contid))) AS branza FROM documents d INNER JOIN vatnote v USING(doc_id) INNER JOIN contacts c1 ON c1.contid = COALESCE(v.rectid, v.toctid) LEFT JOIN features_text_view ftv ON ftv.tbl_id = d.doc_id AND ftv.featid = 15 -- klient końcowy LEFT JOIN contacts c2 ON c2.contid = ftv.data::int WHERE d.doc_id = {DOC_ID}) x

PRZYPISANIA

-- P1. Przypisanie jako osoby tworzącej dokument
SELECT ARRAY[o.orunid] FROM orgtree_view o INNER JOIN documents d ON d.adduid = o.usr_id 
WHERE d.procid = {PROCID}

-- 
-- P2. Przypisanie akceptanta (pobierany z właściwości)
SELECT ARRAY[orunid] FROM organization_units WHERE orunid = {procedures.AKCEPTANT CZŁONEK ZARZĄDU}

--
-- P3. Przypisanie osób które zaakceptowały określony etap (np. 44)
SELECT ARRAY[orunid] FROM stages WHERE ptstid = 44 AND procid = {PROCID}


--
-- P4. Przypisanie osoby odpowiedzialnej ze sprawy
SELECT ARRAY(SELECT o.orunid FROM processes p INNER JOIN orgtree_view o ON p.rspuid = o.usr_id WHERE prc_id = {PRC_ID})

--
-- P5. Przypisanie osób z parametru typu usr_ids[]
SELECT ARRAY(SELECT o.orunid FROM orgtree_view o WHERE o.usr_id IN ({procedures.OSOBY}))

-- 
-- P6. Przypisanie osoby odpowiedzialnej za MPK wpisane w fakturze (do etapu MULTI)
SELECT ARRAY ( 
  SELECT CASE 
    WHEN x.ndetpe = 'POST' THEN x.orunid 
    WHEN x.ndetpe = 'ORGCELL' THEN (SELECT o2.orunid FROM orgtree_view o2 WHERE o2.prn_id = x.orunid LIMIT 1) END 
  FROM 
  (SELECT DISTINCT mpk.orunid, o.ndetpe FROM vatnote_costs 
   LEFT JOIN places_of_vcosts AS mpk USING (povcid) 
   LEFT JOIN orgtree_view AS o ON mpk.orunid = o.orunid 
   WHERE doc_id = {DOC_ID}) 
  AS x)


--
-- P7. Przypisanie osoby zalogowanej
SELECT ARRAY(SELECT o.orunid FROM orgtree_view o WHERE o.usr_id = {LOGGED_USR_ID})

--
-- P8. Przypisanie osoby wybranej w liście wyboru (lista typu select z wartościami orunid, przypisana do zmiennej typu Integer)
SELECT array[orunid] FROM organization_units WHERE orunid = {$DYREKTOR_HANDLOWY}

--
-- P9. Przypisanie orunid w zależności od accdid (jednostki org. w zależności od typu dokumentu księgowego)
SELECT 
CASE WHEN v.accdid = 1 THEN [62] 
	WHEN v.accdid = 2 THEN 56
	WHEN v.accdid = 3 THEN 61
	WHEN v.accdid = 4 THEN 60
	WHEN v.accdid = 5 THEN 63
END
FROM vatnote v  WHERE v.doc_id = {DOC_ID}

-- P10. Przypisanie osoby, która załatwiła poprzedni etap
SELECT ARRAY[s.orunid] 
FROM stages s 
LEFT JOIN workflow_log wl USING(sop_id) 
WHERE s.is_fix IS TRUE AND s.procid = {procedures.procid} AND wl.chloid = (SELECT max(chloid) FROM workflow_log WHERE procid = s.procid)

-- P11
-- Przypisanie osób do etapu z tablicy VAR_OSOBY_OPISUJACE, które nie są w tablicy VAR_OSOBY_FIXED.

SELECT array(
SELECT orunid FROM orgtree_view
WHERE orunid IN (
SELECT * FROM bs_unnest({$VAR_OSOBY_OPISUJACE}::int[]::int[]) as qq where not (array[qq] <@ {$VAR_OSOBY_FIXED}::int[])
    )
)

-- P12
-- Przypisanie osób z określonej grupy (grp_id = 9)
SELECT ARRAY(SELECT o.orunid FROM orgtree_view o WHERE o.orunid IN (SELECT o.orunid FROM users_link_group ulg INNER JOIN orgtree_view o ON o.usr_id = ulg.usr_id AND ulg.grp_id = 2))

--
-- P13
-- Przypisanie wartości cechy - pracownik

SELECT ARRAY[o.orunid]
FROM documents d
LEFT JOIN features_text_view f26 ON d.doc_id = f26.tbl_id AND f26.featid = 26
LEFT JOIN orgtree_view o ON o.usr_id = f26.data__::int
WHERE d.doc_id = {DOC_ID}

-- P14
-- PRZYPISANIE przełożonego osoby wybranej w parametrze $WNIOSKODAWCA
SELECT (get_superior( (SELECT orunid FROM orgtree_view WHERE orunid = ANY({$WNIOSKODAWCA}))))


-- P15
-- Przypisanie do własności tyopu orgarr[]
SELECT {$KTO_OSOBA}::int[]

KWERENDY DO PARAMETRU SELECT[]

-- Członkowie zarządu
SELECT orunid as value, fullnm || ' - ' || ndenam as caption FROM orgtree_view WHERE orunid IN (3,14,15,16)

-- Członkowie grupy o id 9
SELECT o.orunid AS value, o.fullnm AS caption FROM users_link_group ulg INNER JOIN orgtree_view o ON o.usr_id = ulg.usr_id AND ulg.grp_id = 9 ORDER BY caption 

-- 
-- Wszyscy pracownicy (lista jednokrotnego wyboru)
SELECT orunid as value, lasfir || ' - ' || ndenam as caption FROM orgtree_view WHERE ndetpe = 'POST' AND is_del IS FALSE AND usr_id IS NOT NULL ORDER BY lasfir

DYNAMICZNE WARTOŚCI PARAMETRÓW KOMEND

-- Utwórz komentarz
dscrpt="SQL::SELECT CASE WHEN (SELECT EXISTS(
   SELECT value_
   FROM bpm_property_values WHERE id____ = 20 AND sop_id = {SOP_ID})) THEN 
(SELECT value_
   FROM bpm_property_values WHERE id____ = 20 AND sop_id = {SOP_ID})
 ELSE 'Bez uwag' END AS result 
FROM stages WHERE sop_id = {SOP_ID}"

-- Utwórz przypomnienie w sprawie windykacyjnej
-- dla handlowca 
usr_id="SQL::SELECT seller FROM vindication.vind_proc_view WHERE prc_id = {PRC_ID}",
start_="SQL::SELECT fxterm - interval '3 days' FROM vindication.vind_proc_view WHERE prc_id = {PRC_ID}",dscrpt="Uwaga! Za 3 dni mija termin zapłaty za wierzytelność"


Zapytania do parametrów Akcji

Tworzenie dokumentu:

Tworzenie wydania z dokumentu przyjęcia
dctpid="17",dscrpt="Wydanie zewnętrzne",do="SQL::SELECT orunid FROM orgtree_view WHERE usr_id = {LOGGED_USER}"

# tworzenie zamówienia z zapotrzebowania
dctpid="41", dscrpt="Zamówienie do:{spller}",map="adddat=crtdat,dlvdat=orddat,acorid=acorid,spadid=spadid,pchaid=pchaid",state_="1"

#przepisz pozycje z zapotrzebowania do zamówienia
from__="SQL::SELECT doc_id FROM documents WHERE doc_id={DOC_ID}", to____="SQL::SELECT doc_id FROM documents WHERE rel_to={DOC_ID}"

# przepisz pozycje z zapotrzebowania do istniejącego zamówienia
from__="SQL::SELECT doc_id FROM documents WHERE doc_id={DOC_ID}", to____="{procedures.ZAMÓWIENIE}"

# czy pozycje uzupełnione
query="SELECT (SUM(CASE WHEN depnam = depsym THEN 1 ELSE 0 END))=0 FROM fk_elements WHERE doc_id={doc_id} AND is_del=FALSE", alert="Popraw pozycje zapotrzebowania", success="Pozycje poprawnie dodane"

# Utwórz sprawę (dsexid teczki, opis z opisu dokumentu, kontrahent z nadawcy, procedura o id 2
dsexid="107",dscrpt="{documents.dscrpt}",contid="SQL::SELECT contid FROM doc_link_cont WHERE doc_id = {DOC_ID} AND role__ = 'SENDER'",prtpid="2"

# Zarejestruj dokument w zalezności od tego czy dokument przyszedł z emaila
reg_id="
SELECT 
CASE WHEN (SELECT EXISTS (SELECT e.doc_id FROM emails e WHERE e.doc_id = d.doc_id)) THEN 6
WHEN (SELECT NOT EXISTS (SELECT e.doc_id FROM emails e WHERE e.doc_id = d.doc_id)) THEN 4
END
FROM documents d WHERE d.doc_id = {DOC_ID}"


# Sprawdź czy workflow utworzonego z procedury dokumentu (o typie dctpid 10) został zakończony 
query="SELECT EXISTS(
SELECT doc_id FROM documents d INNER JOIN stages s ON s.procid = d.procid AND s.ptsttp = 'END' 
AND d.doc_id = (SELECT dld.doc_id FROM documents d2 INNER JOIN doc_link_doc dld ON d2.doc_id = dld.doc_id WHERE d2.doc_id = {DOC_ID} AND d2.dctpid = 10 LIMIT 1))", alert="Wymagane zakończenie procedury dokumentu - kalkulacja kosztów transportu" 

# Sprawdź czy wypełnione są na opisie kosztowym konta grupy 4XX
SELECT EXISTS(SELECT substring(type__,1,1) = '4' AS res 
FROM vatnote_costs INNER JOIN types_of_vcosts USING (tovcid) 
WHERE doc_id = {DOC_ID} GROUP BY res HAVING substring(type__,1,1) = '4' )


# Wyślij email (do parametry Do - ustawienie emaili osób przypisanych do etapu)
SELECT text_sum(o2.e_mail) FROM 
stages s3 INNER JOIN orgtree_view o2 ON o2.orunid = ANY(s3.orgarr)
WHERE s3.sop_id = {SOP_ID}

# wybierz użytkowników uprawnionych w sprawie nie będących opiekunem
SELECT text_sum(usr_id::text) FROM proc_link_users WHERE prc_id = {processes.prc_id} AND type__ = 'USER' AND usr_id != {processes.rspuid}

# Ustaw przypomnienie na termin obowiązywania umowy - podana w parametrze l. miesięcy wypowiedzienia - 1

SELECT COALESCE(enddat, strdat + interval '1 year') - (fov.ftopnm::int + 1 || 'month')::interval AS termin 
FROM documents d
INNER JOIN contract USING(doc_id)
LEFT JOIN features_opt_view fov ON fov.tbl_id = d.doc_id AND fov.featid = 13
WHERE dctpid = 3 AND prc_id = {PRC_ID}

-- Uprawnij pracownika z parametru do sprawy
SQL::SELECT text_sum(usr_id::text) FROM orgtree_view WHERE orunid = ANY({$OSOBA_ZAINTERESOWANA_SPRAWA})

-- Ustawienie wartości ftopid cechy w komendzie ustaw cechę
-- na podstawie orunid pobranego z danych wejściowych
-- W tym przykładzie Cecha zawiera listę wartości zgodnych z inicjałami
SELECT ftopid
FROM 
features_options 
INNER JOIN features_options_def USING(fodfid)
WHERE featid = 91
AND ftopnm = (SELECT initls FROM users join users_link_org_units using (usr_id) join organization_units using(orunid) WHERE orunid = 140 LIMIT 1)
LIMIT 1

-- Ustawienie w komendzie Wyślij powiadomienie Pracowników wybranych z tablicy 
-- użytkowników w paramatrze w danych wejsciowych (typ tablicowy orunid[])
SELECT text_sum(usr_id::text) FROM orgtree_view WHERE orunid = ANY ('{$OSOBY_UPRAWNIONE}'::int[])
w wykonaniu wygląda to tak:
SELECT text_sum(usr_id::text) FROM orgtree_view WHERE orunid = ANY ('{14,15}'::int[])

-- Ustawienie wartości cechy
-- jeśli z wartości tekstowej chcemy usunać cudzysłowia
SQL::SELECT replace({$KOSZTY_NAPRAWY}, '''','')

Różne

-- Okreslenie stanowiska (orunid) na podstawie wartości cechy produktu w sprawie - listy wyboru
SELECT CASE WHEN fop.ftopid = 206 THEN ARRAY[79]
WHEN fop.ftopid = 207 THEN ARRAY[95]
WHEN fop.ftopid = 208 THEN ARRAY[100]
WHEN fop.ftopid = 209 THEN ARRAY [103]
WHEN fop.ftopid = 210 THEN ARRAY [70]
WHEN fop.ftopid = 211 THEN ARRAY [51]
END
FROM fk_elements_view fk 
INNER JOIN features_opt_view fop ON fop.tbl_id = fk.fkelid 
WHERE fop.tblnam = 'fk_elements' AND fk.doc_id = 14949
LIMIT 1

-- Sprawdzenie czy cecha jest wypełniona
SELECT NOT EXISTS(
SELECT CASE WHEN fop.ftopid IN (206, 207, 208, 209, 210, 211) THEN TRUE
ELSE FALSE END
FROM fk_elements_view fk 
LEFT JOIN features_opt_view fop ON fop.tbl_id = fk.fkelid 
WHERE fop.tblnam = 'fk_elements' AND fk.doc_id = 15815) AS r

-- Sprawdzenie czy wybrany został termin dostawy w zapotrzebowaniu 
SELECT dlvdat IS NOT NULL FROM demand WHERE doc_id = 14949

-- Ustawienie nazwy dla podsprawy zakładanej komendą Utwórz sprawę
SELECT 'Zlecenie realizacji :' || dscrpt FROM processes WHERE prc_id = 10

-- sprawdzenie czy jest uzupełniona cecha w sprawie do której należy aktualny dokument {DOC_ID}
SELECT NOT EXISTS(SELECT CAST (bpv.value_ AS int) 
FROM documents doc 
INNER JOIN processes pr USING (prc_id)
INNER JOIN bpm_property_values bpv ON (bpv.procid = pr.procid AND bpv.id____ = 32)
WHERE doc.doc_id = 14949)

-- Wybór adresu - domyślnego kontaktu
SELECT mainad FROM contacts_view WHERE contid = 2613

-- Sprawdzenie czy termin wprowadzony w cesze nie jest zbyt krótki
SELECT (f32.data__::date - interval '3 days') >= CURRENT_DATE
FROM documents d
LEFT JOIN features_text_view f32 ON d.doc_id = f32.tbl_id AND f32.featid = 263
WHERE d.doc_id = {DOC_ID}

-- Sprawdzenie czy zaznaczona jest określona OPCJA cechy
SELECT f32.ftopid = 230 
FROM documents d
LEFT JOIN features_opt_view f32 ON d.doc_id = f32.tbl_id AND f32.featid = 263
WHERE d.doc_id = {DOC_ID}

Konstrukcje z ANY

-- Sprawdzenie czy wybrany pracownik w parametrze jest 12
select orunid = ANY('{12}') from orgtree_view

-- Pobranie orunid z danej wejściowej typu tablicowego
select orunid from orgtree_view where orunid = ANY('{12}') limit 1

-- Pobranie listy pracowników usr_id na podstawie zawartosci tablicy orunid[]
SELECT text_sum(usr_id::text) FROM orgtree_view WHERE orunid = ANY({$OSOBA_ZAINTERESOWANA_SPRAWA})

Zapytanie dla "moich zadań workflow"

Zapytanie dla moich zadań workflow (v>5)

WITH RECURSIVE user_all_replacements (who___, bywhom, path)
AS (
    SELECT r.who___,
        r.bywhom,
        array [r.who___]::INT [] AS path
    FROM replacements r
    WHERE r.bywhom IN ({ORUNID})
        AND (now() BETWEEN r.from__ AND r.to____)
        AND NOT r.suspen
    
    UNION ALL
    
    SELECT r.who___,
        r.bywhom,
        uar.path || r.who___ AS path
    FROM replacements r,
        user_all_replacements uar
    WHERE NOT (r.who___ = ANY (path))
        AND r.bywhom = uar.who___
        AND (now() BETWEEN r.from__ AND r.to____)
        AND NOT r.suspen
),
all_orunids as (
        SELECT array_agg(who___)||{ORUNID} as val
        FROM (
                SELECT DISTINCT r.who___ FROM user_all_replacements r
        ) foo
)
SELECT keyval, dscrpt, clsnam, ptstnm, dctpid, prtpnm, end___, ptstid, prior_, prtpid 
FROM (
    SELECT keyval, dscrpt, clsnam, ptstnm, dctpid, prtpnm, end___, ptstid, aa.prior_, pd.prtpid, orgarr IS NOT NULL as orgarr, first_value(actdat) OVER (PARTITION BY ptstid ORDER BY actdat ASC) as actdat
    FROM procedures_def pd
    RIGHT JOIN (
        SELECT (doc_id) AS keyval,
            p2.prtpid,
            substr(d.dscrpt, 0, 100) AS dscrpt,
            'DOCUMENT' AS clsnam,
            end___,
            s.ptstnm,
            d.dctpid,
            ptstid,
            orgarr,
            s.actdat,
            d.prior_
        FROM procedures pd
        LEFT JOIN stages s USING (PROCID)
        LEFT JOIN procedures p2 ON (p2.PROCID = pd.rootpr)
        LEFT JOIN bpm_loops_def bld USING (ptstid)
        RIGHT JOIN documents d ON (d.PROCID = p2.PROCID)
        WHERE (
                bld.multii IS NOT TRUE
                OR s.prn_id IS NOT NULL
                )
            AND (
                ((SELECT val FROM all_orunids) && s.orgarr)
                OR (
                    s.orgarr IS NULL
                    AND ARRAY[d.target] <@ (SELECT val FROM all_orunids)
                    )
                )
            AND NOT d.is_del
            AND gostof IS NULL
            AND sop_id IS NOT NULL
            AND s.is_act
            AND NOT (p2.comple OR p2.cancel)
            AND ptsttp NOT IN ('SUBPROCESS', 'START', 'END')
        
        UNION
        
        SELECT (prc_id) AS keyval,
            p2.prtpid,
            substr(p.dscrpt, 0, 100) AS dscrpt,
            'PROCESS' AS clsnam,
            end___,
            s.ptstnm,
            0 AS dctpid,
            ptstid,
            orgarr,
            s.actdat,
            NULL AS prior_
        FROM procedures pd
        LEFT JOIN stages s USING (PROCID)
        LEFT JOIN procedures p2 ON (p2.PROCID = pd.rootpr)
        LEFT JOIN bpm_loops_def bld USING (ptstid)
        RIGHT JOIN processes p ON (p.PROCID = p2.PROCID)
        WHERE (
                bld.multii IS NOT TRUE
                OR s.prn_id IS NOT NULL
                )
            AND p.is_fix IS FALSE
            AND p.is_del IS FALSE
            AND ((SELECT val FROM all_orunids) && s.orgarr)
            AND sop_id IS NOT NULL
            AND s.is_act IS TRUE
            AND NOT (p2.comple OR p2.cancel)
            AND ptsttp NOT IN ('SUBPROCESS', 'START', 'END')
        
        UNION
        
        SELECT (rcp_id) AS keyval,
            p2.prtpid,
            substr(p.dscrpt, 0, 100) AS dscrpt,
            'RCP' AS clsnam,
            end___,
            s.ptstnm,
            0 AS dctpid,
            ptstid,
            orgarr,
            s.actdat,
            NULL AS prior_
        FROM procedures pd
        LEFT JOIN stages s USING (PROCID)
        LEFT JOIN procedures p2 ON (p2.PROCID = pd.rootpr)
        LEFT JOIN bpm_loops_def bld USING (ptstid)
        RIGHT JOIN rcp_cards p ON (p.PROCID = p2.PROCID)
        WHERE (
                bld.multii IS NOT TRUE
                OR s.prn_id IS NOT NULL
                )
            AND p.is_fix IS FALSE
            AND p.is_del IS FALSE
            AND (
                ((SELECT val FROM all_orunids) && s.orgarr)
                OR (
                    s.orgarr IS NULL
                    AND p.emp_id = {USR_ID}
                    )
                )
            AND sop_id IS NOT NULL
            AND s.is_act IS TRUE
            AND NOT (p2.comple OR p2.cancel)
            AND ptsttp NOT IN ('SUBPROCESS', 'START', 'END')
    ) AS aa USING (prtpid)
) res
GROUP BY prtpid, keyval, dscrpt, clsnam, ptstnm, dctpid, prtpnm, end___, ptstid, prior_, orgarr, actdat
ORDER BY prtpid, ptstid, (end___ IS NOT NULL AND orgarr) DESC, end___ IS NOT NULL DESC, end___ ASC, actdat ASC, orgarr DESC, dscrpt ASC


Zapytanie dla wszystkich zadań workflow z modułu Dokumenty:

SELECT doc.*, reg.regtyp,reg.ndenam, type.dctptp,type.dctpnm,type.dctpic, 
    (SELECT ARRAY[count(f.fileid),min(f.fileid)] FROM attachments LEFT JOIN files f USING(fileid) WHERE is_del IS NOT TRUE AND doc_id = doc.doc_id) as files, 
    (EXISTS (SELECT 1 FROM documents_history WHERE doc_id=doc.doc_id AND orunid = 1 AND strpos(dscrpt, 'Otwarcie')=1)) as is_ack 
FROM documents doc 
INNER JOIN (
    SELECT doc_id, (array_agg(attrib))[1] as attrib 
    FROM (
        SELECT documents_view.doc_id, (CASE WHEN dlu_doc_id IS NULL THEN NULL ELSE coalesce(dlu.attrib, '') END) as attrib 
        FROM documents documents_view 
        LEFT JOIN storage_places stp using(strpid) 
        LEFT JOIN (
            SELECT dlu.doc_id as dlu_doc_id, dlu.attrib, dlu.usr_id, ul.prior_ 
            FROM doc_link_users dlu 
            LEFT JOIN users_link_group ul on(ul.grp_id = dlu.grp_id AND ul.usr_id = 2)
            WHERE dlu.usr_id = 2 OR ul.usr_id = 2
        ) dlu ON (dlu_doc_id = documents_view.doc_id)
        WHERE is_del IS NOT TRUE AND gostof IS NULL 
            AND procid IN (
                SELECT p.rootpr 
                FROM procedures p 
                LEFT JOIN stages s USING(procid) 
                WHERE (ARRAY(SELECT orunid FROM orgtree_view LEFT JOIN users_link_org_units ulo USING(orunid) WHERE orunid = 1 OR (ourpid = 1 AND EXISTS(SELECT 1 FROM (SELECT value_ FROM global_sys_conf WHERE ent_id = 2 AND objnam = 'Replacement_'||ulo.usr_id AND varnam = 'from__') as as1 WHERE value_::date <= now()::date) AND EXISTS(SELECT 1 FROM (SELECT value_ FROM global_sys_conf WHERE ent_id = 2 AND objnam = 'Replacement_'||ulo.usr_id AND varnam = 'to____') as sd2 WHERE value_::date >= now()::date))) && s.orgarr) AND s.ptsttp != 'SUBPROCESS' AND sop_id IS NOT NULL AND is_act IS TRUE
            ) 
            AND is_iso IS FALSE AND partof IS NULL ORDER BY dlu_doc_id, dlu.usr_id IS NOT NULL DESC, dlu.prior_ ASC 
    ) foo2
    GROUP BY doc_id
) dolu USING (doc_id) 
LEFT JOIN types_of_documents type USING(dctpid) 
LEFT JOIN registers reg USING(reg_id) 
WHERE (substr(dolu.attrib, 1, 1) = 'r') OR (dolu.attrib IS NULL AND (prionl IS NOT TRUE OR doc.adduid = 2))
ORDER BY timest DESC,doc_id DESC

Linki przydatne

Funkcje tablicowe Postgres: http://www.postgresql.org/docs/8.4/static/intarray.html