Os horários dos funcionários são parte integrante de qualquer sistema de CRM. Mas, dependendo das especificidades da empresa do cliente, elas podem ser muito diferentes. Na clínica, esses são horários de recepção do paciente; em telecomunicações, horários de conexão do cliente; na escola, horários das aulas. Todos eles diferem em estrutura e essência. Eles têm limites diferentes, um conjunto diferente de campos, grades diferentes.
Nossa plataforma ERP está focada no rápido desenvolvimento de qualquer configuração de nicho, e pensamos em como fazer tudo de forma conveniente. Primeiro de tudo por si mesmo. Para que nosso trabalho no desenvolvimento de um cronograma para um nicho específico não leve mais que uma hora de trabalho.
Antes disso, os gráficos eram um tipo de coisa desenvolvida em php. Mas deus! Karl! Sempre que você precisar de uma nova programação para uma solução de nicho, copie e processe esse código. A individualidade dos gráficos não permitiu uma mudança central. E, em geral, prejudicou o conceito de nossa plataforma em nuvem, na medida em que o cliente pode configurá-lo independentemente.
Como resultado, criamos os seguintes requisitos para horários de trabalho
- Configurabilidade
Eles devem ser totalmente configuráveis a partir da interface da web. - Passo variável
Eles devem ter um passo de grade variável.
Em uma clínica, o horário da consulta pode ser de 30 minutos por paciente, e em outros 20, na terceira hora - Chapéu personalizado
O cabeçalho do gráfico pode ser único, ou seja, pode ser um conjunto de médicos, instalações, professores, equipes etc. Em geral, qualquer coisa do que o cliente possui no sistema. Mesmo pelo que não podemos imaginar. - No registro do gráfico - um conjunto arbitrário de campos
Um conjunto de campos pode ser definido arbitrariamente, a partir de qualquer informação que esteja no sistema. E as entradas são organizadas de acordo com o cabeçalho. - CRUD
As entradas do gráfico devem ser CRUD (criar, ler, atualizar, excluir), apesar dos conjuntos arbitrários de campos. E não apenas isso, mas usando procedimentos para organizar interações complexas.
Exemplo: há um agendamento de tarefas.
No registro do cronograma, é exibido quem executa onde o trabalho é realizado, etc. + alguns dados sobre a tarefa (por exemplo, seu número e nome).
Dados adicionais para registrar a agenda são armazenados em uma tabela e dados de tarefas em outra.
Ao criar, o número da tarefa é indicado, quem executa onde e onde. E os dados serão exibidos em duas tabelas.
Você só pode editar os dados na gravação do gráfico, mas não pode executar tarefas de dados.
A entrada da agenda deve ser excluída, mas não a tarefa.
É necessário manter registros que fizeram algo com esta entrada. Porque ele pode ser excluído e não estará necessariamente visível no agendamento; você precisará acessar os logs de alguma forma. Eles são mais lógicos para liderar a tarefa em si, ou seja, Quando a criação-modificação-exclusão deve ser gravada em uma tabela separada e exibida na tarefa.
Essas coisas só podem ser resolvidas por procedimentos armazenados, para que situações simples e complexas possam ser resolvidas.
- Os campos podem ser listas.
Obviamente, os campos não precisam ser apenas texto. Eles também podem ser listas pop-up de alguns dados no sistema. - Os campos podem ser links
É conveniente quando, por exemplo, no horário de trabalho das tarefas, você pode entrar na própria tarefa. - Ocultando campos
Se houver muitos campos no registro, faz sentido minimizar parte deles para um corte para facilitar a percepção. - Triggers
É necessário ajustar a reação do sistema ao que está acontecendo com a gravação. Isso é feito de maneira mais conveniente com gatilhos.
Por exemplo, se o usuário precisar gravar algum tipo de log nas ações executadas no registro, enviar notificações aos funcionários ou enviar o cliente sms ou fazer o que não podemos supor.
- Registros cruzados
Registros cruzados são registros de gráficos diferentes combinados em um único gráfico. Ou a aparência de entradas em outros gráficos, quando as entradas aparecem no atual.
Por exemplo, há situações em que as mesmas brigadas executam trabalho, por exemplo, em aplicativos e tarefas. I.e. eles ficarão confortáveis com um determinado agendamento geral, onde tarefas de agendamentos diferentes serão exibidas.
Ou você precisa da agenda pessoal de um funcionário, com entradas de todas as agendas em que ele participa.
Essas tarefas são um pouco mais complicadas do que as típicas, mas podem ser completamente resolvidas com a ajuda de gatilhos e procedimentos de aquisição de dados. I.e. pela cláusula 9 e 5.
a) gatilhos são criados nos registros dos agendamentos necessários que criam uma entrada no agendamento pessoal do usuário, se o usuário estiver lá (em conformidade, em caso de alteração, alteração, em caso de exclusão)
b) campos adicionais são criados no gráfico do usuário que incluirá os dados necessários e procedimentos de saída de registro são desenvolvidos para extrair dados de tabelas de outros gráficos usando esses identificadores.
Essas tarefas também podem ser resolvidas de outra maneira, ao criar a agenda de um funcionário pessoal, é realizado um procedimento mais sofisticado que exibe os dados não apenas das tabelas pessoais, mas também das tabelas de outras agendas em que o funcionário está presente no dia. Tais soluções baseadas neste design também são possíveis.
- Sobreposições de tempo
O sistema deve exibir corretamente as interseções dos registros no tempo, e não como na maioria dos sistemas em que os registros são executados entre si e não há nem a oportunidade de ler as camadas inferiores.
- Relatórios
Para que, de acordo com o cronograma, fosse possível criar relatórios. O sistema de armazenamento de dados deve ser organizado para ser coletado no configurador de relatórios.
Por exemplo, era necessário criar um relatório para qual dos funcionários quanto tempo passava viajando nas tarefas - pronto! Nós vamos ao configurador de relatórios, lá selecionamos uma tabela onde os dados dos registros da programação desejada são armazenados e fazemos um relatório usando o configurador padrão de acordo com os dados do gráfico.
- Incorporabilidade
O gráfico deve poder ser facilmente incorporado em qualquer lugar da página - ou seja, deve ser um elemento de entrada padrão, o mesmo que um campo de texto ou um botão.
Felizmente, tivemos experiência no desenvolvimento de elementos padrão complexos. Em particular, temos um elemento de comentário padrão, formulário de solicitação de arquivo, formulário de contato, tabela. Todos eles são adicionados com um clique como elementos normais e são facilmente configurados. - Acesso e Segurança
Os direitos de acesso ao cronograma como um todo devem ser regulados pelo sistema geral de direitos e, dentro do cronograma, os direitos de acesso aos registros devem ser regulados pelas configurações do cronograma.
Por exemplo, indique que apenas o autor pode editar sua postagem, seu grupo ou unidade.
- Facilidade de configuração
E, é claro, a criação e a configuração de um novo cronograma devem ser feitas rapidamente e não causar problemas. Em particular, para nós, para um caso típico (é claro que isso pode acontecer, é claro, é muito complexo) esse trabalho não deve demorar mais que uma hora de trabalho.
Acreditamos que conseguimos implementar elegantemente esses requisitos e este artigo descreverá como isso é feito.
No momento, não conheço sistemas com gráficos igualmente versáteis (se você souber, escreva nos comentários, é interessante ver)
O diagrama geral da configuração do gráfico é mais ou menos assim (não julgue estritamente, eu mesmo o desenhei). Cada elemento é necessário aqui, não há supérfluo.
Todo o trabalho começa com a compreensão de qual conjunto de dados deve estar no registro e a criação de uma tabela no banco de dados para esse planejamento.
Por exemplo, para um cronograma de trabalho em tarefas em uma empresa de telecomunicações, é importante saber quando o trabalho será realizado, em qual tarefa, em qual objeto e qual grupo de engenheiros executará esse trabalho.
Portanto, formamos uma tabela em que há todos esses campos de informações + serviço com o ID do registro do registro. (PS: as tabelas que podemos editar diretamente na nuvem a partir do navegador).

Este é um caso simples, mas pode ser muito mais complicado, onde há mais campos ou várias tabelas.
É isso, a estrutura de armazenamento é formada e agora o cronograma precisa saber como trabalhar com ela. Cada entrada pode ser adicionada, exibida, modificada e excluída.
Porque Se o conjunto de dados e a estrutura de armazenamento puderem ser arbitrários, essa estrutura deverá ser tratada através do procedimento armazenado.
Primeiro você precisa criar o procedimento. No nosso exemplo, o caso é simples e pode ser criado no configurador com um botão, usando a função "Criar procedimentos padrão". O sistema por si só, de acordo com esta tabela, criará procedimentos para tirar, alterar, excluir e várias conclusões.
Por exemplo, um fragmento de um procedimento de adição criado automaticamente se parece com isso

Todos os procedimentos são editados diretamente da interface da web. A lógica de compilação é semelhante ao PL-SQL.
Se algo for complexo, esses procedimentos poderão ser editados dependendo da estrutura de armazenamento e várias condições, loops, seleções, atualizações, inserções etc. poderão ser definidos. Em geral, desenhe qualquer estrutura de processamento.
A programação em cada ação indica qual procedimento é responsável por essa ação.
Configurações de agendamento "integradas"Mas também existem configurações "com fio" que só podem ser configuradas, mas não alteradas. Isso simplesmente não é necessário.
- Coordenadas de data e hora são propriedade integrante de qualquer registro
- A localização do gráfico no sistema. Ele é editado usando o editor interno da interface e não é necessário fazer isso no próprio gráfico.
- A memória de onde o usuário estava - não há necessidade de configurar diretamente essa propriedade.
Nas configurações, a Etapa (por exemplo, uma grade de 20 minutos ou 30) e o Intervalo de horas de trabalho (por exemplo, de 8 a 20) também podem ser especificados.
É necessário um intervalo de tempo para reduzir o excesso, por exemplo, se todos os funcionários trabalharem 8 horas por dia útil padrão, não faz sentido exibir o horário noturno.
Etapa - define a grade do gráfico. Por exemplo, em uma clínica, pode haver um horário de consulta médica por 20 minutos, em outras 15, na terceira 30. Tudo isso é configurável.
No entanto, isso não significa que a gravação não possa ser feita fora da grade. Você pode fazer quaisquer entradas, mas elas serão exibidas na grade.
O intervalo de etapas que podemos definir 5, 10, 15, 30, 60 minutos.
Saída de gravaçãoNão é suficiente criar e especificar um procedimento. É necessário que o cronograma entenda como trabalhar com ele por sua parte.
ChapéuO mais importante é indicar o cabeçalho do gráfico. Qual dos campos de saída do procedimento deve ser um cabeçalho.
Considere a lógica de criar um horário de aula em uma organização educacional. Suponha que um registro tenha um conjunto de grupos de professores.
Aqui você pode fazer um cabeçalho para Professores, então o cronograma será formado da seguinte forma:

mas você pode por grupo, e assim:

mas geralmente você pode criar dois gráficos diferentes e exibi-lo da maneira que desejar, os usuários o escolherão. Nesse caso, os mesmos dados serão usados, os mesmos procedimentos. Alterações em um gráfico serão alteradas em outro.
Mas, em geral, a escolha depende das questões de conveniência. Um chapéu deve ser uma informação fundamental que muda pouco. Se você servir um número fixo de objetos - esses devem ser eles. Se você tem um número fixo de grupos, eles são.
Você pode fazer coisas interessantes com um chapéu. Por exemplo, se você indicar o status da tarefa como um cabeçalho, quando o status da tarefa for alterado, o registro da tarefa no gráfico passará para o próprio status correspondente. I.e. de fato, quase pranchas kanban podem ser feitas aqui, etc. coisas Quando vinculamos dados de registro por meio de procedimentos para exibir informações no sistema, elas também podem ganhar vida em gráficos. Mecanismo muito flexível.
Além disso, se você definir condições de filtragem no procedimento, poderá criar dados de cabeçalho no gráfico levando em consideração filtros arbitrários.
O que não produzirVocê também pode especificar o que exibir nos registros e o que não. Por exemplo, no procedimento, alguns identificadores de serviço para pacotes configuráveis podem ser exibidos como resultados. Esta informação, não significativa para o usuário, pode ser ignorada na conclusão.
O que esconderE você pode exibir, mas minimizar para gato. Informações que não são muito importantes, mas que às vezes são necessárias. Por exemplo, quem e quando criou esse registro pode ser necessário apenas no caso de algum tipo de confronto, mas não no trabalho operacional.
ReferênciasTambém é muito conveniente quando algum campo pode ser um link.
Por exemplo, se fizermos uma programação para as tarefas, por que não clicar no número para entrar na tarefa?
Temos um mecanismo de ligação padrão no configurador. Você pode fazê-los lá e associar-se ao campo no gráfico. Tudo funciona.
TítuloObviamente, o campo deve ser chamado de alguma forma. Por padrão, o sistema receberá o nome do campo do procedimento, mas nem sempre é correto para a percepção. Portanto, às vezes você precisa inserir nomes alternativos.
Por exemplo, todos os itens acima conosco são assim. Em frente aos campos deste procedimento estão marcados.

A saída do registro ficará assim:
Adicionando uma nova entradaOs campos para adicionar um novo registro devem ser determinados pelo procedimento de adição. As informações devem ser fornecidas para cada parâmetro de entrada do procedimento.
Mas há um truque. Os campos podem ser não apenas texto, mas também listas.
Vamos dar o nosso exemplo para uma telecom, onde há uma tarefa, grupo, objeto. Não forçaremos o usuário a procurar identificadores de objetos e conduzi-los. É necessário que exista uma lista pop-up com as informações necessárias. Onde conseguir?
Para fazer isso, o campo de entrada do procedimento deve puxar outro procedimento, que por exemplo fornecerá uma lista de tarefas reais ou uma lista de objetos necessários, etc. Ao mesmo tempo, você não pode apenas especificar os campos de uma tabela, pode haver filtros complexos. As mesmas tarefas já podem ter 10.000 carimbos no sistema, mas uma lista de 100 tópicos deve ser exibida agora.

Em geral, um procedimento que se contrai no campo de outro procedimento.
Na verdade, isso parece assustador. Essas coisas são bem automatizadas, os procedimentos de acordo com os diretórios padrão são obtidos com um botão. Procedimentos para várias listas de grupos, tarefas, aplicativos, etc. implementado por muito tempo para a operação de vários módulos de CRM. Eles só precisam ser selecionados. Se já existe um procedimento com funcionalidade semelhante, ele é copiado e editado.
Também é necessário indicar qual dos campos adicionados será um cabeçalho. Nós precisaremos disso no sistema de edição.
Parece assim para nós:
Editar registroAinda é mais interessante aqui. Não basta exibir todos os campos nas listas, como no apêndice. É necessário nessas listas selecionar a posição atual (selecionada). Estamos editando.
Para fazer isso, você precisa associar os campos de criação aos campos de saída. E no caso de uma caixa de listagem, não é apenas um prumo das informações da saída, mas o identificador dessas informações.
I.e. aqui é necessário:
a) indicar o procedimento de edição
b) associe seus campos aos campos de adição
c) associe seus campos aos campos da saída dos dados do registro para colocar os dados atuais nas listas
Não há outros recursos para indicar aqui, porque já configuramos Saída e adição.
Quando a janela de edição é exibida, o sistema chama o procedimento necessário para cada campo, recebe dados, compara-os com os dados da saída do registro, coloca selecionados nas listas e insere os valores atuais em campos simples.
Parece que isso com a gente
Excluir registroA remoção é a mais fácil. O procedimento de exclusão com um parâmetro de entrada é simplesmente indicado: o ID do registro do gráfico.
Manipulação de eventos ao adicionar / modificar / excluir registros. Triggers Registros Cruzados.Apenas adicionar / modificar entradas nos gráficos não é suficiente. Você ainda precisa gerenciar eventos. Isso abre um escopo ilimitado para configuração.
Gerenciar eventos é realmente muito simples. Afinal, já temos tabelas nas quais os dados dos registros gráficos são armazenados. Você pode definir gatilhos de qualquer complexidade nessas tabelas. Nosso configurador de nuvem facilita isso.
Por exemplo, eram necessários registros, quem fez o que na gravação. Tudo é simples. Uma tabela é criada para os logs e gatilhos são colocados na tabela do gráfico que grava os dados de modificação em uma tabela com logs.
Também graças a isso, estão disponíveis gravações cruzadas. Por exemplo, quando uma tarefa é definida em um grupo em nosso exemplo, você pode identificar todos os participantes desse grupo e colocar um dobro desse registro em seus gráficos pessoais. Colocar gráficos pessoais nesse caso significa fazer um registro na tabela de dados de um gráfico pessoal. Ele também é um gráfico neste sistema, apenas configurado de maneira diferente e exibido em outro local. Esta entrada aparecerá nela.
Ou você precisa enviar uma notificação para os usuários do grupo. Ou envie um SMS ao cliente informando que eles o procurarão para executar o trabalho em tal e qual tarefa de vez em quando. Para fazer isso, são feitos gatilhos que fazem entradas nas tabelas de notificação ou no SMS.
RelatóriosTambém são necessários relatórios de gráfico e, com essa estrutura, eles podem ser feitos.
Por exemplo, era necessário fazer um relatório sobre quanto tempo os funcionários estavam viajando no mês anterior. Vamos ao configurador de relatórios, selecionamos a tabela desejada em que as entradas do gráfico são armazenadas, configuramos os filtros e as funções de agregação necessários - e vaul, o relatório está pronto.
Outros usos dos dados do gráficoOs dados gráficos podem ser usados em qualquer lugar com um configurador de sistema avançado. Por exemplo, nas tarefas, conseguimos fazer facilmente a guia Gráficos e, em um procedimento simples, exibir informações sobre quanto tempo e quem tinha essa tarefa para execução.
Sobreposições de tempoEles acontecem. E não há nada pior do que registros batendo um no outro e não permitindo a leitura do registro necessário. Este problema também foi resolvido. O sistema de entradas sobrepostas é colocado automaticamente nas proximidades. Nesse caso, apenas html simples é usado, apenas a estrutura da tabela é construída da maneira necessária para isso. O sistema cuida de qualquer profundidade, mas mais de 2 entradas são raras.
Obviamente, se o tempo se sobrepuser, provavelmente algo não está planejado.
Uma pessoa não pode estar simultaneamente em dois lugares, mas mesmo essas situações devem ser exibidas corretamente.
Acesso e segurança Oacesso é dividido em 2 níveis. Sistema e gráficos pessoais. O sistema é definido como um todo pelo editor de Funções e pelos direitos padrão especificados no configurador de interface. Por exemplo, se esta célula da página (ou as guias, páginas e menus herdados acima) tiver negado o acesso de leitura, nenhum usuário verá esse gráfico no nível de exibição da interface até atribuir direitos de leitura a essa área nas Funções do Usuário.Em seguida, vêm os direitos internos do cronograma. Eles podem ser1) Edição- apenas o autor- apenas o grupo do autor (todos os funcionários incluídos nos grupos dos quais o autor do registro é membro)- apenas a divisão do autor (todos os funcionários incluídos na divisão do autor, de acordo com o estoque)PS: o grupo de trabalho e o pessoal podem diferir de nós. Por exemplo, em uma unidade, pode haver vários grupos de trabalho ou funcionários de diferentes unidades podem estar no mesmo grupo. O mesmo funcionário também pode estar em grupos diferentes ao mesmo tempo. Todo esse sistema leva em consideração.
2) A remoção é semelhante.- apenas o autor- apenas o grupo- apenas a divisãoPor que precisamos de direitos internos?Se essa é uma agenda pessoal ou há alguns recursos, faz sentido colocar apenas o autor.Porém, há equipes de plantão e situações em que o registro precisa ser editado e o funcionário não está no trabalho. O que fazer
Faz sentido definir esses agendamentos para edição por um grupo ou unidade, para que outros funcionários do turno possam trabalhar com esses registros.Além disso, a função, que tem o direito de administrar, pode ser indicada no cronograma. Os funcionários com essa função terão direitos para editar e excluir, independentemente de grupos e unidades.
Aqui temos uma coisa tão legal, que simplifica bastante a vida, quando você sabe como usá-la, é claro. Imediatamente pessoa inexperiente pode ser difícil de descobrir. Mas temos que definir esse cronograma de uma forma simples, é cerca de uma hora de trabalho.Além disso, também temos os mais profundos recursos de configuração e a possibilidade de interação com outros elementos do sistema.