Instalación y soporte
Arquitectura
La app es un cliente directo de la Data API de FileMaker: no hay ningún servidor intermedio de Esofitec entre el móvil y la solución de la empresa. Todo lo que hace la app son lecturas y escrituras sobre presentaciones API_* de la solución, más llamadas a guiones de FileMaker para lo que necesita lógica de servidor: validar al usuario, numerar documentos, enviar albaranes a a3ERP o generar PDF. Este artículo describe esa conexión, cómo se mantiene la sesión y qué presentaciones y guiones usa la app.
Conexión con FileMaker#
La base de datos se forma con el código de empresa que el usuario escribe al iniciar sesión, o el que trae la clave de activación: PRO-01-<código de empresa>. Con ese mismo código la app elige el servidor de FileMaker:
| Código de empresa | Servidor |
|---|---|
00000 |
Servidor de desarrollo |
| Los dos casos fijados en el código de la app: la cuenta de revisión de App Store y una empresa concreta | Servidor de preproducción |
| Cualquier otro | Servidor de producción |
La elección se hace igual en el inicio de sesión manual, en el automático al abrir la app, en la recuperación de contraseña y en la activación. Un código de empresa nuevo no necesita ningún cambio en la app: basta con que su base exista en el servidor de producción.
Sesión de la Data API#
La app se identifica ante la Data API con una cuenta de aplicación de FileMaker, la que viene dentro de la clave de activación. Con ella obtiene un token de sesión, lo guarda en el almacenamiento seguro del dispositivo y lo reutiliza:
- Antes de cada llamada comprueba que el token sigue siendo válido. Si FileMaker responde que no (HTTP 401), cierra esa sesión y pide un token nuevo.
- Cualquier otra respuesta a esa comprobación no cierra la sesión, y tampoco un fallo de la red al hacerla. Un error 5xx o una conexión que se corta significan que el servidor o la red tienen un problema, no que la sesión haya caducado, y abrir sesiones nuevas en ese momento solo empeoraría las cosas. La app avisa, por ejemplo con «El servidor no está disponible en este momento. Inténtalo más tarde.», y esa llamada se trata como si no hubiera conexión: se lee de la copia local y los cambios se encolan. Con mala cobertura es lo normal.
- Si FileMaker rechaza la petición de un token nuevo con un error 500, la app avisa de que no ha podido validar la sesión y pide cerrar sesión y volver a entrar. Lo mismo si, al enviar la cola de cambios pendientes, FileMaker responde con el error 952, que es el de token no válido.
- Al cerrar sesión desde la app, se cierra también la sesión de la Data API. Al abrir la app no se cierra nada: si el token guardado sigue siendo válido, se reutiliza.
Inicio de sesión del usuario#
La cuenta de aplicación solo da acceso a la Data API. Quien valida a la persona es el guion AuthApp, en la presentación API_PERSONAS, que recibe el usuario y la contraseña del formulario junto con la versión de la app, la IP pública y la IP local del dispositivo y, cuando la app ya lo conoce, el nombre de la empresa. Si las credenciales son buenas, devuelve los identificadores de la empresa, la persona, el usuario y el perfil, el NIF y la marca de aceptación del contrato.
Después de un inicio de sesión correcto, la app descarga la configuración (empresa, parámetros globales, perfil y secciones de las fichas) y los catálogos, y abre el calendario. Lo que pasa cuando algo falla está en Resolución de problemas.
Tiempos de espera y reintentos#
El tiempo de espera de cada petición es el parámetro global TIMEOUT_RED_APP, en segundos. Si está vacío vale 30, y la app lo limita a un mínimo de 5 y un máximo de 120. Como mucho hay seis peticiones en curso a la vez; el resto espera turno.
Las llamadas a guiones, las de la sesión y las lecturas directas de registros tienen además un reintento: el primer intento espera como mucho 8 segundos y, si falla o no ha respondido en ese tiempo, la app repite la llamada una vez forzando IPv4, ya con el tiempo de espera completo. Se añadió para las redes que anuncian IPv6 pero no lo encaminan bien, donde la conexión se quedaba colgada. Las búsquedas, las altas, los cambios y los borrados de registros y las subidas de ficheros no tienen ese reintento.
Un guion lento puede ejecutarse dos veces
El reintento no cancela la primera llamada. Si un guion tarda más de 8 segundos en responder, FileMaker lo ejecuta dos veces: la primera, que sigue en curso, y la del reintento. El envío de un albarán a a3ERP tarda entre 6 y 10 segundos en el servidor de desarrollo, así que puede llegar a repetirse. Además, la respuesta del reintento puede no ser la del guion. Si en un cliente aparecen documentos duplicados en a3ERP o planificaciones repetidas, esta es la primera causa que hay que descartar.
Los parámetros de los guiones viajan codificados, así que cualquier carácter de un texto libre, como #, & o +, llega tal cual a FileMaker.
Presentaciones que usa la app#
La app solo trabaja con presentaciones cuyo nombre empieza por API_. Si se cambia el nombre de una, se quita un campo de ella o se cambia su tipo, la app deja de leerlo o de poder escribirlo, normalmente sin ningún aviso al usuario.
| Ámbito | Presentaciones | Uso |
|---|---|---|
| Agenda y trabajo de campo | API_TAREAS, API_PLANIFICACIONES_TAREA, API_PARTES, API_SERVICIOS_PARTE, API_MATERIALES_PARTE, API_GASTOS_PARTE, API_TAREAS_PERSONAL, API_TAREAS_RECURSOS, API_TAREAS_ACTIVOS, API_TAREAS_MANTENIMIENTOS_ACTIVOS, API_MANTENIMIENTOS |
Lectura y escritura |
| Checklist, campos adicionales y documentos | API_CHECKLIST_PARTES, API_DATOS_CAMPOS_ADICIONALES, API_DOCUMENTACION |
Lectura y escritura |
| Facturación | API_CONCEPTOS_FACTURABLES, API_PRESUPUESTOS_ALBARANES, API_DETALLES_PRESUPUESTO |
Lectura y escritura |
| Fichas | API_CLIENTES, API_DIRECCIONES, API_ARTICULOS, API_PERSONAS, API_ACTIVOS |
Lectura y escritura |
| Configuración | API_EMPRESAS, API_SYS, API_SYS_CONFIGURACION_MOVIL, API_PERFILES, API_USUARIOS |
Lectura. La app solo escribe en API_SYS, las opciones del diálogo de impresión, y en API_USUARIOS, la aceptación del contrato |
| Registro de errores | API_LOG_ERRORES |
Alta. Ver Datos que registra la app |
| Ficheros | API_DOCUMENTACION_IMAGEN (campo contenedor DOCUMENTO) y API_GASTOS_PARTE_RECIBO (campo RECIBO) |
Subida de firmas, fotos, documentos y recibos |
| Catálogos | API_ACTIVIDADES, API_ALMACENES, API_CAMPOS_ADICIONALES, API_CARGOS, API_CATEGORIAS_PERSONAL, API_CHECKLIST_DEFINICION, API_CODIGOS_BARRAS, API_CONTACTOS, API_DEPARTAMENTOS, API_DOCUMENTOS_PAGO, API_ESTADOS, API_ETIQUETAS, API_FORMAS_PAGO, API_HORARIOS, API_INCIDENCIAS, API_PAISES, API_PERFILES_TIPO_HORA, API_PERIODOS_RENOVACION, API_PRIORIDADES, API_PROVINCIAS, API_PROYECTOS, API_PROYECTOS_PERSONAL, API_PROYECTOS_RECURSOS, API_RUTAS, API_SERIES, API_TARIFAS, API_TIPOS_ACTIVO, API_TIPOS_HORA, API_TIPOS_IMPACTO, API_TIPOS_INCIDENCIA, API_TIPOS_IVA, API_TIPOS_PARTE, API_TIPOS_PROYECTO, API_TIPOS_TAREA, API_TIPOS_TRABAJO, API_ZONAS |
Solo lectura |
Guiones que llama la app#
| Guion | Presentación | Para qué |
|---|---|---|
AuthApp |
API_PERSONAS |
Validar al usuario al iniciar sesión |
resetpwd |
TABLA_USUARIOS |
Recuperar la contraseña |
API_ObtenerValoresDefecto |
API_SYS |
Tipo de hora y tipo de trabajo por defecto de los servicios nuevos |
API_GuardarTarea |
API_TAREAS y TAREAS |
Numerar una tarea nueva |
API_NuevaPlanificacion |
API_PLANIFICACIONES_TAREA |
Crear una planificación. Sin conexión se encola |
API_GuardarParte |
API_PARTES y CONTADOR_PARTES |
Numerar un parte nuevo |
API_NuevoServicioMarcaje |
API_SERVICIOS_PARTE |
Crear el servicio de un marcaje. Sin conexión se encola |
API_GuardarServicioParte |
API_SERVICIOS_PARTE |
Recalcular los conceptos facturables de los servicios del parte |
API_GuardarEntidadParte |
API_CONCEPTOS_FACTURABLES y API_MATERIALES_PARTE |
Añadir un concepto o un material |
API_sumatoriaHorasParte |
FICHA_PARTE |
Sumar las horas de un parte |
API_GuardarDocumento |
API_DOCUMENTACION |
Crear un documento, una foto o una firma |
API_ObtenerDatosDocumentacion |
API_DOCUMENTACION |
Leer las imágenes y firmas de un registro |
API_ImprimirDocumento |
API_DOCUMENTACION y API_PARTES |
Generar el PDF de un documento |
API_ObtenerTotales |
API_PARTES y API_PRESUPUESTOS_ALBARANES |
Totales para imprimir el ticket |
API_CreaRegistrosDatosCamposAdicionales |
API_DATOS_CAMPOS_ADICIONALES |
Crear los campos adicionales o de checklist de un registro |
API_CalculaCamposCalculo |
API_DATOS_CAMPOS_ADICIONALES |
Recalcular los campos de cálculo |
API_GuardarPresupuesto |
API_PRESUPUESTOS_ALBARANES |
Numerar un presupuesto o un albarán |
API_guardarDocumentoPresupuestoAlbaran |
API_PRESUPUESTOS_ALBARANES |
Enviar un presupuesto o un albarán a a3ERP o a3FACTURA |
numeroAlbaranesPorLineaDesdePresupuestos |
API_PRESUPUESTOS_ALBARANES |
Enlazar las líneas de una certificación con sus albaranes |
API_getPriceFromA3ERP |
API_CONCEPTOS_FACTURABLES y API_PRESUPUESTOS_ALBARANES |
Pedir a a3ERP el precio de un artículo |
API_AlbaranTraspasoMaterial |
API_PARTES |
Traspasar el stock de un material del parte |
API_GuardarFicha |
API_CLIENTES, API_PERSONAS y API_ARTICULOS |
Numerar una ficha nueva o enviarla al ERP |
API_ActualizarCliente |
API_CLIENTES |
Actualizar el cliente desde un parte o una tarea |
API_BuscarRegistro |
API_CLIENTES y API_MANTENIMIENTOS |
Buscar un cliente o una dirección, o un mantenimiento |
Los detalles de la numeración y del envío al ERP están en Integración con a3ERP.