-- prekopanie roli a pristupovych prav

\encoding UTF8

BEGIN;

-- cele inak: povodne acl sa rusi, vznikne nove
DROP TABLE acl;

-- jednotlive role

CREATE TABLE acl_role (
	id SERIAL NOT NULL,
	name VARCHAR NOT NULL,
	comment VARCHAR,
	handler_class VARCHAR,
	handler_param VARCHAR,
	inherit_role INT REFERENCES acl_role (id) ON UPDATE CASCADE ON DELETE CASCADE,
	PRIMARY KEY (id)
);

COMMENT ON TABLE acl_role IS 'ciselnik roli pre ucely ACL';
COMMENT ON COLUMN acl_role.name IS 'nazov role zrozumitelny pre cloveka';
COMMENT ON COLUMN acl_role.comment IS 'blizsie vysvetlenie co rola predstravuje';
COMMENT ON COLUMN acl_role.handler_class IS 'nazov PHP triedy, ktora spravuje prislusnost k tejto roli';
COMMENT ON COLUMN acl_role.handler_param IS 'dalsie udaje pre PHP triedu z handler_class';
COMMENT ON COLUMN acl_role.inherit_role IS 'ID roly, ktoru celu tato rola obashuje';

CREATE INDEX acl_role_inherit_role ON acl_role(inherit_role);

GRANT SELECT, INSERT, UPDATE ON acl_role TO extranet;
GRANT USAGE ON acl_role_id_seq TO extranet;

INSERT INTO acl_role (name,handler_class,handler_param,comment) VALUES ('Hocikto','AnyoneHandler',null,'úplne každý, kto je na portáli');
INSERT INTO acl_role (name,handler_class,handler_param,comment) VALUES ('Neprihlásený','UserSessionHandler','!logged','hocikto, kto je na portáli a ešte sa neprihlásil');
INSERT INTO acl_role (name,handler_class,handler_param,comment) VALUES ('Prihlásený','UserSessionHandler','logged','kto sa na portál prihlásil menom a heslom (alebo cez su-exec)');
INSERT INTO acl_role (name,handler_class,handler_param,comment) VALUES ('Enduser','ConnectorHandler','contract.enduser','kto na danej zmluve vystupuje ako enduser');
INSERT INTO acl_role (name,handler_class,handler_param,comment) VALUES ('Customer pasiv','ConnectorHandler','contract.customer','kto na danej zmluve vystupuje ako customer');
INSERT INTO acl_role (name,comment) VALUES ('Customer aktiv','customer s aktívnymi právami');
INSERT INTO acl_role (name,handler_class,handler_param,comment) VALUES ('Partner pasiv','ConnectorHandler','contract.mediator|referrer','kto na danej zmluve vystupuje ako partner');
INSERT INTO acl_role (name,comment) VALUES ('Partner aktiv','partner s aktívnymi právami');
INSERT INTO acl_role (name,comment) VALUES ('Sysadmin','systémový administrátor');

-- priradenie roli osobam

CREATE TABLE acl_role_person (
	id SERIAL NOT NULL,
	acl_role INT NOT NULL REFERENCES acl_role (id) ON UPDATE CASCADE ON DELETE CASCADE,
	person INT NOT NULL REFERENCES person (id) ON UPDATE CASCADE ON DELETE CASCADE,
	PRIMARY KEY (id)
);

CREATE INDEX acl_role_person_acl_role ON acl_role_person (acl_role);
CREATE INDEX acl_role_person_person ON acl_role_person (person);

COMMENT ON TABLE acl_role_person IS 'priradenie osob ku ACL roliam';
COMMENT ON COLUMN acl_role_person.acl_role IS 'ID role';
COMMENT ON COLUMN acl_role_person.person IS 'ID osoby';

GRANT SELECT, INSERT, UPDATE, DELETE ON acl_role_person TO extranet;
GRANT USAGE ON acl_role_person_id_seq TO extranet;

-- ciselnik opravneni, ktore pouzivatel moze mat

CREATE TABLE acl_high (
	id SERIAL NOT NULL,
	name VARCHAR NOT NULL,
	sysname VARCHAR,
	PRIMARY KEY (id)
);

CREATE UNIQUE INDEX acl_high_sysname ON acl_high (sysname);

COMMENT ON TABLE acl_high IS 'ciselnik opravneni, ktore pouzivatel ci rola moze mat';
COMMENT ON COLUMN acl_high.name IS 'nazov opravnenia zruzumitelny pre cloveka';
COMMENT ON COLUMN acl_high.sysname IS 'nazov opravnenia ak sa na neho potrebuje odkazat PHP kod';

GRANT SELECT, INSERT, UPDATE ON acl_high TO extranet;
GRANT USAGE ON acl_high_id_seq TO extranet;

-- priradenie prava ku role, alebo ku osobe

CREATE TABLE acl ( -- pri select ma role nizsiu prioritu, person vyssiu
	id SERIAL NOT NULL,
	acl_high INT NOT NULL REFERENCES acl_high (id) ON UPDATE CASCADE ON DELETE CASCADE,
	person INT REFERENCES person (id) ON UPDATE CASCADE ON DELETE CASCADE,
	acl_role INT REFERENCES acl_role (id) ON UPDATE CASCADE ON DELETE CASCADE,
	row_id INT,
	PRIMARY KEY (id)
);

CREATE INDEX acl_acl_high ON acl (acl_high);
CREATE INDEX acl_person ON acl (person);
CREATE INDEX acl_acl_role ON acl (acl_role);

COMMENT ON TABLE acl IS 'priradenie prav ku role alebo ku osobe';
COMMENT ON COLUMN acl.acl_high IS 'ID opravnenia';
COMMENT ON COLUMN acl.person IS 'ID osoby';
COMMENT ON COLUMN acl.acl_role IS 'ID role';
COMMENT ON COLUMN acl.row_id IS 'ID riadku tabulky, ak sa opravnenie vztahuje len na jeden riadok';

GRANT SELECT, INSERT, UPDATE, DELETE ON acl TO extranet;
GRANT USAGE ON acl_id_seq TO extranet;

-- tabulka acl_low - mala mapovat acl na starsie acl, ale to sme povedali ze uz netreba

-- teraz skuska spravnosti - ci je mozne popisat jednotlivymi opravneniami tieto pripady:

-- k clanku v manuali pridelit pristupove prava na citanie skupinam a jednotlivcom
INSERT INTO acl_high (name, sysname) VALUES ('právo na čítanie článku v manuáli','doc_read');

-- k clanku v manuali pridelit pristupove prava na zapis skupinam a jednotlivcom
INSERT INTO acl_high (name, sysname) VALUES ('právo na zápis článku v manuáli','doc_write');

-- k osobe pridelit pristupove prava na citanie skupinam a jednotlivcom
INSERT INTO acl_high (name, sysname) VALUES ('právo na čítanie osoby','person_read');

-- k osobe pridelit pristupove prava na zapis skupinam a jednotlivcom
INSERT INTO acl_high (name, sysname) VALUES ('právo na zápis osoby','person_write');

-- k zmluve pridelit pristupove prava na citanie skupinam a jednotlivcom
INSERT INTO acl_high (name, sysname) VALUES ('právo na čítanie zmluvy','contract_read');

-- k zmluve pridelit pristupove prava na zapis skupinam a jednotlivcom
INSERT INTO acl_high (name, sysname) VALUES ('právo na zápis zmluvy','contract_write');

-- k tarife pridelit pristupove prava na citanie skupinam a jednotlivcom
INSERT INTO acl_high (name, sysname) VALUES ('právo na čítanie tarify','tarif_read');

-- rola neprihlaseny
-- - pridat novu osobu
INSERT INTO acl_high (name, sysname) VALUES ('právo registrovať novú osobu','person_register');
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='person_register' AND r.handler_param='!logged';

-- - prihlasit sa
INSERT INTO acl_high (name, sysname) VALUES ('právo prihlásiť sa','person_login');
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='person_login' AND r.handler_param='!logged';

-- - vidiet vybrane kapitoly v manuali
--		pokryte pravom doc_read

-- - vidiet a pouzit tarifu - vsetky verejne tarify
--		pokryte pravom tarif_read

-- rola prihlaseny
-- - vsetko co rola neprihlaseny
UPDATE acl_role SET inherit_role=(SELECT id FROM acl_role WHERE handler_param='!logged') WHERE handler_param='logged';

-- - editovat to ze ktore osoby som ja splnomicnil
INSERT INTO acl_high (name, sysname) VALUES ('právo editovať to, že ktoré osoby splnomocnil','person_representation');
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='person_representation' AND r.handler_param='logged';

-- rola enduser
-- - vsetko co rola prihlaseny
--		pokryte automaticky tym, ze dany clovek je prihlaseny

-- - vidiet vsetky zmluvy, v ktorych som enduser
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='contract_read' AND r.handler_param='contract.enduser';

-- - vidiet svoju osobu
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='person_read' AND r.handler_param='contract.enduser';

-- - odoslat SMS s uctovanim na zmluvu, pri ktorej som enduser
INSERT INTO acl_high (name, sysname) VALUES ('právo odoslať SMS s účtovaním na zmluvu kde je enduser','sms_send');
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='sms_send' AND r.handler_param='contract.enduser';

-- rola customer pasiv
-- - vidiet vsetky zmluvy a  zaznamy (pri ktorych je uzivatel customer)
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='contract_read' AND r.handler_param='contract.customer';

-- rola customer aktiv
-- - vsetko co rola customer pasiv
--		pokryte tym, ze cloevk bude pasiv automaticky

-- - editovat nastavenie sip konta
INSERT INTO acl_high (name, sysname) VALUES ('právo editovat nastavenie SIP konta','ipfon_account_edit');
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='ipfon_account_edit' AND r.name='Customer aktiv';

-- - pridat nove telefonne cislo
INSERT INTO acl_high (name, sysname) VALUES ('právo pridať nové telefónne číslo','ipfon_telno_assign');
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='ipfon_telno_assign' AND r.name='Customer aktiv';

-- rola partner pasiv
-- - vidiet zmluy pri ktorych som customer alebo mediator
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='contract_read' AND r.name='Partner pasiv';

-- - vidiet osoby s ktorymi mam aktivny zmluvny vztah
INSERT INTO acl_high (name, sysname) VALUES ('právo vidieť osoby, s ktorými má aktívny zmluvný vzťah','contract_person_read');
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='contract_person_read' AND r.name='Partner pasiv';

-- - editovat osoby pri ktorych som owner  (alebo to patri k roli owner??)
--		TODO: stlpec owner neexistuje

-- - editovat zmluvy pri ktorych som ja owner  (alebo to patri k roli owner??)
--		TODO: stlpec owner neexistuje

-- - vidiet a pouzit tarifu - konkretna tarifa/tarify spristupnene tomuto partnerovi
--		to bude pripad od pripadu, editovane z web rozhrania

-- rola partner aktiv
-- - vsetko co partner pasiv
--		pokryte tym, ze patri do skupiny pasiv automaticky

-- - editovat zmluvy pri ktorych som customer alebo mediator
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='contract_write' AND r.name='Partner aktiv';

-- - editovat osoby s ktorymi mam aktivny zmluvny vztah a pri ktorych som jediny kto ich pouziva
INSERT INTO acl_high (name, sysname) VALUES ('právo editovať osoby, s ktorými má aktívny zmluvný vzťah a je jediný, kto ho má','contract_person_edit_exclusive');
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='contract_person_edit_exclusive' AND r.name='Partner aktiv';

-- - navrhovat editaciu osoby s ktorou mam zmluvny vztah, a s ktorou ma zmluvny vztah aj niekto iny
INSERT INTO acl_high (name, sysname) VALUES ('právo navrhovať editáciu osôb, s ktorými má aktívny zmluvný vzťah, ale nie je jediný','contract_person_suggest_edit');
INSERT INTO acl (acl_high, acl_role) SELECT h.id AS acl_high, r.id AS acl_role FROM acl_high h, acl_role r WHERE h.sysname='contract_person_suggest_edit' AND r.name='Partner aktiv';

-- user xy (akykolvek, individualne)
-- - povolit/zakazat editovanie zmluvy alebo osoby (odklonit sa pri tejto osobe/zmluve od prav ziskanych z roli)
--		moze sa vytvorit nove pravo/povinnost - 'nemožnosť editovať zmluvu' resp. '... osobu'

-- rola sysadmin
-- - vidiet v manuali kapitolu sysadmin a jej podkapitoly
--		bude editovane skrz web rozhranie

-- user alexii
-- - v manuali editovat vybrane kapitoly (budu zadane id-ckami)
-- - v manuali editovat kapitolu sysadmin a jej podkapitoly
--		bude editovane skrz web rozhranie

-- 18.2.2015: rozdelit acl_high.sysname na opgroup a opname
ALTER TABLE acl_high ADD COLUMN opgroup VARCHAR;
ALTER TABLE acl_high ADD COLUMN opname VARCHAR;

UPDATE acl_high SET opgroup='doc', opname='read' WHERE sysname='doc_read';
UPDATE acl_high SET opgroup='doc', opname='write' WHERE sysname='doc_write';
UPDATE acl_high SET opgroup='person', opname='read' WHERE sysname='person_read';
UPDATE acl_high SET opgroup='person', opname='write' WHERE sysname='person_write';
UPDATE acl_high SET opgroup='contract', opname='read' WHERE sysname='contract_read';
UPDATE acl_high SET opgroup='contract', opname='write' WHERE sysname='contract_write';
UPDATE acl_high SET opgroup='tarif', opname='read' WHERE sysname='tarif_read';
UPDATE acl_high SET opgroup='person', opname='register' WHERE sysname='person_register';
UPDATE acl_high SET opgroup='person', opname='login' WHERE sysname='person_login';
UPDATE acl_high SET opgroup='person_representation', opname='edit' WHERE sysname='person_representation';
UPDATE acl_high SET opgroup='sms', opname='send' WHERE sysname='sms_send';
UPDATE acl_high SET opgroup='ipfon_account', opname='edit' WHERE sysname='ipfon_account_edit';
UPDATE acl_high SET opgroup='ipfon_telno', opname='assign' WHERE sysname='ipfon_telno_assign';
UPDATE acl_high SET opgroup='contract_person', opname='read' WHERE sysname='contract_person_read';
UPDATE acl_high SET opgroup='contract_person', opname='edit_exclusive' WHERE sysname='contract_person_edit_exclusive';
UPDATE acl_high SET opgroup='contract_person', opname='suggest_edit' WHERE sysname='contract_person_suggest_edit';

CREATE UNIQUE INDEX acl_high_opgroup_opname ON acl_high (opgroup,opname);
ALTER TABLE acl_high DROP COLUMN sysname;

-- 3.3.2015: preklopit aktualne prava manualu na acl
INSERT INTO acl (acl_high, acl_role, row_id)
	SELECT h.id AS acl_high, r.id AS acl_role, d.id AS row_id
	FROM acl_role r, acl_high h, doc d
	WHERE r.handler_class='AnyoneHandler' AND h.opgroup='doc' AND h.opname='read' AND d.access_level=0;

INSERT INTO acl (acl_high, acl_role, row_id)
	SELECT h.id AS acl_high, r.id AS acl_role, d.id AS row_id
	FROM acl_role r, acl_high h, doc d
	WHERE r.handler_class='UserSessionHandler' AND r.handler_param='logged' AND h.opgroup='doc' AND h.opname='read' AND d.access_level=1;

INSERT INTO acl (acl_high, acl_role, row_id)
	SELECT h.id AS acl_high, r.id AS acl_role, d.id AS row_id
	FROM acl_role r, acl_high h, doc d
	WHERE r.name='Partner aktiv' AND h.opgroup='doc' AND h.opname='read' AND d.access_level=2;

INSERT INTO acl (acl_high, acl_role, row_id)
	SELECT h.id AS acl_high, r.id AS acl_role, d.id AS row_id
	FROM acl_role r, acl_high h, doc d
	WHERE r.name='Sysadmin' AND h.opgroup='doc' AND h.opname='read' AND d.access_level=3;

INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať celý manuál','doc','admin');

INSERT INTO acl (acl_high, person)
	SELECT h.id AS acl_high, p.id AS person
	FROM person p, acl_high h
	WHERE p.name='Rybáriková Dana' AND h.opgroup='doc' AND h.opname='admin';

-- 5.3.2015: doplnene dalsie prava
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať zoznam oprávnení ACL','acl_high','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať príslušnosť osôb k ACL roliam','acl_role_person','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať ACL role','acl_role','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať záznamy ACL','acl','admin');

INSERT INTO acl (acl_high, person)
	SELECT h.id AS acl_high, p.id AS person
	FROM person p, acl_high h
	WHERE p.name='Rybáriková Dana' AND h.opgroup='acl' AND h.opname='admin';

INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na ručnú editáciu položiek zmlúv','contract_item','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis častí nehnuteľností','property_part','write');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis nehnuteľností','property','write');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis zoznamu osôb k nehnuteľnostiam','property_person','write');

INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať kanály RegioTV','rtv_channel','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať zoznam IP k RegioTV kanálom','rtv_channel_ip','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať zoznam kanálov RegioTV k headendom','rtv_headend_channel','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať zoznam kanálov RegioTV k balíčkom','rtv_package_channel','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať smartkarty RegioTV','rtv_provider_smartcard','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať zoznam kanálov RegioTV k smartkartám','rtv_provider_smartcard_channel','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať providerov RegioTV','rtv_provider','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať streamery RegioTV','rtv_streamer','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať zoznam kanálov k RegioTV streamerom','rtv_streamer_channel','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať zoznam adaptérov k RegioTV streamerom','rtv_streamer_adapter','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať zoznam cardclient k RegioTV streamerom','rtv_streamer_cardclient','admin');

INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis prístupov k tarife (tarifaccess)','tarifaccess','write');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis skupín tarifných položiek','tarifitemgroup','write');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis balíčkov tarifných položiek','tarifitempack','write');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis cien tarifných položiek','tarifitemrate','write');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis tarify','tarif','write');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis tarifných položiek','tarifitem','write');

INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať zmluvy','contract','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať faktúry','invoice','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať SIP účty ipfon','ipfon_account','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať FAX účty ipfon','ipfon_fax_account','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať tel. čísla ipfon','ipfon_telno','admin');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo spravovať osoby','person','admin');

INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo na zápis prenesených čísel','ipfon_telno_inp','write');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo použiť pri výbere tel. čísla aj iný NDC prefix než svoj domovský','ipfon_telno','allow_other_ndc_prefix');
INSERT INTO acl_high (name, opgroup, opname) VALUES ('právo zobraziť aj iné než svoje platby a faktúry','payments','show_all');

INSERT INTO acl_role (name, comment) VALUES ('Neobmedzený admin','to čo predtým bolo admin');

INSERT INTO acl (acl_high, acl_role)
	SELECT h.id AS acl_high, r.id AS acl_role
	FROM acl_role r, acl_high h
	WHERE r.name='Neobmedzený admin' AND h.opname IN ('admin', 'show_all', 'allow_other_ndc_prefix');

INSERT INTO acl (acl_high, acl_role)
	SELECT h.id AS acl_high, r.id AS acl_role
	FROM acl_role r, acl_high h
	WHERE r.name='Neobmedzený admin' AND h.opname='write' AND (h.opgroup LIKE 'property%' OR h.opgroup LIKE 'tarif%' OR h.opgroup='ipfon_telno_inp');

INSERT INTO acl_role_person (acl_role, person)
	SELECT r.id AS acl_role, p.id AS person
	FROM person p, acl_role r
	WHERE r.name='Neobmedzený admin' AND p.name IN ('Rybáriková Dana', 'Rybárik Michal', 'Ing. Pavlisko Peter');

COMMIT;
