Como implementar as tabelas de notificação de novidades

Antes de definir a forma para implementar as tabelas de notificação de novidades, tenha em mente:

1.

Quais são os tipos de notificação que existem hoje, no TelEduc:
  • [M] Notificação por e-mail: Usuário pode habilitar ou desabilitar essa opção. <INFORMA>
  • [S] Notificação da estrelinha: Avisa qual ferramenta que obteve a novidade. <VISUALIZA>
  • [B] Notificação em negrito: Aponta ao usuário qual o exato item que foi incluido/modificado. <DIRECIONA>
Há também planos para gerar uma notificação que, como o [B] direciona o usuário para a novidade gerada na ferramenta.
  • [X] Notificação mensagem: ex: mensagem "Nova leitura" ou "Fim de enquete" ou "Novo comentário no Diário".

2.

Notação dos grupos de notificação usados no TelEduc.
(c) - coordenador.
(f) - formador.
(a) - todos os alunos.
(i) - individual | grupo.
(v) - visitante.
(k) - convidado /* TODO: IMPLEMENTAR NAS TABELAS A BAIXO */

3.

Não deverá ocorrer a notificação para o autor da modificação.

OBS: Sublinhado as Ferramentas com notificação codificada.

Dinâmica de Curso [16]

1. Incluir/Importar dinâmica de curso. [M][S][X] : (c)(f)(a)(v)
2. Editar o texto da dinâmica.         [M][S][X] : (c)(f)(a)(v)
3. Incluir novos ítens < anexar >.     [M][S][X] : (c)(f)(a)(v)

Agenda [1]

1. Criar nova agenda.          [M][S][X] : (c)(f)
2. Editar agenda não aplicada. [M][S][X] : (c)(f)
3. Ativar agenda.              [M][S][X] : (c)(f)(a)(v)
4. Editar agenda ativada.      [M][S][X] : (c)(f)(a)(v)

Avaliações [22]

As funções (i) {3,4,5} necessitam a resolução deste ticket: #254

1. Criar avaliação externa individual.                 [M][S][X] : (c)(f)(a)(v)
2. Editar avaliação em execução.                       [M][S][X] : (c)(f)(a)(v)
3. Formador/Coordenador avalia a avaliação.            [M][S][X] : (i)
4. Aluno comenta a justificativa da nota.              [M][S][X] : (c)(f)(i)
5. Formador/Coordenador faz comentario eq. a do aluno. [M][S][X] : (i)

Atividades [3]

1. Nova/importar atividade 'totalmente compartilhado'.   [M][S][X] : (c)(f)(a)(v)
2. Editar atividade 'totalmente compartilhado'.          [M][S][X] : (c)(f)(a)(v)
3. Alterar compartilhamento: 'totalmente compartilhado'. [M][S][X] : (c)(f)(a)(v)
4. Alterar compartilhamento: 'compartilhado com frmdrs'. [M][S][X] : (c)(f)
5. Nova pasta.                                           [M][S][X] : (c)(f)
6. Incluir avaliação (editar).                           [M][S][X] : (c)(f)(a)(v)
7. Mover/Apagar.                                         [M][S][X] : (c)(f)

Material de Apoio [4]
Leituras [5]
Parada Obrigatória [7]

1. Novo/importar material 'totalmente compartilhado'.    [M][S][X] : (c)(f)(a)(v)
2. Editar material de apoio 'totalmente compartilhado'.  [M][S][X] : (c)(f)(a)(v)
3. Editar material de apoio 'compartilhado com frmdrs'.  [M][S][X] : (c)(f)
4. Alterar compartilhamento: 'totalmente compartilhado'. [M][S][X] : (c)(f)(a)(v)
5. Alterar compartilhamento: 'compartilhado com frmdrs'. [M][S][X] : (c)(f)
6. Nova pasta.                                           [M][S][X] : (c)(f)
7. Mover.                                                [M][S][X] : (c)(f)
8. Apagar.                                               [M][S][X] : (c)(f)

Perguntas Frequêntes [6]

1. Inserir assunto.            [M][S][X] : (c)(f)
2. Editar assunto.             [M][S][X] : (c)(f)
3. Inserir/Importar pergunta.  [M][S][X] : (c)(f)(a)(v)
4. Mover pergunta.             [M][S][X] : (c)(f)
5. Excluir pergunta.           [M][S][X] : (c)(f)

Exercicios [23]



Enquete [24]

/* 
A função vai verificar, quando (i), se o tempo da enquete acabou ou nao e
enviar as notificações nos grupos certos setados na criação da enquete
*/

1. Nova enquete [M][S][X] : flag ? (i) -> tempo nao acabou -> avisar os setados em 'aplicacao'
2. Enquete Finalizada [M][S][X] : flag ? (i) -> tempo acabou -> avisar os setados em 'resultado'
3. Enquete Prorrogada [M][S][X] : flag ? (i) -> tempo nao acabou -> avisar os setados em 'aplicacao'
4. Apagar [M][S][X] : (c)(f)

Mural [8]

1. Nova mensagem    [M][S][X] : (c)(f)(a)(v)
2. Apagar mensagem  [M][S][X] : (c)(f)

Foruns [9]

Problema importante, numero 1 em #347

Passível de mudança.

Batepapo [10]

1. Marcar sessão    [M][S][X] : (c)(f)(a)(v)
2. Desmarcar sessão [M][S][X] : (c)(f)(a)(v)

Correio [11]

1. Nova Mensagem                           [M][S][X] : (i)
2. Respnder                                [M][S][X] : (i)
3. Responder para todos os destinatários   [M][S][X] : (i)
4. Redirecionar                            [M][S][X] : (i)

Grupos [12]

1. Novo Grupo                      [M][S][X] : (c)(f)
2. Renomear Grupo                  [M][S][X] : (c)(f)
3. Incluir Componentes             [M][S][X] : (c)(f)(i)

Perfil [13]

1. Perfil editado. [M][S][X] : (c)(f)(a)(v)

Diario de Bordo [14]

1. Incluir nova anotação   [M][S][X] : ** configurado pelo dono do diário (totalmente compartilhado, compartilhado com formadores, não compartilhado) **
2. Comentar anotação       [M][S][X] : ** configurado pelo dono do diário (totalmente compartilhado, compartilhado com formadores, não compartilhado) **

Portfólio [15]

1. Nova Pata                  [M][S][X] : (c)(f)(a)(v)
2. Incluir Novo Item          [M][S][X] : ** configurado pelo dono do porfólio (totalmente compartilhado, compartilhado com formadores, não compartilhado) **
3. Anexar Arquivo             [M][S][X] : ** configurado pelo dono do porfólio (totalmente compartilhado, compartilhado com formadores, não compartilhado) **
4. Incluir Endereço           [M][S][X] : ** configurado pelo dono do porfólio (totalmente compartilhado, compartilhado com formadores, não compartilhado) **
5. Comentar item              [M][S][X] : ** configurado pelo dono do porfólio (totalmente compartilhado, compartilhado com formadores, não compartilhado) **
6. Associar item à Avaliação  [M][S][X] : ** configurado pelo dono do porfólio (totalmente compartilhado, compartilhado com formadores, não compartilhado) **

.
.

# Rascunho da Solução !!! #

##############
## RASCUNHO ##
##############

Tabela: Notificar <nivel programador>
------------------------------------------------------------------------------
- cod_notificao - cod_ferramenta - cod_item - tipo_notificacao - cod_usuario -
------------------------------------------------------------------------------

Tabela: Notificar_tipo <tabela do tipo lingua_textos para notificacao>
-------------------------------------------------
- cod_ferramenta - tipo_notificacao - notificar -
-------------------------------------------------

Tabela: Notificar_usuario <php edita/busca e notifica>
--------------------------------------
- cod_notificao - cod_usuario - data -
--------------------------------------

'cod_notificacao' -> codigo unico para cada notificacao possivel. está para 'Notificar'
como cod_usuario para a 'Usuario'.

'cod_ferramenta'  -> onde foi gerada a notificação.

'cod_item'        -> eh o codigo específico da ferramenta em questão. para a exercícios
seria cod_exercicio.. para a avaliação seria cod_avaliacao.. eh com esse cod_item que
conseguiremos buscar quem deve ser notificado!

'tipo_notificao'  -> valor numérico, associado a tabela 'Notificar_tipo'. com cod_ferramenta
e tipo_notificacao => encontramos as camadas de usuários que devem ser avisados...

'cod_usuario'     -> usuário que gerou a novidade (essa pessoa nunca deve ser notificada
por causa da novidade que ela mesma gerou)

'data'            -> data em que a novidade foi gerada.

'notificar'       -> bits ? associados a quem deve ser notificado! 
ex: cfav (coordenador, formador, aluno, visitante); --a- (aluno)

/* 
   Como acontece a inserção nessas tabelas:
r: na 'Notificar', ao gerar uma novidade as ferramentas deverao inserir nessa tabela!

   Como acontece a notificao?
r: precisa analise pois são 2 tipos de notificação: a instantânea [S][X] e em periodos específicos [M].

   Qual a difença desta tabela para a tabela atual?
r: comparar possibilidades de problema. talvez a busca por novidades (pesquisa em 
diversas tabelas) seja menor por estar centralizado.

*/

- Problemas ?

Fluxograma:

----------------------------     ------------------------------     -----------------------------
- Formador entra na agenda - ==> - Clica em criar nova agenda - ==> - Faz algumas edições e sai -
----------------------------     ------------------------------     -----------------------------
                                 [Função insere em 'Notificar']     [Cada edição gera nova linha ou atualiza (..) pelo cod_notificao, se
                                 [soh (c)(f) recebem a notifi.]     [trocar o compartilhamento, gera nova linha, com outro tipo_notificao ]

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

----------------------------     ------------------------------     ----------
- Formador entra na agenda - ==> - Escolhe uma agenda criada  - ==> - Aplica -
----------------------------     ------------------------------     ----------
                                                                    [Insere na tabela, gerando um novo cod_notificao com o tipo_notificação ]
                                                                    [especifico. Com o cod_item e o tipo de notificação, fica fácil ver que ]
                                                                    [todos devem ser notificados. ]

- cod_notificao - cod_ferramenta - cod_item - tipo_notificao - cod_usuario - data -
Rascunho para funções (nova biblioteca ?)
/* Com esses dados, insere no 'Notificar'; Busca quem deve ser notificado e insere em 'Notificar_quem'. */
function criarNotificao($sock, $cod_ferramenta, $cod_item, $tipo_notificao, $cod_usuario);

/* Ordena a tabela Notificar_quem por data desc > time(), acha o usuario pelo cod_usuario */
/* Pela tabela Notificar_tipo é possível variar as mensagens de feedback para cada caso :) */
/* Mas ainda não pensei bem em como fazer isso... ou se vale a pena.. */
function gerarNotificao($sock, $cod_usuario);