-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdb.sql
More file actions
1073 lines (900 loc) · 38 KB
/
db.sql
File metadata and controls
1073 lines (900 loc) · 38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
-- CREATE DATABASE jupitor;
CREATE ROLE jupitor WITH LOGIN PASSWORD 'password';
-- GRANT ALL PRIVILEGES ON DATABASE jupitor TO jupitor;
-- psql -U jupitor jupitor
--drop tables if exists--------------------------------------------------------------------------------------------
DROP TABLE IF EXISTS country CASCADE;
DROP TABLE IF EXISTS city CASCADE;
DROP TABLE IF EXISTS address CASCADE;
DROP TABLE IF EXISTS personal_information CASCADE;
DROP TABLE IF EXISTS admin CASCADE;
DROP TABLE IF EXISTS branch CASCADE;
DROP TABLE IF EXISTS department CASCADE;
DROP TABLE IF EXISTS emergency_contact_details CASCADE;
DROP TABLE IF EXISTS employee_status CASCADE;
DROP TABLE IF EXISTS job_type CASCADE;
DROP TABLE IF EXISTS pay_grade CASCADE;
DROP TABLE IF EXISTS employee CASCADE;
DROP TABLE IF EXISTS employee_leave CASCADE;
DROP TABLE IF EXISTS employee_phone_number CASCADE;
DROP TABLE IF EXISTS leave CASCADE;
DROP TABLE IF EXISTS leave_record CASCADE;
DROP TABLE IF EXISTS supervisor CASCADE;
DROP TABLE IF EXISTS session;
DROP TABLE IF EXISTS personal_information_custom;
DROP TABLE IF EXISTS customattributes;
-- create tables-----------------------------------------------------------------------------------------------------
CREATE TABLE country
(
country_id SERIAL NOT NULL ,
country varchar(100) NOT NULL,
CONSTRAINT country_pkey PRIMARY KEY (country_id)
);
CREATE TABLE city
(
city_id SERIAL NOT NULL ,
city varchar(100) NOT NULL,
country_id integer NOT NULL,
CONSTRAINT city_pkey PRIMARY KEY (city_id),
CONSTRAINT city_country_id_fkey FOREIGN KEY (country_id)
REFERENCES country (country_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE address
(
address_id SERIAL NOT NULL ,
address varchar(100) NOT NULL,
city_id integer NOT NULL,
postal_code integer NOT NULL,
CONSTRAINT address_pkey PRIMARY KEY (address_id),
CONSTRAINT address_city_id_fkey FOREIGN KEY (city_id)
REFERENCES city (city_id) ON UPDATE CASCADE
ON DELETE CASCADE
);
-- function for birthday
create or replace function check_age(birthday date) returns boolean
language plpgsql
as $$
begin
if not date_part('year', current_date)- date_part('year',birthday)>=18 then
RAISE EXCEPTION 'your age should be greater than or equal to 18';
end if;
return 1;
end;
$$;
CREATE TABLE personal_information
(
employee_id SERIAL NOT NULL ,
nic varchar(50) NOT NULL,
first_name varchar(100) ,
middle_name varchar(100) ,
last_name varchar(100) ,
gender varchar(50) ,
birth_day date check (check_age(birth_day)),
address_id integer NOT NULL,
email varchar(100) NOT NULL,
password varchar(250) ,
photo varchar(200),
registered_date date DEFAULT CURRENT_DATE,
CONSTRAINT personal_information_pkey PRIMARY KEY (employee_id),
CONSTRAINT address_id_fkey FOREIGN KEY (address_id)
REFERENCES address (address_id) ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE admin
(
employee_id integer NOT NULL,
CONSTRAINT admin_pkey PRIMARY KEY (employee_id),
CONSTRAINT admin_employee_id_fkey FOREIGN KEY (employee_id)
REFERENCES personal_information (employee_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE branch
(
branch_name varchar(100) NOT NULL,
address_id integer NOT NULL,
CONSTRAINT branch_pkey PRIMARY KEY (branch_name),
CONSTRAINT branch_address_id_fkey FOREIGN KEY (address_id)
REFERENCES address (address_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE department
(
dept_name varchar(100) NOT NULL,
employee_count integer NOT NULL DEFAULT 0,
CONSTRAINT department_pkey PRIMARY KEY (dept_name)
);
INSERT INTO department(dept_name)VALUES ('HR');
CREATE TABLE emergency_contact_details
(
employee_id integer NOT NULL,
relative_name varchar(100) NOT NULL,
contact_no varchar(45) NOT NULL,
CONSTRAINT emergency_contact_details_pkey PRIMARY KEY (employee_id),
CONSTRAINT emergency_contact_details_employee_id_fkey FOREIGN KEY (employee_id)
REFERENCES personal_information (employee_id) ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE employee_status
(
e_status_name varchar(50) NOT NULL,
duration varchar(50) ,
description varchar(50) ,
CONSTRAINT employee_status_pkey PRIMARY KEY (e_status_name)
);
CREATE TABLE job_type
(
job_title varchar(50) NOT NULL,
description varchar(50) ,
req_qualification varchar(50) ,
prerequisites varchar(50) ,
CONSTRAINT job_type_pkey PRIMARY KEY (job_title)
);
insert into job_type (job_title) values('HR') ,('Manager');
CREATE TABLE pay_grade
(
paygrade_level varchar(50) NOT NULL,
description varchar(50) ,
requirement varchar(50) ,
CONSTRAINT pay_grade_pkey PRIMARY KEY (paygrade_level)
);
CREATE TABLE employee
(
employee_id integer NOT NULL,
branch_name varchar(100) NOT NULL,
job_title varchar(50) NOT NULL,
dept_name varchar(100) NOT NULL,
paygrade_level varchar(50) NOT NULL,
e_status_name varchar(50) NOT NULL,
supervisor boolean default FALSE,
CONSTRAINT employee_pkey PRIMARY KEY (employee_id),
CONSTRAINT employee_branch_name_fkey FOREIGN KEY (branch_name)
REFERENCES branch (branch_name)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT employee_dept_name_fkey FOREIGN KEY (dept_name)
REFERENCES department (dept_name)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT employee_e_status_name_fkey FOREIGN KEY (e_status_name)
REFERENCES employee_status (e_status_name)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT employee_employee_id_fkey FOREIGN KEY (employee_id)
REFERENCES personal_information (employee_id)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT employee_job_title_fkey FOREIGN KEY (job_title)
REFERENCES job_type (job_title)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT employee_paygrade_level_fkey FOREIGN KEY (paygrade_level)
REFERENCES pay_grade (paygrade_level)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE INDEX department_name ON employee(dept_name);
CREATE INDEX job_type_index ON employee(job_title);
CREATE INDEX paygrade_index ON employee(paygrade_level);
CREATE TABLE employee_leave
(
employee_id integer NOT NULL,
year integer NOT NULL,
anual integer DEFAULT 0,
casual integer DEFAULT 0,
maternity integer DEFAULT 0,
no_pay integer DEFAULT 0,
CONSTRAINT employee_leave_pkey PRIMARY KEY (employee_id, year),
CONSTRAINT employee_leave_employee_id_fkey FOREIGN KEY (employee_id)
REFERENCES personal_information (employee_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE employee_phone_number
(
employee_id integer NOT NULL,
phone varchar(45) NOT NULL,
CONSTRAINT employee_phone_number_pkey PRIMARY KEY (employee_id, phone),
CONSTRAINT employee_phone_number_employee_id_fkey FOREIGN KEY (employee_id)
REFERENCES personal_information (employee_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE leave
(
paygrade_level varchar(50) NOT NULL,
anual integer NOT NULL,
casual integer NOT NULL,
maternity integer NOT NULL,
no_pay integer NOT NULL,
CONSTRAINT leave_pkey PRIMARY KEY (paygrade_level),
CONSTRAINT leave_paygrade_level_fkey FOREIGN KEY (paygrade_level)
REFERENCES pay_grade (paygrade_level)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE leave_record
(
leave_id SERIAL NOT NULL,
employee_id integer NOT NULL,
leave_type varchar(50) NOT NULL,
apply_date date NOT NULL,
start_date date NOT NULL,
duration integer NOT NULL,
reason varchar(200),
approval_state varchar(10) NOT NULL DEFAULT 'No'::varchar,
CONSTRAINT leave_type_cons CHECK( leave_type IN('anual','casual','maternity','no_pay')),
CONSTRAINT leave_record_pkey PRIMARY KEY (leave_id),
CONSTRAINT leave_record_employee_id_fkey FOREIGN KEY (employee_id)
REFERENCES personal_information (employee_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE supervisor
(
employee_id integer NOT NULL,
supervisor_id integer ,
CONSTRAINT supervisor_pkey PRIMARY KEY (employee_id)
);
CREATE INDEX employee_index ON supervisor(supervisor_id);
CREATE TABLE customattributes
(
name character varying(100) NOT NULL,
type character varying(100) ,
size integer,
default_val character varying(100) ,
CONSTRAINT "customAttributes_pkey" PRIMARY KEY (name)
);
CREATE TABLE personal_information_custom(
employee_id integer NOT NULL,
CONSTRAINT personal_information_custom_pkey PRIMARY KEY (employee_id),
CONSTRAINT personal_information_custom_employee_id_fkey FOREIGN KEY (employee_id)
REFERENCES employee (employee_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE "session" (
"sid" varchar NOT NULL COLLATE "default",
"sess" json NOT NULL,
"expire" timestamp(6) NOT NULL
)
WITH (OIDS=FALSE);
ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;
CREATE INDEX "IDX_session_expire" ON "session" ("expire");
-- Kaveesha Functions--------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE addToSupervisorT(
employee_ids integer[],
val_supervisor_id int,
arraylength int
)
LANGUAGE plpgsql
AS $$
DECLARE
i int;
BEGIN
DELETE FROM supervisor WHERE supervisor_id = val_supervisor_id;
for i in 1..arraylength
loop
INSERT INTO supervisor VALUES(employee_ids[i], val_supervisor_id );
end loop;
commit;
END;
$$;
CREATE OR REPLACE FUNCTION updateSupervisorTable()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
DECLARE
supervisr_id int;
BEGIN
IF (NOT NEW.supervisor) AND OLD.supervisor THEN
DELETE FROM supervisor WHERE supervisor_id = OLD.employee_id;
DELETE FROM supervisor WHERE employee_id = OLD.employee_id;
ELSIF NEW.supervisor AND (NOT OLD.supervisor) THEN
IF(OLD.job_title != 'Manager') THEN
SELECT employee_id INTO supervisr_id FROM employee
WHERE branch_name=OLD.branch_name AND dept_name=OLD.dept_name AND job_title='Manager';
INSERT INTO supervisor VALUES(OLD.employee_id, supervisr_id);
END IF;
END IF;
RETURN NEW;
END;
$$;
Drop Trigger if exists removeSupervisor on employee;
CREATE TRIGGER removeSupervisor
AFTER UPDATE
OF supervisor
ON employee
FOR EACH ROW
EXECUTE PROCEDURE updateSupervisorTable();
-- get Supervisors----------------------
CREATE OR REPLACE function getSupervisors (branch varchar(100), department varchar(100), JobTitle varchar(100))
returns table(
employee_id int,
nic varchar,
first_name varchar,
last_name varchar
)
language plpgsql
as $$
begin
return query
select e.employee_id,e.nic,e.first_name,e.last_name from EmployeeData_View e
where e.branch_name = branch and e.dept_name = department and
e.job_title != JobTitle and e.supervisor = true;
end;$$;
-- get getNoSupervisorEmployees----------------------
CREATE OR REPLACE function getNoSupervisorEmployees (branch varchar(100), department varchar(100), JobTitle varchar(100))
returns table(
employee_id int,
first_name varchar,
last_name varchar
)
language plpgsql
as $$
begin
return query
select e.employee_id,e.first_name,e.last_name from EmployeeData_View e
where e.branch_name = branch and e.dept_name = department and e.job_title != JobTitle
and e.employee_id not in (select distinct(s.employee_id) from supervisor s);
end;$$;
CREATE OR REPLACE VIEW EmployeeData_View AS
SELECT *
FROM employee left join personal_information using(employee_id) left join personal_information_custom using(employee_id);
-- Sandaruwn Functions--------------------------------------------------------------------------------------------------------------------
CREATE or replace FUNCTION emp_stamp() RETURNS trigger AS $BODY$
DECLARE
count1 INTEGER :=0 ;
BEGIN
IF( NEW.leave_type ='anual' AND NEW.approval_state = 'Yes') THEN
select anual into count1 from employee_leave where employee_id = NEW.employee_id and year = 2021;
UPDATE employee_leave SET anual = count1 - NEW.duration WHERE employee_id = NEW.employee_id AND year = 2021 ; END IF;
IF( NEW.leave_type ='casual' AND NEW.approval_state = 'Yes') THEN
select casual into count1 from employee_leave where employee_id = NEW.employee_id and year = 2021;
UPDATE employee_leave SET casual = count1 - NEW.duration WHERE employee_id = NEW.employee_id AND year = 2021 ; END IF;
IF( NEW.leave_type ='maternity' AND NEW.approval_state = 'Yes') THEN
select maternity into count1 from employee_leave where employee_id = NEW.employee_id and year = 2021;
UPDATE employee_leave SET maternity = count1 - NEW.duration WHERE employee_id = NEW.employee_id AND year = 2021 ; END IF;
IF( NEW.leave_type ='no_pay' AND NEW.approval_state = 'Yes') THEN
select no_pay into count1 from employee_leave where employee_id = NEW.employee_id and year = 2021;
UPDATE employee_leave SET no_pay = count1 - NEW.duration WHERE employee_id = NEW.employee_id AND year = 2021 ; END IF;
return new;
END;
$BODY$ LANGUAGE plpgsql;
Drop TRIGGER IF EXISTS leave_count on leave_record;
CREATE TRIGGER leave_count AFTER UPDATE ON leave_record FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
-- get leave requests----------------------
create or replace function getleavea ( s_id numeric)
returns table(
leave_id int,
employee_id int,
first_name varchar ,
last_name varchar,
leave_type varchar
)
language plpgsql
as $$
begin
return query
select l.leave_id,l.employee_id,p.first_name,p.last_name,l.leave_type
from supervisor s left outer join leave_record l on l.employee_id = s.employee_id
left outer join personal_information p on s.employee_id = p.employee_id
where s.supervisor_id = s_id AND l.approval_state = 'No' ;
end;$$;
-- get all employees--------------------------------
create or replace function getEmployees1 ( s_id numeric)
returns table(
employee_id int,
first_name varchar ,
last_name varchar,
count_leaves int,
total_leaves int
)
language plpgsql
as $$
begin
return query
select s.employee_id,p.first_name,
p.last_name, e.anual+e.casual+e.maternity+e.no_pay AS count_leaves,
lv.anual + lv.casual + lv.maternity + lv.no_pay AS total_leaves
from supervisor s left outer join personal_information p
on s.employee_id = p.employee_id
left outer join employee_leave e on e.employee_id = p.employee_id
left outer join employee em on em.employee_id = p.employee_id
left outer join leave lv on em.paygrade_level = lv.paygrade_level
where s.supervisor_id = s_id AND year =2021 ;
end;$$;
-- get employee-----------------------------
create or replace function getEmployee ( e_id numeric)
returns table(
employee_id int,
first_name varchar ,
last_name varchar,
count_leaves int,
total_leaves int
)
language plpgsql
as $$
begin
return query
select p.employee_id,p.first_name,p.last_name,
e.anual+e.casual+e.maternity+e.no_pay AS count_leaves,
lv.anual + lv.casual + lv.maternity + lv.no_pay AS total_leaves
from personal_information p
left outer join employee_leave e on e.employee_id = p.employee_id
left outer join employee em on em.employee_id = p.employee_id
left outer join leave lv on em.paygrade_level = lv.paygrade_level
where p.employee_id = e_id AND year =2021 ;
end;$$;
-- get absents -----------------------
create or replace function getAttendence (In s_id numeric,
In today date)
returns integer
language plpgsql
as $$
DECLARE
count1 INTEGER :=0 ;
begin
select count(distinct l.employee_id) into count1
from supervisor s left outer join leave_record l on l.employee_id = s.employee_id
where start_date + duration >= today AND s.supervisor_id = s_id AND start_date < today AND approval_state = 'Yes';
return count1;
end;$$;
CREATE or replace FUNCTION emp_leave()
RETURNS trigger
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
anual1 INTEGER :=0 ;
casual1 INTEGER :=0 ;
maternity1 INTEGER :=0 ;
no_pay1 INTEGER :=0 ;
BEGIN
select anual, casual , maternity , no_pay into anual1 , casual1, maternity1,no_pay1
from leave where paygrade_level = NEW.paygrade_level;
insert into employee_leave values(NEW.employee_id,2021, anual1, casual1, maternity1, no_pay1 );
return new;
END;
$BODY$;
Drop TRIGGER IF EXISTS emp_leave on employee;
CREATE TRIGGER setLeave AFTER INSERT ON employee FOR EACH ROW EXECUTE PROCEDURE emp_leave();
-- Indunil's section---------------------------------------------------------------------------------------------------------------------
CREATE or replace FUNCTION changeempcount()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
update department set employee_count=employee_count+1 where dept_name=new.dept_name;
return new;
END;
$BODY$;
Drop TRIGGER IF EXISTS incrementempcount on employee;
CREATE TRIGGER incrementempcount
AFTER INSERT
ON employee
FOR EACH ROW
EXECUTE PROCEDURE changeempcount();
CREATE OR REPLACE FUNCTION changeempcount1() RETURNS TRIGGER AS $department_table$
BEGIN
update department set employee_count=employee_count-1 where dept_name=old.dept_name;
RETURN old;
END;
$department_table$ LANGUAGE plpgsql;
Drop TRIGGER IF EXISTS deccrementempcount on employee;
CREATE TRIGGER deccrementempcount
AFTER DELETE
ON employee
FOR EACH ROW
EXECUTE PROCEDURE changeempcount1();
CREATE OR REPLACE FUNCTION setcountry( c varchar(100)) RETURNS integer
AS $$
DECLARE
c_id integer;
BEGIN
SELECT country_id INTO c_id FROM country
WHERE country=c;
IF c_id IS NULL THEN
INSERT INTO country (country) VALUES (c)
RETURNING country_id INTO c_id ;
END IF;
RETURN c_id;
END;
$$ LANGUAGE PLpgSQL;
CREATE OR REPLACE FUNCTION setcity( cityname varchar(100), countryid numeric) RETURNS integer
AS $$
DECLARE
c_id integer;
BEGIN
SELECT city_id INTO c_id FROM city
WHERE city=cityname and country_id=countryid;
IF c_id IS NULL THEN
INSERT INTO city (city, country_id) VALUES (cityname, countryid)
RETURNING city_id INTO c_id ;
END IF;
RETURN c_id;
END;
$$ LANGUAGE PLpgSQL;
CREATE OR REPLACE FUNCTION setaddress( addressname varchar(100), cityid numeric, postalcode numeric) RETURNS integer
AS $$
DECLARE
a_id integer;
BEGIN
SELECT address_id INTO a_id FROM address
WHERE address=addressname and city_id=cityid and postal_code=postalcode;
IF a_id IS NULL THEN
INSERT INTO address (address, city_id,postal_code) VALUES (addressname, cityid, postalcode)
RETURNING address_id INTO a_id ;
END IF;
RETURN a_id;
END;
$$ LANGUAGE PLpgSQL;
Create Or Replace PROCEDURE updateJupitorLeaves(paygradelevel varchar(50), an integer, cas integer, mat integer, nopay integer)
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE leave SET anual=an, casual=cas, maternity=mat, no_pay=nopay where paygrade_level=paygradelevel;
IF NOT FOUND THEN
INSERT INTO leave(paygrade_level, anual, casual, maternity,no_pay) values (paygradelevel,an,cas, mat, nopay);
END IF;
END;
$$;
-- views for admin
CREATE OR REPLACE VIEW personal_information_view AS
SELECT employee_id,nic, first_name, middle_name, last_name, gender, address_id, birth_day, email, registered_date, photo
FROM personal_information;
CREATE OR REPLACE view address_view AS
SELECT address.address_id, address.address, address.postal_code, city.city, country.country
FROM address left outer join city using(city_id) left outer join country using(country_id);
CREATE OR REPLACE view contact_details_view AS
SELECT *
from emergency_contact_details left outer join employee_phone_number using(employee_id);
Create Or Replace PROCEDURE updateJupitorPayGrade(paygradelevel varchar(50), des varchar(50), req varchar(50))
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE pay_grade SET description=des, requirement=req where paygrade_level=paygradelevel;
END;
$$;
Create Or Replace PROCEDURE updateJupitorEmployeeStatus(estatusname varchar(50), du varchar(50), des varchar(50))
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE employee_status SET duration=du, description=des where e_status_name=estatusname;
END;
$$;
Create Or Replace PROCEDURE updateJupitorJobs(jobtitle varchar(50), des varchar(50), req varchar(50), prereq varchar(50))
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE job_type SET description=des, req_qualification=req, prerequisites=prereq where job_title=jobtitle;
END;
$$;
Create Or Replace PROCEDURE updateJupitorBranch(branchName varchar(50), add integer)
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE branch SET address_id=add where branch_name=branchName;
END;
$$;
-- trigger to restrict only one admin
create or replace function restrictedAdmin() returns trigger as $$
declare
c_admin integer;
begin
select count(*) into c_admin from admin;
if c_admin>0 then
RAISE EXCEPTION 'permission denied';
end if;
return new;
end;
$$ LANGUAGE plpgsql;
Drop TRIGGER IF EXISTS checkAdminTable on admin;
create trigger checkAdminTable before insert on admin for each row execute procedure restrictedAdmin();
-- call updateJupitorLeaves('level 1', 3 ,3 ,4 ,7)
--Kavishka's Functions--
CREATE OR REPLACE VIEW full_employee_detail
AS
SELECT personal_information.employee_id,
personal_information.nic,
personal_information.first_name,
personal_information.middle_name,
personal_information.last_name,
personal_information.gender,
personal_information.birth_day,
personal_information.address_id,
personal_information.email,
personal_information.password,
personal_information.photo,
personal_information.registered_date,
employee.branch_name,
employee.job_title,
employee.dept_name,
employee.paygrade_level,
employee.e_status_name,
employee.supervisor
FROM (personal_information
JOIN employee USING (employee_id));
-- function for get leave records by date range
CREATE OR REPLACE FUNCTION getleavebydate(startD date,endD date)
RETURNS TABLE(leave_id integer, employee_id integer, leave_type character varying, apply_date date, startdate date, duration integer, reason character varying, approval_state character varying)
LANGUAGE 'plpgsql'
VOLATILE
PARALLEL UNSAFE
COST 100 ROWS 1000
AS $BODY$
BEGIN
RETURN QUERY
SELECT * FROM leave_record WHERE start_date BETWEEN startD AND endD;
END;
$BODY$;
--materialized View with olap
CREATE MATERIALIZED VIEW public.departmentleavesummery
TABLESPACE pg_default
AS
SELECT department.dept_name,
leave_record.leave_type,
count(leave_record.leave_id) AS leavecountbydep
FROM ((leave_record
JOIN employee USING (employee_id))
RIGHT JOIN department USING (dept_name))
GROUP BY CUBE(department.dept_name, leave_record.leave_type)
ORDER BY department.dept_name
WITH DATA;
ALTER TABLE public.departmentleavesummery
OWNER TO jupitor;
GRANT ALL ON TABLE public.departmentleavesummery TO jupitor WITH GRANT OPTION;
GRANT ALL ON TABLE public.departmentleavesummery TO jupitorhr WITH GRANT OPTION;
--Materialized view refresh function and necessory views
CREATE OR REPLACE FUNCTION public.refresh_mvw1(
)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE SECURITY DEFINER PARALLEL UNSAFE
AS $BODY$
BEGIN
REFRESH MATERIALIZED VIEW departmentleavesummery with data;
RETURN;
END;
$BODY$;
ALTER FUNCTION public.refresh_mvw1()
OWNER TO postgres;
GRANT EXECUTE ON FUNCTION public.refresh_mvw1() TO PUBLIC;
GRANT EXECUTE ON FUNCTION public.refresh_mvw1() TO jupitorhr WITH GRANT OPTION;
GRANT EXECUTE ON FUNCTION public.refresh_mvw1() TO postgres;
CREATE OR REPLACE VIEW public.dept_anual
AS
SELECT departmentleavesummery.dept_name,
departmentleavesummery.leave_type,
departmentleavesummery.leavecountbydep
FROM departmentleavesummery
WHERE ((departmentleavesummery.leave_type)::text = 'anual'::text);
ALTER TABLE public.dept_anual
OWNER TO postgres;
GRANT ALL ON TABLE public.dept_anual TO postgres;
GRANT ALL ON TABLE public.dept_anual TO jupitorhr;
CREATE OR REPLACE VIEW public.dept_casual
AS
SELECT departmentleavesummery.dept_name,
departmentleavesummery.leave_type,
departmentleavesummery.leavecountbydep
FROM departmentleavesummery
WHERE ((departmentleavesummery.leave_type)::text = 'casual'::text);
ALTER TABLE public.dept_casual
OWNER TO postgres;
GRANT ALL ON TABLE public.dept_casual TO postgres;
GRANT ALL ON TABLE public.dept_casual TO jupitorhr;
CREATE OR REPLACE VIEW public.dept_maternity
AS
SELECT departmentleavesummery.dept_name,
departmentleavesummery.leave_type,
departmentleavesummery.leavecountbydep
FROM departmentleavesummery
WHERE ((departmentleavesummery.leave_type)::text = 'maternity'::text);
ALTER TABLE public.dept_maternity
OWNER TO postgres;
GRANT ALL ON TABLE public.dept_maternity TO postgres;
GRANT ALL ON TABLE public.dept_maternity TO jupitorhr;
CREATE OR REPLACE VIEW public.dept_no_pay
AS
SELECT departmentleavesummery.dept_name,
departmentleavesummery.leave_type,
departmentleavesummery.leavecountbydep
FROM departmentleavesummery
WHERE ((departmentleavesummery.leave_type)::text = 'no_pay'::text);
ALTER TABLE public.dept_no_pay
OWNER TO postgres;
GRANT ALL ON TABLE public.dept_no_pay TO postgres;
GRANT ALL ON TABLE public.dept_no_pay TO jupitorhr;
-- jupitor
GRANT EXECUTE ON FUNCTION getattendence(s_id numeric, today date) TO jupitor;
GRANT EXECUTE ON FUNCTION getemployee(e_id numeric) TO jupitor;
GRANT EXECUTE ON FUNCTION getemployees1(s_id numeric) TO jupitor;
GRANT EXECUTE ON FUNCTION getleavea(s_id numeric) TO jupitor;
GRANT EXECUTE ON FUNCTION getleavebydate(startd date, endd date) TO jupitor;
GRANT EXECUTE ON FUNCTION getnosupervisoremployees(branch character varying, department character varying, jobtitle character varying) TO jupitor;
GRANT EXECUTE ON FUNCTION getsupervisors(branch character varying, department character varying, jobtitle character varying) TO jupitor;
GRANT EXECUTE ON FUNCTION setaddress(addressname character varying, cityid numeric, postalcode numeric) TO jupitor;
GRANT EXECUTE ON FUNCTION setcity(cityname character varying, countryid numeric) TO jupitor;
GRANT EXECUTE ON FUNCTION setcountry(c character varying) TO jupitor;
GRANT EXECUTE ON PROCEDURE addtosupervisort(employee_ids integer[], val_supervisor_id integer, arraylength integer) TO jupitor;
GRANT EXECUTE ON PROCEDURE updatejupitorbranch(branchname character varying, add integer) TO jupitor;
GRANT EXECUTE ON PROCEDURE updatejupitoremployeestatus(estatusname character varying, du character varying, des character varying) TO jupitor;
GRANT EXECUTE ON PROCEDURE updatejupitorjobs(jobtitle character varying, des character varying, req character varying, prereq character varying) TO jupitor;
GRANT EXECUTE ON PROCEDURE updatejupitorleaves(paygradelevel character varying, an integer, cas integer, mat integer, nopay integer) TO jupitor;
GRANT EXECUTE ON PROCEDURE updatejupitorpaygrade(paygradelevel character varying, des character varying, req character varying) TO jupitor;
GRANT EXECUTE ON FUNCTION changeempcount() TO jupitor;
GRANT EXECUTE ON FUNCTION changeempcount1() TO jupitor;
GRANT EXECUTE ON FUNCTION check_age(birthday date) TO jupitor;
GRANT EXECUTE ON FUNCTION emp_leave() TO jupitor;
GRANT EXECUTE ON FUNCTION emp_stamp() TO jupitor;
GRANT EXECUTE ON FUNCTION restrictedadmin() TO jupitor;
GRANT EXECUTE ON FUNCTION updatesupervisortable() TO jupitor;
GRANT ALL ON SEQUENCE address_address_id_seq TO jupitor;
GRANT ALL ON SEQUENCE city_city_id_seq TO jupitor;
GRANT ALL ON SEQUENCE country_country_id_seq TO jupitor;
GRANT ALL ON SEQUENCE leave_record_leave_id_seq TO jupitor;
GRANT ALL ON SEQUENCE personal_information_employee_id_seq TO jupitor;
GRANT ALL ON TABLE address TO jupitor;
GRANT ALL ON TABLE admin TO jupitor;
GRANT ALL ON TABLE branch TO jupitor;
GRANT ALL ON TABLE city TO jupitor;
GRANT ALL ON TABLE country TO jupitor;
GRANT ALL ON TABLE customattributes TO jupitor;
GRANT ALL ON TABLE department TO jupitor;
GRANT ALL ON TABLE emergency_contact_details TO jupitor;
GRANT ALL ON TABLE employee TO jupitor;
GRANT ALL ON TABLE employee_leave TO jupitor;
GRANT ALL ON TABLE employee_phone_number TO jupitor;
GRANT ALL ON TABLE employee_status TO jupitor;
GRANT ALL ON TABLE job_type TO jupitor;
GRANT ALL ON TABLE leave TO jupitor;
GRANT ALL ON TABLE leave_record TO jupitor;
GRANT ALL ON TABLE pay_grade TO jupitor;
GRANT ALL ON TABLE personal_information TO jupitor;
GRANT ALL ON TABLE personal_information_custom TO jupitor;
GRANT ALL ON TABLE session TO jupitor;
GRANT ALL ON TABLE supervisor TO jupitor;
GRANT ALL ON TABLE employeedata_view TO jupitor;
GRANT ALL ON TABLE full_employee_detail TO jupitor;
-- admin role
drop role if exists admin;
CREATE ROLE admin WITH LOGIN PASSWORD 'passwordAdmin';
Grant select,insert on personal_information to admin;
Grant select,insert on employee to admin;
Grant select,insert,delete on personal_information_custom to admin;
Grant select,insert,delete on customattributes to admin;
Grant select,insert,update on branch to admin;
Grant select,insert,update on address to admin;
Grant select,insert,update on city to admin;
Grant select,insert,update on country to admin;
Grant select,insert,update on job_type to admin;
Grant select,insert,update on pay_grade to admin;
Grant select,insert,update on department to admin;
Grant select,insert,update on employee_status to admin;
Grant select,insert,update on employee_leave to admin;
Grant select,insert,update on employee_phone_number to admin;
Grant select,insert,update on leave to admin;
GRANT ALL ON TABLE admin TO admin;
Grant select on information_schema.columns to admin;
GRANT ALL ON SEQUENCE address_address_id_seq TO admin;
GRANT ALL ON SEQUENCE city_city_id_seq TO admin;
GRANT ALL ON SEQUENCE country_country_id_seq TO admin;
GRANT ALL ON SEQUENCE personal_information_employee_id_seq TO admin;
GRANT SELECT ON TABLE public.address_view TO admin;
GRANT SELECT ON TABLE public.contact_details_view TO admin;
GRANT SELECT ON TABLE public.personal_information_view TO admin;
GRANT EXECUTE ON FUNCTION check_age(birthday date) TO admin;
GRANT EXECUTE ON PROCEDURE updatejupitorleaves(paygradelevel character varying, an integer, cas integer, mat integer, nopay integer) TO admin;
GRANT EXECUTE ON PROCEDURE updatejupitorbranch(branchname character varying, add integer) TO admin;
GRANT EXECUTE ON PROCEDURE updatejupitoremployeestatus(estatusname character varying, du character varying, des character varying) TO admin;
GRANT EXECUTE ON PROCEDURE updatejupitorjobs(jobtitle character varying, des character varying, req character varying, prereq character varying) TO admin;
GRANT EXECUTE ON PROCEDURE updatejupitorpaygrade(paygradelevel character varying, des character varying, req character varying) TO admin;
GRANT EXECUTE ON FUNCTION setaddress(addressname character varying, cityid numeric, postalcode numeric) TO admin;
GRANT EXECUTE ON FUNCTION setcity(cityname character varying, countryid numeric) TO admin;
GRANT EXECUTE ON FUNCTION setcountry(c character varying) TO admin;
ALTER TABLE personal_information_custom
OWNER TO admin;
-- hr role
drop role if exists jupitorhr;
CREATE ROLE jupitorhr WITH LOGIN PASSWORD 'passwordjupitorhr';
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE address TO jupitorhr;
GRANT SELECT, TRIGGER ON TABLE branch TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE city TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE country TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE customattributes TO jupitorhr;
GRANT SELECT, TRIGGER ON TABLE department TO jupitorhr;
GRANT ALL ON TABLE public.department TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE emergency_contact_details TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE employee TO jupitorhr;
GRANT UPDATE, INSERT, SELECT, TRIGGER ON TABLE employee_phone_number TO jupitorhr;
GRANT SELECT, TRIGGER ON TABLE employee_status TO jupitorhr;
GRANT SELECT, TRIGGER ON TABLE job_type TO jupitorhr;
GRANT SELECT, TRIGGER ON TABLE leave TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE leave_record TO jupitorhr;
GRANT SELECT, TRIGGER ON TABLE pay_grade TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE personal_information TO jupitorhr;
GRANT ALL ON TABLE session TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE supervisor TO jupitorhr;
GRANT ALL ON SEQUENCE address_address_id_seq TO jupitorhr;
GRANT ALL ON SEQUENCE city_city_id_seq TO jupitorhr;
GRANT ALL ON SEQUENCE country_country_id_seq TO jupitorhr;
GRANT ALL ON SEQUENCE leave_record_leave_id_seq TO jupitorhr;
GRANT ALL ON SEQUENCE personal_information_employee_id_seq TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE personal_information_custom TO jupitorhr;
GRANT INSERT, SELECT, UPDATE, TRIGGER ON TABLE full_employee_detail TO jupitorhr;
GRANT EXECUTE ON FUNCTION changeempcount() TO jupitorhr;
GRANT EXECUTE ON FUNCTION changeempcount1() TO jupitorhr;