Herramientas de administración
Introducción. Modelo de BD
El modelo conceptual de las BBDD Ingrid sobre el motor de BD MongoDB está orientado a documentos dinámicos (asimilables a los 'registros' en SGBD relacionales), agrupados dentro de colecciones (asimilables a 'tablas' o conjuntos de ellas). Cada documento de BD tiene algunos campos fijos, con los que trabaja Ingrid, porque los tiene en cuenta para su funcionalidad, y luego una cantidad variable de campos dinámicos de los tipos de campos reconocidos por Ingrid.
Cada documento tiene unas relaciones compartidas con de los
Relación completa de los tipos de campos y como definirlos en Definición de campos.
En el menú de la aplicación, la definición de clases no tiene límite de niveles, y sirve sólo para indicar qué campos se deben mostrar jerárquicamente e incluso en qué orden, tanto en listas (columnas) como en formularios (páginas con un conjunto de campos a consultar o rellenar). Esta definición de campos -sólo visible y editable para administradores-, permite indicar cuáles son visibles en formularios, cuáles en listas, cuáles editables inicialmente, la vista por defecto...
Esquema cliente-servidor
El servidor de Ingrid está implementado en lenguaje multiplataforma nodeJs, y utiliza el motor de BD MongoDB. El cliente web está implementado, en ECMAscript y HTML5.
Las BD se encuentran en la misma máquina que la instalación de Ingrid que proporciona el servicio web, o distribuidas entre distintos servidores (por ejemplo para repartir la carga), sin importar donde, y no se garantiza su ubicación física.
El cliente no requiere ningún tipo de instalación ni permisos especiales de red local, sólo un navegador (soportados Chrome, Explorer y Firefox), y acceso a Internet para abrir una web. En los casos de las redes más protegidas que no permiten todo tipo de tráfico hacia el exterior, puede requerir la apertura de un puerto para comunicarse con Ingrid.
Los servidores de Ingra proporcionan unas condiciones con el siguiente nivel de servicio (SLA):
- Alta disponibilidad de servicio (99,8% del tiempo) en una empresa de alojamiento de reconocimiento mundial
- Proyectos alojados en al menos 3 servidores físicos en ubicaciones geográficas distintas (todas en Europa, lo que es importante por tema de protección de datos)
Seguridad:
- Comunicaciones encriptadas con SSL (mediante HTTPS) y WSS Websockets seguros
- Encriptación de datos sensibles dentro de cada proyecto, mediante AES-256 con clave privada SÓLO en el lado del cliente
- Backup cada dos horas de los datos de las bases y archivos del proyecto, con historial de modificaciones durante 6 meses
- Aplicaciones cliente cliente y servidora con librerías propias, lo que aumenta al dificultad de hackeo por código publicado
Rendimiento:
- Acceso a directorios de datos del servidor desde la propia aplicación
- Alta velocidad de entrada y salida en servidores dedicados de 1Gbps ancho de banda simétrico máximo (no garantizado en todo momento)
- Motor de BBDD mongoDb orientado a Big data
- Procedimientos, Informes y Descripciones Parámetricas en Javascript (Con traducción automática desde estándar FIEBDC)
- Conector con Visual Studio Code para depuración de Procedimientos, Informes y programas Paramétricos
- Modelo de datos con clases personalizables y ampliables por el usuario desde el interface
- Control de obra con mensajería mediante TELEGRAM (con envío de multimedia y seguimiento GPS en tiempo real con almacenamiento de las rutas)
Definición de Campos
El administrador de BD, pulsando el botón Admin, puede acceder en una clase (conceptos cuyo código comienza con punto) a la persiana <Nombre_de_la_clase> > Campos y crear en ella campos de los tipos que permite Ingrid en las clases predefinidas por la aplicación. También modificar los existentes predefinidos (con chincheta verde a la derecha), excepto el Código y Tipo, y (Tamaño del campo Tipo). El Tamaño del campo Tipo (es decir, la forma de visualizar los datos), es modificable excepto en los campos de tipo referencia (>), cuyo Tamaño es la Clase. También se pueden crear nuevas clases de conceptos completas para propósitos específicos, con los campos que se desee.
Base de ejemplo: test-campos
IMPORTANTE: todas las herramientas definidas en estas columnas se aplican tanto a definición de los campos de interface en el modelo de datos de las clases, como a parámetros de informes, pero NO todos los tipos de campos se pueden usar como parámetros de informes, y algunas herramientas para parámetros no tienen sentido en campos de BD. En cada caso se indicará si se aplica a campos, parámetros o ambos.
Al abrir cada proyecto, se chequean todos los campos, para comprobar que la estructura del modelo de datos, aunque sea un proyecto muy antiguo, es consistente con la estructura de la aplicación actual.
En la parte superior derecha de la lista de campos, además de los botones estándar de listas (el nº de líneas, un enlace contextual a la ayuda y el volcado de la tabla a un archivo de texto en formato .CSV para abrir en Excel), si hemos hecho algún cambio en los campos con respecto al modelo fijado en Ingrid (y se trata de una clase estándar) o bien si los datos que teníamos no coinciden con el modelo de datos actual al abrir la aplicación, se muestra un icono Pone campos de defecto en la tabla actual para indicar que hay diferencias y en la lista se muestran en color rojo las diferencias.
Pulsando el botón, podemos recuperar el estado estándar actual y los campos sobrantes se guardarán en una sección 'Particulares' al final.
Código
Restricciones a los identificadores de DB: Sólo se admiten: caracteres ASCII de 0-9, a-z, A-Z y los 9 símbolos
!#$%&@-._, también se admite el espacio en blanco, aunque no se recomienda
en absoluto, porque puede complicar las ordenaciones, búsquedas...
Esta limitación viene menos dada por el motor de BD mongoDB -que admite casi
cualquier carácter-, que por los nombres de archivos Windows, dado que los
códigos o _id de concepto se utilizan muchas veces como nombre de archivo
para generar webs, exportaciones...
Tipo
Permite definir el tipo de dato que se almacena en cada campo (número, cadena de caracteres, identificador...) y el formato que se va a dar al contenido de cada campo. Por ejemplo, un real almacenado 2222.1234 se puede mostrar como '2222' (sin decimales) o 2.222,12 (con 2 decimales, no significa que se redondee, y además se usa la notación decimal española, no la que está almacenada en BD).
El campo Tipo, contiene dos datos separados por un espacio en blanco: Tipo y Tamaño. En el tipo referencia a concepto '>', además hay que especificar detrás una clase.
En cualquier momento se puede cambiar el tipo de visualización, por ejemplo, cambiar un campo real de 2 a 3 decimales: de 'r 2' a 'r 3', pero además se puede cambiar el contenido de los campos de BD en función del tipo, con la opción del menú contextual de la línea: Cambia tipo de campo. Se puede ver cómo en la sección de Cambio de tipo.
En la base de ejemplo test-campos, el concepto campos.001 es una muestra de uso de todos los tipos. En la pista del botón de cabecera del campo, hay un recordatorio de las abreviaturas.
De todos estos sólo se pueden usar unos pocos como parámetros de procedimientos (entero, real, ref. a concepto, ref. a clasificación, fecha, date, hora, mapas...).
NUMÉRICOS
- Booleano simple: b(null|1✔). tamaños: 0(null|0✘) *1-defecto-(null|1✔) 2(null|1✔|2✘)
- Booleano múltiple: bc(check) br(radio) bp(push); Los campos Resumen y Pista,
admiten una lista de valores separados por barras | , para las opciones.
-
Entero: e, tamaño 2, muestra los controles de
incremental)
- Real: r, (seguido del nº de
decimales a visualizar)
FECHAS
- Fecha: f (d/m/a)
· tamaño= -2 se rotula
e introduce en formato
ISO AAAA-MM-DD (que admite incompletas AAAA y AAAA-MM)
· tamaño= 1 rotula la semana a la derecha del
campo.
· tamaño= 4 rotula sólo fecha en los fecha-hora.
- FechaHora: fh
(d/m/a h:m:s) Hora: h(h:m:s) DiaMes: dm(d/m) MesAño: ma(m/a)
-
F Date ISO: d Este campo
es un objeto con diversas partes de información: fecha, hora,
meridiano de referencia relativo a la hora “zero” (Greenwich)..., si
se imprime.
Es un dato que almacena fecha+hora y se guarda internamente con el
estándar ISO AAAA-MM-DDThh:mm:ss.mmmZ con 3 dígitos de milisegundos.
Externamente, los campos se rotulan como: AAAA-MM-DD hh:mm:ss
y se introducen como un número real formato AAAAMMDD.hhmmss,
que admite datos incompletos; por ejemplo, sólo con la fecha pone la hora
00:00:00. El separador entre fecha y hora puede ser un espacio en blanco,
dos puntos (:) o el punto (.)
ALFANUMÉRICOS
- Texto:
· t (texto monollínea) ancho
por defecto: 62%. Otros tamaños:
2 medio, de un 38% del ancho
de la ventana
1
corto, del 23% del ancho
· tm (texto multilinea)
ancho por defecto: 100%. Otros tamaños:
3 normal, de un 62% del ancho
2 medio, de un 38% del ancho
1
corto, del 23% del ancho
· tp (password,
caracteres ocultos). Posibilidad de visibilizarlos con el botón a la derecha
· tc (código
Javascript multilínea)
- Color: col (formato AARRGGBB hexadecimal,
siendo los 2 primeros caracteres del canal alfa, para la semi-transparencia)
Con
botones de acción para acceder:
- Dirección de internet: web
- E-mail: cor
- Dirección geográfica: dir
- Posición geográfica: pos
- Vista geográfica en Google streetview: vis
- Teléfono: tel
- Referencia a concepto: >
enlace con un concepto de la clase especificada a continuación.
Detrás, en tamaño, el formato de visualización (icono · clase · código ·
resumen, como 1234), es decir, para ver iconos y descripciones de conceptos
clase carpeta, sería: '> car 14'.
- Clasificación: # (presenta una persiana para la definición de la lista de valores)
Códigos con cálculo (el dato se muestra en color rojo si son incorrectos):
- dni
- cif
- visa
- iban (Admite 3 opciones:
· cuenta
bancaria de 20 dígitos
· código IBAN completo
· prefijo de país, dos interrogantes (??) y cuenta de 20 dígitos para
calcular el código IBAN
ESPECIALES
- Relaciones: >> (definición de subtabla auxiliar, interna sólo de la
clase). Presenta una subpersiana al mismo nivel que la de definición de
campos. Puede ser de dos tipos:
· Una lista de relaciones a otros conceptos
(en cuyo caso hay que poner en el campo Clase, el
código de la misma).
· Una lista de registros, que
no van a ser conceptos de BD, con
los campos que se quiera, sin identificador.
- Expresiones: * (campos con {campo}Lee definido en eventos)
- Json: j (sub-objeto) y jm
(multilínea)
- Firma dibujada: firma (almacena de forma
vectorial líneas poligonales con todos los puntos no co-lineales a la escala
visible. Ocupa 360 veces menos que el
almacenamiento bitmap (y permite trazar con distintos gruesos, por
ejemplo).
- Archivo de
audio .mp3: audio (incluye controles de
reproducción)
- Archivo de vídeo .mp4: video
(incluye controles de reproducción)
Los campos se
pueden agrupar en secciones (un rótulo)
y en persianas (convertibles en pestañas,
como siempre haciendo CONTROL+clic sobre el nombre). Para ello se crea un
campo con descripción pero sin código. Si se quiere que sea una persiana, se
puede poner un nivel en la columna Tamaño,
por ejemplo 2.
Modificadores
Los valores tras la
letras del modificador indican el valor de defecto, o sea, f es igual que f1.
Permite gestionar la apariencia,
visualización o no y la funcionalidad del
campo cuando aparece en distintos componentes de una página:
- f1,
mostrar el campo en la ficha de concepto
- t1, mostrar como columna en tablas (lista de conceptos)
- h1, mostrar en el historial
- b1, mostrar en los formularios de búsqueda
general de su clase
- i1, considerar imprimible el campo cuando se
utilizan informes con funciones que tienen en cuenta ese valor, así se puede
personalizar qué datos aparecen en el informe de ficha o lista.
- r1, mostrar en la persiana Referencias del concepto al que apunta. para campos de Tipo referencia (>). Se muestra en la página
del concepto al que apunta, como una lista o tabla de conceptos que hacen
referencia a aquel.
Ejemplo completo de uso en la Base de ejemplo: test-referencias.
r0 oculta la persiana de referencias en la ficha de clase a la que apunta,
r1 la muestra sin edición (excepto para usuarios admin y G1), r2 la muestra
editable y r3 la muestra 'insertable' (se pueden añadir líneas).
ATENCIÓN: Si en un campo de tipo referencia se pone el
modificador r0 para que los objetos de esa clase NO aparezcan en la
persiana de referencias de los que apuntan, hay que recalcular las
referencias de la base, porque no se hacen en tiempo real. Lo puede
hacer un administrador en modo admin, desde el botón Menú > Base >
General > Procedimientos > Cuenta referencias.
- p0,
mantener la posición original al redefinir un campo de una superclase en una
clase. Los campos se redefinen para cambiarlos la clase, forma de
visualización, o posición respecto a los otros campos.
- c0, permite rotular
los valores 0 en los campos numéricos (los ceros numéricos se guardan en BD,
pero por defecto no se visualizan)
- o0, oculto por defecto en tablas
(listas). El campo con o1 se mostrará seleccionable para visualizar en el
menú contextual de cabecera de las listas, pero no aparece inicialmente, ni
tampoco al seleccionar la opciónPresenta defecto
del menú contextual.
- T0 Trazabilidad: está pensado para campos de tipo fecha o fecha-hora,
que marcarán el hito de cierre de un bloque de campos seguidos y que suponen
una fase documental. Los posibles valores:
- T1, oculta campos siguientes y
al procesar, bloquea (quita edición) campos hasta el anterior campo traza.
La acción de pulsar el botón (con el nombre que se haya definido) introduce
el valor de la fecha y hora actual.
- T2, oculta campos anteriores y
bloquea el flujo de trazas, no continúa con las siguientes, sirve para
interrumpir el proceso documental.
- T5, es la traza modo 1 pero permite
edición del dato: se introduce la fecha tecleando, o con la máscara punto
(.) que introduce la actual, no es automático.
- T6, lo mismo (campo
editable) para traza modo 2.
Sólo a los usuarios del grupo expertos (g1) les aparece en cada hito cerrado un botón Retroceder para deshacer consecutivamente los cierres en caso de que haya que modificar los datos.
Resumiendo el funcionamiento de las trazas de modo 1 y 2:
modo1! modo1!! sin dato, con dato. Sin dato oculta posteriores, con dato no edita anteriores
R! Re Rv R! Re Rv sin Restricciones, restric. de edición, restric. de visualización
e v - v v - campos anteriores (editable, visible o no visible)
e - - e v - campo traza
- - - e e e campos posteriores
modo2! modo2!! sin dato, con dato. Sin dato no hace nada, con dato bloquea ant. y oculta post.
R! Re Rv R! Re Rv sin Restricciones, restric. de edición, restric. de visualización
e e e v v - campos anteriores
e - - e v - campo traza
e e e - - - campos posteriores
El grupo de usuarios que no tenga restricciones y pueda editar cada hito, también puede en caso de error, volver atrás con el botón que aparece al lado del campo, hasta el hito anterior.
IMPORTANTE! esto puede dar lugar a
situaciones en las que un usuario "interfiera" en la edición de otro que
está modificando el hito siguiente. Por ejemplo:
> un operario rellena su
parte y lo cierra
> el inspector lo tiene para inspeccionar y toma alguna
nota, pero no lo cierra
> el operario se da cuenta de un error y lo abre
en ese momento el inspector vuelve a entrar para cerrarlo, pero se lo
encuentra en estado "pendiente de cerrar por el operario", no tiene acceso
momentáneamente a los datos que introdujo, ni le aparece como pendiente de
inspeccionar hasta que el operario no la cierre de nuevo.
- M0, campos múltiples en referencias a conceptos o clasificaciones
(tipos s, #, >) permiten hacer referencia a varios conceptos, aunque sólo
se muestra en _id en el campo, no el resumen.
- E0, campo encriptado a
través de una
clave de cifrado
- a, alineación (0 izq, 1 centro, 2 der), el
defecto depende del tipo de campo. Por ejemplo: textos a izquierda, enteros
y reales a derecha...
- e, establece la editabilidad, heredada de los
permisos que tenga el usuario para la clase.
- d refresca el
campo/línea/tabla/ventana cuando cambia. Útil para cuando se programan
campos evento dependientes de este campo, al cambiar debe refrescarse la
línea o la tabla para actualizar los campos con evento.
Restricciones
Permite especificar para cada campo una lista de códigos de grupos de usuarios (como g1, g2...), seguidos por dos puntos (:) y una restricción L(lectura) o E(edición) y separados por espacios en blanco, como: g5:E g6:L
Se usan habitualmente en combinación con los modos T de traza, y la restricción consiste en que los usuarios de esos grupos no puedan editar o ni siquiera ver el campo.
Unidad de medida
Un simple rótulo para documentar la unidad en las que se miden las cantidades del campo
Abreviatura
Rótulo que se imprimirá en tablas, para que los nombres largos de campos no hagan columnas muy anchas
Convertir un tipo de campo en otro
Con la opción del menú contextual Cambia tipo de campo sobre una línea de definición de campo, se puede aplicar el cambio mediante un diálogo que permite pasar de los 7 tipos básicos de información a cualquiera de los otros 6.
Estos tipos son: (s)elección, (>)referencia a concepto, (#)clasificación, (e)ntero, (r)eal, (t)exto y (j)son
El resto de formatos son internamente de uno estos tipos básicos, por ejemplo:
- Un booleano es un 1 ó 0 pero se guarda con un dato nº entero. Es el formato el que muestra un tick color verde o un aspa roja en vez de un número.
- De forma similar, una referencia a un concepto se guarda como una cadena de caracteres con la clase y el código, como "car.C01", en este caso el tipo de campo indica que hay que interpretarlo y editarlo como una referencia a concepto.
- Otro ejemplo, las fechas se guardan como enteros con formato AAAAMMDD (como 20181222), y los datos fechaHora como reales (20181222.234505).
El cuadro de posibles combinaciones, enlazado a continuación, explica qué efecto produce cada conversión:
Definición de Campos. SÓLO parámetros de procedimientos
Hay otras columnas en la definición de campos que SÓLO SON APLICABLES A CAMPOS DEFINIDOS COMO Parámetros de procedimientos, no se aplican a los de una ficha o lista de conceptos:
Modificadores
- m1, memorizar contenido en la instancia del navegador; por defecto se guarda el último valor introducido en un parámetro de informe para usarlo las siguientes veces que lo ejecutemos. Si algún parámetro no se quiere guardar, por ejemplo una fecha que siempre cambia, hay que poner m0.
Búsqueda
Permite establecer una condición para filtrar los valores que se presentarán en los campos de tipo referencia a concepto cuando se utiliza la herramienta 'buscar todo', es decir, teclear una máscara punto (.) o hacer clic en el icono de la clase de concepto referencia. Por ejemplo, si hace referencia a la clase espacio (> esp), con una búsqueda como 'cla=espzon' nos mostrará para elegir en un diálogo sólo los de una subclase zona, no todos. Es una ayuda que no se aplica al poner una máscara por _id o resumen, ni tampoco al teclear explícitamente el _id de un espacio de otra clase, si queremos introducirlo a propósito.
Valor por defecto
Valor que consideramos habitual y que se puede recuperar en todos los parámetros de golpe, con el botón de la esquina superior derecha de la persiana Parámetros: Pone parámetros por defecto
Marca de agua
Muestra le texto difuminado para dar información sobre el contenido que hay que poner en el campo o el valor de defecto que contiene. Se puede introducir el dato encima de él.
Ayuda en pista
Texto de ayuda rápida y breve de uso del campo o parámetro. Cuando se pone, aparece junto al nombre del campo un punto central (·) indicando que al ponerse encima del nombre aparece un tip.
Ayuda en url
Ayuda más extensa que la pista, es una página propia de la ayuda en línea y el usuario no puede editarla, es documentación de la aplicación para campos predefinidos. Se indica una dirección url absoluta con lo que aparece junto al campo un icono de ayuda, que abre la documentación al pie de la página.
Procesa
Permite especificar un código javascript que se ejecuta dentro de una función function (bas, pro) { ... } para cargar un valor o bien ocultar un parámetro, ya que está hecho para que cuando sea el resultado sea indefinido (undefined), no se muestre.
Por ejemplo, en el informe común pro.pre.exporta, en el
campo en qeu se indica el nº de certificación con el que ejecutar el
informe, se define el código JS: if (bas.cab.cerl) return ingrid.memoria.cera||bas.cab.cerl.length
que comprueba si hay definidas certificaciones, y pone en el parámetro la guardada en memoria al usarlo la última vez o bien la última certificación definida.
Observaciones
Un texto opcional para documentación interna y comentarios del administrador de BD en cada campo
Campo Estilo de concepto
La representación como icono de cualquier concepto de BD, se hace inicialmente en la clase a la que pertenece. En el campo Estilo de esa clase, se guarda la representación del icono de conceptos para las listas y la propia ficha, y también para la representación de capa geográfica en el mapa (que puede ser un icono para un objeto puntual, una línea abierta o una superficie cerrada con relleno).
Además se puede especificar un estilo de representación en el mapa que debería ser (y suele serlo) igual que el icono de clase de conceptos, pero no para algunas excepciones ni para elementos lineales o superficiales, por ejemplo.
Se puede ver la especificación completa y ejemplos de uso en Anexo. Estilos de conceptos y capas.
Eventos
En cada clase, el administrador puede definir dentro de esta persiana, una lista de funciones que se ejecutan cada vez que se produce un evento del tipo: leer o modificar un campo, crear o eliminar un objeto de la clase actual, hacer login en la base...
Tenemos la especificación completa, ejemplos y herramientas de desarrollo en Anexo eventos javascript.
Directorios comprimidos
El servidor de archivos permite en una ruta dada, tener comprimidos todos los archivos de un directorio (incluidos subdirectorios) con el mismo nombre y extensión .zip (no .rar). El acceso a todos los archivos será transparente, como si estuviera descomprimido. Siempre recomendado construir el archivo zip sin compresión para un acceso más rápido.
Limitación: los nombres de archivos se buscan exactos distinguiendo
mayúsculas de minúsculas, es decir, si teníamos un directorio \mapas\nivel1
dentro del directorio de la base, con 25.000 archivos, y los comprimimos en
uno \mapas\nivel1.zip, sin comprimir admitía buscar, por ejemplo, un archivo https://ingra.es/mapas/nivel1/F003.21.11.png
aunque estuviese grabado con el nombre F003.21.11.PNG
,
pero comprimido no se encontraría.