-
Notifications
You must be signed in to change notification settings - Fork 1
/
auxiliary_functions.sql
1265 lines (1018 loc) · 65 KB
/
auxiliary_functions.sql
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
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- ####################################### FUNCTIONS AUXILIARES ######################################## --
-- ################################################################################################################### --
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
--*****************************************************************************************************************************************************************--
----------------------------*************************** << FUNCTIONS AUXILIARES DE FUNCTIONS PRINCIPAIS >> ****************************----------------------------
--*****************************************************************************************************************************************************************--
--|-------------------------------------------------------------------------------------------------|--
--|--- ############################### RETORNAR_TABELA_DO_USUARIO ############################## ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SELECIONA O NOME DA TABELA A QUAL O USUÁRIO LOGADO PERTENCE. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [TEXT] TEXTO QUE REPRESENTA A TABELA A QUAL O USUÁRIO LOGADO PERTENCE ('ALUNO', |--
--| 'PROFESSOR' OU 'SUPER USUARIO'). |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION RETORNAR_TABELA_DO_USUARIO()
RETURNS VARCHAR(13)
AS $$
BEGIN
IF CURRENT_USER IN (SELECT EMAIL FROM ALUNO) THEN
RETURN 'ALUNO';
ELSIF CURRENT_USER IN (SELECT EMAIL FROM PROFESSOR) THEN
RETURN 'PROFESSOR';
ELSE
RETURN 'SUPER USUARIO';
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ############################### RETORNAR_CODIGO_DO_USUARIO ############################## ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SELECIONA O CÓDIGO DO USUÁRIO LOGADO, CASO ELE SEJA 'ALUNO' OU 'PROFESSOR'. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| CASOS DE EXCEÇÕES: 'SUPER USUARIO' EXECUTANDO A FUNÇÃO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [INT] CÓDIGO DO USUÁRIO LOGADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION RETORNAR_CODIGO_DO_USUARIO()
RETURNS INT
AS $$
DECLARE
CODIGO INT;
TABELA TEXT := RETORNAR_TABELA_DO_USUARIO();
BEGIN
IF TABELA = 'ALUNO' THEN
SELECT COD_ALUNO INTO CODIGO FROM ALUNO WHERE EMAIL = CURRENT_USER;
RETURN CODIGO;
ELSIF TABELA = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO CODIGO FROM PROFESSOR WHERE EMAIL = CURRENT_USER;
RETURN CODIGO;
ELSE
RAISE EXCEPTION 'É OBRIGATÓRIO ESTAR LOGADO COMO ALUNO OU COMO PROFESSOR PARA EXECUTAR ESSA FUNÇÃO!';
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ####################### VERIFICAR_PERMISSAO_DA_TABELA_DO_USUARIO ######################## ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| APLICA CASOS DE EXCEÇÃO CASO O NOME DA TABELA DO USUÁRIO LOGADO NÃO SEJA O MESMO QUE SE DESEJA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [TEXT] NOME DA TABELA QUE SE REQUER QUE O USUÁRIO LOGADO PERTENÇA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| CASOS DE EXCEÇÕES: 'SUPER USUARIO' EXECUTANDO A FUNÇÃO; NOME DA TABELA DO USUÁRIO LOGADO |--
--| DIFERENTE DO NOME DA TABELA QUE SE REQUER QUE O USUÁRIO LOGADO PERTENÇA; A TABELA QUE SE REQUER |--
--| QUE O USUÁRIO LOGADO PERTENÇA SER DIFERENTE DE 'ALUNO' OU PROFESSOR. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_PERMISSAO_DA_TABELA_DO_USUARIO(TABELA_DO_USUARIO_REQUERIDA TEXT)
RETURNS VOID
AS $$
DECLARE
TABELA_DO_USUARIO VARCHAR(13) := RETORNAR_TABELA_DO_USUARIO();
BEGIN
IF TABELA_DO_USUARIO_REQUERIDA = 'ALUNO_OU_PROFESSOR' THEN
IF TABELA_DO_USUARIO = 'SUPER USUARIO' THEN
RAISE EXCEPTION 'É OBRIGATÓRIO ESTAR LOGADO COMO ALUNO OU COMO PROFESSOR PARA EXECUTAR ESSA FUNÇÃO!';
END IF;
ELSIF TABELA_DO_USUARIO_REQUERIDA != TABELA_DO_USUARIO THEN
IF TABELA_DO_USUARIO_REQUERIDA = 'ALUNO' THEN
RAISE EXCEPTION 'É OBRIGATÓRIO ESTAR LOGADO COMO ALUNO PARA EXECUTAR ESSA FUNÇÃO!';
ELSIF TABELA_DO_USUARIO_REQUERIDA = 'PROFESSOR' THEN
RAISE EXCEPTION 'É OBRIGATÓRIO ESTAR LOGADO COMO PROFESSOR PARA EXECUTAR ESSA FUNÇÃO!';
ELSE
RAISE EXCEPTION 'A TABELA_DO_USUARIO_REQUERIDA SÓ PODE SER ALUNO, PROFESSOR OU ALUNO_OU_PROFESSOR!';
END IF;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ############################# CALCULAR_DATA_PAGAMENTO_ATUAL ############################# ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| CALCULA A DATA DE PAGAMENTO MAIS RECENTE (OS PAGAMENTOS ACONTECEM TODO DIA 01 DO MÊS). |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [DATE] DATA DE PAGAMENTO MAIS RECENTE. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION CALCULAR_DATA_PAGAMENTO_ATUAL()
RETURNS DATE
AS $$
DECLARE
MES_DATA_PAGAMENTO_ATUAL INT;
ANO_DATA_PAGAMENTO_ATUAL INT;
DATA_PAGAMENTO_ATUAL DATE;
BEGIN
MES_DATA_PAGAMENTO_ATUAL := EXTRACT(MONTH FROM DATE(NOW()));
ANO_DATA_PAGAMENTO_ATUAL := EXTRACT(YEAR FROM DATE(NOW()));
DATA_PAGAMENTO_ATUAL := CAST(CAST(ANO_DATA_PAGAMENTO_ATUAL AS VARCHAR(4)) || '-' || CAST(MES_DATA_PAGAMENTO_ATUAL AS VARCHAR(2)) || '-01' AS DATE);
RETURN DATA_PAGAMENTO_ATUAL;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ############################## VERIFICAR_SE_REGISTRO_EXISTE ############################# ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA A EXISTÊNCIA DE UM REGISTRO EM UMA TABELA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO REGISTRO QUE DEVE EXISTIR EM UMA TABELA; [TEXT] NOME DA TABELA EM QUE |--
--| O REGISTRO DEVE EXISTIR. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE A EXISTÊNCIA DO REGISTRO NA TABELA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_SE_REGISTRO_EXISTE(COD_ANALISADO INT, TABELA TEXT)
RETURNS BOOLEAN
AS $$
DECLARE
REGISTRO RECORD;
BEGIN
IF TABELA = 'ALUNO' THEN
SELECT * INTO REGISTRO FROM ALUNO WHERE COD_ALUNO = COD_ANALISADO;
IF REGISTRO.COD_ALUNO IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF TABELA = 'PROFESSOR' THEN
SELECT * INTO REGISTRO FROM PROFESSOR WHERE COD_PROFESSOR = COD_ANALISADO;
IF REGISTRO.COD_PROFESSOR IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF TABELA = 'CURSO' THEN
SELECT * INTO REGISTRO FROM CURSO WHERE COD_CURSO = COD_ANALISADO;
IF REGISTRO.COD_CURSO IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF TABELA = 'MODULO' THEN
SELECT * INTO REGISTRO FROM MODULO WHERE COD_MODULO = COD_ANALISADO;
IF REGISTRO.COD_MODULO IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF TABELA = 'DISCIPLINA' THEN
SELECT * INTO REGISTRO FROM DISCIPLINA WHERE COD_DISCIPLINA = COD_ANALISADO;
IF REGISTRO.COD_DISCIPLINA IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF TABELA = 'VIDEO_AULA' THEN
SELECT * INTO REGISTRO FROM VIDEO_AULA WHERE COD_VIDEO_AULA = COD_ANALISADO;
IF REGISTRO.COD_VIDEO_AULA IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF TABELA = 'QUESTAO' THEN
SELECT * INTO REGISTRO FROM QUESTAO WHERE COD_QUESTAO = COD_ANALISADO;
IF REGISTRO.COD_QUESTAO IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF TABELA = 'QUESTIONARIO' THEN
SELECT * INTO REGISTRO FROM QUESTIONARIO WHERE COD_QUESTIONARIO = COD_ANALISADO;
IF REGISTRO.COD_QUESTIONARIO IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF TABELA = 'QUESTAO_ALUNO' THEN
SELECT * INTO REGISTRO FROM QUESTAO_ALUNO WHERE COD_QUESTAO_ALUNO = COD_ANALISADO;
IF REGISTRO.COD_QUESTAO_ALUNO IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END IF;
RETURN NULL;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ############################# VERIFICAR_PERMISSAO_DO_USUARIO ############################ ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA A POSSIBILIDADE DO USUÁRIO LOGADO MANIPULAR O REGISTRO DA LINHA DA TABELA QUE POSSUI O |--
--| CÓDIGO DA TABELA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DA TABELA QUE SE REQUER QUE O USUÁRIO LOGADO POSSUA PERMISSÃO; [TEXT] |--
--| NOME DA TABELA QUE SE REQUER QUE O USUÁRIO LOGADO POSSUA PERMISSÃO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| CASOS DE EXCEÇÕES: 'SUPER USUARIO' EXECUTANDO A FUNÇÃO; CÓDIGO DA TABELA QUE SE REQUER QUE O |--
--| USUÁRIO LOGADO POSSUA PERMISSÃO INVÁLIDO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE A POSSIBILIDADE DO USUÁRIO LOGADO MANIPULAR O REGISTRO DA LINHA |--
--| DA TABELA QUE POSSUI O CÓDIGO DA TABELA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_PERMISSAO_DO_USUARIO(CODIGO_TABELA_VERIFICADA INT, TABELA TEXT)
RETURNS BOOLEAN
AS $$
DECLARE
TABELA_DO_USUARIO VARCHAR(13);
CODIGO_USUARIO_VERIFICADO INT;
EMAIL_USUARIO_VERIFICADO TEXT;
BEGIN
TABELA_DO_USUARIO := RETORNAR_TABELA_DO_USUARIO();
IF TABELA_DO_USUARIO = 'SUPER USUARIO' THEN
RAISE EXCEPTION 'ESSA FUNÇÃO NÃO DEVE SER EXECUTADA POR UM SUPER USUARIO!';
ELSIF TABELA = 'CURSO' THEN
IF VERIFICAR_SE_REGISTRO_EXISTE(CODIGO_TABELA_VERIFICADA, 'CURSO') IS FALSE THEN
RAISE EXCEPTION 'ESSE CURSO NÃO EXISTE, INSIRA UM COD_CURSO VÁLIDO!';
ELSIF TABELA_DO_USUARIO = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO CODIGO_USUARIO_VERIFICADO FROM CURSO WHERE COD_CURSO = CODIGO_TABELA_VERIFICADA;
END IF;
ELSIF TABELA = 'MODULO' THEN
IF VERIFICAR_SE_REGISTRO_EXISTE(CODIGO_TABELA_VERIFICADA, 'MODULO') IS FALSE THEN
RAISE EXCEPTION 'ESSE MÓDULO NÃO EXISTE, INSIRA UM COD_MODULO VÁLIDO!';
ELSIF TABELA_DO_USUARIO = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO CODIGO_USUARIO_VERIFICADO FROM CURSO
WHERE COD_CURSO = (SELECT COD_CURSO FROM MODULO WHERE COD_MODULO = CODIGO_TABELA_VERIFICADA);
END IF;
ELSIF TABELA = 'DISCIPLINA' THEN
IF VERIFICAR_SE_REGISTRO_EXISTE(CODIGO_TABELA_VERIFICADA, 'DISCIPLINA') IS FALSE THEN
RAISE EXCEPTION 'ESSA DISCIPLINA NÃO EXISTE, INSIRA UM COD_DISCIPLINA VÁLIDO!';
ELSIF TABELA_DO_USUARIO = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO CODIGO_USUARIO_VERIFICADO FROM CURSO
WHERE COD_CURSO = (SELECT COD_CURSO FROM MODULO WHERE COD_MODULO =
(SELECT COD_MODULO FROM DISCIPLINA WHERE COD_DISCIPLINA = CODIGO_TABELA_VERIFICADA));
END IF;
ELSIF TABELA = 'VIDEO_AULA' THEN
IF VERIFICAR_SE_REGISTRO_EXISTE(CODIGO_TABELA_VERIFICADA, 'VIDEO_AULA') IS FALSE THEN
RAISE EXCEPTION 'ESSA VIDEO_AULA NÃO EXISTE, INSIRA UM COD_VIDEO_AULA VÁLIDO!';
ELSIF TABELA_DO_USUARIO = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO CODIGO_USUARIO_VERIFICADO FROM CURSO
WHERE COD_CURSO = (SELECT COD_CURSO FROM MODULO WHERE COD_MODULO =
(SELECT COD_MODULO FROM DISCIPLINA WHERE COD_DISCIPLINA =
(SELECT COD_DISCIPLINA FROM VIDEO_AULA WHERE COD_VIDEO_AULA = CODIGO_TABELA_VERIFICADA)));
END IF;
ELSIF TABELA = 'QUESTAO' THEN
IF VERIFICAR_SE_REGISTRO_EXISTE(CODIGO_TABELA_VERIFICADA, 'QUESTAO') IS FALSE THEN
RAISE EXCEPTION 'ESSA QUESTAO NÃO EXISTE, INSIRA UM COD_QUESTAO VÁLIDO!';
ELSIF TABELA_DO_USUARIO = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO CODIGO_USUARIO_VERIFICADO FROM CURSO
WHERE COD_CURSO = (SELECT COD_CURSO FROM MODULO WHERE COD_MODULO =
(SELECT COD_MODULO FROM DISCIPLINA WHERE COD_DISCIPLINA =
(SELECT COD_DISCIPLINA FROM QUESTAO WHERE COD_QUESTAO = CODIGO_TABELA_VERIFICADA)));
END IF;
ELSIF TABELA = 'QUESTAO_ALUNO' THEN
IF VERIFICAR_SE_REGISTRO_EXISTE(CODIGO_TABELA_VERIFICADA, 'QUESTAO_ALUNO') IS FALSE THEN
RAISE EXCEPTION 'ESSA QUESTAO_ALUNO NÃO EXISTE, INSIRA UM COD_QUESTAO_ALUNO VÁLIDO!';
ELSIF TABELA_DO_USUARIO = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO CODIGO_USUARIO_VERIFICADO FROM CURSO
WHERE COD_CURSO = (SELECT COD_CURSO FROM MODULO WHERE COD_MODULO =
(SELECT COD_MODULO FROM DISCIPLINA WHERE COD_DISCIPLINA =
(SELECT COD_DISCIPLINA FROM QUESTAO WHERE COD_QUESTAO =
(SELECT COD_QUESTAO FROM QUESTAO_ALUNO WHERE COD_QUESTAO_ALUNO = CODIGO_TABELA_VERIFICADA))));
END IF;
ELSIF TABELA = 'QUESTIONARIO' THEN
IF VERIFICAR_SE_REGISTRO_EXISTE(CODIGO_TABELA_VERIFICADA, 'QUESTIONARIO') IS FALSE THEN
RAISE EXCEPTION 'ESSE QUESTIONARIO NÃO EXISTE, INSIRA UM COD_QUESTIONARIO VÁLIDO!';
ELSIF TABELA_DO_USUARIO = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO CODIGO_USUARIO_VERIFICADO FROM CURSO
WHERE COD_CURSO = (SELECT COD_CURSO FROM MODULO WHERE COD_MODULO =
(SELECT COD_MODULO FROM DISCIPLINA WHERE COD_DISCIPLINA =
(SELECT COD_DISCIPLINA FROM QUESTIONARIO WHERE COD_QUESTIONARIO = CODIGO_TABELA_VERIFICADA)));
END IF;
ELSE
RAISE EXCEPTION 'TABELA INVÁLIDA!';
END IF;
IF TABELA_DO_USUARIO = 'ALUNO' THEN
SELECT EMAIL INTO EMAIL_USUARIO_VERIFICADO FROM ALUNO WHERE COD_ALUNO = CODIGO_USUARIO_VERIFICADO;
ELSE
SELECT EMAIL INTO EMAIL_USUARIO_VERIFICADO FROM PROFESSOR WHERE COD_PROFESSOR = CODIGO_USUARIO_VERIFICADO;
END IF;
IF EMAIL_USUARIO_VERIFICADO = CURRENT_USER THEN
RETURN TRUE;
END IF;
RETURN FALSE;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- #################################### CURSO_DISPONIVEL ################################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE O CURSO ESTÁ PUBLICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO O CURSO QUE SE DESEJA VERIFICAR SE ESTÁ PUBLICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE O CURSO ESTAR PUBLICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION CURSO_DISPONIVEL(COD_CURSO_ANALISADO INT)
RETURNS BOOLEAN
AS $$
DECLARE
CURSO_ANALISADO_PUBLICADO BOOLEAN;
BEGIN
SELECT PUBLICADO INTO CURSO_ANALISADO_PUBLICADO FROM CURSO WHERE COD_CURSO = COD_CURSO_ANALISADO;
RETURN CURSO_ANALISADO_PUBLICADO;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ############################# VERIFICAR_VINCULO_ALUNO_CURSO ############################# ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE O ALUNO ESTÁ VÍNCULADO AO CURSO, POR MEIO DE UM ALUNO_CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO ALUNO QUE SE DESEJA VERIFICAR SE ESTÁ VINCULADO; [INT] CÓDIGO DA |--
--| TABELA QUE SE DESEJA VERIFICAR SE ESTÁ VINCULADA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE O ALUNO ESTAR VÍNCULADO AO CURSO, POR MEIO DE UM ALUNO_CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_VINCULO_ALUNO_CURSO(COD_ALUNO_ANALISADO INT, COD_CURSO_ANALISADO INT)
RETURNS BOOLEAN
AS $$
DECLARE
ALUNO_CURSO_ANALISADO RECORD;
BEGIN
SELECT COD_ALUNO_CURSO INTO ALUNO_CURSO_ANALISADO FROM ALUNO_CURSO WHERE COD_ALUNO_ANALISADO = COD_ALUNO AND COD_CURSO_ANALISADO = COD_CURSO;
IF ALUNO_CURSO_ANALISADO IS NULL THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ################################ PERIODO_CURSANDO_VALIDO ################################ ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE O PERÍODO EM QUE O ALUNO ESTÁ CURSANDO AINDA NÃO ULTRAPASSOU A DURAÇÃO DO CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO ALUNO QUE SE DESEJA VERIFICAR SE O PERÍODO CURSANDO É VÁLIDO; [INT] |--
--| CÓDIGO DO CURSO EM QUE ESSA VERIFICAÇÃO SERÁ DIRECIONADA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE O PERÍODO EM QUE O ALUNO ESTÁ CURSANDO AINDA NÃO TER |--
--| ULTRAPASSADO A DURAÇÃO DO CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION PERIODO_CURSANDO_VALIDO(COD_ALUNO_ANALISADO INT, COD_CURSO_ANALISADO INT)
RETURNS BOOLEAN
AS $$
DECLARE
DATA_COMPRA_ALUNO_CURSO_ANALISADA DATE;
DURACAO_CURSO_ANALISADA INT;
BEGIN
SELECT DATA_COMPRA INTO DATA_COMPRA_ALUNO_CURSO_ANALISADA FROM ALUNO_CURSO WHERE COD_ALUNO_ANALISADO = COD_ALUNO AND COD_CURSO_ANALISADO = COD_CURSO;
SELECT DURACAO INTO DURACAO_CURSO_ANALISADA FROM CURSO WHERE COD_CURSO_ANALISADO = COD_CURSO;
IF DATA_COMPRA_ALUNO_CURSO_ANALISADA + DURACAO_CURSO_ANALISADA >= DATE(NOW()) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ################################## ALUNO_AINDA_CURSANDO ################################# ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE O ALUNO AINDA ESTÁ CURSANDO O CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO ALUNO QUE SE DESEJA VERIFICAR SE AINDA ESTÁ CURSANDO; [INT] CÓDIGO DO |--
--| CURSO EM QUE ESSA VERIFICAÇÃO SERÁ DIRECIONADA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE O ALUNO AINDA ESTÁ CURSANDO O CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION ALUNO_AINDA_CURSANDO(COD_ALUNO_ANALISADO INT, COD_CURSO_ANALISADO INT)
RETURNS BOOLEAN
AS $$
BEGIN
IF VERIFICAR_VINCULO_ALUNO_CURSO(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) IS TRUE
AND PERIODO_CURSANDO_VALIDO(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) IS TRUE THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- #################################### ALUNO_JA_CURSOU #################################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE O ALUNO JÁ CURSOU (E NÃO CURSA MAIS) O CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO ALUNO QUE SE DESEJA VERIFICAR SE JÁ CURSOU; [INT] CÓDIGO DO CURSO EM |--
--| QUE ESSA VERIFICAÇÃO SERÁ DIRECIONADA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE O ALUNO JÁ TER CURSADO (E NÃO CURSAR MAIS) O CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION ALUNO_JA_CURSOU(COD_ALUNO_ANALISADO INT, COD_CURSO_ANALISADO INT)
RETURNS BOOLEAN
AS $$
BEGIN
IF VERIFICAR_VINCULO_ALUNO_CURSO(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) = TRUE
AND PERIODO_CURSANDO_VALIDO(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) != TRUE THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- #################################### SELECIONAR_PRECO ################################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SELECIONA O PREÇO DO CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO CURSO QUE SE DESEJA SELECIONAR O PREÇO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE O ALUNO JÁ TER CURSADO (E NÃO CURSAR MAIS) O CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION SELECIONAR_PRECO(COD_CURSO_ANALISADO INT)
RETURNS FLOAT
AS $$
DECLARE
PRECO_SELECIONADO FLOAT;
BEGIN
SELECT PRECO INTO PRECO_SELECIONADO FROM CURSO WHERE COD_CURSO_ANALISADO = COD_CURSO;
RETURN PRECO_SELECIONADO;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ################################### ALUNO_JA_ASSISTIU ################################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE O ALUNO JÁ ASSISTIU À VIDEOAULA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO CURSO QUE SE DESEJA VERIFICAR; [INT] CÓDIGO DA VIDEOAULA EM QUE ESSA |--
--| VERIFICAÇÃO SERÁ DIRECIONADA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE O ALUNO JÁ TER ASSISTIDO À VIDEOAULA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION ALUNO_JA_ASSISTIU(CODIGO_ALUNO INT, CODIGO_VIDEO_AULA INT)
RETURNS BOOLEAN
AS $$
DECLARE
REGISTRO_VIDEO_AULA RECORD;
BEGIN
FOR REGISTRO_VIDEO_AULA IN (SELECT * FROM ALUNO_VIDEO_ASSISTIDO) LOOP
IF REGISTRO_VIDEO_AULA.COD_VIDEO_AULA = CODIGO_VIDEO_AULA AND REGISTRO_VIDEO_AULA.COD_ALUNO = CODIGO_ALUNO THEN
RETURN TRUE;
END IF;
END LOOP;
RETURN FALSE;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ######################## VERIFICAR_VINCULO_QUESTAO_QUESTIONARIO ######################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE A QUESTÃO ESTÁ VÍNCULADA AO QUESTIONÁRIO, POR MEIO DE UM QUESTAO_QUESTIONARIO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DA QUESTÃO QUE SE DESEJA VERIFICAR SE ESTÁ VINCULADA; [INT] CÓDIGO DO |--
--| QUESTIONÁRIO QUE SE DESEJA VERIFICAR SE ESTÁ VINCULADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE A QUESTÃO ESTAR VÍNCULADA AO QUESTIONÁRIO, POR MEIO DE UM |--
--| QUESTAO_QUESTIONARIO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_VINCULO_QUESTAO_QUESTIONARIO(COD_QUESTIONARIO_ANALISADO INT, COD_QUESTAO_ANALISADA INT)
RETURNS BOOLEAN
AS $$
DECLARE
QUESTAO_QUESTIONARIO_ANALISADO RECORD;
BEGIN
SELECT * INTO QUESTAO_QUESTIONARIO_ANALISADO FROM QUESTAO_QUESTIONARIO WHERE COD_QUESTIONARIO = COD_QUESTIONARIO_ANALISADO
AND COD_QUESTAO = COD_QUESTAO_ANALISADA;
IF QUESTAO_QUESTIONARIO_ANALISADO IS NULL THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ############################ VERIFICAR_VINCULO_QUESTAO_ALUNO ############################ ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE A QUESTÃO ESTÁ VÍNCULADA AO ALUNO, POR MEIO DE UM QUESTAO_ALUNO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO ALUNO QUE SE DESEJA VERIFICAR SE ESTÁ VINCULADA; [INT] CÓDIGO DA |--
--| QUESTÃO QUE SE DESEJA VERIFICAR SE ESTÁ VINCULADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOLEANO SOBRE A QUESTÃO ESTAR VÍNCULADA AO ALUNO, POR MEIO DE UM |--
--| QUESTAO_ALUNO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_VINCULO_QUESTAO_ALUNO(COD_ALUNO_ANALISADO INT, COD_QUESTAO_ANALISADA INT)
RETURNS BOOLEAN
AS $$
DECLARE
ALUNO_QUESTAO_ANALISADO RECORD;
BEGIN
SELECT * INTO ALUNO_QUESTAO_ANALISADO FROM QUESTAO_ALUNO WHERE COD_ALUNO = COD_ALUNO_ANALISADO AND COD_QUESTAO = COD_QUESTAO_ANALISADA;
IF ALUNO_QUESTAO_ANALISADO IS NULL THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
END
$$ LANGUAGE plpgsql;
--*****************************************************************************************************************************************************************--
----------------------------*************************** << FUNCTIONS AUXILIARES DE FUNCTIONS DE TRIGGERS >> ***************************----------------------------
--*****************************************************************************************************************************************************************--
--|-------------------------------------------------------------------------------------------------|--
--|--- ##################################### RETORNA_IDADE ##################################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SELECIONA A IDADE BASEADA EM UMA DATA DE NASCIMENTO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [DATE] DATA DE NASCIMENTO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [INT] IDADE. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
/* RETORNA IDADE */
CREATE OR REPLACE FUNCTION RETORNA_IDADE(DATA_NASCIMENTO DATE)
RETURNS INT
AS $$
BEGIN
RETURN EXTRACT(YEAR FROM AGE(DATA_NASCIMENTO));
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ########################## VERIFICAR_CPF_USUARIO_JA_REGISTRADO ########################## ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE EXISTE ALGUM USUÁRIO DA TABELA ESPECIFICADA COM O CPF ESPECIFICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [TEXT] CPF DO USUÁRIO; [TEXT] TABELA DO USUÁRIO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOOLEANO SOBRE EXISTIR ALGUM USUÁRIO DA TABELA ESPECIFICADA COM O CPF |--
--| ESPECIFICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_CPF_USUARIO_JA_REGISTRADO(CPF_USUARIO TEXT, TABELA TEXT)
RETURNS BOOLEAN
AS $$
DECLARE
USUARIO_COM_CPF RECORD;
BEGIN
IF TABELA = 'ALUNO' THEN
SELECT COD_ALUNO INTO USUARIO_COM_CPF FROM ALUNO WHERE CPF = CPF_USUARIO;
ELSIF TABELA = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO USUARIO_COM_CPF FROM PROFESSOR WHERE CPF = CPF_USUARIO;
ELSE
RETURN NULL;
END IF;
IF USUARIO_COM_CPF IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ######################### VERIFICAR_EMAIL_USUARIO_JA_REGISTRADO ######################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE EXISTE ALGUM USUÁRIO DA TABELA ESPECIFICADA COM O EMAIL ESPECIFICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [TEXT] EMAIL DO USUÁRIO; [TEXT] TABELA DO USUÁRIO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOOLEANO SOBRE EXISTIR ALGUM USUÁRIO DA TABELA ESPECIFICADA COM O EMAIL |--
--| ESPECIFICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_EMAIL_USUARIO_JA_REGISTRADO(EMAIL_USUARIO TEXT, TABELA TEXT)
RETURNS BOOLEAN
AS $$
DECLARE
USUARIO_COM_EMAIL RECORD;
BEGIN
IF TABELA = 'ALUNO' THEN
SELECT COD_ALUNO INTO USUARIO_COM_EMAIL FROM ALUNO WHERE EMAIL = EMAIL_USUARIO;
ELSIF TABELA = 'PROFESSOR' THEN
SELECT COD_PROFESSOR INTO USUARIO_COM_EMAIL FROM PROFESSOR WHERE EMAIL = EMAIL_USUARIO;
ELSE
RETURN NULL;
END IF;
IF USUARIO_COM_EMAIL IS NOT NULL THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ########################## VERIFICAR_EXISTENCIA_ALUNOS_CURSANDO ######################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE EXISTE ALGUM ALUNO CURSANDO O CURSO ESPECIFICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOOLEANO SOBRE EXISTIR ALGUM ALUNO CURSANDO O CURSO ESPECIFICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_EXISTENCIA_ALUNOS_CURSANDO(CODIGO_CURSO INT)
RETURNS BOOLEAN
AS $$
DECLARE
REGISTRO_ALUNO RECORD;
BEGIN
FOR REGISTRO_ALUNO IN (SELECT * FROM ALUNO WHERE COD_ALUNO IN (SELECT COD_ALUNO FROM ALUNO_CURSO WHERE COD_CURSO = CODIGO_CURSO)) LOOP
IF PERIODO_CURSANDO_VALIDO(REGISTRO_ALUNO.COD_ALUNO, CODIGO_CURSO) IS TRUE THEN
RETURN TRUE;
END IF;
END LOOP;
RETURN FALSE;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ############################## INCREMENTAR_NUMERO_MODULOS ############################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| APLICA O INCREMENTO ESPECIFICADO NO NÚMERO DE MÓDULOS DO CURSO ESPECIFICADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO CURSO; [INT] INCREMENTO A SER APLICADO NO NÚMERO DE MÓDULOS DO CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION INCREMENTAR_NUMERO_MODULOS(CODIGO_CURSO INT, INCREMENTO INT)
RETURNS VOID
AS $$
BEGIN
UPDATE CURSO SET NUMERO_MODULOS = NUMERO_MODULOS + INCREMENTO WHERE COD_CURSO = CODIGO_CURSO;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ######################### VERIFICAR_SE_ALTEROU_APENAS_PUBLICADO ######################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE APENAS O PUBLICADO DO CURSO PODE TER SIDO ALTERADO EM UMA ATUALIZAÇÃO DA TABELA |--
--| CURSO, SENDO ANALISADOS TODOS OS ATRIBUTOS DE DEPOIS E DE DEPOIS DA ATUALIZAÇÃO DO CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO CURSO ANTES DA ATUALIZAÇÃO; [INT] CÓDIGO DO CURSO DEPOIS DA |--
--| ATUALIZAÇÃO; [TEXT] NOME DO CURSO ANTES DA ATUALIZAÇÃO; [TEXT] NOME DO CURSO DEPOIS DA |--
--| ATUALIZAÇÃO; [TEXT] DESCRIÇÃO DO CURSO ANTES DA ATUALIZAÇÃO; [TEXT] DESCRIÇÃO DO CURSO DEPOIS |--
--| DA ATUALIZAÇÃO; [INT] DURAÇÃO DO CURSO ANTES DA ATUALIZAÇÃO; [INT] DURAÇÃO DO CURSO DEPOIS DA |--
--| ATUALIZAÇÃO; [FLOAT] PREÇO DO CURSO ANTES DA ATUALIZAÇÃO; [FLOAT] PREÇO DO CURSO DEPOIS DA |--
--| ATUALIZAÇÃO; [INT] NÚMERO DE MÓDULOS DO CURSO ANTES DA ATUALIZAÇÃO; [INT] NÚMERO DE MÓDULOS DO |--
--| CURSO DEPOIS DA ATUALIZAÇÃO; [FLOAT] PREÇO DO CURSO ANTES DA ATUALIZAÇÃO; [FLOAT] PREÇO DO |--
--| CURSO DEPOIS DA ATUALIZAÇÃO; [BOOLEAN] DISPONIBILIDADE DO CURSO ANTES DA ATUALIZAÇÃO; [BOOLEAN] |--
--| DISPONIBILIDADE DO CURSO DEPOIS DA ATUALIZAÇÃO; [INT] CÓDIGO DO PROFESSOR DO CURSO ANTES DA |--
--| ATUALIZAÇÃO; [INT] CÓDIGO DO PROFESSOR DO CURSO DEPOIS DA ATUALIZAÇÃO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOOLEANO SOBRE APENAS O PUBLICADO DO CURSO PODER TER SIDO ALTERADO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_SE_ALTEROU_APENAS_PUBLICADO(OLD_COD_CURSO INT, NEW_COD_CURSO INT,
OLD_NOME TEXT, NEW_NOME TEXT,
OLD_DESCRICAO TEXT, NEW_DESCRICAO TEXT,
OLD_DURACAO INT, NEW_DURACAO INT,
OLD_PRECO FLOAT, NEW_PRECO FLOAT,
OLD_NUMERO_MODULOS INT, NEW_NUMERO_MODULOS INT,
OLD_DISPONIBILIDADE BOOLEAN, NEW_DISPONIBILIDADE BOOLEAN,
OLD_COD_PROFESSOR INT, NEW_COD_PROFESSOR INT)
RETURNS BOOLEAN
AS $$
BEGIN
IF (OLD_COD_CURSO != NEW_COD_CURSO OR
OLD_NOME != NEW_NOME OR
OLD_DESCRICAO != NEW_DESCRICAO OR
OLD_DURACAO != NEW_DURACAO OR
OLD_PRECO != NEW_PRECO OR
OLD_NUMERO_MODULOS != NEW_NUMERO_MODULOS OR
OLD_DISPONIBILIDADE != NEW_DISPONIBILIDADE OR
OLD_COD_PROFESSOR != NEW_COD_PROFESSOR) IS TRUE THEN
RETURN FALSE;
END IF;
RETURN TRUE;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ##################### VERIFICAR_POSSIBILIDADE_DELETE_UPDATE_NO_CURSO #################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| APLICA CASOS DE EXCEÇÃO CASO OCORRER ALGUMA ALTERAÇÃO DENTRO DE UM CURSO COM ELE ESTANDO |--
--| PUBLICADO OU COM ALUNOS QUE AINDA ESTÃO CURSANDO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| CASOS DE EXCEÇÕES: CURSO PUBLICADO; EXISTÊNCIA DE ALUNOS CURSANDO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VERIFICAR_POSSIBILIDADE_DELETE_UPDATE_NO_CURSO(CODIGO_CURSO INT)
RETURNS VOID
AS $$
BEGIN
IF (SELECT PUBLICADO FROM CURSO WHERE COD_CURSO = CODIGO_CURSO) IS TRUE THEN
RAISE EXCEPTION 'NÃO É POSSÍVEL ADICIONAR, ALTERAR OU REMOVER NADA QUE ESTEJA EM UM CURSO JÁ PUBLICADO';
ELSIF VERIFICAR_EXISTENCIA_ALUNOS_CURSANDO(CODIGO_CURSO) IS TRUE THEN
RAISE EXCEPTION 'NÃO É POSSÍVEL ADICIONAR, ALTERAR OU REMOVER NADA QUE ESTEJA EM UM CURSO ONDE AINDA HÁ ALUNOS CURSANDO!';
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ################################ CALCULAR_DURACAO_CURSO ################################# ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| CÁLCULA A DURAÇÃO DO CURSO, EM DIAS, BASEADO NO DOBRO DO TEMPO DAS VIDEOAULAS (CONSIDERA-SE QUE |--
--| UM ALUNO ASSISTE A MESMA VIDEOAULAS DUAS VEZES AO LONGO DO CURSO) E NO NÚMERO DE QUESTÕES |--
--| (CONSIDERA-SE QUE O ALUNO RESPONDE A CADA QUESTÃO APENAS UMA VEZ E DEMORA 6 MINUTOS PARA SER |--
--| RESPONDIDA), ISSO TUDO CONSIDERANDO QUE O ALUNO DEDICA NO MÍNIMO 1 HORA DE ESTUDO POR DIA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [INT] DURAÇÃO DO CURSO, EM DIAS. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION CALCULAR_DURACAO_CURSO(CODIGO_CURSO INT)
RETURNS INT
AS $$
DECLARE
REGISTRO_DISCIPLINA_DO_CURSO RECORD;
REGISTRO_VIDEOAULA_DO_CURSO RECORD;
REGISTRO_QUESTAO_DO_CURSO RECORD;
QTD_TEMPO_VIDEOS_DO_CURSO_TOTAL INT := 0;
NUM_QUESTOES_DO_CURSO_TOTAL INT := 0;
DURACAO_CALCULADA INT;
BEGIN
FOR REGISTRO_DISCIPLINA_DO_CURSO IN (SELECT * FROM DISCIPLINA D_C
INNER JOIN MODULO M_D ON D_C.COD_MODULO = M_D.COD_MODULO
WHERE M_D.COD_CURSO = CODIGO_CURSO) LOOP
FOR REGISTRO_VIDEOAULA_DO_CURSO IN (SELECT * FROM VIDEO_AULA WHERE COD_DISCIPLINA = REGISTRO_DISCIPLINA_DO_CURSO.COD_DISCIPLINA) LOOP
QTD_TEMPO_VIDEOS_DO_CURSO_TOTAL := QTD_TEMPO_VIDEOS_DO_CURSO_TOTAL + REGISTRO_VIDEOAULA_DO_CURSO.DURACAO;
END LOOP;
FOR REGISTRO_QUESTAO_DO_CURSO IN (SELECT * FROM QUESTAO WHERE COD_DISCIPLINA = REGISTRO_DISCIPLINA_DO_CURSO.COD_DISCIPLINA) LOOP
NUM_QUESTOES_DO_CURSO_TOTAL := NUM_QUESTOES_DO_CURSO_TOTAL + 1;
END LOOP;
END LOOP;
DURACAO_CALCULADA := TRUNC(((QTD_TEMPO_VIDEOS_DO_CURSO_TOTAL * 2) + (NUM_QUESTOES_DO_CURSO_TOTAL * 6)) / 60);
IF (((QTD_TEMPO_VIDEOS_DO_CURSO_TOTAL * 2) + (NUM_QUESTOES_DO_CURSO_TOTAL * 6)) % 60) != 0 THEN
DURACAO_CALCULADA = DURACAO_CALCULADA + 1;
END IF;
RETURN DURACAO_CALCULADA;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ################################### VALIDAR_DISCIPLINA ################################## ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE A DISCIPLINA É VÁLIDA (POSSUI 3 VIDEOAULAS). |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DA DISCIPLINA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOOLEANO SOBRE A DISCIPLINA SER VÁLIDA. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VALIDAR_DISCIPLINA(CODIGO_DISCIPLINA INT)
RETURNS BOOLEAN
AS $$
DECLARE
NUM_VIDEOS INT := (SELECT COUNT(*) FROM VIDEO_AULA V_A WHERE V_A.COD_DISCIPLINA = CODIGO_DISCIPLINA);
BEGIN
IF NUM_VIDEOS >= 3 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- #################################### VALIDAR_MODULO ##################################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE O MÓDULO É VÁLIDO (POSSUI 3 DISCIPLINAS VÁLIDAS). |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO MÓDULO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOOLEANO SOBRE O MÓDULO SER VÁLIDO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
CREATE OR REPLACE FUNCTION VALIDAR_MODULO(CODIGO_MODULO INT)
RETURNS BOOLEAN
AS $$
DECLARE
NUM_DISCIPLINAS_VALIDAS INT := 0;
REGISTRO_DISCIPLINA RECORD;
BEGIN
FOR REGISTRO_DISCIPLINA IN (SELECT * FROM DISCIPLINA D_P WHERE D_P.COD_MODULO = CODIGO_MODULO) LOOP
IF VALIDAR_DISCIPLINA(REGISTRO_DISCIPLINA.COD_DISCIPLINA) = TRUE THEN
NUM_DISCIPLINAS_VALIDAS := NUM_DISCIPLINAS_VALIDAS + 1;
END IF;
END LOOP;
IF NUM_DISCIPLINAS_VALIDAS >= 3 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END
$$ LANGUAGE plpgsql;
--|-------------------------------------------------------------------------------------------------|--
--|--- ##################################### VALIDAR_CURSO ##################################### ---|----------------------------------------------------------------
--|-------------------------------------------------------------------------------------------------|--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| VERIFICA SE O CURSO É VÁLIDO (POSSUI 3 MÓDULOS VÁLIDOS). |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| ENTRADA: [INT] CÓDIGO DO CURSO. |--
--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--
--| SAÍDA: [BOOLEAN] BOOLEANO SOBRE O CURSO SER VÁLIDO. |--