====== Ámbitos: quién ve qué ======
//La misma aplicación, la misma versión y la misma base de datos, pero cada
instalación —y si hace falta cada usuario— con sus formularios, su menú y sus
informes. Eso son los ámbitos.//
Lo que se configura por ámbito son hoy tres cosas, y las tres funcionan igual:
^ Qué se configura ^ Tabla ^ Quién elige la fila ^ Página ^
| El layout de una ficha de edición | ''PWA_FORMS'' | ''PWA_GET_FORM'' | [[pwa:doc:Documentación diseño de formularios en SmartPWA|Diseño de formularios]] |
| El menú de la aplicación | ''PWA_MENUS'' | ''PWA_GET_MENU'' | [[pwa:doc:Documentación diseño de menús en SmartPWA|Diseño del menú]] |
| El diseño de informe de una consulta | ''PWA_INFORMES'' | ''PWA_GET_INFORME'' | |
===== La clave: qué distingue una definición de otra =====
Las tres tablas llevan los mismos tres campos en su clave primaria, detrás de
lo que identifica el objeto (''COD_FORM'', ''COD_MENU'' o ''COD_PROC''):
^ Campo ^ Qué lleva ^
| ''TIPO_AMBITO'' | ''US'' un usuario, ''CI'' una clave de instalación o de grupo, ''G'' la definición general |
| ''COD_AMBITO'' | el código del usuario o la clave, según el tipo |
| ''CLAVE_INSTALACION'' | la instalación del usuario; solo se rellena en las de tipo ''US'' |
Los campos que no aplican **no se dejan en blanco: llevan el comodín ''*''**.
Forman parte de la clave primaria, y una clave con un hueco vacío no se puede
guardar. La aplicación los rellena sola cuando se crea la definición desde la
pantalla de listado.
Solo hay tres tipos de ámbito para cinco niveles de precedencia, porque
dos pares comparten fila: una definición ''US'' vale para el usuario y para
quien herede de él, y una ''CI'' vale para la clave de instalación y para la
del grupo. Lo que cambia es contra qué valor casa ''COD_AMBITO'', no cómo se
guarda la fila.
===== Las cinco precedencias =====
Cuando la aplicación necesita un layout, un menú o un informe, el procedimiento
''PWA_GET_*'' busca en este orden y **se queda con el primero que exista**:
^ # ^ Tipo ^ ''COD_AMBITO'' casa con ^ Para qué se usa ^
| 1 | ''US'' | el usuario conectado | el caso raro: una pantalla a medida de una persona |
| 2 | ''US'' | ''USUARIO.USUARIO_MENUS'' del conectado | un usuario hereda la configuración de otro, así no se repite |
| 3 | ''CI'' | ''EMPRESA.CLAVE_INSTALACION'' (tres caracteres) | lo normal: lo propio de un cliente |
| 4 | ''CI'' | ''EMPRESA.CLAVE_INSTALACION_GRUPO'' (cuatro caracteres) | lo común a un grupo de instalaciones |
| 5 | ''G'' | — | la definición general, la que vale para todos |
Las claves de instalación tienen **tres** caracteres y las de grupo **cuatro**,
así que nunca se confunden aunque compartan campo. El censo de instalaciones,
con sus claves, está en ''Z_LICENCIAS'', y la clave de la empresa en la que se
trabaja sale de ''EMPRESA''.
==== Por qué las de usuario llevan además la instalación ====
El mismo código de usuario existe en varias empresas —hay un ''JUANMA'' en cada
una— y los scripts de mantenimiento se aplican a todas. Sin la clave de
instalación, la definición del usuario de un cliente le caería encima al
usuario homónimo de otro. Por eso, en las filas ''US'', ''CLAVE_INSTALACION''
es obligatoria y la aplicación no deja crearlas sin ella.
===== La regla que hay que tener presente =====
Cada definición describe el objeto **entero**, no un parche
sobre el general.
Una instalación con su propio layout de albarán tiene //todo// el layout del
albarán; una con su propio menú tiene //todo// el menú. La consecuencia:
* **lo que se añade al general no llega a quien tiene lo suyo**. Una pestaña nueva en el formulario general de cliente no la verá la instalación que se hizo el suyo hace seis meses;
* y por eso conviene tener pocos ámbitos propios, y crearlos **copiando el general** para partir de lo mismo.
La pantalla de menús trae para esto la opción **Comparar con el general**, que
dice qué opciones tiene el general y a este ámbito le faltan. Es lo primero que
hay que mirar cuando alguien dice «a mí no me sale eso que habéis puesto».
===== Cómo se crea una definición para un ámbito =====
Desde la aplicación, en el listado correspondiente —**Formularios**, **Menús**
o **Diseños de informe**— con el botón de nuevo registro. Se piden solo el
código del objeto y el ámbito; los comodines los pone la aplicación:
- **COD_FORM / COD_MENU / COD_PROC**: qué pantalla, qué menú o qué consulta.
- **TIPO_AMBITO**: ''US'', ''CI'' o ''G''.
- **COD_AMBITO**: el usuario o la clave. En la general se deja vacío: se guarda el comodín.
- **CLAVE_INSTALACION**: solo si el tipo es ''US''.
La aplicación comprueba lo que no puede salir bien y lo dice con estas mismas
palabras:
* //«El tipo de ámbito debe ser US, CI o G.»//
* //«Los ámbitos distintos del general necesitan el usuario o la clave de instalación.»//
* //«Las definiciones de usuario necesitan la clave de instalación: el mismo código de usuario existe en varias empresas.»//
Recién creada, la definición está **vacía**: hay que pegarle el texto del
general (o el de otra instalación parecida) y quitarle lo que no aplique. En
los menús ese paso es una sola opción: **Copiar a otro ámbito**, desde la
definición que sirve de origen.
==== Saber cuál se está aplicando ====
La barra de título de las pantallas de edición lo dice: //«Formulario
albaran-venta-edit · Usuario JUANMA (026)»//, //«· Clave de instalación 026»// o
//«· General»//. Es la manera rápida de comprobar que se está tocando la
definición que se cree.
===== Llevar un ámbito a otra base de datos =====
Los ámbitos viven en la base de datos de cada cliente, así que un cambio hecho
aquí no viaja solo. Las pantallas de formularios y de menús traen:
* **Copiar script de actualización**: deja en el portapapeles el ''UPDATE OR INSERT'' de esta definición.
* **Descargar script (.sql)**: lo mismo en un archivo.
Ese script es idempotente —se puede ejecutar las veces que haga falta— y es lo
que se incorpora a la base del cliente por la vía de siempre. Las definiciones
**generales** están además versionadas en el repositorio
(''db/pwa_forms_layouts.sql'', ''db/pwa_menus_datos.sql''), que es de donde
salen para todos los clientes; las de instalación o de usuario, al ser de uno
solo, no se versionan ahí.
===== Consejos =====
* **Empezar siempre por el general.** Si algo tiene que verlo todo el mundo, va al general; un ámbito propio es la excepción, no el punto de partida.
* **Preferir ''CI'' a ''US''.** Lo que necesita un usuario suele necesitarlo su puesto, no su persona; y un ámbito de usuario es uno que nadie recuerda que existe cuando algo no sale.
* **Usar el grupo** cuando varias instalaciones del mismo cliente comparten manera de trabajar: una fila en vez de cinco.
* **No dejar definiciones vacías.** Una fila creada y sin texto es una definición que gana al general y no enseña nada; si se crea por error, se borra.
* **Al añadir algo al general, repasar quién tiene lo suyo**, con la comparación de menús o mirando las filas de esa pantalla en ''PWA_FORMS''.
===== Cómo se mantiene esta página =====
^ Qué ^ Dónde ^
| Tipos de ámbito, comodín y descripciones | ''projects/smart-core/src/lib/utilidades/pwa-forms.ts'' |
| Lectura del layout por ámbito | ''projects/smart-core/src/lib/servicios/form-layout.service.ts'' |
| Lectura del menú por ámbito | ''projects/smart-core/src/lib/servicios/menu.service.ts'' |
| Alta de definiciones con sus comprobaciones | ''projects/smart-core/paginas/src/lib/tabla-list-wrap/'' |
| Copiar a otro ámbito y comparar con el general | ''projects/smart-core/paginas/src/lib/pwa-menu-edit/'' |
| Procedimientos ''PWA_GET_FORM'', ''PWA_GET_MENU'', ''PWA_GET_INFORME'' | ''db/pwa_forms_procs.sql'', ''db/pwa_menus_procs.sql'', ''db/pwa_informes_procs.sql'' |