Há umas duas semanas eu me deparei com um problema interessante, no Virto (sistema que colaboro atualmente). Neste sistema há uma cadastro de horários de expediente do usuário. Há uma configuração de horário para cada usuário, e as tabelas no banco de dados segue a seguinte estrutura:
Os registros da tabela acima informam que o usuario '1' trabalha das 06:00h às 07:00, das 08:00h ás 09:00h e das 09:00h às 10:00h. Observe que neste caso o usuário não trabalha de 07:00h às 09:00h, mas trabalha de 08:00h às 10:00h de acordo com os registros 2 e 3. Isso é o que o sistema permite fazer.
Isso é horrível a efeito de normalização da base de dados, uma vez que uma empresa pode ter 200 funcionários que trabalhem nas mesmas 8 horas diárias, por exemplo, gerando portanto 1600 registros na base de dados. Foi aí que tiveram a brilhante idéia de criar perfis de horários, e atribuir o perfil de horário ao usuário.
Até aí nada de difícil. O desafio se apresentou quando foi necessário identificar quais eram os usuários que tinham os horarios iguais, para que pudesse ser criado apenas um perfil. Se assim não fosse, seria necessário criar um perfil para cada usuário
Existe algumas maneiras práticas pra realizar esta proeza:
1ª maneira: chamar o estagiário pra comparar um a um, sendo esta a maneira mais econômica.
2ª maneira: procurar no google pela ferramenta 'Super Ultra Plus Perfis Agrupator Utility', e torcer para que ele tenha a versão trial 30 dias se você pensa em economizar din-din.
Bem, segue minha solução:
1) Para cada registro de horário, elevar 2 à hora do dia. Assim, o registro referente ao período de 06:00h às 07:00h traria um registro 2 ^ 6 = 64.
2) Soma-se os valores do hora_id, agrupado por usuário.
Perceba que na imagem acima os usuários 901 e 244 têm as somas iguais. Isso significa que eles têm o mesmo perfil de horário. Se você for verificar com calma…
q
Nenhum comentário:
Postar um comentário