Pessoal, bom dia
Estou me deparando com 1 cenario e queria a opiniao de vcs:
Tenho 1 sistema onde um usuário qualquer irá se logar e “manter” os registros, digamos assim. Inserir, alterar, etc… Em determinado momento, ele “submete” os dados
para aprovação, momento em que passam a ser visíveis para um outro usuário, que podemos chamar de usuário “aprovador”. Em 1 outro momento, esse mesmo usuario aprovador ira entrar no sistema para publicar esses dados, momento em que passam a ser visíveis num portal para usuários sem autenticação.
Eu me deparei com 1 problema ao tentar modelar o banco pelo seguinte: Se após a submissao dos dados, eles passassem a ser visíveis pro usuario aprovador e o usuario cadastrador nao pudesse mais editar o registro, tudo bem. O problema é que nao funciona assim. Após a submissao dos dados, eles podem ser aprovados pelo usuario aprovador, mas o usuario cadastrador pode continuar a inserir novos registros, ou mesmo alterá-lo.
Ai vem a duvida: como evitar o fenômeno de “ghost read”? Ex: o cara cadastra 1 contrato de 1milhao, com 3 aditivos de 200.000 (total= 1.600.000)
Na hora em que ele clica em APROVAR, 2 segundos antes o cadastrador insere mais 2 aditivos.
Resumindo: o aprovador aprovou coisas que nao visualizou.
Avisar o usuario, no momento que for aprovar efetivamente, que os dados foram alterados e “recarregar” a tela, NAO é opção. Deve ser assincrono, os 2 usuarios devem trabalhar livremente sem depender 1 do outro, e caso o usuario aprovador aprove, deve aprovar somente os dados que foram submetidos.
Por enqto a unica solucao que cheguei (que ta 1 bad smell danado) é, de pra cada tabela que for sofrer aprovação (ex: Contrato), existir tambem uma tabela “ContratoHomologacao”, na qual ira estar os dados “Aguardando Aprovacao”. Eles sao transferidos pra essa tabela no momento da “submissao” dos dados, pelo usuario cadastrador. O usuario aprovador trabalha entao em cima dessa tabela, ContratoHomologacao
Sugestoes? Dei uma lida nos Workflow Patterns e State Patter, mas nao ajudaram muito. (ate pq sao para problemas diferentes, pelo q entendi)