Los horarios de los empleados son una parte integral de cualquier sistema CRM. Pero dependiendo de los detalles del negocio del cliente, pueden ser muy diferentes. En la clínica, estos son horarios de recepción de pacientes; en telecomunicaciones, horarios de conexión de clientes; en la escuela, horarios de clases. Todos ellos difieren en estructura y esencia. Tienen diferentes límites, un conjunto diferente de campos, diferentes cuadrículas.
Nuestra plataforma ERP se centra en el desarrollo rápido de cualquier configuración de nicho, y pensamos en cómo hacerlo todo convenientemente. Primero de todo por ti mismo. Para que nuestro trabajo en el desarrollo de un horario para un nicho específico no tome más de una hora hombre.
Antes de eso, los gráficos eran una especie de cosa desarrollada en PHP. Pero dios! Karl! Cada vez que necesite un nuevo horario para una solución de nicho, debe copiar este código y procesarlo. La individualidad de los gráficos no permitió un cambio central. Y, en general, socava el concepto de nuestra plataforma en la nube, ya que el cliente puede configurarla de forma independiente.
Como resultado, formamos los siguientes requisitos para horarios de trabajo
- Configurabilidad
Deben ser totalmente configurables desde la interfaz web. - Tono variable
Deben tener un paso de cuadrícula variable.
En una clínica, el horario de la cita puede ser de 30 minutos por paciente, y en otros 20, a la tercera hora. - Sombrero personalizado
El encabezado del gráfico puede ser único, es decir Puede ser un conjunto de médicos, instalaciones, maestros, equipos, etc. En general, cualquier cosa, desde lo que el cliente tiene en el sistema. Incluso de lo que no podemos imaginar. - En el registro del gráfico: un conjunto arbitrario de campos
Se puede establecer un conjunto de campos arbitrariamente, a partir de cualquier información que esté en el sistema. Y las entradas se organizan de acuerdo con el encabezado. - CRUDO
Las entradas del gráfico deben ser CRUDAS (crear, leer, actualizar, eliminar), a pesar de los conjuntos arbitrarios de campos. Y no solo eso, sino que usa procedimientos para organizar interacciones complejas.
Ejemplo: hay un cronograma de tareas.
En el registro del cronograma, se muestra quién realiza dónde se realiza el trabajo, etc. + algunos datos sobre la tarea (por ejemplo, su número y nombre).
Los datos adicionales para registrar la programación se almacenan en una tabla y los datos de tareas en otra.
Al crear, se indica el número de tarea, quién realiza dónde y dónde. Y los datos se mostrarán en dos tablas.
Solo puede editar los datos en la grabación del gráfico, pero no puede realizar tareas de datos.
La entrada de programación debe eliminarse, pero no la tarea.
Es necesario mantener registros que hicieron algo con esta entrada. Porque se puede eliminar y no necesariamente estará visible en la programación, entonces debe acceder a los registros de alguna manera. Son más lógicos para liderar la tarea en sí, es decir. al crear, modificar o eliminar, debe escribirse en una tabla separada y mostrarse en la tarea.
Tales cosas solo pueden resolverse mediante procedimientos almacenados, de modo que se puedan resolver situaciones simples y complejas.
- Los campos pueden ser listas.
Por supuesto, los campos no tienen que ser solo texto. También pueden ser listas emergentes de algunos datos en el sistema. - Los campos pueden ser enlaces
Es conveniente cuando, por ejemplo, desde el cronograma de trabajo en las tareas puede ingresar a la tarea misma. - Ocultar campos
Si hay muchos campos en el registro, tiene sentido minimizar parte de ellos en un corte para facilitar la percepción. - Disparadores
Es necesario ajustar la reacción del sistema a lo que sucede con la grabación. Esto se hace más convenientemente con disparadores.
Por ejemplo, si el usuario necesita escribir algún tipo de registro sobre las acciones tomadas sobre el registro, o enviar notificaciones a los empleados, o incluso enviar al cliente SMS o incluso hacer lo que no podemos asumir.
- Registros cruzados
Los registros cruzados son registros de diferentes gráficos combinados en un solo gráfico. O la aparición de entradas en otros gráficos, cuando las entradas aparecen en el actual.
Por ejemplo, hay situaciones en las que las mismas brigadas realizan trabajos, por ejemplo, en aplicaciones y tareas. Es decir se sentirán cómodos con un horario general determinado, donde se mostrarán tareas de diferentes horarios.
O necesita el horario personal de un empleado, con entradas de todos los horarios en los que participa.
Estas tareas son un poco más complicadas que las típicas, pero se pueden resolver completamente con la ayuda de disparadores y procedimientos de adquisición de datos. Es decir por la cláusula 9 y la cláusula 5.
a) los desencadenantes se crean en los registros de las programaciones necesarias que crean una entrada en la programación personal del usuario si el usuario está allí (en consecuencia, en caso de un cambio, cambio, en caso de eliminación)
b) se crean campos adicionales en el gráfico del usuario que incluirán los datos necesarios, y se desarrollan procedimientos de salida de registro que extraerán datos de las tablas de otros gráficos utilizando estos identificadores.
Dichas tareas también pueden resolverse al revés, cuando se crea el horario de un empleado personal, se realiza un procedimiento más sofisticado que muestra datos no solo de tablas personales, sino de tablas de otros horarios donde el empleado está presente en el día dado. Tales soluciones basadas en este diseño también son posibles.
- Superposiciones de tiempo
El sistema debería mostrar correctamente las intersecciones de los registros a tiempo, y no como en la mayoría de los sistemas donde los registros se encuentran entre sí y ni siquiera hay la oportunidad de leer las capas inferiores.
- Informes
De modo que, de acuerdo con el cronograma, era posible crear informes. El sistema de almacenamiento de datos debe organizarse de modo que pueda recogerse en el configurador de informes.
Por ejemplo, fue necesario crear un informe sobre cuál de los empleados cuánto tiempo pasó viajando en tareas, ¡voilá! Vamos al configurador de informes, allí seleccionamos una tabla donde se almacenan los datos de registros de la programación deseada y hacemos un informe utilizando el configurador estándar de acuerdo con los datos del gráfico.
- Embeddability
El gráfico debe poder integrarse fácilmente en cualquier lugar de cualquier página, es decir debe ser un elemento de entrada estándar, igual que un campo de texto o un botón.
Afortunadamente, teníamos experiencia en el desarrollo de elementos estándar complejos. En particular, tenemos un elemento de comentario estándar, formulario de solicitud de archivo, formulario de contacto, tabla. Todos ellos se agregan con un clic como elementos normales y se configuran fácilmente. - Acceso y seguridad
Los derechos de acceso al cronograma en su conjunto deben estar regulados por el sistema general de derechos, y dentro del cronograma los derechos de acceso a los registros deben estar regulados por la configuración del cronograma.
Por ejemplo, indique que solo el autor puede editar su publicación, o su grupo o unidad.
- Facilidad de configuración
Y, por supuesto, la creación y configuración de una nueva programación debe hacerse rápidamente y no causar ningún problema. En particular, para nosotros, para un caso típico (está claro que puede suceder, por supuesto, es muy complejo) este trabajo no debería llevar más de una hora hombre.
Creemos que logramos implementar con elegancia estos requisitos y este artículo describirá cómo se hace.
Por el momento, no conozco sistemas con gráficos igualmente versátiles (si sabes, escribe en los comentarios, es interesante ver)
El diagrama general de la configuración del gráfico se parece a esto (no juzgue estrictamente, lo dibujé yo mismo). Aquí se necesita cada elemento, no hay superfluo.
Todo el trabajo comienza con la comprensión de qué conjunto de datos debe estar en el registro y la creación de una tabla en la base de datos para este programa.
Por ejemplo, para un cronograma de tareas para una empresa de telecomunicaciones, es importante saber cuándo se realizará el trabajo, para qué tarea, para qué objeto y qué grupo de ingenieros llevará a cabo este trabajo.
Por lo tanto, formamos una tabla donde hay todos estos campos de información + servicio con la ID del registro de registro. (PD: las tablas que podemos editar directamente en la nube desde el navegador).

Este es un caso simple, pero puede ser mucho más complicado, donde hay más campos o varias tablas.
Eso es todo, la estructura de almacenamiento está formada y ahora la programación necesita saber cómo trabajar con ella. Cada entrada se puede agregar, mostrar, modificar y eliminar.
Porque Si el conjunto de datos y la estructura de almacenamiento pueden ser arbitrarios, esta estructura debe manejarse mediante el procedimiento almacenado.
Primero necesitas crear el procedimiento. En nuestro ejemplo, el caso es simple, y se pueden crear en el configurador con un botón usando la función "Crear procedimientos estándar". El sistema por sí solo de acuerdo con esta tabla creará procedimientos para hacer, cambiar, eliminar y varias conclusiones.
Por ejemplo, un fragmento de un procedimiento de agregar creado automáticamente se ve así

Todos los procedimientos se editan directamente desde la interfaz web. La lógica de compilación es similar a PL-SQL.
Si algo es complicado, entonces estos procedimientos pueden editarse dependiendo de la estructura de almacenamiento y se pueden establecer varias condiciones, bucles, selecciones, actualizaciones, inserciones, etc. En general, dibuje cualquier estructura de procesamiento.
El cronograma en cada acción indica qué procedimiento es responsable de esta acción.
Configuración de programación "incorporada"Pero también hay configuraciones "cableadas" que solo se pueden configurar, pero no cambiar. Esto simplemente no es necesario.
- Las coordenadas de fecha y hora son una propiedad integral de cualquier registro
- La ubicación del gráfico en el sistema. Se edita utilizando el editor incorporado de la interfaz y no hay necesidad de hacerlo desde el gráfico mismo.
- La memoria de dónde estaba el usuario: no es necesario configurar directamente esta propiedad.
En la configuración, también se puede especificar el Paso (por ejemplo, una cuadrícula de 20 minutos o 30) y el Rango de horas de trabajo (por ejemplo, de 8 a 20).
Se necesita un rango de tiempo para cortar el exceso, por ejemplo, si todos los empleados trabajan 8 horas al día laboral estándar, entonces no tiene sentido mostrar las horas nocturnas.
Paso: define la cuadrícula del gráfico. Por ejemplo, en una clínica puede haber un horario de citas médicas por 20 minutos, en otras 15, en la tercera 30. Todo esto es configurable.
Sin embargo, esto no significa que la grabación no se pueda hacer fuera de la cuadrícula. Puede realizar cualquier entrada, pero se mostrarán dentro de la cuadrícula.
El rango de pasos que podemos establecer es de 5, 10, 15, 30, 60 minutos.
Salida de registroNo es suficiente crear y especificar un procedimiento. Es necesario que el horario comprenda cómo trabajar con él por su parte.
SombreroLo más importante es indicar el encabezado del gráfico. ¿Cuál de los campos de salida del procedimiento debe ser un encabezado?
Considere la lógica de construir un horario de clases en una organización educativa. Supongamos que un registro tiene un conjunto de grupo de maestros.
Aquí puede hacer un encabezado para Maestros, luego el cronograma se formará de la siguiente manera:

pero puedes por Grupo, entonces así:

pero generalmente puede hacer 2 gráficos diferentes y mostrarlos de todos modos, como lo desee, los usuarios lo elegirán. En este caso, se utilizarán los mismos datos, los mismos procedimientos. Los cambios en un gráfico cambiarán en otro.
Pero en general, la elección depende de las cuestiones de conveniencia. Un sombrero debería ser información fundamental que cambia poco. Si sirve un número fijo de objetos, estos deberían ser ellos. Si tiene un número fijo de grupos, entonces lo son.
Puedes hacer cosas interesantes con un sombrero. Por ejemplo, si indica el estado de la tarea como un encabezado, cuando el estado de la tarea cambie, el registro de la tarea en el gráfico saltará al estado correspondiente. Es decir de hecho, aquí se pueden hacer casi tablas kanban, etc. cosas Cuando vinculamos datos de registro a través de procedimientos para transmitir información en el sistema, también puede cobrar vida en gráficos. Mecanismo muy flexible.
Además, si establece condiciones de filtrado en el procedimiento, puede crear datos de encabezado en el gráfico teniendo en cuenta los filtros arbitrarios.
Que no dar salidaTambién puede especificar qué mostrar en los registros y qué no. Por ejemplo, en el procedimiento, algunos identificadores de servicio para paquetes se pueden mostrar como resultados. Esta información, que no es significativa para el usuario, puede ignorarse al final.
Que esconderY puede mostrar, pero minimizar al gato. Información que no es muy importante, pero que a veces es necesaria. Por ejemplo, quién y cuándo creó este registro puede ser necesario solo en el caso de algún tipo de enfrentamiento, pero no en el trabajo operativo.
ReferenciasTambién es muy conveniente cuando algún campo puede ser un enlace.
Por ejemplo, si hacemos un cronograma para las tareas, ¿por qué no hacer clic en su número para ingresar a la tarea misma?
Tenemos un mecanismo de enlace estándar en el configurador. Puede hacerlos allí y asociarlos con el campo en el gráfico. Todo funciona
TituloPor supuesto, el campo debe llamarse de alguna manera. Por defecto, el sistema tomará el nombre del campo de procedimiento, pero no siempre es correcto para la percepción. Por lo tanto, a veces necesita ingresar nombres alternativos.
Por ejemplo, todo lo anterior con nosotros se ve así. Enfrente se verifican los campos de este procedimiento.

La salida del registro se verá así:
Agregar una nueva entradaLos campos para agregar un nuevo registro deben determinarse mediante el procedimiento de adición. Se debe proporcionar información a cada parámetro de entrada del procedimiento.
Pero hay un truco. Los campos pueden ser no solo texto, sino también listas.
Tomemos nuestro ejemplo para una telecom, donde hay una tarea, grupo, objeto. No obligaremos al usuario a buscar identificadores de objetos y conducirlos. Es necesario que haya una lista emergente con la información necesaria. ¿Dónde conseguirlo?
Para hacer esto, el campo de entrada del procedimiento debe extraer otro procedimiento, que por ejemplo dará una lista de tareas reales, o una lista de objetos necesarios, etc. Al mismo tiempo, no puede especificar los campos de alguna tabla desde Puede haber filtros complejos. Es posible que las mismas tareas ya tengan 10,000 estampados en el sistema, pero ahora debe mostrarse una lista de 100 tópicos.

En general, un procedimiento que se mueve a través del campo de otro procedimiento.
En realidad, solo suena aterrador. Estas cosas están bien automatizadas, los procedimientos de acuerdo con los directorios estándar se obtienen con un solo botón. Procedimientos para diversas listas de grupos, tareas, aplicaciones, etc. implementado durante mucho tiempo para la operación de varios módulos CRM. Solo necesitan ser seleccionados. Si ya existe un procedimiento con una funcionalidad similar, se copia y edita.
También es necesario indicar cuál de los campos agregados será un encabezado. Lo necesitaremos en el sistema de edición.
Se ve así para nosotros:
Editar registroTodavía es más interesante aquí. No es suficiente mostrar todos los campos en las listas como en el apéndice. Es necesario en estas listas seleccionar la posición actual (seleccionada). Estamos editando
Para hacer esto, debe asociar los campos de creación con los campos de salida. Y en el caso de un cuadro de lista, no es solo una plomada de la información de la salida, sino el identificador de esta información.
Es decir aquí es necesario:
a) indicar el procedimiento de edición
b) asocia sus campos con los campos de suma
c) asocia sus campos con los campos de salida de los datos de registro para colocar los datos actuales en las listas
No hay otras características para indicar aquí, porque Ya hemos configurado Salida y Adición.
Cuando se muestra la ventana de edición, el sistema llamará al procedimiento necesario para cada campo, recibirá datos, los comparará con los datos de la salida del registro, los seleccionará en las listas e insertará los valores actuales en campos simples.
Se ve así con nosotros
Eliminar registroLa eliminación es la más fácil. El procedimiento de eliminación con un parámetro de entrada simplemente se indica: la ID de registro del gráfico.
Manejo de eventos al agregar / modificar / eliminar registros. Disparadores Cross Records.Solo agregar / modificar entradas en los gráficos no es suficiente. Aún necesita administrar eventos. Esto abre un alcance ilimitado para la configuración.
La gestión de eventos es realmente muy simple. Después de todo, ya tenemos tablas en las que se almacenan los datos de los registros del gráfico. Puede establecer desencadenantes de cualquier complejidad en estas tablas. Nuestro configurador en la nube hace que esto sea fácil de hacer.
Por ejemplo, se necesitaban registros, quién hizo qué en la grabación. Todo es simple Se crea una tabla para los registros y los activadores se colocan en la tabla de gráficos que escriben los datos de modificación en una tabla con registros.
También gracias a esto, hay disponibles grabaciones cruzadas. Por ejemplo, cuando una tarea se establece en un grupo en nuestro ejemplo, puede identificar a todos los participantes en este grupo y ponerles el doble de este registro en sus gráficos personales. Poner en gráficos personales en este caso significa hacer un registro en la tabla de datos de un gráfico personal. También es un gráfico en este sistema, solo configurado de manera diferente y se muestra en otro lugar. Esta entrada aparecerá en ella.
O necesita enviar una notificación a los usuarios del grupo. O envíe un SMS al cliente para que vengan a él a realizar el trabajo en tal o cual tarea de vez en cuando. Para hacer esto, simplemente se activan los disparos que hacen entradas en las tablas de notificación o SMS.
InformesTambién se necesitan informes gráficos, y con tal estructura se pueden hacer.
Por ejemplo, era necesario hacer un informe sobre cuánto tiempo viajaban los empleados el mes anterior. Vamos al configurador de informes, seleccionamos la tabla deseada donde se almacenan las entradas del gráfico, establecemos los filtros necesarios y las funciones de agregación, y luego, el informe está listo.
Otros usos de los datos del gráficoLos datos gráficos se pueden usar en cualquier lugar con un configurador de sistema avanzado. Por ejemplo, en las tareas, pudimos crear fácilmente la pestaña Gráficos y, en un procedimiento simple, mostrar información sobre cuánto tiempo y quién tenía esta tarea para la ejecución.
Superposiciones de tiempoSuceden Y no hay nada peor que los registros que se golpean entre sí y no permiten leer el registro necesario. Este problema también se ha resuelto. El sistema de entradas superpuestas se coloca automáticamente cerca. En este caso, solo se usa html simple, solo la estructura de la tabla se construye de la manera necesaria para esto. El sistema brinda atención a cualquier profundidad, pero son raras más de 2 entradas.
Por supuesto, si el tiempo se superpone, lo más probable es que algo no esté planeado.
Una persona no puede estar simultáneamente en dos lugares, pero incluso tales situaciones deben mostrarse correctamente.
Acceso y seguridad Elacceso se divide en 2 niveles. Sistema y Gráficos Personales. El sistema está definido en su conjunto por el editor de roles y los derechos predeterminados especificados en el configurador de la interfaz. Por ejemplo, si esta celda de página (o las pestañas, páginas, menús heredados anteriormente) no tiene acceso de lectura, ningún usuario verá este gráfico en el nivel de visualización de la interfaz hasta que asigne derechos de lectura a esta área en Roles de usuario.Luego vienen los derechos internos de la programación. Pueden ser1) Edición, solo el autor, solo el grupo del autor (todos los empleados incluidos en los grupos de los que es miembro el autor del registro)- solo la división del autor (todos los empleados incluidos en la división del autor, según el stock)PD: el grupo de trabajo y el personal pueden diferir de nosotros. Por ejemplo, en una unidad puede haber varios grupos de trabajo, o los empleados de diferentes unidades pueden estar en el mismo grupo. El mismo empleado también puede estar en diferentes grupos al mismo tiempo. Todo este sistema tiene en cuenta.
2) La eliminación es similar.- solo el autor- solo el grupo- solo la división¿Por qué necesitamos derechos internos?Si este es un horario personal, o hay algunas características, entonces tiene sentido poner solo al autor.Pero hay turnos de personal y situaciones en las que es necesario editar el registro y el empleado no está en el trabajo. Que hacer
Tiene sentido establecer dichos horarios para la edición por un grupo o unidad para que otros empleados de turno puedan trabajar con estos registros.Además, el Rol, que tiene derecho a administrar, puede indicarse en el cronograma. Los empleados con este rol tendrán derechos para editar y eliminar, independientemente de los grupos y unidades.
Aquí tenemos algo genial, que simplifica enormemente la vida, cuando sabes cómo usarlo, por supuesto. Una persona sin experiencia inmediata puede ser difícil de entender. Pero tenemos que poner ese horario en una forma simple, se trata de una hora hombre.Además, también obtenemos las capacidades de configuración más profundas y la posibilidad de interacción con otros elementos del sistema.