ADMIN – ADministración de MantenImieNtos – Últimas mejoras

Logo ADMINLos sistemas empresariales requieren de un completo seguimiento y actualización en base a la retroalimentación generada por sus usuarios buscando facilitar y mejorar la productividad en el trabajo día a día. Es por ello que para nosotros resulta prioritario escuchar a nuestros clientes para que el sistema ADMIN siga creciendo aumentando su valor para cada uno de sus usuarios.

Durante los últimos meses hemos estado en una etapa de optimización y mejoras que nos ha permitido enriquecer el sistema ADMIN. Destacan las siguientes mejoras:

Mejoras generales

  • Carga de fotografías: se registra y visualiza la fecha original de la fotografía, y la  marca y el modelo de la cámara utilizada.
  • Optimización de varias pantallas para su uso con dispositivos móviles (se reemplazan varias tablas por listas responsive para eliminar el scroll horizontal).
  • Mejora en la visualización de números en campos de escritura (se agrupa la parte entera del número en bloques de 3 dígitos).

VisualizacionDigitos

  • Órdenes de servicio: se añade la hora a la fecha de ejecución prevista.
  • Duración prevista: para facilitar la planificación, tanto las supervisiones como las órdenes de servicio cuentan con el campo duración prevista.
  • Listado de ubicaciones: se añade la opción de buscar entre las ubicaciones principales.
  • Proyectos: se añade a cada proyecto un monto límite para realizar un seguimiento controlado del total de las órdenes de servicio incluídas en el proyecto.
  • Impresión: se mejora la visualización de la impresión de pantallas del sistema.

Mejoras herramientas productividad

  • Notificaciones: nueva notificación órdenes de servicio sin finalizar (asociadas al colaborador del usuario actual).
  • Calendario: se añade una barra de avance para visualizar rápidamente el estado de los trabajos. Se visualizan los días feriados.
  • Tareas: ahora es posible asignar varios usuarios a una misma tarea, y definir tareas periódicas. Además, se han añadido campos de búsqueda en el listado de tareas.

Tareas busqueda

Nuevos reportes

  • Evolución evaluaciones proveedores: las órdenes de servicio y las supervisiones de instalciones se evalúan al finalizarlas, este reporte nos muestra visualmente la evolucuión de estas evaluaciones para cada cliente.

Reporte evolución cumplientos

  • Trabajos realizados:  listado de órdenes de servicio y supervisiones planificadas para un periodo de tiempo con su información.

Reporte trabajos realzados

Además, como siempre, se han realizado pequeñas mejoras visuales en varias pantallas.

ADMIN – ADministración de ManenImieNtos – Novedades y vídeo

Durante las últimas semanas hemos añadido nuevas funcionalidades al sistema ADMIN – ADministración de MantenImieNtos, principalmente:

  • Registro y seguimiento de cotizaciones.
  • Usuarios para proveedores: acceso para proveedores al sistema (sólo pueden ver su información, sus órdenes de servicio, sus cotizaciones…).

Además, hemos podido realizar varias optimizaciones que mejoran el tiempo de respuesta del sistema, hemos reducido el número de pantallas manteniendo la funcionalidad, y pequeñas mejoras visuales en varias pantallas.

A continuación puede verse un vídeo mostrando la funcionalidad del sistema:

Si desea más información sobre ADMIN haga clic aquí.

Administración de Mantenimientos – Presupuesto

Para ayudar en la planificación necesitamos poder realizar una estimación del presupuesto necesario para la ejecución de nuestro plan de mantenimientos.

Hemos desarrollado una nueva funcionalidad en nuestro Sistema de Administración de Mantenimientos (ADMIN) donde generar y y dar seguimiento al cumplimiento presupuestario.

Estimación costo de los mantenimientos por tipo de activo:

  • Tipos de activos: asigne un costo estimado anual para sus mantenimientos.
presupuesto_01_tipoactivo
Tipo activo: definición costo anual mantenimiento

Generación del presupuesto:

  • A partir del número de activos de cada tipo incluidos en el sistema (con el indicador de que reciben mantenimientos) se genera un presupuesto partiendo de una fecha de inicio y un número de meses (el número de activos de cada tipo puede modificarse si se tiene planificado comprar o retirar alguno).
  • Se puede generar presupuestos filtrando por compañías y/o centros de costo.
presupuesto_02_generacion
Presupuesto – Generación

Seguimiento del presupuesto:

  • Al visualizar un presupuesto se obtiene y compara con el gasto real (manteniendo sus condiciones).
  • Además puede verse en la misma pantalla el listado de órdenes de servicio generadas durante el periodo del presupuesto.
presupuesto_03_seguimiento
Presupuesto – Seguimiento

Cada usuario puede generar tantos presupuestos como considere oportuno, y sólo el usuario que lo crea puede eliminarlo.

Migrando de Grails 2.5.5 a Grails 3.2.4

Para evitar seguir acumulando deuda técnica decidimos que ya era el momento para migrar nuestro sistema ADMIN – Administración de Mantenimientos a la última versión disponible de Grails (3.2.4).

El cambio interno y externo de Grails 2 a Grails 3 ha sido grande, modificando incluso la estructura de la aplicación. En Grails 3.2.4 destacan las siguientes tecnologías:

  • Spring 4.3.1 (MVC, seguridad)
  • Hibernate 5.1.1 (por debajo de GORM 6)
  • Spring Boot 1.4.0
  • Gradle 3.0

Vamos a compartir los pasos que hemos seguido durante este proceso.

Seguir los pasos de la documentación

Detalla muy bien la nueva estructura de la aplicación, ayudando a mover todos los archivos. (Grails guide chapter Upgrading)

Resolver problemas de memoria

Inicialmente no podíamos ni compilar la aplicación, necesitamos otorgar más recursos tanto a la propia aplicación como al demonio de Gradle, para ello en el build.gradle se puede añadir al final:

tasks.withType(GroovyCompile) {
configure(groovyOptions.forkOptions) {
memoryMaximumSize = '1g'
jvmArgs = ['-XX:MaxPermSize=512m', '-Xms512m', '-Xmx1g']
}
}

Fuente: Gradle groovy compile and out of memory error

Logs

Ha pasado de utilizar Log4j a Logback. El único cambio que hemos realizado ha sido añadir una línea al archivo de configuración …/grails-app/conf/logback.groovy dentro del bloque definido para el entorno de desarrollo:

logger("com.jpicadoyasociados", INFO)

Spring Security Core Plugin

Para seguir utilizando el mismo esquema para el control de acceso y la administración de la seguridad, hay que realizar algunos cambios detallados en su guía (Spring Security Core Plugin – Reference Documentation)

  • Cambiar los nombres de los campos en el formulario de login y debe llamar a /login/authenticate.
  • Si se está utilizando interceptUrlMap ahora se debe definir como un array de arrays:
grails.plugin.springsecurity.interceptUrlMap = [
[pattern: '/secure/someAction', access: ["hasRole('ROLE_ADMIN')"]],
[pattern: '/secure/someOtherAction', access: ["authentication.name == 'ralph'"]]
]

Controles AJAX

Ya no están incluidos por defecto en Grails (formRemote, submitToRemote, etc.). Se pueden añadir como un plugin. Se decidió deprecarlos porque no siguen las mejores prácticas (añaden javaScript inline en el HTML).

Para tenerlos de nuevo disponibles basta con añadir la siguiente dependencia:

compile 'org.grails.plugins:ajax-tags:1.0.0'

Fuente: Grails 3.0 Ajax call replacement due to deprecation

Scaffolding

Se ha modificado la declaración en los controladores de que se debe generar dinámicamente el CRUD de la clase de dominio, ahora utiliza el siguiente formato:

class UbicacionRegistroMovimientoController {
 static scaffold = UbicacionRegistroMovimiento

Ahora el scaffolding de Grails utiliza el Fields plugin, y no genera en las vistas el código para cada uno de los atributos de la clase de dominio (Fields se encarga de ello).

Fields plugin

Queremos utilizar Bootstrap en las pantallas, manteniendo los estilos ya definidos y utilizados en la aplicación, para es necesario modificar las plantillas del plugin.

Puede definirse la plantilla ../grails-app/views/templates/_fields/_table.gsp para modificar la tabla con el listado de objetos que se genera en:

<f:table collection="\${${propertyName}List}" />

Puede definirse la plantilla ../grails-app/views/templates/_fields/_list.gsp para modificar como se visualiza el listado de atributos generado por:

<f:display bean="${propertyName}" />

Para modificar como se muestra cada atributo (tanto en edición como en visualización), aquí hay unas instrucciones: Customizing Field Rendering – Reference Documentation.

Un ejemplo, para definir como debe trabajarse en las pantallas con campos de tipo fecha:

Utilizamos el wrapper default definido en ../grails-app/views/_fields/default/_wrapper.gsp

<%@ page defaultCodec="html" %>
<div class="form-group">
<label for="${property}" class="col-sm-2 control-label ${(required)?'text-danger':''}">
${label}
<g:if test="${required}">
<span class="required-indicator danger">*</span>
</g:if>
</label>
<div class="col-sm-10">
<%= widget %></div>
</div>

Y el displayWidget definido para fechas en ../grails-app/views/_fields/date/_displayWidget.gsp

<g:if test="${value == null || value == ''}">
--
</g:if>
<g:else>
<g:if test="${constraints.attributes.precision=='day'}">
<g:formatDate date="${value}" format="yyyy-MM-dd" />
</g:if>
<g:elseif test="${constraints.attributes.precision=='minute'}">
<g:formatDate date="${value}" format="yyyy-MM-dd HH:mm:ss a" />
</g:elseif>
<g:else>
<g:formatDate date="${value}" format="yyyy-MM-dd HH:mm:ss a" />
</g:else>
</g:else>

Y el widget definido también para fechas en ../grails-app/views/_fields/date/_widget.gsp

<div class="datePickerForm">
<g:if test="${constraints.nullable == true}">
<g:datePicker name="${property}" value="${value}" precision="${constraints.attributes.precision}" relativeYears="${constraints.attributes.relativeYears}" default="none" noSelection="[null: '']" />
</g:if>
<g:else>
<% if(value==null){value = new Date()} %>
<g:datePicker name="${property}" value="${value}" precision="${constraints.attributes.precision}" relativeYears="${constraints.attributes.relativeYears}"/>
</g:else></div>

De esta forma el código generado durante el scaffolding muestra las fechas de acuerdo a su precisión. Y si se realiza la llamada manual, se puede hacer así:

Para mostrar:

<f:display bean="obj" property="fecha" />

Para editar:

<f:field bean="obj" property="fecha" />

De esta forma, hemos definido plantillas para el tipo de dato string (cambiando el tipo de control según la longitud máxima permitida o los atributos de la propiedad), intfloat (utilizando el locale de la aplicación, evitando la escritura de otros caracteres mediante javaScript, y añadiendo un teclado virtual), boolean y como se deben mostrar cada una de las relaciones (oneToOne, oneToMany, manyToOne y manyToMany).

Jasper

De los principales plugins sólo falta por estar disponible el de Jasper (lo utilizamos para generar los .pdf de las órdenes de servicio). No es un gran problema, es muy sencillo realizar las llamadas directamente añadiendo Jasper como dependencia, e imitando el código del plugin de la versión 2 para no tener que modificar nada más.

Estas son las dependicias a declarar:

compile group: 'com.lowagie', name: 'itext', version: '2.1.7'
compile group: 'net.sf.jasperreports', name: 'jasperreports', version: '6.4.0'
compile 'net.sf.jasperreports:jasperreports-fonts:6.0.0'

Bonus

  • Control de sessiones concurrentes: si tenéis un concurrency filter en grails 2, puede que tengáis que modificar su funcionamiento. En este enlace explican como controlar que cada usuario sólo tenga 1 sesión a la vez en el sistema.
  • Spring-security-ui: si utilizaís este plugin para la administración de usuarios, perfiles y demás parámetros de la seguridad, sus clases han cambiado, por lo que puede que tengáis que modificar algo el código si habéis personalizado o extendido sus elementos.

Conclusión

Una vez actualizada y funcionando la aplicación podemos empezar a  realizar revisiones iterativas buscando implementar las optimizaciones que el avance en las tecnologías nos permiten.

Lo que por ahora ha supuesto un paso atrás para nosotros ha sido como funciona el Scaffolding. En la versión 2 utilizamos plantaillas propias para generar todos los controladores y vistas, y luego a partir de ese código sin errores realizabamos mejoras. El plugin en la versión 3, aún pudiendo personalizar la salida como ya hemos visto no genera todo el código como antes, de forma que cuando queremos modificar una vista tenemos que escribir mucho más código.

ADMIN: Asignación y seguimiento de recursos

En un sistema de administración de mantenimientos es de gran importancia la asignación y seguimiento de recursos propios de la compañía.

ordenservicio_recursos
Orden servicio – Recursos

Con el fin de optimizar el uso de recursos, evitando solapamientos en la planificación y el posterior seguimiento de la realización de las actividades, debemos poder asignar los recursos disponibles en la compañía a cada uno de los elementos del plan de mantenimiento de activos.

  • Contrato de mantenimiento:
    • Supervisor
    • Responsable
    • Otros recursos:
      • Colaborador
      • Herramienta
      • Contacto del proveedor
  • Orden de servicio:
    • Supervisor
    • Responsable
    • Otros recursos:
      • Colaborador
      • Herramienta
      • Contacto del proveedor
  • Supervisión plan:
    • Supervisor
    • Ejecutor
    • Otros recursos:
      • Colaborador
      • Herramienta
  • Supervisión ejecución:
    • Supervisor
    • Ejecutor
    • Otros recursos:
      • Colaborador
      • Herramienta
  • Incidencia:
    • Supervisor
    • Técnico
    • Otros recursos:
      • Colaborador
      • Herramienta

Para facilitar la visualicion de esta información de una manera ágil, todo se muestra en el calendario.

calendario_vistames_detalledia
Calendario – Vista 1 mes detalle día

Más información en la página de ADMIN.

ADMIN: Nuevo calendario

Una de las principales necesidades a las que ADMIN ayuda es la planificación y seguimiento de los trabajos a realizar sobre nuestros activos. Ya contabamos con notificaciones y listados específicos para acciones a realizar recientes o próximas, pero faltaba una forma de visualizar la planificación completa. Para ello hemos implementado un calendario que muestra:

  • Ordenes de servicio: por fecha ejecución prevista y si el colaborador es supervisor o responsable.
  • Ejecuciones supervisiones: por fecha prevista y si el colaborador es supervisor o ejecutor.
  • Incidencias: por fecha de inicio y colaborador es supervisor o técnico.
  • Los siguientes sólo se muestran si no se ha seleccionado “Ver todos”:
    • Registro de accesos del colaborador (por fecha de entrada).
    • Registro de movimientos del colaborador (por fecha de salida).
    • Tareas del colaborador (por fecha ejecución límite).

Vista de un día

Visualice la información de 1 día específico, pudiendo desplazarse a cada elemento con un solo clic.

calendario_vistdia
Calendario – Vista 1 día

Vista mensual

Visualice toda la información resumida de un mes completo.

calendario_vistames_grande
Calendario – Vista 1 mes

Si hace clic sobre el número del día del calendario se visualiza la información detallada de ese día.

calendario_vistames_detalledia
Calendario – Vista 1 mes – Detalle día

Más información en la página de ADMIN.

ADMIN: ADministración de MantenimIeNtos – Nuevas funcionalidades

En las últimas fechas hemos estado trabajando añadiendo intereseantes nuevas funcionalidades a nuestro sistema de adminisración de mantenimientos (ADMIN).

Entre estas nuevas funcionalidades destacan:

  • Ficha técnica de activos:
    • Se ha ampliado la información a completar para cada activo.
    • Campos dinámicos.
    • Definición de indicadores dinámicos.
  • Registro de incidencias (fallas, averías…).
  • Planes de supervisión de instalaciones.
  • Catálogo de ubicaciones jerárquicas (geolocalizadas)
  • Registro de movimientos de colaboradores (integrado con Waze).
  • Registro de permisos de acceso a ubicaciones para colaboradores y contactos de proveedores.
  • Panel de control: punto centralizado con los principales KPIs del sistema.
  • Notificaciones:
    • Movimiento iniciado
    • Ejecución de supervisión no finalizada
    • Nueva incidencia registrada

Esto unido a la administación de contratos preventivos, correctivos y órdenes de servicio convierte al sistema en una completa suite de administración del día a día en el ciclo de vida de los activos de la compañía.

Toda la información del sistema está disponible aquí.

Nueva demo: JPréstamos

Hoy os traemos 2 demos de nuestro sistema JPréstamos.

JPréstamos es un sistema para la completa administración de préstamos en la nube, desde su etapa de preventa y formalización, al registro y gestión de cobro.

Desarrollado con últimas tecnologías Web, permitiendo su uso desde diferentes plataformas y dispositivos.

Demo sistema

Demo oficina virtual

Más información aquí.

Nueva demo: Sistema de Administración de Propiedades Inmbiliarias

Hace ya un tiempo que no actualizábamos la demo de nuestro sistema SAPROIN (Sistema de Administración de PROpiedades INmobiliarias). El sistema ha madurado y crecido en funcionalidad desde entonces.

SAPROIN  es una aplicación multiplataforma y multidispositivo en la nube desarrollada para la completa administración de propiedades inmobiliarias y activos, entidades (clientes, proveedores, bancos, entidades propias), eventos, mantenimientos, ingresos, y gastos.

A continuación puede ver el vídeo con la nueva demo del sistema:

Para obtener más información del sistema haga clic aquí. Para ver otras demos del sistema haga clic aquí.

Gestión de imágenes y documentos (prototipo con GRAILS)

Como parte de las mejoras propuestas para nuestro sistema Sistema de Administración de PROpiedades INmobiliarias vamos a incluir la opción de añadir documentos multimedia a los elementos que lo conforman:

  • Imagen principal: a propiedades y entidades (clientes, proveedores y empresas propias)
  • Otras imágenes: a propiedades
  • Planos: a propiedades
  • Documentos: a propiedades y entidades
  • Vídeos: a propiedades

Las imágenes y documentos se alojan en el servidor de la aplicación, mientras que los vídeos deben estar alojados en Youtube o Vimeo.

A la hora de seleccionar los documentos multimedia a subir al servidor se ha validado su formato en cliente (con el parámetro accept del input y en JavaScript una vez seleccionado) y en servidor,  y su tamaño en cliente (en JavaScript una vez seleccionado) y en servidor.

*Actualización: se ha dejado de controlar el tamaño máximo de las imágenes, ahora se redimensionan al subirlas al servidor.

El diseño de la aplicación debe permitir incluir con facilidad documentos multimedia a otros objetos, como podrían ser los arrendamientos (podría subirse el contrato escaneado). Además, puede que se requiera la implementación de un gestor documental que permita acceder a los documentos multimedia sin tener que hacerlo desde el objeto que los contiene.

De este modo, lo primero ha sido montar un prototipo muy sencillo que tenga esta funcionalidad, para posteriormente incluirlo en el sistema. Sobre un proyecto en blanco de GRAILS 2.5.1, sólo añadiendo Twitter Bootstrap (para la visualización de las secciones de los documentos  multimedia), y una galería de imágenes en Jquery, este ha sido el resultado:

Se ha buscado poder reutilizar tango pantallas como código en el servidor (la gestión de los documentos multimedia se hace desde un controlador común haciendo un forward desde el controlador de cada objeto que los contiene).

Los parámetros de número máximo de elementos están guardados en el fichero de configuración Config.groovy, y los parámetros tamaño máximo están guardados en las clases (cada objeto sabe cual es su tamaño máximo permitido), de esta forma hay un ejemplo de las 2 formas de gestionarlos.

Para quien pueda servirle, el código fuente del prototipo está disponible en esta dirección: