App de gestión Última actualización: 02/07/2024 13:39

URL Pruebas apptest.plazy.eco
URL Producción app.plazy.eco

Aplicación de uso interno para gestionar los servicios, clientes, personal y pedidos, desarrollada con PHP y MySQL.

El acceso a cada sección así como el contenido depende del Rol y el Departamento del usuario.

Manual

Ajustes comunes

En las distintas páginas de listados hay varias opciones comunes en la esquina superior derecha:

  • Buscar: Buscar elementos en el listado actual
  • Filtrar: Filtrar los resultados
  • Exportar: Exportar listado en CSV
  • Nuevo: Añadir nuevo elemento
  • Registros por página: Cambiar el nº de elementos por página

En la cabecera de la tabla si el título de la columna es clickable al pulsar se ordena en un sentido y volviendo a pulsar se ordena en el sentido contrario.

Pulsando sobre el icono que tiene cada registro se despliegan las distintas opciones (editar, borrar...).

Barra superior

Barra de búsqueda Solo disponible para usuarios del rol Administrador
Se pueden buscar los siguientes elementos:

  • Empleados: Por nombre, apellidos, email, teléfono o DNI
  • Marcas: Por nombre
  • Modelos: Por nombre
  • Productos: Por nombre
  • Clientes: Por nombre, apellidos, email, teléfono
  • Pedidos: Por nº de pedido
  • Servicios: Por nº de servicio

Botón llamar a Central Solo disponible para usuarios del departamento Plazier
Botón para que los Plaziers llamen por teléfono a Central si hay alguna incidencia.

Botón enviar idea
Botón para comunicar alguna idea para mejorar el servicio.

Botón calcular presupuesto Solo disponible para usuarios del departamento Central
Botón para abrir la página de calcular presupuesto de servicio.

Botón nuevo pedido/suscripción Solo disponible para usuarios con permisos para gestionar pedidos
Desplegable para abrir la página de nuevo pedido o nueva suscripción.

Botón alertas
Botón para abrir la barra lateral donde el usuario puede gestionar sus Alertas y Favoritos.
Los usuario de Central también verán aquí el listado de notificaciones pendientes de revisar.

Barras laterales

Barra lateral izquierda

  • Datos de usuario:
    • Ajustes: Configuración general. Solo disponible para usuarios con permisos para gestionar opciones
    • Alertas: Mis alertas
    • Ausencias: Mis ausencias. No disponible para usuarios del departamento Externos
    • Cerrar sesión: Salir de la aplicación
  • Botón de tamaño de menú: Botón para cambiar el tamaño de la barra lateral.
  • Secciones: Lista de secciones

Barra lateral derecha

  • Pendientes: Elementos pendientes de revisar
  • Alertas: Mis alertas
  • Favoritos: Mis favoritos

Ajustes

Solo disponible para usuarios con permisos para gestionar opciones

General
Configuración de los destinatarios de llamadas y correos, y del garaje de motos por defecto que se usa para calcular las rutas en caso de que un Plazier no tenga otro garaje configurado.

El Modo debug es para mostrar errores de programación, solo se debe usar temporalmente para detectar fallos.

Mensajes
Los mensajes se envían automáticamente por WhatsApp a través de la API de 360 Dialog, para elegir la plantilla que se envía en cada caso hay que introducir la clave key correspondiente. En caso de que no se confirme el envío del WhatsApp se enviará el mensaje por SMS.

Se puede elegir que mensajes se envían de los 4 disponibles: Inicio de ruta, Fin de ruta, Inicio de servicio y Fin de servicio.

Emails
Configuración del título y contenido de los correos que se envían automáticamente, se puede enviar una prueba de cada uno de ellos para comprobar como llegarán al cliente.

Pagos
Configuración de los textos que aparecen en pantalla después de finalizar el proceso de pago, se pueden previsualizar para comprobar como las verá el cliente.

Agenda
Configuración de los tiempos de espera y días festivos

Ausencias
Configuración de los tipos de ausencias y sus días correspondientes.

Alertas

Las alertas son avisos que se pueden añadir para que se genere un recordatorio, cuando llega el día de la alerta aparece una notificación sobre el icono de la barra superior, la notificación desaparece cuando se marca la alerta como finalizada.

Cada usuario solo verá sus alertas pero se pueden generar alertas para otros usuarios.

Ausencias

Disponible para usuarios que no sean del departamento Externos

Calendario de ausencias propias, en la parte superior están las vacaciones del año actual y en la parte inferior está el listado de todas las solicitudes de ausencia enviadas en formato tabla y agenda. Las solicitudes de ausencia nuevas se crean en estado Pendiente y deben ser confirmadas desde Central.

Dependiendo del tipo de ausencia la selección de fechas tendrá distintas opciones, algunas ausencias ya tienen la duración asignada y solo hay que seleccionar el día inicial, en otras (como las vacaciones) hay que seleccionar día inicial y día final.

Los usuarios de rol administrador pueden dar de alta ausencias de otros empleados.

El cálculo del nº de días de vacaciones es:
Días de alta en el año * Vacaciones anuales / Días del año

Personal

Solo disponible para usuarios con permisos para gestionar empleados
* El rol ETT tiene permisos pero solo podrá acceder a la vista de ocupación de sus Plaziers asociados

Usuarios:
Listado de usuarios con acceso a la aplicación. Para dar de baja un usuario tiene que ser archivado, solo podrá ser archivado un usuario que no tenga un salario activo. Un usuario archivado puede ser eliminado de la aplicación, pero si se elimina se dejará de tener en cuenta a ese usuario para el cálculo de rentabilidad en fechas pasadas.

Las opciones de cada usuario dependen del departamento/rol:

  • Dep. Central: Datos generales y ausencias
  • Dep. Plazier: Datos generales, ausencias, ocupación, salarios, zonas, horario, vehículo y servicios
  • Rol ETT: Datos generales, Plaziers asociados
  • Rol Partner: Datos generales, comisiones, direcciones

Plaziers:
Listado de usuarios del departamento Plazier.

  • Zonas: A la hora de calcular los huecos libres en agenda a cada Plazier solo se le asignarán servicios cuyo código postal pertenezca a las Zonas principales que tenga seleccionadas. Si no se encuentran Plaziers con la zona como principal se buscarán Plaziers que tengan esa Zona secundaria (si la ruta no es mayor de 30 minutos). Si el Plazier pertenece a una franquicia también se debe seleccionar en este apartado.
  • Vehículo: Solo se agendarán servicios a un Plazier si tiene vehículo asignado, si no se indica un garaje se usará el garaje configurado en los ajustes de la aplicación. También se debe indicar cada cuantos servicios debe realizar limpieza de paños.
  • Salarios: Los salarios tienen fecha inicial y fecha final, un salario sin fecha final se considera un salario activo, a un Plazier se le pueden configurar distintos salarios pero solo puede tener uno activo. No se puede dar de baja un Plazier que tenga un salario activo, será necesario finalizar primero el salario para darlo de baja.
  • Horario: Solo se agendarán servicios a un Plazier dentro del rango horario de los días seleccionados, para cada día se puede configurar que el calculador ofrezca el primer/último hueco o ambos.
  • Servicios: Los servicios seleccionados NO SERÁN REALIZADOS por el Plazier.

Importante

Un salario no se puede modificar, cuando se edita un salario realmente se crea uno nuevo a partir de la fecha indicada y se finaliza el anterior.

Partners:
Listado de usuarios con el rol Partner, en la tabla se muestran los datos de comisiones de cada usuario en el rango de fechas seleccionado.

En la configuración de cada Partner se debe indicar la Comisión y añadir las Direcciones que luego se podrán seleccionar en los servicios, el Partner se llevará ese porcentaje de comisión en los servicios que se hagan en sus instalaciones.

Al abrir los detalles de las comisiones de un Partner se mostrará el total de comisiones, el listado de servicios y los pagos realizados.

Departamentos:
Listado de departamentos.

Roles:
Listado de roles. A cada rol se le pueden asignar permisos para que tenga acceso solo a determinadas secciones.

Noticias:
Listado de noticias. Las noticias son para mostrar en la App de los Plaziers.

Ideas:
En la parte superior se muestra el total de ideas recibidas, el total de ideas aprobadas y el total de ideas rechazadas, en la parte inferior está el listado de las ideas enviadas por los Plaziers, que se pueden filtrar por Plazier, Estado y fecha.

Pulsando sobre una de las ideas se puede marcar como Aprobada/Denegada y dejar un comentario que verá el Plazier.

Rentabilidad:
Resumen de la rentabilidad y ocupación de los Plaziers en el rango de fechas seleccionado. Pulsando sobre alguna de las filas se abren los detalles de ocupación del Plazier correspondiente. En los botones +info se despliega la información detallada de cómo se calculan los datos.

Ausencias:
En la tabla superior se verán por defecto las ausencias pendientes de confirmación de todos los empleados (se puede marcar la casilla Pendientes + Confirmadas para ver todas), haciendo click sobre alguna de las filas se abren las ausencias del empleado correspondiente.

Las ausencias pendientes se pueden Aprobar desde el menú desplegable o pulsando sobre el icono . Una vez aprobada la ausencia, si hay servicios afectados estos quedarán marcados en gris en la agenda, y en la página de Inicio aparecerán en la parte superior con un botón de Enviar avisos, pulsando este botón se cancelarán los servicios afectados y se enviará un WhatsApp de aviso a los clientes.

En el calendario de la parte inferior se verán las ausencias ya confirmadas, se pueden filtrar por empleado pulsando sobre el icono de la cara que hay en la esquina superior derecha.

Horarios:
Tabla de las agendas de cada Plazier, indicando los días disponibles y los horarios.

Fichajes:
Listado de fichajes de los Plaziers y resumen de las horas pendientes.

Gmail/Firma:
Herramienta para generar la firma de correo corporativa de Plazy.
Se incluyen también tutoriales para configurar el correo en Gmail.

Registros: Solo disponible para usuarios con permisos para gestionar registros
Listado de los registros de actividad guardados en la base de datos.

Configuración

Modelos: Solo disponible para usuarios con permisos para gestionar vehículos

  • Modelos: Listado de modelos, cada modelo está asociado a una marca y tamaño
  • Marcas: Listado de marcas
  • Tamaños: Listado de tamaños
  • Tabla de tamaños: Tabla de vehículos y tamaños
  • Colores: Listado de colores

Zonas: Solo disponible para usuarios con permisos para gestionar zonas

  • Zonas: Listado de zonas
  • Ciudades: Listado de ciudades
  • CPS: Listado de códigos postales, cada CP está asociado a una zona y ciudad

Productos: Solo disponible para usuarios con permisos para gestionar servicios

  • Productos: Listado de servicios, el icono indica que el servicio se muestra en la web y el icono indica que el servicio no cuenta para el % de ocupación
    • Tipo: Si es un Servicio o Complemento
    • Nombre: Nombre del servicio
    • Nombre interno: Nombre que se muestra en la aplicación
    • Nombre web: Nombre que se muestra en la web
    • Descripción: Descripción corta que se muestra en la web
    • Descripción larga: Descripción larga que se muestra en la web
    • Tipo de precio: Simple (un único precio/tiempo) o Variable (el precio/tiempo depende del tamaño del vehículo)
    • Disponible en la web: (solo servicios) Si el servicio se muestra en la web o no
    • No contar para ocupación: (solo servicios) Si se marca el servicio no cuenta para el % de ocupación
    • Orden: (solo servicios) Para elegir el orden en que se muestran los servicios en la web
    • Complementos: (solo servicios) Listado de complementos, hay que indicar si están disponibles y si se muestran en la web
    • Múltiple: (solo complementos) Para permitir seleccionar más de uno por servicio
  • Tablas de precios: Para actualizar los precios de cada servicio/tamaño
  • Tablas de tiempos: Para actualizar los tiempos de cada servicio/tamaño
  • Tablas de códigos: Los códigos se generan automáticamente
  • Complementos web: Tabla para configurar que complementos se muestran en la web

Packs: Solo disponible para usuarios con permisos para gestionar servicios
Listado de packs disponibles para suscripciones.

  • Nombre: Nombre del pack
  • Nombre interno: Nombre que se muestra en la aplicación
  • Nombre web: Nombre que se muestra en la web
  • Servicios: Nº de servicios que incluye el pack
  • Meses: Nº de meses para realizar todos los servicios
  • Descuento: Descuento para pago en cuotas
  • Dto. pronto pago: Descuento adicional para pago único
  • Ordenable: Si el usuario puede ordenar los servicios (en caso de que no sean todos iguales)
  • Descripción: Descripción del pack
  • Combinaciones: Combinaciones de servicios disponibles, se puede configurar el orden por defecto de los servicios, a la hora de dar de alta la suscripción este orden se podrá personalizar

Soluciones: Solo disponible para usuarios con permisos para gestionar servicios
Listado de opciones para la ayuda de selección de servicio.

  • Nombre: Nombre del tipo de suciedad
  • Categoría: Limipeza interna o externa
  • Icono: Icono de fontawesome
  • Orden: Orden para listar en la web
  • Opciones: 3 opciones de limpieza

ITV: Solo disponible para usuarios con permisos para gestionar servicios
Configuración para los servicios de ITV.

  • Precios: Configuración de precio según el combustible
  • Estaciones: Direcciones de las estaciones disponibles

Promociones

Cupones: Solo disponible para usuarios con permisos para gestionar cupones
Listado de cupones de descuento.
Los cupones con fecha ya caducada o con el nº máximo de usos superado se muestran en color rojo.

  • Código: Código del cupón, será lo que tendrá que indicar el cliente para usarlo
  • Descuento: Cantidad de descuento
  • Tipo: Si es un descuento en € o en %
  • Fecha límite: Hasta que fecha se puede usar el cupón
  • Cliente: Si es para un usuario concreto o para todos
  • Máximo de usos totales: Cuantas veces se puede usar el cupón (0 para ilimitadas)
  • Máximo de usos por usuario: Cuantas veces puede usar el cupón un usuario (0 para ilimitadas)
  • Plazier asociado: Plazier asociado que se llevará una comisión
  • Solo válido en primer servicio: Solo válido en primer servicio
  • Descripción: Descripción del cupón

Invitaciones: Solo disponible para usuarios con permisos para gestionar personal
Listado de invitaciones y cupones que dan comisión a los Plaziers.
Las invitaciones de registro se envían por mail, si el cliente se registra desde el enlace que recibe tiene un descuento del 35% en su primer pedido y proporciona al Plazier una comisión del 10% del importe neto del pedido.
Los cupones los puede enviar el Plazier por WhatsApp pero también se pueden dar al cliente por cualquier otro medio (promociones en redes por ejemplo), cuando un cliente usa un cupón asociado a un Plazier proporciona al Plazier una comisión del 10% del importe neto del pedido.

Recompensas: Solo disponible para usuarios con permisos para gestionar cupones
Listado de recompensas activas en el área de usuario. Es un listado informativo, la gestión de promociones se hace de manera manual.

Clientes

Solo disponible para usuarios con permisos para gestionar clientes

Clientes
Listado de clientes particulares, los iconos de las columnas Web y News indican si el cliente está registrado en la web y si está suscrito a las newsletters.

En la pantalla de edición de cliente se pueden modificar sus datos y se pueden consultar sus vehículos, direcciones y pedidos. También se puede generar el cupón de descuento correspondiente a la reseña en Google.

Clientes B2B
Listado de clientes B2B.

Vehículos
Listado de vehículos de los clientes.

Direcciones de servicio
Listado de direcciones de servicio de los clientes. Se puede acceder al listado de Direcciones no válidas para consultar las direcciones no válidas introducidas por los usuarios en la web, y también un resumen agrupado por CP.

Importante

Para que el cálculo de las rutas se haga bien es imprescindible que la dirección se seleccione de entre las opciones ofrecidas por Google Maps.

Direcciones de facturación
Listado de direcciones de facturación de los clientes.

Pedidos

Solo disponible para usuarios con permisos para gestionar pedidos

Listado de pedidos

En las últimas columnas del listado se indica si el pedido se hizo desde la web y si tiene factura asociada o si pertenece a una suscripción .

Listado de pedidos archivados

Son datos de pedidos web que se eliminan automáticamente, para que no queden huecos pendientes de pago ocupando la agenda si el usuario tarda más de 15 minutos en finalizar una reserva (desde la web) el pedido se elimina y se envía un mail al cliente.

Nuevo pedido

Se puede asociar a un cliente existente seleccionándolo en el desplegable o crear un nuevo cliente seleccionando la opción Nuevo cliente.

Importante

Al seleccionar un cliente existente se cargan automáticamente sus datos, si se modifican esos datos al guardar el pedido se actualizará la ficha del cliente.

Nueva factura múltiple

Desde esta opción se puede generar una factura seleccionando varios pedidos de un mismo cliente.

Modificar pedido

Cliente

Se puede cambiar el cliente asociado por un cliente existente (seleccionándolo en el desplegable) o por un cliente nuevo (seleccionando Nuevo cliente en el desplegable o pulsando el botón Nuevo cliente). Los datos de cliente aparecen bloqueados por defecto, para actualizarlos hay que pulsar en el botón Actualizar, si se modifican esos datos al guardar el pedido se actualizará la ficha del cliente.

Datos de facturación

Marcando la casilla Añadir datos de facturación se mostrarán los campos para añadir la dirección de facturación, se puede elegir una dirección existente en el desplegable o seleccionar Nueva dirección para crear una nueva.

Después de añadir la dirección de facturación y guardar el pedido se mostrará el botón de Generar factura.

Cuando un pedido tiene factura asociada se pueden configurar algunas opciones:.

  • Se puede actualizar la fecha de la factura
  • Se puede mostrar/ocultar la matrícula del vehículo
  • Se puede mostrar/ocultar la línea de descuentos
  • Se puede generar una factura rectificativa

Importante

Si se selecciona una dirección existente y se modifican los datos al guardar el pedido se actualizará la ficha de la dirección.

Comentario de pedido

Son las observaciones del pedido, se mostrarán en la factura.

Servicios

Lista de servicios asociados al pedido.

  • No se pueden añadir servicios a pedidos finalizados o cancelados ni a pedidos de una suscripción.
  • No se pueden editar servicios ya iniciados.
  • No se puede borrar un servicio en curso ni de suscripción.

Total

Importe total del pedido y configuración del modo de pago y el estado de pedido. Para poder seleccionar un modo de pago es necesario que el pedido tenga algún servicio asociado, y para poder asignar un estado de pedido debe haber un modo de pago seleccionado.

El estado por defecto de un pedido es Pendiente de configuración, después de añadir algún servicio y seleccionar el modo de pago se marca por defecto como Pendiente de pago, se puede actualizar manualmente el estado del pedido pero también cambiará automáticamente en los siguientes casos:

  • Cuando se hace un pago con tarjeta el pedido cambia a estado En Agenda
  • Cuando se termina el último servicio de un pedido el pedido cambia a estado Finalizado

El campo fecha de pago indica el momento en el que se confirma el pago del pedido, en los pagos con tarjeta este campo se cubre automáticamente, en los pagos en efectivo o por transferencia hay que añadirlo manualmente.

Debajo se muestra una tabla con el histórico de estados de pedido, cuando el cambio de estado de pedido conlleva el envío de un correo electrónico se indica el email al que se envió. En caso de que el pedido esté en estado Pendiente de pago hay un botón para enviar un mensaje al móvil del cliente con el enlace de pago con tarjeta.

Suscripciones

Solo disponible para usuarios con permisos para gestionar pedidos

Listado de suscripciones

En la última columna del listado se indica si el pedido se hizo desde la web .

Nueva suscripción

Cliente

Se puede asociar a un cliente existente seleccionándolo en el desplegable o crear un nuevo cliente seleccionando la opción Nuevo cliente.

Importante

Al seleccionar un cliente existente se cargan automáticamente sus datos, si se modifican esos datos al guardar el pedido se actualizará la ficha del cliente.

Vehículo

Se puede asociar a un vehículo existente seleccionándolo en el desplegable o crear un nuevo vehículo seleccionando la opción Nuevo vehículo.

Importante

Al seleccionar un vehículo existente se cargan automáticamente sus datos, si se modifican esos datos al guardar la suscripción se actualizará la ficha del vehículo.

Pack

Para seleccionar un Pack es necesario que esté seleccionado el Cliente y el Vehículo, ya que su importe dependerá de la tarifa del cliente y el tamaño del coche.

Si el tipo de suscripción es mensual solo se puede hacer el pago con tarjeta, en caso de ser pago único puede ser con cualquier modo de pago como un pedido normal.

El orden por defecto de los servicios se puede modificar arrastrando y soltando.

Importante

Al cambiar de tipo de suscripción se restablece el orden por defecto de los servicios.

Dirección

Se puede asociar a una dirección existente seleccionándola en el desplegable o crear una nueva dirección seleccionando la opción Nueva dirección.

Se usará la misma dirección para todos los servicios de la suscripción, se enviará un aviso al cliente antes de cada servicio para que la confirme.

Importante

Al seleccionar una dirección existente se cargan automáticamente sus datos, si se modifican esos datos al guardar la suscripción se actualizará la ficha de la dirección.

Importante

Para que el cálculo de las rutas se haga bien es imprescindible que la dirección se seleccione de entre las opciones ofrecidas por Google Maps.

Calcular ruta del primer servicio

Indicando el día inicial y el horario se ofrecerán los huecos disponibles en la agenda, los siguientes servicios se programarán automáticamente según la periodicidad del pack seleccionado, se enviará un aviso al cliente antes de cada servicio para que confirme la fecha y hora.

Agenda del primer servicio

Se puede agendar manualmente el primer servicio en vez de usar la calculadora de ruta, en este caso hay que seleccionar manualmente Plazier, fecha y hora, también se puede indicar al Plazier si el cliente acepta que el servicio empiece antes de la hora.

Comentarios

Las indicaciones para el Plazier, se asociarán a cada una de los servicios de la suscripción, más adelante el cliente podrá actualizar los comentarios de cada servicio desde su área de cliente.

Modificar suscripción

En la parte superior se muestra la información de la suscripción: Cliente, Pack, Vehículo y Precios.

Estado

El estado por defecto de una suscripción es Pendiente de pago, luego el estado de la suscripción se puede cambiar manualmente, pero también cambiará automáticamente en los siguientes casos:

  • Cuando se hace un pago con tarjeta la suscripción cambia a estado En Agenda
  • Cuando se termina el último servicio de la suscripción cambia a estado Finalizado

Las suscripciones se pueden pausar, a los servicios pendientes de la suscripción se les borrará la fecha y el plazier asociado y a las cuotas pendientes se les borrará la fecha de pago. En el momento que se reactive la suscripción se reubicarán los servicios pendientes (el primero 8 días después de la fecha de reactivación) y los pagos pendientes (el primero un día después de la reactivación).

Debajo se muestra una tabla con el histórico de estados de la suscripción, cuando el cambio de estado de la suscripción conlleva el envío de un correo electrónico se indica el email al que se envió. En caso de que la suscripción esté en estado Pendiente de pago hay un botón para enviar un mensaje al móvil del cliente con el enlace de pago con tarjeta.

Datos de facturación

Marcando la casilla Añadir datos de facturación se mostrarán los campos para añadir la dirección de facturación, se puede elegir una dirección existente en el desplegable o seleccionar Nueva dirección para crear una nueva.

Después de añadir la dirección de facturación y guardar la suscripción se podrá Generar factura para cada una de las cuotas de la suscripción.

Cuando una cuota tiene factura asociada se pueden configurar algunas opciones:.

  • Se puede actualizar la fecha de la factura
  • Se puede actualizar las observaciones de la factura
  • Se puede mostrar/ocultar la matrícula del vehículo
  • Se puede generar una factura rectificativa

Importante

Si se selecciona una dirección existente y se modifican los datos al guardar la suscripción se actualizará la ficha de la dirección.

Cuotas

Según el tipo de suscripción los pagos serán en 1 cuota o varias, en el listado se muestran las cuotas con su imorte, el estado y la fecha programada para el pago.

Servicios

Lista de servicios asociados al pedido.

  • No se pueden añadir servicios a una suscripción.
  • No se pueden editar servicios ya iniciados, y en los servicios sin iniciar no se puede modificar cliente, vehículo ni servicios.
  • No se puede borrar un servicio de una suscripción.

Servicios

Solo disponible para usuarios con permisos para gestionar pedidos
* Los usuarios del departamento Plazier podrán acceder a la Vista de sus servicios asignados

Listado de servicios

En la primera columna se muestra la previsión meteorológica para el día/dirección del servicio, esta previsión solo alcanza a una semana vista, para servicios a partir de esa fecha la previsión no estará disponible.

Si el servicio fue generado como una incidencia de otro en la columna de Nº se mostrará en rojo el Nº de origen.

En las últimas columnas hay varios iconos:

  • Si el servicio tiene incidencias
  • Si el servicio se reservó desde la web
  • Si el servicio se reservó desde una empresa externa
  • Si el servicio pertenece a una suscripción enlazará con los detalles
  • Indica si el Plazier adjuntó fotos
  • Indica que el informe de final de servicio está pendiente de recibir
  • Indica que el informe de final de servicio está recibido
  • Indica que el informe de final de servicio está finalizado

Nuevo servicio

No se puede añadir un nuevo servicio de manera independiente, los servicio deben pertenecer a un pedido y se añaden desde la página de pedido.

Cliente

Por defecto el servicio estará asociado al mismo cliente del pedido, se puede cambiar por un cliente existente (seleccionándolo en el desplegable) o por un cliente nuevo (seleccionando Nuevo cliente en el desplegable o pulsando el botón Nuevo cliente). Los datos de cliente aparecen bloqueados por defecto, para actualizarlos hay que pulsar en el botón Actualizar.

Importante

Al seleccionar un cliente existente se cargan automáticamente sus datos, si se modifican esos datos al guardar el pedido se actualizará la ficha del cliente.

Vehículo

Se puede asociar a un vehículo existente seleccionándolo en el desplegable o crear un nuevo vehículo seleccionando la opción Nuevo vehículo.

Importante

Al seleccionar un vehículo existente se cargan automáticamente sus datos, si se modifican esos datos al guardar la suscripción se actualizará la ficha del vehículo.

Dirección

Se puede asociar a una dirección existente seleccionándola en el desplegable o crear una nueva dirección seleccionando la opción Nueva dirección.

Importante

Al seleccionar una dirección existente se cargan automáticamente sus datos, si se modifican esos datos al guardar la suscripción se actualizará la ficha de la dirección.

Importante

Para que el cálculo de las rutas se haga bien es imprescindible que la dirección se seleccione de entre las opciones ofrecidas por Google Maps.

Tipo de servicio

Para seleccionar un Tipo de servicio es necesario que esté seleccionado el Vehículo.

Una vez seleccionado el servicio se mostrarán los complementos disponibles.

Total

Es el resumen de tiempo e importe según el servicio y complementos seleccionados, se puede añadir un cupón de descuento y también se muestra debajo del precio la tarifa que se le aplica al cliente.

Calcular ruta

Indicando el día inicial y el horario se ofrecerán los huecos disponibles en la agenda.

Agenda

Se puede agendar manualmente el servicio en vez de usar la calculadora de ruta, en este caso hay que seleccionar manualmente Plazier, fecha y hora, también se puede indicar si el cliente acepta que el servicio empiece antes de la hora acordada (si es posible).

Comentarios

Las indicaciones para el Plazier.

Modificar servicio

Están disponibles todas las opciones de Nuevo servicio, a mayores se puede:

  • Ver si el servicio surge como incidencia de otro
  • Ver si el servicio tiene incidencias
  • Modificar los tiempos de servicio
  • Ver los mensajes que se han enviado y enviar un SMS al cliente

Vista de servicio

La pantalla de Vista de servicio muestra toda la información del servicio: Servicios, Plazier, Fecha y hora, Tiempos de servicio, Cliente, Vehículo, Dirección, Comentarios y Mensajes enviados.

Si el servicio incluye incidencias se muestan en una tabla, y si el servicio se originó como incidencia de otro se indica el servicio original y se muestran las fotos del servicio original.

En caso de que el cliente acepte que el servicio se pueda empezar antes de tiempo aparecerá un aviso en la parte superior.

Si el servicio está sin finalizar en la parte superior se mostrará un botón grande que sirve para gestionar el progreso de servicio, pulsando el botón se cambiará de:

  1. En agenda > En ruta
  2. En ruta > En espera
  3. En espera > Inicio de servicio
  4. Inicio de servicio > Fin de servicio
  5. Fin de servicio > Fin de servicio

Durante los pasos 1 y 2
El Plazier tiene un botón para avisar al cliente del servicio de que llegará tarde.
Durante el paso 3
Si pasan 10 minutos de espera el Plazier podrá llamar al cliente
Si no localiza al cliente tiene un botón para enviar un WhatsApp al cliente de que se esperarán 10 minutos más.
A los 20 minutos se mostrará un botón para cancelar el servicio.
Durante el paso 4
El Plazier tiene un botón para avisar al cliente del siguiente servicio de que llegará tarde.
También tiene un botón para cancelar el servicio si: empieza a llover, si lo pide el cliente, oros motivos.
Durante el paso 5
El Plazier podrá llamar al cliente.

Cuando el servicio está finalizado el Plazier podrá adjuntar fotos y cubrir el informe final de servicio, la última parte del informe se completará cuando el cliente envíe el formulario de satisfacción, desde donde puede añadir fotos.

Importante

Una vez que el Plazier envía el informe final de servicio no lo podrá modificar, solo podrá ser modificado desde Central.

Galería de fotos

Listado de todas las fotos de servicios subidas por los Plaziers y los clientes.

Calcular

Sección para simular los datos de un servicio y poder comprobar el importe y los huecos disponibles.

Agenda

Solo disponible para usuarios con permisos para gestionar la agenda

Calendario de servicios, se pueden visualizar en formato Mes (por defecto para Central), en formato Semana o en formato Lista (por defecto para Plaziers).

Los usuarios del departamento Plazier verán solo sus servicios y los usuarios del departamento Central verán todos los servicios, pero pueden filtrar los servicios por Plazier en el icono de la cara de la esquina superior derecha.

Los colores de cada servicio indican el estado:

  • Gris: Pendiente de configurar o Plazier de baja
  • Amarillo: Pendiente de pago
  • Azul: En agenda
  • Verde: Finalizado
  • Rojo: Plazier no disponible
  • Negro: Servicio cancelado/aplazado
  • Parpadeando: En curso

Al situar el ratón sobre un servicio se abrirá una ventana con la información principal del servicio, y haciendo click en el servicio se abre la página de Vista de servicio. En móvil la ventana con la información principal se muestra al pulsar encima del servicio y dentro de la ventana aparecerá un botón para abrir la Vista de servicio.

Si la reserva se hizo desde la web se indica con el icono .

Vista mensual

La parte superior de cada día muestra el porcentaje de ocupación del día (entre paréntesis el nº de Plaziers activos ese día) y debajo la rentabilidad del día. Cuando la ocupación del día es inferior al 80% se muestra en rojo, entre el 80% y el 101% se muestra en verde y más del 101% se muestra en negro. La rentabilidad se muestra en rojo si es negativa y en verde si es positiva.

Haciendo click sobre el número de día se abre una ventana con los detalles de rentabilidad y ocupación del día.

En el lateral izquierdo de cada semana se muestra el porcentaje de ocupación de la semana. Cuando la ocupación de la semana es inferior al 80% se muestra en rojo, entre el 80% y el 101% se muestra en verde y más del 101% se muestra en negro.

Haciendo click sobre la barra de ocupación semanal se abre una ventana con los detalles de ocupación de la semana.

Facturas

Solo disponible para usuarios con permisos para gestionar facturas

Es el listado de facturas generadas desde los pedidos y suscripciones, las facturas rectificativas se muestran en color rojo.

En la parte superior se indica cual es el nº que se asignará a la siguiente factura, pulsando sobre se puede aumentar el nº de la siguiente factura manualmente.

Pulsando sobre una factura se abre una nueva ventana con la factura en formato PDF para poder descargar.

Material

Solo disponible para usuarios con permisos para gestionar material
* Los usuarios del departamento Plazier podrán acceder a la lista de su stock

Es la gestión del material de trabajo.

Material

Gestión de los materiales, cada material tiene cantidad mínima (cuando un vehículo llega a esa cantidad se avisa de stock bajo) y cantidad recomendada (es la cantidad que debería haber en el vehículo cuando se cargue).

Vehículos

Es el listado de vehículos disponibles.

Almacenes

Es el listado de almacenes, en los almacenes se guarda el stock de materiales desde el que se rrecargarán los vehículos.

Stock

Es el stock de cada material en cada vehículo, para recargar el stock hay que seleccionar el almacén de origen en la esquina superior derecha.

Cuando se ha seleccionado un almacén aparecerá una primera columna indicando el stock de material en el almacén, si el stock no es suficiente para llenar todos los vehículos hasta su cantidad recomendada aparecerá debajo y en rojo la cantidad que se debe comprar.

Según se van añadiendo unidades a los vehículos se descuentan del almacén, cuando el stock de un material es bajo se muestra en rojo, cuando el stock de un material es el recomendado se muestra en verde.

Al acabar de recargar el stock hay que pulsar el botón Guardar.

Informes

Solo disponible para usuarios con permisos para gestionar informes
* Los usuarios del departamento Plazier podrán acceder a los informes de Final de servicio de sus servicios

KPIs dirección

Informe de los KPIs de dirección filtrados por fechas y franquicia.

La gráficas muestra los datos seleccionados en la tabla inferior.

Nota de desempeño

En la parte superior hay un gráfico que muestra la nota media de desempeño mensual en el rango de fechas seleccionado.

En los informes de servicio antiguos el Plazier cubría la información del servicio y en Central se cubría la valoración, estos informes tenían 3 estados: Pendiente (el Plazier aún no envió el informe), Recibido (el Plazier envió el informe) y Finalizado (Central completó el informe).

En los informes de servicio nuevos el Plazier cubre la información del servicio y la valoración la envía el cliente si cubre el formulario de satisfacción, estos informes tienen 2 estados: Nota Plazier (el cliente no envió el formulario de satisfacción) y Nota cliente (el cliente envió el formulario de satisfacción).

Si el cliente envía el formulario el cálculo se hace según los siguientes factores:

  • Nota de valoración (49%) * 0.49
  • Puntualidad (10,5%) + 0,525
  • Nota de atención (10,5%) * 0.105
  • Diferencia de tiempo de servicio (21%)
    • Negativa o entre 0 y 5% + 1,05
    • Entre 5% y 10% + 0,735
    • Entre 10% y 20% + 0,525
    • Más del 20% + 0
  • Informe de plazier (6%) + 0,3
  • Fotos añadidas (3%) + 0,15

Si la diferencia es un -5% (o menos) y tiene una valoración de 4 (o menos) se le baja la nota a 1 automáticamente

Si el cliente no envía el formulario el cálculo se hace según los siguientes factores:

  • Diferencia de tiempo de servicio (70%)
    • Negativa o entre 0 y 5% + 3,5
    • Entre 5% y 10% + 2,45
    • Entre 10% y 20% + 1,75
    • Más del 20% + 0
  • Informe de plazier (20%) + 1
  • Fotos añadidas (10%) + 0,5

Facturación comercial

Listado de servicios creados en el rango de fechas seleccionado y su importe, por defecto aparecerán los pedidos del último año.

Las gráficas comparan los datos entre Central, Web, Empresas y Partners.

Facturación operativa

Informe de rentabilidad en base al coste por Plazier/día y la facturación/día

Facturación real

Listado de pedidos pagados en el rango de fechas seleccionado y su importe, por defecto aparecerán los pedidos del último año.

Incidencias

Informe de incidencias, muestra el gráfico de incidencias por mes en el rango seleccionado y el listado de incidencias. Se puede filtrar por Plazier, Franquicia y por rango de fechas.

Cupones

Informe de uso de cupones, muestra el gráfico con el uso mensual de los cupones más comunes y el listado de servicios con cupón. Se puede filtrar por Plazier, cupón y por rango de fechas.

Invitaciones

Informe de invitaciones, muestra el gráfico y listado de invitaciones enviadas por mes en el rango seleccionado.

Material

Informe de gastos de material, muestra una tabla con el gasto total de cada producto por Paxter, el nº de servicios y el gasto por servicio en el rango seleccionado.

Ocupación

Comparativa entre la ocupación estimada y real en el rango seleccionado, por defecto aparecerán los pedidos del último año.

Registro de clientes

Listado de clientes registrados en el rango de fechas seleccionado, por defecto aparecerán los registros del último año.

La gráfica comparan los datos entre Central y Web.

Reseñas

Lista de las reseñas enviadas por los clientes, si la reseña incluye comentario hay que pulsar en el icono para leerlo. Se puede añadir un comentario adicional si es necesario.

Si el cliente adjuntó fotos al formulario aparecerá marcado el icono .

La línea aparece destacada hasta que se marque la reseña como resuelta pulsando el icono .

En el resumen de la parte superior se indica el número de encuestas enviadas, las que se han recibido y la nota media de valoración de las que se han recibido.

También se muestra el porcentaje de posibilidad de recomendación por parte de los clientes, una nota de 6 o menos es negativa, de 7 u 8 es neutra y de 9 o 10 es positiva.

Retrasos

Comparativa entre los tiempos estimados y reales de los servicios ya finalizados.

En la gráfica se muestra la diferencia media de cada mes en el rango seleccionado.

Servicios

Listado de servicios reservados en un rango de fechas ordenados por número de reservas.

En la gráfica se muestra el total de servicios y se pueden cargar hasta 5 servicios adicionales.

Tiempos por servicio

Comparativa entre el tiempo objetivo de cada servicio y el tiempo medio real de los servicios ya finalizados.

En el icono de la esquina superior izquierda se pueden seleccionar qué servicios mostrar en el informe.

Tiempos globales

Gráfica y listado de tiempos medios de servicio, ruta y espera.

Premios

Solo disponible para usuarios del departamento Central

Clasificaciones de la puntuación de los Plaziers:

  1. La clasificación mensual en el momento actual
  2. La clasificación anual hasta el mes pasado
  3. La clasificación total hasta el mes pasado

Para elegir mes y año hay un desplegable en la esquina superior derecha en el bloque correspondiente.

Las puntuaciones anual y total se actualizan el día 1 de cada mes a las 00:00, se actualizan las de los 2 últimos meses para contabilizar la nota de desempeño si faltaban encuestas de satisfacción por enviar.

Se puede ver también la vista de Plazier, en formato gráfico.

Puntos mensuales
Servicio realizado 1km
Invitaciones confirmadas 20 km
Ideas implantadas 10 km
Incidencias -30 km
Desempeño individual >= 4.8 20 km
Desempeño global >= 4.8 30 km

Comunicación

Email PHPMailer
WhatsApp 360 Dialog
SMS SMS Publi

Los mensajes enviados desde la aplicación son los siguientes:

Al establecer el estado de un pedido/suscripción como Pendiente de pago *

  • Mail con info de pago al cliente
  • Mail de aviso a Central
  • WhatsApp con enlace de pago al cliente (si el pago es con tarjeta)

* Las nuevas suscripciones se crean como Pendientes de pago por defecto

Al pulsar el botón "WHATSAPP PAGO CON TARJETA" en la página de pedido/suscripción *

  • WhatsApp con enlace de pago al cliente

* Botón visible si el estado es Pediente de pago y el pago es con tarjeta

Al establecer el estado de un pedido/suscripción como En Agenda *

  • Mail con info de cada servicio al cliente correspondiente (si es una suscripción solo se envía la info del primer servicio)
  • Mail con info de cada servicio al Plazier correspondiente
  • Mail con info de cada servicio al Partner correspondiente (si es una suscripción solo se envía la info del primer servicio)
  • Mail de aviso a Central

* Cuando se paga con tarjeta un pedido/suscripción el cambio es automático

Al establecer el estado de un pedido/suscripción como Cancelado

  • Mail de aviso al cliente
  • Mail de aviso a Central
  • Mail de aviso al Plazier de cada servicio del pedido/suscripción

Al modificar la información de un servicio

  • Mail con info del servicio al Plazier correspondiente

Al enviar el formulario "ENVIAR NUEVO SMS" en la página de edición de servicio

  • SMS al cliente

Recordatorios de servicio todos los días a las 11:00

  • Mail de aviso a cliente de los servicios dentro de 7 días
  • Mail de aviso a cliente de los servicios dentro de 1 día
  • WhatsApp de aviso a cliente de los servicios dentro de 7 días
  • WhatsApp de aviso a cliente de los servicios dentro de 1 día
  • WhatsApp de ayuda a clientes registrados el día anterior que no finalizaron pedido

Al pulsar el botón grande de progreso en la Vista de servicio *

  • WhatsApp de Inicio de ruta
  • WhatsApp de Fin de ruta
  • WhatsApp de Inicio de servicio
  • WhatsApp de Fin de servicio
  • WhatsApp de Fin de servicio (formulario de satisfacción)

* Cada uno de los WhatsApps solo se enviará si está activado en Ajustes > Mensajes

Al avisar el Plazier que llega con retraso

  • WhatsApp de aviso al cliente
  • Mail de aviso a Central

Si un servicio va con retraso y no se avisó al cliente

  • Mail de aviso a Central

Si el cliente tarda 10 minutos y no se le localiza

  • WhatsApp de aviso al cliente
  • Mail de aviso a Central

Si el cliente tarda más de 20 minutos y no llegó

  • WhatsApp de aviso de cancelación al cliente
  • Mail de aviso a Central

Si se interrumpe el servicio

  • WhatsApp de aviso al cliente
  • Mail de aviso a Central

Al enviar un informe de fin de servicio con comentarios adicionales

  • Mail con comentario adicional a Central

Al crear una nueva solicitud de ausencia

  • Mail con info de solicitud a Central

Al cancelar un servicio por ausencia

  • WhatsApp de aviso a los clientes

Al enviar el formulario "ENVIAR IDEA" de la barra superior

  • Mail a Central

Al eliminarse automáticamente un pedido web que lleva más de 15 minutos pendiente de pago

  • Mail al usuario

Recompensas de usuario

  • Mail al usuario cuando se genera desde la App el cupón de reseña en Google
  • Mail al usuario cuando otro usuario le invita a registrarse desde la Web
  • Mail al usuario cuando un amigo que invitó hace su primer pedido en la Web
  • Mail al usuario cuando envía la encuesta de satisfacción de servicio

Recompensas de Plazier

  • Mail al usuario cuando un Plazier le invita a registrarse desde la Web

Aviso de stock bajo

  • Mail a Central cuando el stock de un producto en un vehículo es bajo

Recursos

Estructura de archivos

  • index.php
    Listado de ausencias
  • new.php
    Nueva solicitud de ausencia

  • edit.php
    Edición de alerta
  • export.php
    Exportar alertas
  • index.php
    Listado de alertas

Archivos de la API

  • css
    Estilos
  • fonts
    Fuentes
  • images
    Imágenes de plugins
  • img
    Imágenes de plantilla
  • js
    JavaScript global
  • vendors
    Plugins

  • parts
    Vistas de mes/año/total
  • index-central.php
    Clasificación completa de los Plaziers
  • index-plazier.php
    Clasificación gamificada de los Plaziers
  • index.php
    Base

  • index.php
    Calendario de servicios
  • index-scripts.php
    Javascript

  • parts
    Subpestañas de opciones
  • apps.php
    Listado de aplicaciones
  • docs.php
    Listado de documentos
  • index.php
    Configuración general
  • phpinfo.php
    Información PHP

  • export.php
    Exportar contactos
  • index-modals.php
    Modals nuevo/editar contacto
  • index-scripts.php
    JavaScript
  • index.php
    Listado de contactos

  • cron
    Tareas cron
  • functions
    Funciones específicas
  • inc
    Herramientas de terceros
  • connect.php
    Conexión con la base de datos
  • defines.php
    Credenciales
  • functions.php
    Loader de funciones
  • functions_redsys.php
    Funciones para acciones Redsys
  • login.php
    Inicio de sesión

  • edit.php
    Edición de cupón
  • export.php
    Exportar cupones
  • index.php
    Listado de cupones
  • new.php
    Nuevo cupón

  • addresses
    Direcciones de servicio
  • addresses-invoice
    Direcciones de facturación
  • vehicles
    Vehículos
  • edit-modals.php
    Modals de edición de cliente
  • edit-scripts.php
    JavaScript de edición de cliente
  • edit.php
    Edición de cliente
  • export.php
    Exportar clientes
  • index-b2b.php
    Listado de clientes B2B
  • index.php
    Listado de clientes
  • new.php
    Nuevo cliente

  • absences
    Ausencias de empleado
  • breaks
    Trayectos de plaziers
  • departments
    Departamentos
  • ideas
    Ideas
  • news
    Noticias
  • partners
    Partners
  • parts-plaziers
    Pestañas de configuración de Plazier
  • rentability
    Rentabilidad y ocupación
  • roles
    Perfiles de usuario
  • archived.php
    Listado de empleados archivados
  • edit-central.php
    Opciones de empleado tipo Central
  • edit-empresa.php
    Opciones de empleado tipo Empresa
  • edit-ett.php
    Opciones de empleado tipo ETT
  • edit-franquicia.php
    Opciones de empleado tipo Franquicia
  • edit-partner.php
    Opciones de empleado tipo Partner
  • edit-plaziers.php
    Opciones de empleado tipo Plazier
  • edit-scripts.php
    JavaScript de edición de empleado
  • edit.php
    Edición de empleado
  • export.php
    Exportar empleados
  • Firma.php
    Plantilla para firma de correo
  • index-plaziers.php
    Listado de Plaziers
  • index.php
    Listado de empleados
  • new.php
    Nuevo empleado
  • schedule.php
    Horarios de Plaziers
  • signatures.php
    Generador de firma de correo
  • time-control-export.php
    Exportación de fichajes
  • time-control-hours.php
    Bolsa de horas
  • time-control.php
    Listado de fichajes

  • contacto.php
    Información de contacto

  • 400.php
    Error 400
  • 403.php
    Error 403
  • 404.php
    Error 404
  • 500.php
    Error 500

  • export.php
    Exportar facturas
  • index.php
    Listado de facturas
  • new.php
    Añadir factura múltiple

Archivos de registro de APIs

  • stock
    Gestión de stock en vehículos
  • vehicles
    Gestión de vehículos
  • warehouses
    Gestión de almacenes
  • edit.php
    Edición de producto
  • export.php
    Exportar productos
  • index-admin.php
    Listado de productos para Central
  • index-plazier.php
    Listado de productos para Plaziers
  • index.php
    Listado de productos
  • new.php
    Nuevo producto

    • scripts
      JavaScript de servicio ITV
    • edit.php
      Edición de servicio ITV
    • new.php
      Nuevo servicio ITV
    • parts
      Cálculo de rutas / Informes / Listados
    • scripts
      JavaScript de servicios
    • calc.php
      Calculadora de precios
    • edit.php
      Edición de servicios
    • export.php
      Exportar servicios
    • gallery.php
      Galería de fotos
    • index.php
      Listado de servicios
    • new-internal.php
      Nuevo servicio interno
    • new.php
      Nuevo servicio
    • view.php
      Vista de servicio
  • archived.php
    Pedidos eliminados
  • edit-scripts.php
    JavaScript de edición de pedido
  • edit.php
    Edición de pedido
  • export.php
    Exportar pedidos
  • index.php
    Listado de pedidos
  • invoice.php
    Factura de pedido
  • new-empresa.php
    Nuevo pedido para empresas
  • new.php
    Nuevo pedido

  • calendar
    Agenda
  • customers
    Clientes
  • employees
    Empleados
  • material
    Material
  • orders
    Pedidos
  • parts
    Partes comunes
  • products
    Productos
  • reports
    Informes
  • subscriptions
    Suscripciones
  • vehicles
    Vehículos
  • zones
    Zonas
  • index.php
    Portada

  • head.php
    Header
  • header-modal-cps.php
    Popup de CPs disponibles
  • header-modal-horario.php
    Popup de horarios por ciudades
  • header.php
    Barra superior
  • loader.php
    Animación de carga
  • num-dropdown.php
    Selector de registros por página
  • paginator-gallery.php
    Paginador de la galería de fotos
  • paginator.php
    Paginador
  • scripts.php
    Cargar plugins y scripts
  • sidebars.php
    Barras laterales

  • dia
    Distintas subsecciones del día actual
  • parts
    Partes comunes
  • agenda.php
    Agenda de servicios
  • ausencias.php
    Solicitudes de ausencia
  • desempeno.php
    Informes de fin de servicio
  • dia.php
    Gestión de los servicios del día actual
  • horas.php
    Bolsa de horas
  • incidencias.php
    Incidencias
  • index.php
    Portada
  • invitaciones.php
    Listado de invitaciones enviadas
  • material.php
    Control de stock
  • noticia.php
    Detalles de noticia
  • noticias.php
    Listado de noticias
  • servicio.php
    Detalles de servicio

  • itv
    Configuración de precios y estaciones de ITV
  • packs
    Packs para suscripciones
  • solutions
    Soluciones para recomendador
  • codes.php
    Tabla de códigos
  • complements-web.php
    Tabla de complementos disponibles en la web
  • edit-internal.php
    Edición de producto interno
  • edit.php
    Edición de producto
  • export.php
    Exportar productos
  • index.php
    Listado de productos
  • new-internal.php
    Nuevo producto interno
  • new.php
    Nuevo producto
  • prices.php
    Tabla de precios
  • times.php
    Tabla de tiempos

  • friends
    Invitaciones de Plaziers
  • edit.php
    Info de promoción
  • export.php
    Exportar promociones
  • index.php
    Listado de promociones

  • export.php
    Exportar registros
  • index.php
    Listado de registros

  • clientes
    Informe de registros de clientes
  • facturacion
    Informe de facturación real
  • final-de-servicio
    Informe de servicio
  • incidencias
    Informe de incidencias
  • invitaciones
    Informe de invitaciones
  • material
    Informe de material y stock
  • ocupacion
    Informe de ocupación
  • operativa
    Informe de facturación operativa
  • pedidos
    Informe de pedidos y facturación
  • reviews
    Informe de reseñas de clientes
  • servicios
    Informe de servicios
  • tiempos-de-retraso
    Informe de tiempos de retraso
  • tiempos-de-ruta
    Informe de tiempos de ruta
  • tiempos-de-servicio
    Informe de tiempos

  • edit-scripts.php
    Javascript
  • edit.php
    Edición de suscripción
  • export.php
    Exportar suscripciones
  • index.php
    Listado de suscripciones
  • invoice.php
    Factura de cuota de suscripción
  • new-scripts.php
    Javascript
  • new.php
    Nueva suscripción

  • 360-test.php
    Pruebas de conexión con API de 360Dialog
  • agenda.php
    Comprobar descansos
  • clientify-api.php
    Pruebas de conexión con API de Clientify
  • convertir-cps.php
    Obtener coordenadas de cada CP
  • convertir-direcciones.php
    Convertir el formato de direcciones
  • coordenadas.php
    Buscar coordenadas de CPs
  • find-image.php
    API de búsqueda de imágenes
  • holded-api.php
    API de Holded
  • importar-fechas.php
    Importar fechas de pago de pedidos
  • index.php
    Listado de herramientas
  • limpiar-bayetas.php
    Comprobar limpieza de paños
  • redsys-subs-test.php
    Prueba de pago de cuota mediante operación Credential-On-File (COF)
  • rutas.php
    Prueba de API de Google Maps
  • servicios-futuros.php
    Lista de servicios sin finalizar
  • sms-test.php
    Pruebas de envío de SMS con SMSPubli
  • waylet.php
    Prueba de pago con Waylet

Imágenes subidas

  • colors
    Colores
  • companies
    Marcas
  • sizes
    Tamaños
  • edit.php
    Edición de vehículo
  • export.php
    Exportar vehículos
  • index.php
    Listado de vehículos
  • new.php
    Nuevo vehículos
  • sizes.php
    Tabla de tamaños

  • cities
    Ciudades
  • cps
    Códigos postales
  • edit.php
    Edición de zona
  • export.php
    Exportar zonas
  • index.php
    Listado de zonas
  • new.php
    Nueva zona
  • index-central.php
    Contenido de inicio para Central
  • index-franquicias.php
    Contenido de inicio para Franquicias
  • index-partner.php
    Contenido de inicio para Partners
  • index-plazier.php
    Contenido de inicio para Plaziers
  • index.php
    Página de inicio base
  • login.php
    Formulario de acceso
  • logout.php
    Cerrar sesión
  • plantilla-email.html
    Plantilla de los emails
  • realizarPago.php
    Página de pago Redsys
  • realizarPagoKo.php
    Página de pago Ok Redsys
  • realizarPagoNotification.php
    Página de notificaciones Redsys
  • realizarPagoOk.php
    Página de pago Error Redsys
  • wayletPagoNotification.php
    Página de notificaciones Waylet

Base de datos

Estructura Relaciones

Tablas

  • 360_templates
    Plantillas de WhatsApp
  • address_cities
    Ciudades
  • address_cps
    Códigos postales
  • address_cps_weather
    Previsión meteorológica por CP/Fecha
  • address_zones
    Zonas
  • alerts
    Alertas
  • bookmarks
    Favoritos
  • calendar_absences
    Tipos de ausencias
  • calendar_festives
    Festivos
  • config
    Configuración general
  • contacts
    Contactos
  • contacts_fails
    Razones de fail de contactos
  • contacts_origins
    Orígenes de contactos
  • contacts_status
    Estados de contactos
  • contacts_status_history
    Histórico de estado de contactos
  • coupons
    Cupones de descuento
  • customers
    Clientes
  • customers_address
    Direcciones de servicio de clientes
  • customers_address_errors
    Direcciones de servicio no validas de clientes
  • customers_address_invoice
    Direcciones de facturación de clientes
  • customers_b2b_products
    Productos específicos para clientes B2B
  • customers_vehicles
    Vehículos de clientes
  • itvs_address
    Direcciones de estaciones de ITV
  • logs
    Registros de actividad
  • material
    Listado de material de trabajo
  • material_vehicles
    Listado de vehículos de trabajo
  • material_vehicles_stock
    Stock de material en vehículos de trabajo
  • material_vehicles_stock_updates
    Actualizaciones de stock de material en vehículos de trabajo
  • material_warehouse
    Listado de almacenes de material
  • material_warehouse_stock
    Stock de material en almacenes
  • material_warehouse_stock_updates
    Actualizaciones de stock de material en almacenes
  • news
    Noticias
  • orders
    Pedidos
  • orders_deleted
    Pedidos eliminados
  • orders_invoices
    Facturas de pedidos
  • orders_invoices_multiples
    Facturas de múltiples pedidos
  • orders_payment
    Métodos de pago
  • orders_pending
    Pedidos pendientes
  • orders_status
    Estados de pedido
  • orders_status_history
    Histórico de estados de pedido
  • problems
    Histórico de estados de pedido
  • problems_solutions
    Listado de tipos de manchas
  • problems_translations
    Traducciones de textos de problemas
  • products
    Productos
  • products_categories
    Categorías de producto
  • products_complements
    Complementos de producto
  • products_packs
    Packs
  • products_packs_variations
    Variaciones de packs
  • products_packs_variations_washes
    Servicios de variación
  • products_subcategories
    Subategorías de producto
  • products_translations
    Traducciones de textos de servicios
  • products_variations
    Variaciones de productos
  • promotions
    Promociones
  • promo_friends
    Invitaciones enviadas por clientes
  • promo_plaziers_coupons
    Invitaciones enviadas por Plaziers
  • promo_plaziers_coupons_send
    Cupones de Plaziers enviados/usados
  • promo_plaziers_friends
    Cupones asociados a Plaziers
  • promo_reviews
    Reseñas enviadas
  • subscriptions
    Suscripciones
  • subscriptions_fees
    Cuotas de suscripciones
  • users
    Usuarios de la aplicación
  • users_absences
    Ausencias de empleados
  • users_address
    Direcciones de partners
  • users_awards
    Puntuaciones de Plaziers
  • users_breaks
    Trayectos de plaziers
  • users_comissions
    Pagos a partners
  • users_departments
    Departamentos
  • users_etts
    Empleados de ETT
  • users_excluded_products
    Productos excluidos para Plaziers
  • users_geolocation
    Datos de geolocalización de usuarios
  • users_ideas
    Ideas de Plaziers
  • users_options
    Opciones de usuario
  • users_roles
    Perfiles de usuario
  • users_roles_access
    Accesos de cada rol de usuario
  • users_salaries
    Salarios de plaziers
  • users_schedule
    Horarios de plaziers
  • users_schedule_control
    Control horario de plaziers
  • users_zones
    Zonas de plaziers
  • users_zones_alt
    Zonas alternativas de plaziers
  • vehicles
    Modelos de vehículos
  • vehicles_colors
    Colores de vehículos
  • vehicles_colors_translations
    Traducciones de colores
  • vehicles_companies
    Marcas de vehículos
  • vehicles_fuel
    Tipos de combustible
  • vehicles_fuel_translations
    Traducciones de tipos de combustible
  • vehicles_sizes
    Tamaños de vehículos
  • washes
    Servicios
  • washes_complements_pending
    Complementos de servicios pendientes
  • washes_complements
    Complementos de servicio
  • washes_incidences
    Incidencias en servicios
  • washes_photos
    Fotos de servicio
  • washes_pending
    Servicios pendientes
  • washes_ratings
    Puntuación de clientes
  • washes_reports
    Informes de servicio
  • washes_sms
    Mensajes de servicio
  • washes_web_origins
    Lista de orígenes de servicios web

Funciones

Tareas CRON de recordatorios
cron_alerts.php

/**
 * Enviar avisos
 * Se ejecuta el archivo desde una tarea CRON todos los días a las 11:00
 * Description:
 *    - Aviso por email y whatsapp 1 semana antes del servicio
 *    - Aviso por email y whatsappp 1 día antes del servicio
 *    - Ofrecer ayuda por whatsapp a usuarios registrados en la web el día anterior que no realizaron pedido
 *    - Descargar nuevas plantillas de Clientify
 *
 * @category Plazy
 * @package  Plazy_App
 * @author   Gaspar 
 * @link     https://app.plazy.eco/
 */

Tareas CRON de puntuación mensual
cron_awards.php

/**
 * Guardar puntuaciones mensuales
 * Se ejecuta el archivo desde una tarea CRON todos los días 5 de cada mes a las 23:30
 *
 * @category Plazy
 * @package  Plazy_App
 * @author   Gaspar 
 * @link     https://app.plazy.eco/
 */

Tareas CRON de limpiar pedidos
cron_clean_orders.php

/**
 * Eliminar pedidos generados desde la web que lleven más de 15 minutos pendientes de pago
 * Se ejecuta el archivo desde una tarea CRON todos los días cada minuto
 *
 * @category Plazy
 * @package  Plazy_App
 * @author   Gaspar 
 * @link     https://app.plazy.eco/
 */

Tareas CRON de generar limpieza de paños
cron_panhos.php

/**
 * Comprobar si hay que generar limpiezas de paños
 * Se ejecuta el archivo desde una tarea CRON todos los días a las 23:00
 *
 * @category Plazy
 * @package  Plazy_App
 * @author   Gaspar 
 * @link     https://app.plazy.eco/
 */

Tareas CRON de servicios que van con retraso
cron_retarded_services.php

/**
 * Avisar de pedidos con retraso sin avisar al cliente
 * Se ejecuta el archivo desde una tarea CRON todos los días cada 10 minutos
 *
 * @category Plazy
 * @package  Plazy_App
 * @author   Gaspar 
 * @link     https://app.plazy.eco/
 */

Tareas CRON de pago de cuotas
cron_subscriptions_fees.php

/**
 * Enviar pagos recurrentes a Redsys
 * Se ejecuta el archivo desde una tarea CRON a las 7:00
 *
 * @category Plazy
 * @package  Plazy_App
 * @author   Gaspar 
 * @link     https://app.plazy.eco/
 */

Tareas CRON de previsión meteorológica
cron_weather_cps.php

/**
 * Obtener previsión meteorológica de cada CP
 * Se ejecuta el archivo desde una tarea CRON todos los días a las 3:00 cada minuto
 *
 * @category Plazy
 * @package  Plazy_App
 * @author   Gaspar 
 * @link     https://app.plazy.eco/
 */

Funciones para las ausencias
functions_absences.php

/**
 * Listado de ausencias
 *
 * @param  int   $status Id de estado (0 pendientes, 1 aprobadas)
 * @param  int   $id     Id de empleado (0 para mostrar todos)
 * @return array $data   Listado de ausencias
 */
function absencesList($status, $id = 0)
/**
 * Listado de ausencias aprobadas con servicios en agenda afectados
 *
 * @return array $data Listado de ausencias
 */
function absencesListWithWashes()
/**
 * Lista de ausencias aprobadas en una semana de los plaziers (para selección de servicio)
 *
 * @param  string $date  Fecha Y-m-d H:i:s
 * @param  string $limit IDs de plaziers a excluir
 * @return array  $data  Listado de ausencias
 */
function absencesWeekList($date = false, $limit = '')
/**
 * Nueva ausencia
 */
function addAbsence()
/**
 * Borrar ausencia
 */
function deleteAbsence()
/**
 * Aprobar ausencia
 */
function approveAbsence()
/**
 * Avisar a clientes de cancelación por ausencia
 */
function absenceCancelNotice()
/**
 * Calcular vacaciones de un usuario en el año actual
 *
 * @param  int    $id   Id de empleado
 * @return object $data Datos de vacaciones
 */
function userHolidays($id = false)
/**
 * Calcular asuntos propios de un usuario en el año actual
 *
 * @param  int    $id   Id de empleado
 * @return object $data Datos de asuntos propios
 */
function userPersonalDays($id = false)
/**
 * Comprobar si un plazier está ausente en un día concreto
 *
 * @param  int     $id   Id de empleado
 * @param  string  $date Fecha Y-m-d
 * @return boolean Si/No
 */
function checkPlazierAbsenceDay($id, $date)

Funciones para tiempos de trayecto
functions_breaks.php

/**
 * Lista de tiempos de trayectos
 *
 * @param  int    $pag   Página
 * @param  int    $num   Clientes por página
 * @param  string $order Orden de listado
 * @return array  $data  Registros de la tabla
 */
function breaksList($pag, $num, $order = 'start DESC')
/**
 * Contador de tiempo de trayecto
 *
 * @return string Mensaje de notificación
 */
function plazierBreak()
/**
 * Modificar tiempo de trayecto
 */
function editBreak()
/**
 * Borrar trayecto
 */
function deleteBreak()
/**
 * Comprobar si el plazier tiene contador de trayecto activo
 *
 * @return string Tiempo de inicio del contador
 */
function checkPlazierBreak()
/**
 * Obtener media de trayectos de regreso por día y Plazier
 *
 * @param  int    $id   Plazier
 * @return string $data Media
 */
function plazierAverageBreaks($id)
/**
 * Obtener filtro de trayectos
 *
 * @return array $data Filtros
 */
function getBreaksFilters()
/**
 * Guardar filtro de trayectos
 */
function setBreaksFilters()

Funciones para cálculo de rentabilidad y ocupación de agenda
functions_calendar.php

/**
 * Obtener salarios activos entre dos fechas
 *
 * @param  string $date_from Fecha inicio
 * @param  string $date_to   Fecha fin
 * @param  int    $id        Id de plazier (0 para todos)
 * @param  int    $f_id      Id de franquicia (0 para todas)
 * @return array  $data      Salarios asociados
 */
function get_salaries_dates($date_from, $date_to, $id = 0, $f_id = 0)
/**
 * Información de los días entre dos fechas
 *
 * @param  string $date_from  Fecha inicial
 * @param  string $date_to    Fecha final
 * @return array  $data       Información de los días
 */
function get_working_days($date_from, $date_to)
/**
 * Comprobar días laborables de ausencia de un plazier entre dos fechas
 *
 * @param  int     $id        Id de empleado
 * @param  string  $date_from Fecha desde Y-m-d
 * @param  string  $date_to   Fecha hasta Y-m-d
 * @param  boolean $vacations Incluir vacaciones/asuntos propios
 * @return int     $data      Nº de días ausente
 */
function checkPlazierAbsenceRange($id, $date_from, $date_to, $vacations = false)
/**
 * Comprobar días laborables de ausencia de un plazier entre dos fechas, teniendo en cuenta los días activos del salario
 *
 * @param  int     $id        Id de empleado
 * @param  string  $date_from Fecha desde Y-m-d
 * @param  string  $date_to   Fecha hasta Y-m-d
 * @param  array   $days      Días de la semana (empieza en 0 para Domingo)
 * @return int     $data      Nº de días ausente
 */
function checkSalaryAbsenceRange($id, $date_from, $date_to, $days)
/**
 * Comprobar días festivos dentro de los días laborables de ausencia de un plazier entre dos fechas
 *
 * @param  int     $id        Id de empleado
 * @param  string  $date_from Fecha desde Y-m-d
 * @param  string  $date_to   Fecha hasta Y-m-d
 * @param  array   $days      Días de la semana (empieza en 0 para Domingo)
 * @return int     $count     Nº de días ausente
 */
function checkSalaryAbsenceRangeFestives($id, $date_from, $date_to, $days)
/**
 * Servicios de un plazier entre dos fechas
 *
 * @param  int     $id        Plazier
 * @param  string  $date_from Fecha inicial
 * @param  string  $date_to   Fecha final
 * @param  boolean $finished  Solo finalizados si/no
 * @return object  $data      Nº de servicios, tiempo y precio total
 */
function plazierWhasesRange($id, $date_from, $date_to, $finished = false)
/**
 * Servicios previstos/finalizados de un plazier entre dos fechas
 *
 * @param  int     $id        Plazier
 * @param  string  $date_from Fecha inicial
 * @param  string  $date_to   Fecha final
 * @return object  $data      Nº de servicios, tiempo y precio total
 */
function plazierWhasesRangeCompare($id, $date_from, $date_to)
/**
 * Calcular ocupación semanal de un mes
 *
 * @return array $data Ocupación de cada semana
 */
function weekNumbersOcupation()
/**
 * Detalles de la ocupación de una semana
 *
 * @return string $info Información de la semana
 */
function weekOcupationInfo()
/**
 * Calcular ocupación media de un rango
 *
 * @param  string  $start   Fecha inicial
 * @param  string  $end     Fecha final
 * @param  int     $plazier Id de plazier (0 para todos)
 * @param  boolean $day     Día (1) o Rango (0)
 * @return array   $data    Ocupación media y detalles
 */
function rangeOcupationAverage($start, $end, $plazier, $day = 0)
/**
 * Calcular rentabilidad/ocupación del día
 *
 * @return string $data Html para el calendario
 */
function calendarDay()
/**
 * Detalles de la rentabilidad/ocupación del día
 *
 * @return string $data Html para el calendario
 */
function calendarDayInfo()
/**
 * Detalles de tiempo de trabajo/descanso del día
 *
 * @return string $info Html para el calendario
 */
function calendarDayTimeControl()
/**
 * Totales de tiempo de trabajo/descanso del día
 *
 * @param  int    $id      Id de fichaje
 * @param  string $date    Fecha Y-m-d
 * @param  int    $plazier Id de Plazier
 * @return array  $data    Tiempos totales
 */
function calendarDayTimeControlTotals($id, $date, $plazier)
/**
 * Calcular ocupación prevista/real del día
 *
 * @param  string $date   Fecha Y-m-d
 * @param  int    $f_id   Id de franquicia (0 para todas)
 * @param  int    $active Solo Plaziers activos para informes (0 para todos)
 * @return array  $data   Ocupación prevista/real
 */
function calendarDayCompare($date, $f_id = 0, $active = 0)
/**
 * Tabla de rentabilidad/ocupación de x semanas
 *
 * @return string $data Html de tabla
 */
function weekRentability()
/**
 * Obtener media de tiempo de ruta en servicios
 *
 * @return int $data Media
 */
function average_route()
/**
 * Obtener medias de tiempo de ruta en servicios con tiempo estimado
 *
 * @param string  $from Desde
 * @param string  $to   Hasta
 * @param int     $f_id Id de franquicia
 * @return object $data Media estimada/real
 */
function average_route_estimate($from = false, $to = false, $f_id = 0)
/**
 * Obtener media de tiempo de espera
 * Solo si es menor de 40 minutos
 *
 * @param string  $from Desde
 * @param string  $to   Hasta
 * @param int     $f_id Id de franquicia
 * @return int $data Media
 */
function average_waiting($from = false, $to = false, $f_id = 0)
/**
 * Obtener media de tiempo de espera final
 * Solo si es menor de 40 minutos
 *
 * @param string  $from Desde
 * @param string  $to   Hasta
 * @param int     $f_id Id de franquicia
 * @return int $data Media
 */
function average_waiting_final($from = false, $to = false, $f_id = 0)

Funciones de la API de Clientify
functions_clientify.php

/**
 * Buscar contacto por email, si no existe crearlo
 *
 * @param  string $first_name     Nombre
 * @param  string $last_name      Apellidos
 * @param  string $email          Email
 * @param  string $phone          Teléfono
 * @param  string $contact_type   Tipo
 * @param  string $contact_source Origen
 * @param  int    $create         Crear contacto o no
 * @return int    $id             Id de cliente en Clientify
 */
function clientify_search($first_name, $last_name, $email, $phone, $contact_type, $contact_source, $create)
/**
 * Crear contacto
 *
 * @param  string $first_name     Nombre
 * @param  string $last_name      Apellidos
 * @param  string $email          Email
 * @param  string $phone          Teléfono
 * @param  string $contact_type   Tipo
 * @param  string $contact_source Origen
 * @return int    $id             Id de cliente en Clientify
 */
function clientify_create_contact($first_name, $last_name, $email, $phone, $contact_type, $contact_source)
/**
 * Crear pedido
 *
 * @param  int    $order_id Id de pedido
 * @return string $response Respuesta
 */
function clientify_create_order($order_id)
/**
 * Crear carrito abandonado
 *
 * @param  int    $order_id Id de pedido
 * @return string $response Respuesta
 */
function clientify_create_abandoned_order($order_id)

Funciones comunes
functions_common.php

/**
 * Cargar todos los registros de una tabla
 *
 * @param  string $table Tabla en la que buscar los registros
 * @param  string $order Orden de listado
 * @return array  $data  Registros de la tabla
 */
function get_all($table, $order = 'id DESC')
/**
 * Cargar todos los registros de una tabla relacionados
 *
 * @param  string $table Tabla en la que buscar los registros
 * @param  string $field Campo a buscar
 * @param  int    $id    Valor relacionado
 * @param  string $order Orden de listado
 * @return array  $data  Registros de la tabla
 */
function get_all_related($table, $field, $id, $order = 'id DESC')
/**
 * Cargar todos los registros de una tabla por páginas
 *
 * @param  string $table Tabla en la que buscar los registros
 * @param  int    $pag   Página
 * @param  int    $num   Registros por página
 * @param  string $order Orden de listado
 * @return array  $data  Registros de la tabla
 */
function get_all_pag($table, $pag, $num, $order = 'id DESC')
/**
 * Cargar los registros con valor distinto de una tabla
 *
 * @param  string $table Tabla en la que buscar los registros
 * @param  string $field Campo distinto
 * @param  string $order Orden de listado
 * @return array  $data  Registros de la tabla
 */
function get_distinct($table, $field, $order = 'id DESC')
/**
 * Cargar registro por ID
 *
 * @param string  $table Tabla en la que buscar el registro
 * @param int     $id    Id a buscar
 * @return object $data  Registro encontrado
 */
function get_by_id($table, $id)
/**
 * Cargar registro por slug
 *
 * @param  string  $table Tabla en la que buscar el registro
 * @param  string  $field Nombre del campo
 * @param  string  $slug  Slug a buscar
 * @return object  $data  Registro encontrado
 */
function get_by_field_slug($table, $field, $slug)
/**
 * Cargar campo en un idioma
 *
 * @param  string $table Tabla en la que buscar el registro
 * @param  string $field Nombre del campo a buscar
 * @param  int    $id    Id a buscar
 * @param  string $lang  Idioma
 * @return string $data  Campo
 */
function get_translate($table, $field, $id, $lang)
/**
 * Cargar registro por ID desde ajax
 *
 * @return string $data Fila encontrada
 */
function getajax_by_id()
/**
 * Cargar campo por ID
 *
 * @param  string $table Tabla en la que buscar el registro
 * @param  string $field Campo a buscar
 * @param  int    $id    Id a buscar
 * @return string $data  Campo encontrado
 */
function get_field_by_id($table, $field, $id)
/**
 * Cargar campo por ID desde ajax
 *
 * @return string $data Campo encontrado
 */
function getajax_field_by_id()
/**
 * Modificar campo int por ID desde ajax
 */
function setajax_intfield_by_id()
/**
 * Modificar campo string por ID desde ajax
 */
function setajax_strfield_by_id()
/**
 * Número de registros
 *
 * @param  string $table Tabla
 * @return int    $total Número de registros
 */
function get_total($table)
/**
 * Número de registros relacionados
 *
 * @param  string $table Tabla en la que buscar el registro
 * @param  string $field Campo a buscar
 * @param  int    $id    Valor relacionado
 * @return int    $total Número de registros encontrados
 */
function get_total_related($table, $field, $id)
/**
 * Formato de moneda €
 *
 * @param  int    $total Importe
 * @return string Cadena en formato euro
 */
function get_money($total)
/**
 * Formato de distancia
 *
 * @param  int    $dist Metros
 * @return string Cadena en formato distancia
 */
function get_distance($dist)
/**
 * Calcular porcentaje
 *
 * @param  int   $total   100%
 * @param  int   $int     Cantidad
 * @return float $percent Porcentaje
 */
function get_percent($total, $int)
/**
 * Borrar texto del plugin Froala Editor
 *
 * @param  string $text   Texto original del textarea
 * @return string $return Texto eliminando la cadena de Froala
 */
function delete_froala($text)
/**
 * Quitar caracteres especiales
 *
 * @param  string $str Texto original
 * @param  int    $min Convertir a minúsculas si (1) no (0)
 * @return string Texto convertido
 */
function replace_special_characters($str, $min = 0)
/**
 * Validar móvil
 *
 * @param  string  $tel Teléfono
 * @return boolean Si es válido
 */
function validate_mobile($tel)
/**
 * Ordenar array por campo
 *
 * @param string $clave Nombre de campo a ordenar
 */
function ordenar_array($clave)
/**
 * Limpiar duplicados en array multidimensional
 *
 * @param array  $array Array.
 * @param string $key   Campo único.
 */
function unique_multidim_array($array, $key)
/**
 * Limpiar cadena para url
 *
 * @param string $cadena Cadena a limpiar
 */
function limpiar_cadena_url($cadena)
/**
 * Enviar mensaje SMS
 *
 * @param  string  $tel  Teléfono
 * @param  string  $rte  Remitente
 * @param  string  $text Texto
 * @return boolean SMS enviado
 */
function send_sms($tel, $rte, $text)
/**
 * Borrar imagen original
 *
 * @param string $filename Nombre del archivo
 */
function delete_original_img($filename)
/**
 * Borrar todos los tamaños de una imagen
 *
 * @param string $filename Nombre del archivo
 */
function delete_all_img($filename)
/**
 * Enviar email con PHPMailer
 *
 * @param string $destinatario Correo(s) electrónico(s) de destino separados por comas
 * @param string $asunto       Asunto del correo
 * @param string $mensaje_html Contenido del correo en formato HTML
 * @param string $mensaje_text Contenido del correo en formato texto plano
 * @param string $attachment   Adjunto
 */
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
function sendPhpmailerEmail($destinatario, $asunto, $mensaje_html, $mensaje_text, $attachment = false)
/**
 * Guardar log
 *
 * @param string $name        Título de la acción
 * @param string $description Descripción de la acción
 */
function addNewLog($name, $description)
/**
 * Conexión con API WhatsApp de 360 Dialog
 *
 * @param  string $endpoint Endpoint de la API
 * @param  string $request  Tipo de petición
 * @param  array  $payload  Datos a enviar
 * @return array  $response Array con resultados
 */
function apiWhatsApp360($endpoint, $request, $payload = false)
/**
 * Obtener URL de pago con Waylet
 *
 * @param  int    $order_id ID de pago
 * @return string URL
 */
function wayletPayUrl($order_id)

Funciones de configuración
functions_configuration.php

/**
 * Configuración del usuario
 *
 * @return object $data Opciones del usuario
 */
function get_options()
/**
 * Configuración general
 *
 * @return object $data Opciones generales
 */
function get_config()
/**
 * Obtener email de configuración
 *
 * @param  string $category Categoría
 * @return string $email    Email
 */
function get_config_email($category)
/**
 * Obtener valor de configuración de facturas
 *
 * @param  string $option Opción
 * @return string $value  Valor
 */
function get_config_invoice($option)
/**
 * Guardar tamaño de sidebar
 */
function sidebar_size()
/**
 * Cargar número de registros por página
 *
 * @return int $data Registros por página
 */
function get_num_per_page()
/**
 * Guardar número de registros por página
 *
 * @param int $num Registros por página
 */
function set_num_per_page($num)
/**
 * Cargar orden de registros
 *
 * @param  string $field Nombre del campo
 * @return string $data  Valor del campo
 */
function get_order_page($field)
/**
 * Guardar orden de registros
 *
 * @param string $field Nombre del campo
 * @param string $orden Valor del campo
 */
function set_order_page($field, $orden)
/**
 * Modificar configuración del informe de tiempos de servicios
 */
function configWashesTimesIds()
/**
 * Modificar configuración general
 */
function configGeneral()
/**
 * Modificar configuración de emails
 */
function configGeneralEmails()
/**
 * Modificar configuración de facturas
 */
function configFacturas()
/**
 * Comprobar si un mensaje está activo por categoría
 *
 * @param int  $id_cat Id de categoría
 * @param name $name   Nombre del mensaje
 */
function checkMensaje($id_cat, $name)
/**
 * Mensaje por categoría
 *
 * @param int   $id_cat Id de categoría
 * @param name  $name   Nombre del mensaje
 * @param field $field  Tipo de mensaje
 */
function getMensaje($id_cat, $name, $field)
/**
 * Modificar configuración de Mensajes
 */
function configMensajes()
/**
 * Modificar configuración de Mensajes de categoría
 */
function configMensajesCategoria()
/**
 * Modificar configuración de emails de modos de pago
 */
function configEmail()
/**
 * Modificar configuración de pantallas de pago
 */
function configPagos()
/**
 * Modificar configuración de Agenda
 */
function configAgenda()
/**
 * Modificar hora de media jornada en Agenda
 */
function configAgendaPartTime()
/**
 * Modificar configuración de tiempo de espera
 */
function configWaitTimes()
/**
 * Modificar configuración de ausencias
 */
function configAbsences()
/**
 * Añadir/Modificar festivo
 *
 * @return string $data Listado de festivos actualizado
 */
function editFestives()
/**
 * Comprobar si un día está configurado como festivo en determinadas zonas
 *
 * @param  string  $date Fecha Y-m-d
 * @param  array   $zones Ids de zonas
 * @return boolean Si/No
 */
function isFestiveInZones($date, $zones)
/**
 * Comprobar los festivos en determinadas zonas
 *
 * @param  array $zones Ids de zonas
 * @return array $data Festivos
 */
function festivesInZones($zones)
/**
 * Borrar festivo
 */
function deleteFestive()
/**
 * Añadir/Modificar tipo de ausencia
 *
 * @return string $data Listado de ausencias actualizado
 */
function editAbsence()
/**
 * Borrar tipo de ausencia
 */
function deleteAbsenceType()

Funciones de formularios de contacto
functions_contacts.php

/**
 * Lista de formularios
 *
 * @param  int     $pag   Página
 * @param  int     $num   Formularios por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de formularios
 */
function contactsList($pag, $num, $order)
/**
 * Nº de formularios por día
 *
 * @param  string  $day    Fecha Y-m-d
 * @param  int     $status ID de estado (0 para todos)
 * @return int     $data   Nº de formularios
 */
function contactsInDay($day, $status = 0)
/**
 * Añadir/Modificar contacto
 */
function editContact()
/**
 * Detalles de formulario
 *
 * @return string $data Tabla con datos de formulario
 */
function viewContact()
/**
 * Guardar estado de formulario
 */
function editContactStatus()
/**
 * Obtener filtro de formularios
 *
 * @return array $data Filtros
 */
function getContactsFilters()
/**
 * Guardar filtro de formularios
 */
function setContactsFilters()
/**
 * Borrar contacto
 */
function deleteContact()

Funciones de cupones
functions_coupons.php

/**
 * Lista de cupones usados
 *
 * @param  int     $pag   Página
 * @param  int     $num   Cupones por página
 * @param  string  $order Orden de listado
 * @param  int     $id    Id de usuario (0 para todos)
 * @return array   $data  Listado de cupones
 */
function couponsListUsed($pag, $num, $order, $id = 0)
/**
 * Lista de cupones
 *
 * @param  int     $pag   Página
 * @param  int     $num   Cupones por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de cupones
 */
function couponsList($pag, $num, $order)
/**
 * Lista de cupones pendientes de usar
 *
 * @param  int     $pag   Página
 * @param  int     $num   Cupones por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de cupones
 */
function couponsPendingList($pag, $num, $order)
/**
 * Nuevo cupón
 *
 * @return array $jsondata Mensaje de notificación
 */
function addCoupon()
/**
 * Nuevo cupón por incidencia
 *
 * @param  string $name     Nombre
 * @param  int    $discount Descuento
 * @param  int    $type     Tipo
 * @param  int    $user_id  Id de usuario
 */
function addIncidenceCoupon($name, $discount, $type, $user_id)
/**
 * Nuevo cupón de reseña en Google
 *
 * @return array $jsondata Mensaje de notificación
 */
function addCouponGoogleReview()
/**
 * Modificar cupón
 *
 * @return array $jsondata Mensaje de notificación
 */
function editCoupon()
/**
 * Borrar cupón
 */
function deleteCoupon()
/**
 * Obtener cupón por nombre
 *
 * @param  string  $name Nombre de cupón
 * @return array   $data Datos de promoción
 */
function getCouponByName($name)
/**
 * Comprobar si un cupón es válido por nombre
 *
 * @param  string  $name    Nombre de cupón
 * @param  int     $user_id Id de usuario
 * @return boolean
 */
function isValidCoupon($name, $user_id)
/**
 * Comprobar usos de un cupón en pedidos sin cancelar
 *
 * @param  string $name    Nombre de cupón.
 * @param  id     $user_id Id de usuario (0 para todos).
 * @return int    $total   Nº de usos
 */
function couponTotalUses($name, $user_id = 0)
/**
 * Aplicar cupón a importe
 *
 * @param  int    $id    Id de cupón
 * @param  string $price Importe original
 * @return string $data  Importe con descuento aplicado
 */
function applyCoupon($id, $price)
/**
 * Obtener descuento de cupón sobre importe
 *
 * @param  int    $id    Id de cupón
 * @param  string $price Importe original
 * @return string $desc  Descuento aplicado
 */
function getCouponDiscount($id, $price)
/**
 * Lista de promociones
 *
 * @param  int     $pag   Página
 * @param  int     $num   Promociones por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de promociones
 */
function promotionsList($pag, $num, $order)
/**
 * Obtener promoción por slug
 *
 * @param  string  $slug Slug de promoción
 * @return array   $data Datos de promoción
 */
function getPromotionBySlug($slug)
/**
 * Nuevo cupón de promoción
 *
 * @param string $name     Nombre de cupón
 * @param int    $type     Tipo de descuento
 * @param float  $discount Descuento
 * @param int    $user_id  Id de usuario
 */
function addPromoCoupon($name, $type, $discount, $user_id)
/**
 * Editar promoción
 */
function editPromo()
/**
 * Enviar invitación de cliente
 *
 * @param  int    $id    Id de cliente
 * @param  string $email Mail del invitado
 * @param  string $phone Teléfono del invitado
 * @return array  $data  Datos de invitaciones
 */
function inviteFriend($id, $email, $phone)
/**
 * Comprobar invitación de cliente
 *
 * @param  int     $id    Id de cliente
 * @param  string  $email Mail del invitado
 * @return boolean Si es válido
 */
function checkPromoFriend($id, $email)
/**
 * Invitaciones enviadas por un cliente
 *
 * @param  int   $id   Id de cliente
 * @return array $data Datos de invitaciones
 */
function userPromoFriends($id)
/**
 * Invitaciones enviadas por un cliente y finalizadas
 *
 * @param  int $id    Id de cliente
 * @return int $total Nº de invitaciones
 */
function userPromoFriendsOk($id)
/**
 * Cupones de reseñas enviadas por un cliente y finalizadas
 *
 * @param  int $id    Id de cliente
 * @return int $total Nº de cupones
 */
function userPromoReviews($id)
/**
 * Añadir nuevo cupón de reseña enviada por un cliente
 *
 * @param int $id Id de cliente
 */
function addUserPromoReview($id)
/**
 * Lista de invitaciones y cupones
 *
 * @param  int    $pag     Página
 * @param  int    $num     Items por página
 * @param  int    $id      Id de Plazier (0 para todos)
 * @param  int    $success Solo confirmadas
 * @param  string $from    Desde
 * @param  string $to      Hasta
 * @return array  $data    Listado de invitaciones
 */
function invitationsList($pag, $num, $id = 0, $success = 0, $f_id = 0, $from = '', $to = '')
/**
 * Total de invitaciones y cupones
 *
 * @param  int    $id   Id de Plazier
 * @param  int    $f_id Id de franquicia
 * @param  string $from Desde
 * @param  string $to   Hasta
 * @return array  $data Total y comisión
 */
function invitationsTotals($id = 0, $f_id = 0, $from = '', $to = '')
/**
 * Enviar invitación
 *
 * @return array $jsondata Mensaje de notificación
 */
function sendPlazierInvitation()
/**
 * Enviar cupón de Plazier
 *
 * @return array $jsondata Mensaje de notificación
 */
function sendPlazierCoupon()
/**
 * Comprobar invitación de Plazier
 *
 * @param  int     $id    Id de Plazier
 * @param  string  $email Mail del invitado
 * @return boolean Si es válido
 */
function checkPlazierInvitation($id, $email)

Funciones de clientes
functions_customers.php

/**
 * Lista de clientes
 *
 * @param  int     $pag   Página
 * @param  int     $num   Clientes por página
 * @param  string  $order Orden de listado
 * @param  int     $b2b   Clientes B2B Si(1)/No(0)
 * @return array   $data  Listado de clientes
 */
function customersList($pag, $num, $order, $b2b)
/**
 * Lista de clientes registrados entre dos fechas
 *
 * @param  string  $from  Fecha inicial
 * @param  string  $to    Fecha final
 * @param  int     $pag   Página
 * @param  int     $num   Clientes por página
 * @param  string  $order Orden
 * @return array   $data  Listado de clientes
 */
function customersRangeList($from, $to, $pag, $num, $order)
/**
 * Obtener datos de cliente
 *
 * @param  int    $id   Id de cliente
 * @return object $data Datos de usuario
 */
function getCustomer($id)
/**
 * Obtener datos de cliente por AJAX
 *
 * @return object $data Datos de usuario
 */
function get_customer_ajax()
/**
 * Nuevo cliente
 *
 * @return array $jsondata Mensaje de notificación
 */
function addCustomer()
/**
 * Modificar cliente
 *
 * @return array $jsondata Mensaje de notificación
 */
function editCustomer()
/**
 * Modificar cliente con datos web
 */
function editCustomerWeb()
/**
 * Modificar imagen de perfil
 */
function editCustomerImage()
/**
 * Modificar imagen de perfil con URL externa
 */
function editCustomerImageUrl()
/**
 * Borrar cliente
 */
function deleteCustomer()
/**
 * Comprobar disponibilidad de email
 *
 * @param  int     $id   Id de cliente (enviar 0 si es un nuevo cliente)
 * @param  string  $mail Correo electrónico
 * @return boolean Si el email es válido
 */
function checkAvailableCustomerEmail($id, $mail)
/**
 * Datos de cliente por email
 *
 * @param  string $mail Correo electrónico
 * @return object $row  Datos de cliente
 */
function getCustomerByEmail($mail)
/**
 * Enlazar cliente de la App con el de la Web
 *
 * @param  int $id     Id de la App
 * @param  int $web_id Id de la Web
 */
function addCustomerWebId($id, $web_id)
/**
 * Lista de vehículos
 *
 * @param  int     $id     Id de cliente (0 para todos los clientes)
 * @param  int     $pag    Página
 * @param  int     $num    Vehículos por página
 * @param  string  $order  Orden de listado
 * @param  boolean $json   Si el resultado es json para ajax o no
 * @param  int     $subcat Subcategoría
 * @return array   $data   Listado de vehículos
 */
function customersVehiclesList($id, $pag, $num, $order, $json = false, $subcat = false)
/**
 * Nuevo vehículo de cliente
 *
 * @return array $jsondata Mensaje de notificación
 */
function addCustomerVehicle()
/**
 * Modificar vehículo de cliente
 *
 * @return array $jsondata Mensaje de notificación
 */
function editCustomerVehicle()
/**
 * Borrar vehículo de cliente
 */
function deleteCustomerVehicle()
/**
 * Lista de direcciones de servicio
 *
 * @param  int     $id    Id de cliente (0 para todos los clientes)
 * @param  int     $pag   Página
 * @param  int     $num   Direcciones por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de direcciones
 */
function customersAddressList($id, $pag, $num, $order, $json = false)
/**
 * Lista de direcciones de servicio no válidas
 *
 * @param  int     $id    Id de cliente (0 para todos los clientes)
 * @param  int     $pag   Página
 * @param  int     $num   Direcciones por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de direcciones
 */
function customersAddressErrorList($id, $pag, $num, $order, $json = false)
/**
 * Lista de CPs no válidos
 *
 * @return array $data Listado de CPs
 */
function customersAddressErrorCPs()
/**
 * Datos de dirección
 *
 * @param  int   $id   Id de dirección
 * @return array $data Datos de dirección
 */
function getCustomerAddress($id)
/**
 * Lista de direcciones de facturación
 *
 * @param  int     $id    Id de cliente (0 para todos los clientes)
 * @param  int     $pag   Página
 * @param  int     $num   Direcciones por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de direcciones
 */
function customersAddressInvoiceList($id, $pag, $num, $order, $json = false)
/**
 * Nueva dirección de servicio de cliente
 *
 * @return array $jsondata Mensaje de notificación
 */
function addCustomerAddress()
/**
 * Guardar dirección no disponible de cliente
 */
function addCustomerAddressError()
/**
 * Modificar dirección de servicio de cliente
 *
 * @return array $jsondata Mensaje de notificación
 */
function editCustomerAddress()
/**
 * Borrar dirección de servicio de cliente
 */
function deleteCustomerAddress()
/**
 * Añadir/Modificar dirección de facturación de cliente
 *
 * @return array $jsondata Mensaje de notificación
 */
function customerAddressInvoice()
/**
 * Borrar dirección de facturación de cliente
 */
function deleteCustomerAddressInvoice()
/**
 * Actualizar correo de usuario en WordPress
 *
 * @param  int    $id    Id de usuario en la Web
 * @param  string $email Nuevo email de usuario
 * @return object $data  Info de estado
 */
function updateWebUserEmail($id, $email)
/**
 * Añadir servicios específicos para clientes de empresa
 */
function addCustomerB2bService()
/**
 * Borrar servicios específicos para clientes de empresa
 */
function deleteCustomerB2bService()
/**
 * Avisar a clientes de cancelación por Plazier archivado
 */
function archivedCancelNotice()
/**
 * Servicio actual/siguiente de un usuario
 *
 * @param  int   $id   Id de usuario
 * @return array $data Info de servicios
 */
function getUserNearWash($id)
/**
 * Vehículo de usuario
 *
 * @param  int   $id   Id de vehículo
 * @return array $data Info de vehículo
 */
function getUserVehicle($id)
/**
 * Vehículo de usuario con más servicios
 *
 * @param  int   $id   Id de usuario
 * @return array $data Info de vehículo
 */
function getUserBestVehicle($id)
/**
 * Siguiente servicio de vehículo de usuario
 *
 * @param  int   $id   Id de vehículo de usuario
 * @return array $data Info de servicio
 */
function getUserVehicleNextWash($id)
/**
 * Último servicio de vehículo de usuario
 *
 * @param  int   $id   Id de vehículo de usuario
 * @return array $data Info de servicio
 */
function getUserVehicleLastWash($id)
/**
 * Solicitar certificado
 */
function environmentalCertificate()

Funciones de fecha y hora
functions_datetime.php

/**
* Formato de fecha indicando Ayer/Hoy/Mañana
*
* @param  string $date Fecha a convertir
* @return string Fecha convertida
*/
function get_date($date)
/**
* Formato de fecha
*
* @param  string $date Fecha a convertir
* @return string Fecha convertida
*/
function get_date_($date)
/**
* Formato de fecha para lectura
*
* @param  string $date Fecha a convertir
* @param  int    $min  Fecha comprimida si (1) no (0)
* @return string Fecha convertida
*/
function clean_date($date, $min = 0)
/**
* Día de la semana en español
*
* @param  string $date Fecha Y-m-d a convertir
* @return string Nombre de día de la semana
*/
function es_day($date)
/**
* Formato de día y hora
*
* @param  string $date Fecha a convertir
* @return string Fecha y hora convertida
*/
function get_datetime($date)
/**
* Formato de hora
*
* @param  string $date Fecha a convertir
* @return string Hora convertida
*/
function get_time($date)
/**
* Minutos de diferencia entre dos fechas
*
* @param  string $from Fecha inicial
* @param  string $to   Fecha final
* @return int    Minutos
*/
function dif_minutes($from, $to)
/**
* Convertir minutos en horas y minutos
*
* @param  int    $time Nº de minutos
* @return string Cadena H horas i minutos
*/
function convertToHoursMins($time)
/**
* Redondear hora a la siguiente hora múltiplo de 5
*
* @param  string  $time Hora (H:i)
* @param  boolean $to   Hacia arriba (true) o hacia abajo (false)
* @return string  $time Hora redondeada
*/
function roundTime5($time, $to = true)
/**
* Redondear hora a la siguiente hora múltiplo de 10
*
* @param  string $time Hora (H:i)
* @return string $time Hora redondeada
*/
function roundTime10($time)
/**
* Redondear minutos de un servicio a la mitad
*
* @param  int $time Minutos
* @return int $time Minutos
*/
function roundTimeHalf($time)
/**
* Calcular días entre fechas
*
* @param  string $fecha_inicial Fecha inicial
* @param  string $fecha_final   Fecha final
* @return int    $dias          Nº de días
*/
function days_count($fecha_inicial, $fecha_final)
/**
* Calcular días futuros entre fechas
*
* @param  string $fecha_inicial Fecha inicial
* @param  string $fecha_final   Fecha final
* @return int    $dias          Nº de días
*/
function future_days_count($fecha_inicial, $fecha_final)
/**
* Comprobar nº de días del año
*
* @param  string $year Año
* @return int    $dias Nº de días
*/
function year_days_count($year)
/**
* Comprobar nº de días de lunes a viernes en un mes/año
*
* @param  int $m Mes
* @param  int $y Año
* @return int Nº de días
*/
function get_weekdays($m, $y)
/**
* Calcular días de una semana por nº de semana y año
*
* @param  int     $week    Nº de semana
* @param  int     $year    Año
* @param  boolean $weekend Incluir o no fines de semana
* @return array   $data    Días
*/
function week_days($week, $year, $weekend)
/**
 * Contar repeticiones de un mismo día de la semana entre dos fechas
 *
 * @param  int    $day   Día de la semana (empieza en 0 para Domingo)
 * @param  string $start Día inicial en formato Y-m-d
 * @param  string $end   Día final en formato Y-m-d
 * @return int    Nº de repeticiones de $day entre $start y $end
 */
function countDays($day, $start, $end)
/**
 * Contar festivos entre dos fechas que correspondan a ciertos días de la semana y a ciertas zonas
 *
 * @param  array  $days  Días de la semana (empieza en 0 para Domingo)
 * @param  string $start Día inicial en formato Y-m-d
 * @param  string $end   Día final en formato Y-m-d
 * @param  array  $zones Ids de zonas
 * @return int    $count Nº de días festivos de $days entre $start y $end
 */
function countFestivesInZones($days, $start, $end, $zones)
/**
 * Calcular días laborables de un empleado entre dos fechas
 *
 * @param  int    $id    Id de empleado
 * @param  string $start Día inicial en formato Y-m-d
 * @param  string $end   Día final en formato Y-m-d
 * @return int    $days  Nº de días laborables de $id entre $start y $end
 */
function countLabDays($id, $start, $end)
/**
 * Comprobar si una fecha es mañana como mínimo
 *
 * @param  string $date Fecha
 * @return srting $date Fecha
 */
function date_min_tomorrow($date)

Funciones de plantillas de email
functions_emails.php

/**
 * Enviar mail de prueba
 */
function emailTest()
/**
 * Enviar mail de pago pendiente
 *
 * @param int $order_id Id de pedido
 */
function emailPayment($order_id)
/**
 * Enviar mail de pago realizado
 *
 * @param int $order_id Id de pedido
 */
function emailCalendar($order_id)
/**
 * Enviar mail de pedido cancelado
 *
 * @param int $order_id Id de pedido
 */
function emailCanceled($order_id)
/**
 * Enviar mail de servicio modificado
 *
 * @param int $wash_id Id de servicio
 */
function emailWashEdit($wash_id)
/**
 * Plantilla HTML de email
 *
 * @param  $string $titulo Título del mensaje
 * @param  $string $texto  Cuerpo del mensaje
 * @return string  $html   Contenido de la plantilla
 */
function emailTemplate($titulo, $texto)

Funciones de empleados
functions_employees.php

/**
 * Lista de empleados
 *
 * @param  int     $pag   Página
 * @param  int     $num   Empleados por página
 * @param  string  $order Orden de listado
 * @param  int     $dep   Id de departamento (0 para todos)
 * @param  int     $del   Archivados (1) o Activos (0)
 * @param  int     $rol   ID de rol (0 para todos)
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de empleados
 */
function employeesList($pag, $num, $order, $dep = 0, $del = 0, $rol = 0, $json = false)
/**
 * Lista de empleados básica
 *
 * @param  string  $order Orden de listado
 * @param  int     $dep   Id de departamento (0 para todos)
 * @param  boolean $ids   Solo ids o todos los datos
 * @return array   $data  Listado de empleados
 */
function employeesBasicList($order = 'id ASC', $dep = 0, $ids = false)
/**
 * Obtener filtro de empleados
 *
 * @return array $data Filtros
 */
function getEmployeesFilters()
/**
 * Guardar filtro de empleados
 */
function setEmployeesFilters()
/**
 * Lista de plaziers en activo
 *
 * @param  int   $all  Todos los Plaziers
 * @return array $data Listado de plaziers en activo
 */
function plaziersList($all = 0)
/**
 * Lista de plaziers distintos con servicios
 *
 * @param  string $from Fecha desde
 * @param  string $to   Fecha hasta
 * @return array  $data Listado de plaziers en activo
 */
function plaziersDistinct($from = '', $to = '')
/**
 * Desempeño medio entre fechas
 *
 * @param  int    $id   Id de Plazier
 * @param  string $from Fecha desde
 * @param  string $to   Fecha hasta
 * @return array  $data Nota media y total de servicios
 */
function plaziersRangePerformance($id, $from = '', $to = '')
/**
 * Comprobar siguiente nº de plazier
 *
 * @return int $number Número a usar
 */
function getPlazierNumber()
/**
 * Lista de departamentos
 *
 * @param  int     $pag   Página
 * @param  int     $num   Departamentos por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de departamentos
 */
function departmentsList($pag, $num, $order, $json = false)
/**
 * Nuevo departamento
 *
 * @return array $jsondata Mensaje de notificación
 */
function addDepartment()
/**
 * Modificar icono de departamento
 */
function editDepartmentImage()
/**
 * Modificar departamento
 *
 * @return array $jsondata Mensaje de notificación
 */
function editDepartment()
/**
 * Borrar departamento
 */
function deleteDepartment()
/**
 * Obtener agenda de empleado
 *
 * @param  int    $id   Id de empleado
 * @return object $data Horarios
 */
function getUserSchedule($id)
/**
 * Obtener horario de empleado en un día
 *
 * @param  int    $id   Id de empleado
 * @param  int    $d    Nº de día (1-7)
 * @return object $data Horarios
 */
function getUserDaySchedule($id, $d)
/**
 * Comprobar si un Plazier trabaja en un día
 *
 * @param  int    $id    Id de empleado
 * @param  string $date  Fecha (Y-m-d)
 * @return string $start Hora inicial
 */
function checkPlazierAvailableDay($id, $date)
/**
 * Modificar agenda de empleado
 *
 * @return array $jsondata Mensaje de notificación
 */
function editUserSchedule()
/**
 * Comprobar última limpieza de paños de un Plazier
 *
 * @param  int   $id   Id de empleado
 * @return array $data Fecha de última limpieza y Nº de servicios desde esa fecha hasta ahora
 */
function checkPlazierLastPanhos($id)
/**
 * Obtener salarios de un empleado
 *
 * @param  int   $product Id de empleado
 * @param  int   $type    Tipo de salario: mensual (0) o por horas (1)
 * @return array $data    Salarios asociados
 */
function get_user_salaries($user_id, $type = 0)
/**
 * Comprobar si un empleado tiene salario activo
 *
 * @param  int     $id Id de empleado
 * @return boolean Si hay salario activo o no
 */
function checkUserActiveSalary($id)
/**
 * Comprobar si un empleado tiene salario activo en un día
 *
 * @param  int     $id   Id de empleado
 * @param  string  $date Fecha Y-m-d
 * @return boolean Si hay salario activo o no
 */
function checkPlazierSalaryDate($id, $date)
/**
 * Datos de salario activo de un empleado
 *
 * @param  int   $id   Id de empleado
 * @return array $data Datos de salario
 */
function get_user_active_salary($id)
/**
 * Datos del salario de un empleado por fecha
 *
 * @param  int    $id   Id de empleado
 * @param  string $date Fecha Y-m-d
 * @return array  $data Datos de salario
 */
function get_user_salary_by_date($id, $date)
/**
 * Obtener fecha de último servicio agendado de un Plazier
 *
 * @param  int    $id   Id de empleado
 * @return string $data Fecha
 */
function get_user_last_wash($id)
/**
 * Obtener fechas de futuros servicios de un Plazier
 *
 * @param  int   $id   Id de empleado
 * @return array $data Fechas
 */
function get_user_future_washes($id)
/**
 * Añadir salarios
 *
 * @return array $jsondata Mensaje de notificación
 */
function addSalary()
/**
 * Modificar salario
 *
 * @return array $jsondata Mensaje de notificación
 */
function editSalary()
/**
 * Finalizar salario
 */
function endSalary()
/**
 * Borrar salario
 */
function deleteSalary()
/**
 * Obtener zonas de un empleado
 *
 * @param  int   $user_id Id de empleado
 * @return array $data    Zonas asociadas
 */
function get_user_zones($user_id)
/**
 * Obtener zonas alternativas de un empleado
 *
 * @param  int   $user_id Id de empleado
 * @return array $data    Zonas asociadas
 */
function get_user_zones_alt($user_id)
/**
 * Modificar zonas de empleado
 */
function editUserZones()
/**
 * Modificar cuenta de facturación de franquicia
 *
 * @return array $jsondata Mensaje de notificación
 */
function editUserHoldedAccount()
/**
 * Modificar datos de usuario franquicia
 *
 * @return array $jsondata Mensaje de notificación
 */
function editUserFranchise()
/**
 * Modificar servicios de empleado
 */
function editUserServices()
/**
 * Modificar vehículo de empleado
 */
function editUserVehicle()
/**
 * Modificar grupo de Plaziers
 */
function editPlaziersGroup()
/**
 * Obtener plaziers activos de una zona
 *
 * @param  int   $zone_id Id de zona
 * @return array $data    Empleados asociados
 */
function getZonePlaziers($zone_id)
/**
 * Obtener plaziers secundarios de una zona
 *
 * @param  int   $zone_id Id de zona
 * @return array $data    Empleados asociados
 */
function getZoneAltPlaziers($zone_id)
/**
 * Obtener plaziers de una ETT
 *
 * @param  int   $ett_id Id de empleado
 * @return array $data   Zonas asociadas
 */
function get_ett_users($ett_id)
/**
 * Modificar plaziers de ETT
 */
function editEttUsers()
/**
 * Obtener información de rentabilidad de un salario
 *
 * @param  object $sal       Salario
 * @param  string $date_from Fecha desde Y-m-d
 * @param  string $date_to   Fecha hasta Y-m-d
 * @return array  $data      Información de rentabilidad
 */
function plazier_salarie_rentability($sal, $date_from, $date_to)
/**
 * Obtener información de ocupación de un salario
 *
 * @param  object  $sal       Salario
 * @param  string  $date_from Fecha desde Y-m-d
 * @param  string  $date_to   Fecha hasta Y-m-d
 * @return array   $data      Información de rentabilidad
 */
function plazier_salary_ocupation($sal, $date_from, $date_to)
/**
 * Horas de trabajo en festivos entre dos fechas que correspondan a ciertos días de la semana
 *
 * @param  int    $id    Id de salario
 * @param  array  $days  Días de la semana (empieza en 0 para Domingo)
 * @param  string $start Día inicial en formato Y-m-d
 * @param  string $end   Día final en formato Y-m-d
 * @return int    $hours Nº de horas en festivos de $days entre $start y $end
 */
function salaryHoursFestives($id, $days, $start, $end)
/**
 * Horas de trabajo en ausencias de un plazier entre dos fechas
 *
 * @param  int     $id        Id de salario
 * @param  int     $plazier   Id de empleado
 * @param  string  $date_from Fecha desde Y-m-d
 * @param  string  $date_to   Fecha hasta Y-m-d
 * @param  array   $days      Días de la semana (empieza en 0 para Domingo)
 * @return int     $hours     Nº de horas ausente
 */
function salaryHoursAbsences($id, $plazier, $date_from, $date_to, $days)
/**
 * Horas de trabajo en ausencias de un plazier entre dos fechas que coinciden con festivos
 *
 * @param  int     $id        Id de salario
 * @param  int     $plazier   Id de empleado
 * @param  string  $date_from Fecha desde Y-m-d
 * @param  string  $date_to   Fecha hasta Y-m-d
 * @param  array   $days      Días de la semana (empieza en 0 para Domingo)
 * @return int     $hours     Nº de horas ausente
 */
function salaryHoursAbsencesFestives($id, $plazier, $date_from, $date_to, $days)
/**
 * Días festivos en un salario
 *
 * @param  int $id   Id de salario
 * @return int $days Nº de días festivos
 */
function salaryDaysFestives($id)
/**
 * Ausencia durante un salario
 *
 * @param  int   $id   Id de salario
 * @return array $data Ausencias
 */
function salaryAbsences($id)
/**
 * Horas trabajadas durante un salario
 *
 * @param  int $id    Id de salario
 * @return int $hours Horas
 */
function salaryTimeControl($id)
/**
 * Comprobar si un Plazier es un grupo activo
 *
 * @param  int $id Id de empleado
 * @return boolean
 */
function checkPlazierGroup($id)
/**
 * Comprobar si un Plazier pertenece a un grupo activo
 *
 * @param  int   $id  Id de empleado
 * @return array $row Nombre de grupo
 */
function checkPlazierInGroup($id)

Funciones de Partners
functions_employees_partners.php

/**
 * Listado de comisiones entre dos fechas
 *
 * @param  string $id        Id de partner (0 para todos)
 * @param  string $date_from Fecha de inicio
 * @param  string $date_to   Fecha de final
 * @return array  $data      Listado de partners
 */
function get_partners_list($date_from, $date_to, $id = 0)
/**
 * Datos totales de partner
 *
 * @param  string $id   Id de partner
 * @return array  $data Totales
 */
function get_partner_totals($id)
/**
 * Modificar comisión de Partner
 */
function editPartnerUsers()
/**
 * Obtener direcciones de Partners activos
 *
 * @return array $data Direcciones asociadas
 */
function get_partners_addresses()
/**
 * Obtener direcciones de un Partner
 *
 * @param  int   $id   Id de empleado
 * @return array $data Direcciones asociadas
 */
function get_partner_addresses($id)
/**
 * Añadir/Editar dirección de Partner
 *
 * @return array $jsondata Mensaje de notificación
 */
function editPartnerAddress()
/**
 * Borrar dirección de Partner
 */
function deletePartnerAddress()
/**
 * Añadir/Editar pago a Partner
 *
 * @return array $jsondata Mensaje de notificación
 */
function editPartnerPago()
/**
 * Borrar pago a Partner
 */
function deletePartnerPago()
/**
 * Modificar datos de Empresa
 */
function editCompanyUsers()

Funciones de Franquicias
functions_franchises.php

/**
 * Comprobar si un Plazier trabaja en la zona de la franquicia logueada
 *
 * @param  int $id Id de plazier
 * @return boolean
 */
function check_franchise_plazier($id)
/**
 * Comprobar si un servicio pertenece a la franquicia logueada
 *
 * @param  int $id Id de servicio
 * @return boolean
 */
function check_franchise_wash($id)
/**
 * Comprobar si un pedido tiene servicios que pertenecen a la franquicia logueada
 *
 * @param  int $id Id de pedido
 * @return boolean
 */
function check_franchise_order($id)
/**
 * Comprobar franquicia a la que pertenece un pedido
 *
 * @param  int $id Id de pedido
 * @return boolean
 */
function get_franchise_order($id)
/**
 * Comprobar si una paxster pertenece a la franquicia logueada
 *
 * @param  int $id Id de paxster
 * @return boolean
 */
function check_franchise_paxster($id)
/**
 * Ids de paxsters asociadas a empleados de una franquicia
 *
 * @return array $data IDs de Paxsters
 */
function get_franchise_paxsters()
/**
 * Actualizar stock de vehículos de franquicia
 *
 * @return array $jsondata Mensaje de notificación
 */
function updateVehiclesStockFranchise()
/**
 * Enviar pedido de material a Central
 *
 * @return array $jsondata Mensaje de notificación
 */
function materialFranchiseOrder()
/**
 * Lista de servicios generados entre fechas por una franquicia
 *
 * @param  string $from  Fecha desde
 * @param  string $to    Fecha hasta
 * @param  int    $pag   Página
 * @param  int    $num   Servicios por página
 * @param  string $order Orden
 * @param  int    $id    Id de franquicia
 * @return array  $data  Listado de servicios
 */
function washesListFranchise($from, $to, $pag, $num, $order, $id)
/**
 * Lista de empleados básica de una franquicia
 *
 * @param  int     $id    Id de franquicia
 * @param  string  $order Orden de listado
 * @param  int     $dep   Id de departamento (0 para todos)
 * @param  boolean $ids   Solo ids o todos los datos
 * @return array   $data  Listado de empleados
 */
function employeesBasicListFranchise($id, $order = 'id ASC', $dep = 0, $ids = false)
/**
 * Obtener siguiente número de factura
 *
 * @param  int $id     Id de franquicia
 * @return int $numero Número de factura
 */
function getFranchiseInvoiceNumber($id)
/**
 * Lista de facturas de la franquicia
 *
 * @param  int   $id   Id de franquicia
 * @return array $data Facturas
 */
function getFranchiseInvoices($id)
/**
 * Generar factura del mes pasado de la franquicia
 */
function saveInvoiceFranchise()
/**
 * Borrar factura de franquicia
 */
function deleteInvoiceFranchise()
/**
 * Comprobar a qué franquicias pertenecen los servicios de un pedido
 *
 * @param  int     $id   Id de pedido
 * @param  boolean $text Devolver como texto
 * @return array   $data Franquicias
 */
function checkOrderFranchises($id, $text = true)

Funciones de gamificación
functions_gamification.php

/**
 * Obtener clasificación mensual
 *
 * @param  int    $year  Año
 * @param  string $month Mes 01-12
 * @return array  $data  Clasificación de Plaziers
 */
function getMonthClasification($year, $month)
/**
 * Obtener histórico de puntos
 *
 * @param  int   $year Año (0 para todos)
 * @param  int   $id   Id de Plazier (0 para todos)
 * @return array $data Puntuación
 */
function getPoints($year = 0, $id = 0)
/**
 * Obtener puntos de un Plazier por servicios y desempeño
 *
 * @param  int    $id        Id de Plazier
 * @param  string $date_from Fecha inicial Y-m-d
 * @param  string $date_to   Fecha final Y-m-d
 * @return array  $data      Datos de servicios
 */
function getPlazierWashPoints($id, $date_from, $date_to)
/**
 * Obtener puntos de un Plazier por incidencias
 *
 * @param  int    $id        Id de Plazier
 * @param  string $date_from Fecha inicial Y-m-d
 * @param  string $date_to   Fecha final Y-m-d
 * @return array  $data      Datos de incidencias
 */
function getPlazierIncidencesPoints($id, $date_from, $date_to)
/**
 * Obtener puntos de un Plazier por invitaciones
 *
 * @param  int    $id        Id de Plazier
 * @param  string $date_from Fecha inicial Y-m-d
 * @param  string $date_to   Fecha final Y-m-d
 * @return array  $data      Datos de invitaciones
 */
function getPlazierInvitationPoints($id, $date_from, $date_to)

Funciones de geolocalización
functions_geolocation.php

/**
 * Guardar localización de usuario
 *
 * @return string Fecha
 */
function saveGeolocation()
/**
 * Datos de la última localización del usuario
 *
 * @param  int    $id   Id de usuario
 * @return string $data Fecha
 */
function getLastGeolocation($id = 0)
/**
 * Fecha y hora de la última localización del usuario
 *
 * @param  int    $id   Id de usuario
 * @return string $data Fecha
 */
function getLastGeolocationDate($id = 0)
/**
 * Obtener dirección en GMaps con coordenadas
 *
 * @param  string $lat  Latitud
 * @param  string $lon  Longitud
 * @return array  $data Dirección
 */
function getGoogleAddressByLatLon($lat, $lon)

Funciones de sincronización con Holded
functions_holded.php

/**
 * Sincronizar contacto con Holded
 *
 * @param int $id Id de usuario
 */
function holded_sync_contact($id)
/**
 * Actualizar DNI de contacto con Holded
 *
 * @param int    $id  Id de usuario
 * @param string $dni DNI
 */
function holded_sync_contact_dni($id, $dni)
/**
 * Sincronizar productos simples con Holded
 *
 * @param int $id Id de producto
 */
function holded_sync_simple_product($id)
/**
 * Sincronizar productos variables con Holded
 *
 * @param int $id Id de producto
 */
function holded_sync_variable_product($id)
/**
 * Sincronizar pedido con Holded
 *
 * @param int $id Id de pedido
 */
function holded_sync_order($id)
/**
 * Pagar pedido en Holded
 *
 * @param int    $id     Id de pedido
 * @param string $doc    Tipo de documento
 * @param int    $refund Si es una devolución
 */
function holded_pay_order($id, $doc, $refund = 0)
/**
 * Crear ticket rectificativo
 *
 * @param int $id Id de pedido
 */
function holded_refund_order($id)
/**
 * Sincronizar factura con Holded
 *
 * @param int $id Id de factura
 */
function holded_sync_invoice($id)
/**
 * Pagar factura en Holded
 *
 * @param int    $id  Id de pedido
 * @param string $doc Tipo de documento
 */
function holded_pay_invoice($id, $doc)
/**
 * Borrar pedido/factura en Holded
 *
 * @param int    $id  Id de pedido en holded
 * @param string $doc Tipo de documento
 */
function holded_delete_order($id, $doc)
/**
 * Comprobar cuenta de facturacion
 *
 * @param int    $id      Id de pedido
 * @param string $account Id de cuenta de Holded
 */
function holded_user_account($id)

Funciones de ideas
functions_ideas.php

/**
 * Enviar idea
 */
function sendMessage()
/**
 * Lista de ideas
 *
 * @param  int     $pag   Página
 * @param  int     $num   Ideas por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de ideas
 */
function ideasList($pag, $num, $order)
/**
 * Obtener filtro de ideas
 *
 * @return array $data Filtros
 */
function getIdeasFilters()
/**
 * Guardar filtro de ideas
 */
function setIdeasFilters()
/**
 * Ideas totales
 *
 * @param  int $status Id de estado
 * @param  int $id     Id de empleado (0 para mostrar todos)
 * @return int $num    Total de ideas pendientes
 */
function ideasTotal($status, $id = 0)
/**
 * Ideas totales en un rango
 *
 * @param  string $date_from Fecha inicio
 * @param  string $date_to   Fecha final
 * @param  int    $status    Id de estado
 * @param  int    $id        Id de empleado (0 para mostrar todos)
 * @return int    $num       Total de ideas pendientes
 */
function ideasTotalRange($date_from, $date_to, $status, $id = 0)
/**
 * Modificar idea
 */
function editIdea()

Funciones de facturas
functions_invoices.php

/**
 * Lista de facturas
 *
 * @param  int     $pag   Página
 * @param  int     $num   Facturas por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de facturas
 */
function invoicesList($pag, $num, $order, $json = false)
/**
 * Obtener filtro de facturas de usuario
 *
 * @return array $data Filtros
 */
function getInvoicesFilters()
/**
 * Guardar filtro de facturas de usuario
 */
function setInvoicesFilters()
/**
 * Obtener siguiente número de factura del año actual
 *
 * @param  int $year   Año
 * @return int $number Número de factura
 */
function getNextInvoiceNumber($year)
/**
 * Guardar fecha de pago de factura
 */
function saveInvoiceDate()
/**
 * Añadir factura
 *
 * @return array $jsondata Mensaje de notificación
 */
function addInvoice()
/**
 * Añadir factura desde la web
 *
 * @return array $data Mensaje de notificación
 */
function addInvoiceWeb()
/**
 * Añadir factura de múltiples pedidos
 */
function addInvoiceMultiple()
/**
 * Modificar fecha de factura
 */
function editInvoiceDate()
/**
 * Ocultar descuentos en factura
 */
function editInvoiceDiscounts()
/**
 * Ocultar matrículas en factura
 */
function editInvoiceNumberPlate()
/**
 * Borrar factura
 */
function deleteInvoice()
/**
 * Obtener el número de una factura por ID
 *
 * @param  int    $id     Id de factura
 * @return string $number Nº de factura
 */
function getInvoiceNumber($id)
/**
 * Comprobar si el pedido ya tiene factura
 *
 * @param  int     $id     Id de pedido
 * @param  int     $cancel Buscar factura normal (false) o rectificativa (true)
 * @return boolean Si la factura existe
 */
function checkOrderInvoice($id, $cancel = false)
/**
 * Obtener factura de un pedido
 *
 * @param  int    $id      Id de pedido
 * @param  int    $cancel  Buscar factura rectificativa
 * @return object $invoice Factura
 */
function getOrderInvoice($id, $cancel = 0)
/**
 * Obtener datos de factura de una cuota
 *
 * @param  int    $fee    Id de cuota
 * @param  int    $cancel Id de factura rectificada
 * @return object $data   Datos de factura
 */
function getFeeInvoice($fee = 0, $cancel = 0, $json = false)
/**
 * Guardar factura de una cuota
 */
function editFeeInvoice()

Funciones de ITV
functions_itv.php

/**
 * Direcciones de ITVs
 *
 * @param  int     $pag   Página
 * @param  int     $num   Zonas por página
 * @param  string  $order Orden de listado
 * @return array   $data  Direcciones
 */
function itvAddressesList($pag, $num, $order)
/**
 * Direcciones de ITVs en una zona
 *
 * @param  $id   int   Id de zona
 * @return $dirs array Direcciones
 */
function getItvAddresses($id)
/**
 * Modificar precios de ITV
 *
 * @return array $jsondata Mensaje de notificación
 */
function editItvPrice()
/**
 * Nueva dirección de ITV
 *
 * @return array $jsondata Mensaje de notificación
 */
function addItvAddress()
/**
 * Modificar dirección de ITV
 *
 * @return array $jsondata Mensaje de notificación
 */
function editItvAddress()
/**
 * Borrar dirección de ITV
 */
function deleteItvAddress()
/**
 * Obtener tiempo/precio de ITV según tipo de combustible y cupón
 *
 * @return object $data Tiempo y precio total
 */
function getPriceTimeItv()
/**
 * Nuevo servicio de ITV
 *
 * @return array $jsondata Mensaje de notificación
 */
function addItv()
/**
 * Nuevo servicio de ITV desde la web
 *
 * @return array $jsondata Mensaje de notificación
 */
function addItvWeb()
/**
 * Modificar ITV
 *
 * @return array $jsondata Mensaje de notificación
 */
function editItv()
/**
 * Calcular horas disponibles para un servicio de ITV a partir de una fecha.
 * Listado completo indicando Plazier.
 *
 * @return string $data Html con las horas disponibles
 */
function gmaps_route_itv()
/**
 * Calcular horas disponibles para un servicio de ITV a partir de una fecha.
 * Listado ordenado y sin duplicados sin mostrar Plaziers.
 *
 * @return string $data Html con las horas disponibles
 */
function gmaps_route_empresa_itv()
/**
 * Calcular horas disponibles para un servicio de ITV a partir de una fecha.
 * Se devuelve el array filtrado y ordenado.
 *
 * @return array $data Horas disponibles
 */
function gmaps_route_itv_web($cp_num, $direccion, $wash_time, $date_from)
/**
 * Calcular huecos/horas disponibles en agenda para un servicio de ITV
 *
 * @param  string  $cp          Código postal
 * @param  string  $address     Dirección
 * @param  string  $address_itv Dirección de la estación de ITV
 * @param  int     $wash_time   Minutos del servicio
 * @param  string  $date_from   Fecha de inicio
 * @param  boolean $sort        Ordenar y eliminar duplicados
 * @param  int     $plazier_id  Buscar solo en la agenda de un Plazier por ID
 * @param  string  $min         Hora mínima H:i
 * @return string  $data        Html con las horas disponibles
 */
function gmaps_route_v2_itv($cp, $address, $address_itv, $wash_time, $date_from, $sort, $plazier_id = 0, $min = 0)
/**
 * Huecos disponibles para servicio de ITV de un Plazier un día
 *
 * @param  string $date        Día Y-m-d
 * @param  int    $num_w       Nº de día de la semana
 * @param  int    $plazier     ID de Plazier
 * @param  int    $wash_time   Minutos necesarios
 * @param  string $address     Dirección de servicio
 * @param  int    $limit       Tiempo máximo de ruta
 * @param  string $min         Hora mínima H:i
 * @param  string $address_itv Dirección de servicio
 * @return array  $free        Huecos disponibles
 */
function huecos_dia_plazier_itv($date, $num_w, int $plazier, int $wash_time, $address, $limit, $min, $address_itv)

Funciones de stock de material
functions_material.php

/**
 * Lista de material
 *
 * @param  int     $pag   Página
 * @param  int     $num   Material por página
 * @param  string  $order Orden de listado
 * @param  int     $del   Eliminados (1) o Activos (0)
 * @return array   $data  Listado de material
 */
function materialList($pag, $num, $order, $del = 0)
/**
 * Nuevo material
 *
 * @return array $jsondata Mensaje de notificación
 */
function addMaterial()
/**
 * Archivar material
 */
function archiveMaterial()
/**
 * Desarchivar material
 */
function desarchiveMaterial()
/**
 * Borrar material
 */
function deleteMaterial()
/**
 * Modificar material
 *
 * @return array $jsondata Mensaje de notificación
 */
function editMaterial()
/**
 * Modificar imagen de material
 */
function editMaterialImage()
/**
 * Lista de vehículos de trabajo
 *
 * @param  int     $pag   Página
 * @param  int     $num   Vehículos por página
 * @param  string  $order Orden de listado
 * @param  int     $del   Eliminados (1) o Activos (0)
 * @return array   $data  Listado de vehículos
 */
function materialVehiclesList($pag, $num, $order, $del = 0)
/**
 * Nuevo vehículo de trabajo
 *
 * @return array $jsondata Mensaje de notificación
 */
function addMaterialVehicle()
/**
 * Archivar vehículo de trabajo
 */
function archiveMaterialVehicle()
/**
 * Desarchivar vehículo de trabajo
 */
function desarchiveMaterialVehicle()
/**
 * Borrar vehículo de trabajo
 */
function deleteMaterialVehicle()
/**
 * Modificar vehículo de trabajo
 *
 * @return array $jsondata Mensaje de notificación
 */
function editMaterialVehicle()
/**
 * Metros totales de un vehículo en un rango de fechas
 *
 * @param int    $id     Id de vehículo
 * @param string $from   Fecha inicial (Y-m-d)
 * @param string $to     Fecha final (Y-m-d)
 * @return int   $metros Metros totales
 */
function getPaxsterDistance($id, $from, $to)
/**
 * Lista de almacenes
 *
 * @param  int     $pag   Página
 * @param  int     $num   Almacenes por página
 * @param  string  $order Orden de listado
 * @param  int     $del   Eliminados (1) o Activos (0)
 * @return array   $data  Listado de almacén
 */
function materialWarehousesList($pag, $num, $order, $del = 0)
/**
 * Nuevo almacén
 *
 * @return array $jsondata Mensaje de notificación
 */
function addMaterialWarehouse()
/**
 * Archivar almacén
 */
function archiveMaterialWarehouse()
/**
 * Desarchivar almacén
 */
function desarchiveMaterialWarehouse()
/**
 * Borrar almacén
 */
function deleteMaterialWarehouse()
/**
 * Modificar almacén
 *
 * @return array $jsondata Mensaje de notificación
 */
function editMaterialWarehouse()
/**
 * Obtener stock de un producto en un almacén
 *
 * @param  int    $warehouse_id Id de almacén
 * @param  int    $material_id  Id de material
 * @return object $stock        Stock
 */
function stockMaterialWarehouse($warehouse_id, $material_id)
/**
 * Obtener stock de un producto en un vehículo
 *
 * @param  int    $vehicle_id  Id de vehículo
 * @param  int    $material_id Id de material
 * @return object $stock       Stock
 */
function stockMaterialVehicle($vehicle_id, $material_id)
/**
 * Comprobar stock faltante de un producto en un almacén
 *
 * @param  int $warehouse_id Id de almacén
 * @param  int $material_id  Id de material
 * @return int $falta        Stock necesario
 */
function checkWarehouseProductStock($warehouse_id, $material_id)
/**
 * Actualizar stock de almacén
 *
 * @return array $jsondata Mensaje de notificación
 */
function updateWarehouseStock()
/**
 * Actualizar stock de un producto en un almacén
 *
 * @param  int   $warehouse_id Id de almacén
 * @param  int   $material_id  Id de material
 * @param  int   $new_stock    Nuevo stock
 * @param  int   $add          1) Añadir al stock, 0) Stock nuevo
 * @return array $jsondata     Mensaje de notificación
 */
function updateWarehouseStockMaterial($warehouse_id = 0, $material_id = 0, $new_stock = 0, $add = 0)
/**
 * Actualizar stock de vehículos desde almacén
 *
 * @return array $jsondata Mensaje de notificación
 */
function updateVehiclesStock()
/**
 * Actualizar stock de un producto en un vehículo
 *
 * @param  int   $warehouse_id Id de almacén (si lo hay)
 * @param  int   $material_id  Id de material
 * @param  int   $vehicle_id   Id de vehículo
 * @param  int   $new_stock    Nuevo stock
 * @param  int   $add          1) Añadir al stock, 0) Stock nuevo
 * @return array $jsondata     Mensaje de notificación
 */
function updateVehicleStockMaterial($warehouse_id = 0, $material_id = 0, $vehicle_id = 0, $new_stock = 0, $add = 0)
/**
 * Comprobar gasto de stock
 *
 * @param  int    $paxter  Id de paxter (0 para todos)
 * @param  int    $product Id de material (0 para todos)
 * @param  string $from    Desde
 * @param  string $to      Hasta
 * @return int    $total   Cantidad gastada
 */
function stockExpense($paxter, $product, $from, $to)
/**
 * Servicios de una Paxter
 *
 * @param  int    $paxter  Id de paxter
 * @param  string $from    Desde
 * @param  string $to      Hasta
 * @return int    $total   Nº de servicios
 */
function vehicleWashes($paxter, $from, $to)

Funciones de noticias
functions_news.php

/**
 * Nuevo departamento
 *
 * @return array $jsondata Mensaje de notificación
 */
function addNew()
/**
 * Modificar imagen de noticia
 */
function editNewImage()
/**
 * Modificar noticia
 *
 * @return array $jsondata Mensaje de notificación
 */
function editNew()
/**
 * Borrar noticia
 */
function deleteNew()

Funciones de pedidos
functions_orders.php

/**
 * Lista de pedidos
 *
 * @param  int     $pag   Página
 * @param  int     $num   Pedidos por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de pedidos
 */
function ordersList($pag, $num, $order, $json = false)
/**
 * Lista de pedidos entre fechas
 *
 * @param  string $from Fecha desde
 * @param  string $to   Fecha hasta
 * @param  int    $pag  Página
 * @param  int    $num  Pedidos por página
 * @return array  $data Listado de pedidos
 */
function ordersListRange($from, $to, $pag, $num)
/**
 * Lista de pedidos pagados
 *
 * @param  string $from Fecha desde
 * @param  string $to   Fecha hasta
 * @param  int    $f_id Id de franquicia (0 para todas)
 * @return array  $data Listado de pedidos
 */
function ordersPaidList($from, $to, $f_id = 0)
/**
 * Lista de pedidos pagados paginados
 *
 * @param  string $from  Fecha desde
 * @param  string $to    Fecha hasta
 * @param  int    $pag   Página
 * @param  int    $num   Pedidos por página
 * @param  string $order Orden
 * @param  int    $f_id  Id de franquicia (0 para todas)
 * @return array  $data  Listado de pedidos
 */
function ordersPaidListPag($from, $to, $pag, $num, $order, $f_id = 0)
/**
 * Lista de pedidos sin pagar
 *
 * @param  string $from Fecha desde
 * @param  string $to   Fecha hasta
 * @return array  $data Listado de pedidos
 */
function ordersUnpaidList()
/**
 * Lista de pedidos de un cliente
 *
 * @param  int   $id   Id de cliente
 * @return array $data Listado de pedidos
 */
function customerOrders($id)
/**
 * Lista de pedidos pendientes de configuración/pago
 *
 * @return array $data Listado de pedidos
 */
function ordersPendingList()
/**
 * Número de pedidos pagados de un cliente
 *
 * @param  int $id    Id de cliente
 * @return int $total Total de pedidos
 */
function totalCustomerOrders($id)
/**
 * Obtener filtro de pedidos de usuario
 *
 * @return array $data Filtros
 */
function getOrderFilters()
/**
 * Guardar filtro de pedidos de usuario
 */
function setOrderFilters()
/**
 * Datos de pedido
 *
 * @param  int     $id   Id de pedido
 * @param  boolean $json Si el resultado es json para ajax o no
 * @return object  $data Datos de pedido
 */
function getOrder($id, $json = false)
/**
 * Importe total de un pedido calculando el importe de sus servicios
 *
 * @param  int    $id   Id de pedido
 * @return string $data Importe total con descuentos incluidos
 */
function orderTotalPrice($id)
/**
 * Nº de servicios de un pedido
 *
 * @param  int $id   Id de pedido
 * @return int $data Nº de servicios
 */
function orderCountWash($id)
/**
 * Nuevo pedido
 *
 * @return array $jsondata Mensaje de notificación
 */
function addOrder()
/**
 * Nuevo pedido web
 *
 * @return array $id Id de nuevo pedido
 */
function addOrderWeb()
/**
 * Asociar pedido con suscripción
 *
 * @param int $order_id Id de pedido
 * @param int $subs_id Id de suscripción
 */
function orderSetSubscription($order_id, $subs_id)
/**
 * Modificar pedido
 *
 * @return array $jsondata Mensaje de notificación
 */
function editOrder()
/**
 * Modificar datos de facturación de pedido
 *
 * @return array $jsondata Mensaje de notificación
 */
function editOrderInvoiceAddress()
/**
 * Cambiar estado de pedido
 *
 * @param int $order  Id de pedido
 * @param int $status Id de estado
 * @param bool $email  Enviar email
 */
function setOrderStatus($order = false, $status = false)
/**
 * Obtener mail de contacto de un pedido
 *
 * @param  int    $order Id de pedido
 * @return string $mail  Mail de contacto
 */
function getOrderMail($order)
/**
 * Obtener teléfono de contacto de un pedido
 *
 * @param  int    $order Id de pedido
 * @return string $phone Teléfono de contacto
 */
function getOrderPhone($order)
/**
 * Enviar WhatsApp de info de pago
 *
 * @param  int $order Id de pedido
 * @param  int $campo Campo de tipo de pago
 */
function sendPayLink($order = false, $campo = false)
/**
 * Borrar pedido
 *
 * @param int $id Id de pedido
 */
function deleteOrder($id = false)
/**
 * Comprobar estado actual de un pedido
 *
 * @param  int    $id   Id de pedido
 * @return object $data Info de estado
 */
function checkOrderStatus($id)

Funciones de pedidos pendientes
functions_orders_pending.php

/**
 * Generar/Modificar pedido pendiente
 *
 * @return array $id Id de nuevo pedido
 */
function updatePendingOrder()
/**
 * Generar/Modificar servicio de pedido pendiente
 *
 * @return array $id Id de nuevo pedido
 */
function updatePendingWash()

Funciones de packs
functions_packs.php

/**
 * Lista de packs
 *
 * @param  int     $pag   Página
 * @param  int     $num   Packs por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de packs
 */
function packsList($pag, $num, $order, $json = false)
/**
 * Listado de meses disponibles para suscripciones
 *
 * @return array $data Distinto nº de meses
 */
function packsMonths()
/**
 * Datos de pack
 *
 * @param  int   $id   Id de pack
 * @return array $data Datos de pack
 */
function getPack($id)
/**
 * Nuevo pack
 *
 * @return array $jsondata Mensaje de notificación
 */
function addPack()
/**
 * Modificar pack
 *
 * @return array $jsondata Mensaje de notificación
 */
function editPack()
/**
 * Modificar imagen de pack
 */
function editPackImage()
/**
 * Borrar pack
 */
function deletePack()
/**
 * Guardar combinación de pack
 *
 * @return array $jsondata Mensaje de notificación
 */
function savePackCombination()
/**
 * Datos de combinación
 *
 * @param  int   $id   Id de combinación
 * @return array $data Datos de combinación
 */
function getCombination($id)
/**
 * Obtener combinaciones por nº de servicios
 *
 * @param  int   $num  Nº de servicios
 * @return array $data Combinaciones
 */
function getCombinationsByWashes($num)
/**
 * Obtener servicios de combinación
 *
 * @param  int   $id      ID de combinación
 * @param  bool  $group   Agrupado por ID si/no
 * @param  bool  $json    Formato json si/no
 * @return array $data    Servicios de la combinación
 */
function getCombinationWashes($id = 0, $group = false, $json = false)
/**
 * Obtener servicios de combinación con precios
 *
 * @param  int   $id           ID de combinación
 * @param  int   $vehicle      ID de vehículo
 * @param  int   $rate         Tarifa
 * @param  int   $pay_discount Pronto pagp
 * @param  bool  $json         Formato json si/no
 * @return array $data         Servicios de la combinación
 */
function getCombinationWashesPrice($id = 0, $vehicle = 0, $rate = 0, $pay_discount = 0, $json = false)
/**
 * Guardar orden de servicios de combinación
 */
function savePackCombinationOrder()
/**
 * Borrar combinación
 */
function deletePackCombination()

Funciones de paginador
functions_paginator.php

/**
 * Cargar contador del paginador
 *
 * @param  string  $table Tabla de los registros a contar
 * @param  int     $num   Nº de registros por página
 * @return object  $data  Total de registros y total de páginas
 */
function paginator_config($table, $num)
/**
 * Paginador HTML
 *
 * @param  int    $pages  Total de páginas
 * @param  int    $pag    Página actual
 * @return string $return Elemento nav
 */
function paginator_html($pages, $pag)

Funciones de solucionador de problemas
functions_problems.php

/**
 * Lista de problemas
 *
 * @param  int     $pag   Página
 * @param  int     $num   Problemas por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de problemas
 */
function problemsList($pag, $num, $order, $json = false)
/**
 * Lista de problemas para la web
 *
 * @param  string $lang Código de idioma
 * @return array  $data Listado de problemas
 */
function problemsWebList($lang = 'es')
/**
 * Datos de problema
 *
 * @param  int   $id   Id de problema
 * @return array $data Datos de problema
 */
function getProblem($id)
/**
 * Datos de problema en un idioma
 *
 * @param  int    $id   Id de problema
 * @param  string $lang Idioma
 * @return array  $data Datos de problema
 */
function getProblemTranslate()
/**
 * Modificar traducción de problema
 *
 * @return array $jsondata Mensaje de notificación
 */
function editProblemTranslate()
/**
 * Nuevo problema
 *
 * @return array $jsondata Mensaje de notificación
 */
function addProblem()
/**
 * Modificar problema
 *
 * @return array $jsondata Mensaje de notificación
 */
function editProblem()
/**
 * Borrar problema
 */
function deleteProblem()
/**
 * Guardar opción de solución
 *
 * @return array $jsondata Mensaje de notificación
 */
function saveProblemSolution()
/**
 * Borrar opcpión de solución
 */
function deleteProblemSolution()
/**
 * Buscar soluciones según tamaño y necesidades
 *
 * @param  int    $size   Id de tamaño
 * @param  string $needs  Necesidades
 * @param  int    $rate   Id de tarifa
 * @param  string $coupon Cupón
 * @param  string $lang   Código de idioma
 * @return array  $data   Soluciones
 */
function getSolutionsbyProblem($size, $needs, $rate, $coupon, $lang = 'es')
/**
 * Obtener tiempo/precio de solución
 *
 * @return array $data Tiempo y precio total
 */
function getPriceTimeSolution($products, $size, $rate = 0, $coupon = '')

Funciones de productos
functions_products.php

/**
 * Lista de productos
 *
 * @param  int     $pag   Página
 * @param  int     $num   Productos por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de productos
 */
function productsList($pag, $num, $order, $json = false)
/**
 * Obtener filtro de productos
 *
 * @return array $data Filtros
 */
function getProductsFilters()
/**
 * Guardar filtro de productos
 */
function setProductsFilters()
/**
 * Lista de productos internos
 *
 * @return array $data Listado de productos
 */
function productsListInternal()
/**
 * Datos de producto
 *
 * @return array $data Datos de producto
 */
function getProduct($id)
/**
 * Datos de producto en un idioma
 *
 * @param  int    $id   Id de producto
 * @param  string $lang Idioma
 * @return array  $data Datos de producto
 */
function getProductTranslate()
/**
 * Modificar traducción de producto
 *
 * @return array $jsondata Mensaje de notificación
 */
function editProductTranslate()
/**
 * Lista de productos principales
 *
 * @return array $data Listado de productos principales
 */
function productsMainList()
/**
 * Lista de productos principales disponibles en la web
 *
 * @param string $lang Idioma
 * @return array $data Listado de productos
 */
function productsMainWebList($lang = 'es')
/**
 * Lista de complementos
 *
 * @return array $data Listado de complementos
 */
function complementsList()
/**
 * Lista de complementos de un producto disponibles en la web
 *
 * @param string $lang Idioma
 * @return array $data Listado de complementos
 */
function productComplementsWebList($id, $lang = 'es')
/**
 * Tabla de complementos para web
 *
 * @return array $data Listado de complementos
 */
function complementsTable()
/**
 * Modificar campo web de un complemento
 */
function editComplementWeb()
/**
 * Lista de productos según vehículo
 *
 * @return array $data Listado de productos
 */
function loadProductsByVehicle()
/**
 * Lista de productos según tamaño de vehículo
 *
 * @param  int   $size Id de tamaño
 * @return array $data Listado de productos
 */
function loadProductsByVehicleSize($size)
/**
 * Lista de productos disponibles en la web según marca/modelo
 *
 * @param  string $marca  Marca
 * @param  string $modelo Modelo
 * @return array  $data   Listado de productos/precios/tiempos
 */
function loadVehicleProducts($marca, $modelo)
/**
 * Lista de complementos según producto y vehículo
 *
 * @return array $data Complementos relacionados
 */
function loadComplementsByProduct()
/**
 * Lista de complementos según producto y tamaño
 *
 * @param  int   $product Id de producto
 * @param  int   $size    Id de tamaño
 * @return array $data    Complementos relacionados
 */
function loadComplementsByProductandSize($product, $size)
/**
 * Obtener media de tiempo y total de productos según producto y tamaño
 *
 * @param  int    $product Id de producto
 * @param  int    $size    Id de tamaño
 * @param  string $from    Desde
 * @param  string $to      Hasta
 * @return object $data    Media y total
 */
function averageProductSizeTime($product, $size, $from, $to)
/**
 * Obtener valores de variación de producto
 *
 * @param  int    $product Id de producto
 * @param  int    $size    Id de tamaño
 * @param  string $lang    Código de idioma
 * @return object $data    Datos de la variación
 */
function get_variable_data($product, $size, $lang = 'es')
/**
 * Obtener complementos relacionados de un producto
 *
 * @param  int    $product Id de producto
 * @return object $data    Complementos relacionados
 */
function get_complements_product($product)
/**
 * Obtener tiempo/precio de productos según tamaño y cantidad
 *
 * @return object $data Tiempo y precio total
 */
function getPriceTimeProduct()
/**
 * Nuevo producto
 *
 * @return array $jsondata Mensaje de notificación
 */
function addProduct()
/**
 * Nuevo producto interno
 *
 * @return array $jsondata Mensaje de notificación
 */
function addInternalProduct()
/**
 * Modificar producto
 *
 * @return array $jsondata Mensaje de notificación
 */
function editProduct()
/**
 * Modificar imagen de producto
 */
function editProductImage()
/**
 * Modificar precio de variación
 */
function editVariationField()
/**
 * Borrar producto
 */
function deleteProduct()

Funciones de log de registro de acciones
functions_registers.php

/**
 * Lista de registros
 *
 * @param  int     $pag   Página
 * @param  int     $num   Registros por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de registros
 */
function registersList($pag, $num, $order)
/**
 * Obtener filtro de registros
 *
 * @return array $data Filtros
 */
function getRegisterFilters()
/**
 * Guardar filtro de registros
 */
function setRegisterFilters()

Funciones de informe final de servicios
functions_reports.php

/**
 * Lista de informes
 *
 * @param  int     $pag   Página
 * @param  int     $num   Informes por página
 * @param  string  $order Orden de listado
 * @param  int     $f_id  Id de franquicia
 * @param  int     $p_id  Id de Plazier
 * @param  string  $from  Desde
 * @param  string  $to    Hasta
 * @return array   $data  Listado de informes
 */
function reportsList($pag, $num, $order, $f_id = 0, $p_id = 0, $from = '', $to = '')
/**
 * Lista de informes de un Plazier
 *
 * @param  int     $pag   Página
 * @param  int     $num   Informes por página
 * @param  int     $id    ID de Plazier
 * @return array   $data  Listado de informes
 */
function plazierReportsList($pag, $num, $id)
/**
 * Datos de cada día para facturación comercial
 *
 * @param  string $date Fecha
 * @param  int    $f_id Id de franquicia
 * @return array  $data Datos del día
 */
function getReportComercialDay($date, $f_id = 0)
/**
 * Obtener reseña de servicio
 *
 * @param int $id Id de servicio
 */
function getWashReview($id)
/**
 * Guardar nota de desempeño en servicio
 *
 * @param int $id Id de servicio
 */
function setWashRating($id)
/**
 * Guardar nota de desempeño manualmente
 */
function setWashRatingManual()
/**
 * Calcular desempeño de informes antiguos
 *
 * @param  int   $id   Id de servicio
 * @param  int   $diff % de diferencia de tiempo estimado/real
 * @return float $des  Desempeño
 */
function get_total_report_old($id, $diff)
/**
 * Calcular desempeño de informes nuevos
 *
 * @param  int    $id     Id de servicio
 * @param  int    $diff   % de diferencia de tiempo estimado/real
 * @param  int    $report Estado de informe de Plazier (0 sin enviar / 1 o 2 enviado)
 * @param  object $rating Informe de cliente
 * @return float  $des    Desempeño
 */
function get_total_report_new($id, $diff, $report, $rating)
/**
 * Puntuación media de los servicios de un cliente
 *
 * @param  int   $id   Id de cliente
 * @return float $data Puntuación media
 */
function getUserRating($id)
/**
 * Total de servicios y puntuación media de los servicios de un Plazier
 *
 * @param  int   $id   Id de plazier
 * @return array $data Servicios y Puntuación media
 */
function getEmployeeRating($id)
/**
 * Lista de reseñas
 *
 * @param  int     $pag   Página
 * @param  int     $num   Informes por página
 * @param  string  $order Orden de listado
 * @param  int     $view  Estado (1 resueltas / 0 sin resolver)
 * @param  int     $f_id  Id de franquicia (0 para todas)
 * @param  string  $from  Desde
 * @param  string  $to    Hasta
 * @return array   $data  Listado de reseñas
 */
function reviewsList($pag, $num, $order, $view = 2, $f_id = 0, $from = false, $to = false)
/**
 * Añadir reseña
 */
function addReview()
/**
 * Reseñas sin leer
 *
 * @return int $data Nº de reseñas
 */
function reviewsPending()
/**
 * Resumen de encuestas para el informe de servicios
 *
 * @param  string $from Desde
 * @param  string $to   Hasta
 * @param  int    $f_id Id de franquicia (0 para todas)
 * @return array  $data Total de encuestas enviadas, recibidas y nota media
 */
function getReportsRating($from, $to, $f_id = 0)
/**
 * Obtener nº de votaciones por campo/valor
 *
 * @param  string $field Nombre del campo
 * @param  int    $value Valor
 * @param  string $from  Desde
 * @param  string $to    Hasta
 * @return array  $data  Total y porcentaje
 */
function getRatingByFieldVal($field, $value, $from, $to)
/**
 * Resumen para el informes de recomendaciones
 *
 * @param  string $from Desde
 * @param  string $to   Hasta
 * @param  int    $f_id Id de franquicia (0 para todas)
 * @return array $data Porcentaje de positivos, neutros y negativos
 */
function getReportsRecommends($from, $to, $f_id = 0)
/**
 * Marcar reseña como resuelta
 */
function setRatingView()
/**
 * Añadir resolución de reseña
 */
function addRatingResponse()
/**
 * Lista de informes pendientes
 *
 * @param  int    $status  Id de estado (1 para pendientes de plazier, 2 para pendientes y no finalizados)
 * @param  string $date    Fecha mínima Y-m-d
 * @param  int    $plazier Id de empleado
 * @return array  $data    Listado de informes
 */
function reportsPendingList($status, $date = false, $plazier = false)
/**
 * Obtener filtro de informes de usuario
 *
 * @return array $data Filtros
 */
function getReportsFilters()
/**
 * Guardar filtro de informes de usuario
 *
 * @param  int     $p_id Id de Plazier
 * @param  int     $f_id Id de franquicia
 * @param  string  $from Desde
 * @param  string  $to   Hasta
 */
function setReportsFilters($p_id = 0, $f_id = 0, $from = '', $to = '')
/**
 * Lista de incidencias
 *
 * @param  int     $pag   Página
 * @param  int     $num   Incidencias por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de incidencias
 */
function incidencesList($pag, $num, $order)
/**
 * Lista de incidencias computables a un Plazier
 *
 * @param  int     $pag   Página
 * @param  int     $num   Incidencias por página
 * @param  string  $order Orden de listado
 * @param  int     $id    Id de Plazier
 * @return array   $data  Listado de incidencias
 */
function incidencesListPlazier($pag, $num, $order, $id)
/**
 * Obtener filtro de informes de incidencias
 *
 * @return array $data Filtros
 */
function getIncidenceFilters()
/**
 * Guardar filtro de informes de incidencias
 *
 * @param  int     $p_id Id de Plazier
 * @param  int     $f_id Id de franquicia
 * @param  string  $from Desde
 * @param  string  $to   Hasta
 */
function setIncidenceFilters($p_id = 0, $f_id = 0, $from = '', $to = '')
/**
 * Borrar incidencia
 *
 * @param int $id Id de incidencia
 */
function deleteIncidence($id = 0)
/**
 * Incidencias de Plazier entre fechas
 *
 * @param  int    $id        Id de Plazier (0 para todos)
 * @param  string $from      Fecha desde
 * @param  string $to        Fecha hasta
 * @param  string $incidence Tipo de incidencia (0 para todos)
 * @return int    $data      Total de incidencias
 */
function plazierTotalIncidences($id = 0, $from = '', $to = '', $incidence = '')
/**
 * Listado de informes de material
 *
 * @param  int     $pag   Página
 * @param  int     $num   Informes por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de informes
 */
function materialReportsList($pag, $num, $order)
/**
 * Obtener filtro de informes de material
 *
 * @return array $data Filtros
 */
function getMaterialFilters()
/**
 * Guardar filtro de informes de material
 */
function setMaterialFilters()
/**
 * Obtener filtro de informes de retrasos
 *
 * @return array $data Filtros
 */
function getDelayFilters()
/**
 * Guardar filtro de informes de retrasos
 *
 * @param int    $f_id Id de franquicia
 * @param int    $p_id Id de Plazier
 * @param string $from Desde
 * @param string $to   Hasta
 */
function setDelayFilters($f_id = 0, $p_id = 0, $from = '', $to = '')
/**
 * Lista de servicios para informe de retrasos
 *
 * @param  int     $pag   Página
 * @param  int     $num   Servicios por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de servicios
 */
function washesListDelays($pag, $num, $order)
/**
 * Retraso medio entre fechas
 *
 * @param  int    $id   Id de Plazier
 * @param  string $from Fecha desde
 * @param  string $to   Fecha hasta
 * @param  int    $f_id Id de franquicia
 * @return array  $data Nota media y total de servicios
 */
function plaziersDelayAverage($id, $from = '', $to = '', $f_id = 0)
/**
 * Total de invitaciones y cupones de un Plazier en un rango
 *
 * @param  int    $id        Id de Plazier
 * @param  string $date_from Fecha inicial
 * @param  string $date_to   Fecha final
 * @return array  $data      Totales
 */
function plazierInvitationsReports($id, $date_from, $date_to)
/**
 * Medias de tiempos de ruta/espera/servicio entre fechas
 *
 * @param  string $from Desde
 * @param  string $to   Hasta
 * @param  int    $f_id Id de franquicia
 * @return array  $data Totales
 */
function average_times_report($from, $to, $f_id = 0)
/**
 * Reservas de un servicio un día
 *
 * @param  string $day      Día
 * @param  string $servicio Servicio
 * @return int    $num      Total de reservas
 */
function serviceReportsByProductDay($day, $servicio)
/**
 * Guardar filtro de informes de cupones
 *
 * @param  int     $c_id Id de cupón
 * @param  int     $f_id Id de franquicia
 * @param  string  $from Desde
 * @param  string  $to   Hasta
 */
function setCouponsReportsFilters($c_id = 0, $f_id = 0, $from = '', $to = '')
/**
 * Obtener filtro de informes de cupones
 *
 * @return array $data Filtros
 */
function getCouponsReportsFilters()
/**
 * Lista de informes de cupones
 *
 * @param  int     $pag   Página
 * @param  int     $num   Informes por página
 * @param  string  $order Orden de listado
 * @param  int     $f_id  Id de franquicia
 * @param  int     $c_id  Id de cupón
 * @param  string  $from  Desde
 * @param  string  $to    Hasta
 * @return array   $data  Listado de informes
 */
function couponsReportsList($pag, $num, $order, $f_id = 0, $c_id = 0, $from = '', $to = '')
/**
 * Guardar filtro de informes de invitaciones
 *
 * @param  int     $p_id Id de Plazier
 * @param  int     $f_id Id de franquicia
 * @param  string  $from Desde
 * @param  string  $to   Hasta
 */
function setInvitationsReportsFilters($p_id = 0, $f_id = 0, $from = '', $to = '')
/**
 * Obtener filtro de informes de invitaciones
 *
 * @return array $data Filtros
 */
function getInvitationsReportsFilters()
/**
 * Lista de informes de invitaciones
 *
 * @param  int     $pag   Página
 * @param  int     $num   Informes por página
 * @param  string  $order Orden de listado
 * @param  int     $f_id  Id de franquicia
 * @param  int     $p_id  Id de Plazier
 * @param  string  $from  Desde
 * @param  string  $to    Hasta
 * @return array   $data  Listado de informes
 */
function invitationsReportsList($pag, $num, $order, $f_id = 0, $p_id = 0, $from = '', $to = '')
/**
 * Guardar filtro de informes de tiempos
 *
 * @param  int     $f_id Id de franquicia
 * @param  string  $from Desde
 * @param  string  $to   Hasta
 */
function setTimesReportsFilters($f_id = 0, $from = '', $to = '')
/**
 * Obtener filtro de informes de tiempos
 *
 * @return array $data Filtros
 */
function getTimesReportsFilters()

Funciones de cálculo de rutas
functions_routes.php

/**
 * Calcular horas disponibles para un servicio a partir de una fecha.
 * Listado completo indicando Plazier.
 *
 * @return string $data Html con las horas disponibles
 */
function gmaps_route()
/**
 * Calcular horas disponibles para un servicio a partir de una fecha.
 * Se devuelve el array filtrado y ordenado.
 *
 * @param int    $cp        CP
 * @param int    $zone      Zona
 * @param string $direccion Dirección
 * @param int    $parking   Tipo de parking
 * @param int    $wash_time Minutos de servicio
 * @param string $date_from Fecha inicial
 * @param string $date_to   Fecha final
 * @param int    $product   Id de producto
 * @return array $data Horas disponibles
 */
function gmaps_route_web($cp_num, $zone, $direccion, $parking, $wash_time, $date_from, $date_to)
/**
 * Calcular horas disponibles para un servicio a partir de una fecha.
 * Listado ordenado y sin duplicados sin mostrar Plaziers.
 *
 * @return string $data Html con las horas disponibles
 */
function gmaps_route_empresa()
/**
 * Devolver primera hora disponible para un servicio a partir de una fecha
 *
 * @param int    $city      Ciudad
 * @param int    $cp        CP
 * @param string $address   Dirección
 * @param int    $parking   Tipo de parking
 * @param int    $wash_time Minutos de servicio
 * @param string $date_from Fecha inicial
 * @param int    $days      Nº de días a buscar
 * @return array $data      Información de hueco
 */
function gmaps_route_first($city, $cp, $address, $parking, $wash_time, $date_from, $days)
/**
 * Devolver primera hora disponible de un Plazier para un servicio a partir de una fecha
 *
 * @param int    $plazier   Id de Plazier
 * @param int    $city      Ciudad
 * @param int    $cp        CP
 * @param string $address   Dirección
 * @param int    $parking   Tipo de parking
 * @param int    $wash_time Minutos de servicio
 * @param string $date_from Fecha inicial
 * @param int    $days      Nº de días a buscar
 * @param int    $panhos    Si es servicio de paños
 * @return array $data      Información de hueco
 */
function gmaps_route_first_plazier($plazier, $city, $cp, $address, $parking, $wash_time, $date_from, $days, $panhos = 0)
/**
 * Tiempo de trayecto entre dos puntos
 *
 * @param  string $dir1     Dirección de origen
 * @param  string $dir2     Dirección de destino
 * @param  int    $time     Fecha y hora en formato strtotime
 * @param  int    $highways Acceso a autopistas
 * @return int    $data     Minutos
 */
function gmaps_distance_api($dir1, $dir2, $time, $highways = 0)
/**
 * Recalcular rutas de servicios del plazier en el día
 *
 * @param  string $plazier ID de plazier
 * @param  string $date    Fecha Y-m-d
 */
function calculateRoutes($plazier, $date)
/**
 * Calcular huecos/horas disponibles en agenda para un servicio
 *
 * @param  string  $cp         Código postal
 * @param  string  $address    Dirección
 * @param  int     $wash_time  Minutos del servicio
 * @param  string  $date_from  Fecha de inicio
 * @param  boolean $sort       Ordenar y eliminar duplicados
 * @param  int     $plazier_id Buscar solo en la agenda de un Plazier por ID
 * @param  string  $min        Hora mínima H:i
 * @return string  $data       Html con las horas disponibles
 */
function gmaps_route_v2($cp, $address, $wash_time, $date_from, $sort, $plazier_id = 0, $min = 0)
/**
 * Huecos disponibles de un Plazier un día
 *
 * @param  string $date      Día Y-m-d
 * @param  int    $num_w     Nº de día de la semana
 * @param  int    $plazier   ID de Plazier
 * @param  int    $wash_time Minutos necesarios
 * @param  string $address   Dirección de servicio
 * @param  int    $limit     Tiempo máximo de ruta
 * @param  string $min       Hora mínima H:i
 * @return array  $free      Huecos disponibles
 */
function huecos_dia_plazier($date, $num_w, int $plazier, int $wash_time, $address, $limit, $min)

Funciones de control horario
functions_schedule_control.php

/**
 * Lista de jornadas
 *
 * @param  int     $pag   Página
 * @param  int     $num   Jornadas por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de jornadas
 */
function timeControlList($pag, $num, $order)
/**
 * Obtener filtro de jornadas
 *
 * @return array $data Filtros
 */
function getTimeControlFilters()
/**
 * Guardar filtro de jornadas
 */
function setTimeControlFilters()
/**
 * Comprobar si se inició jornada de Plazier en un día
 *
 * @param int    $id    Id de usuario
 * @param string $fecha Fecha
 */
function check_plazier_schedule_control($id, $fecha)
/**
 * Actualizar jornada
 */
function update_schedule_control()
/**
 * Actualizar hora de preparación
 */
function update_schedule_preparation()
/**
 * Iniciar ruta de vuelta
 *
 * @param int $id Id de registro
 */
function update_schedule_garage_start($id = 0)
/**
 * Finalizar ruta de vuelta
 */
function update_schedule_garage_finish()
/**
 * Modificar tiempo de fichaje
 */
function editTimeControl()
/**
 * Obtener bolsa de horas de Plazier
 *
 * @param int id Id de Plazier
 */
function getUserControlTime($id)

Funciones de búsquedas
functions_search.php

/**
 * Búsqueda general
 *
 * @return string $data Listado de resultados
 */
function search()
/**
 * Buscar en tabla
 *
 * @return string $data Listado de resultados
 */
function search_table()

Funciones de barras laterales
functions_sidebars.php

/**
 * Sidebar de favoritos
 *
 * @return string $data Listado de favoritos
 */
function reloadFixedSidebar()
/**
 * Sidebar de alertas pendientes
 *
 * @return string $data Listado de alertas
 */
function reloadAlertSidebar()
/**
 * Añadir/Modificar favorito
 *
 * @return array $jsondata Mensaje de notificación
 */
function saveBookmark()
/**
 * Borrar favorito
 */
function deleteBookmark()
/**
 * Comprobar si hay alertas pendientes con fecha de hoy o ya pasada
 *
 * @return int $data Número de alertas pendientes
 */
function check_alerts()
/**
 * Listado de alertas
 *
 * @param  int     $pag   Página actual
 * @param  int     $num   Número de registros por página
 * @param  string  $order Orden
 * @param  boolean $json  Respuesta en json si/no
 * @return array   $data  Array de alertas
 */
function alerts_list($pag, $num, $order, $json = false)
/**
 * Número de alertas del usuario actual
 *
 * @param  int   $id   Id de usuario
 * @return array $data Número de alertas
 */
function count_user_alerts()
/**
 * Alerta por ID
 *
 * @param  int    $id   Id de la alerta
 * @return object $data Objeto de alerta
 */
function getAlert($id)
/**
 * Alerta por ID (por Post)
 *
 * @return object $data Objeto de alerta
 */
function getAlertJson()
/**
 * Nueva alerta
 *
 * @return array $jsondata Mensaje de notificación
 */
function addAlert()
/**
 * Modificar alerta
 *
 * @return array $jsondata Mensaje de notificación
 */
function editAlert()
/**
 * Marcar/Desmarcar alerta
 */
function checkAlert()
/**
 * Borrar alerta
 */
function deleteAlert()

Funciones de suscripciones
functions_subscriptions.php

/**
 * Lista de suscripciones
 *
 * @param  int     $pag   Página
 * @param  int     $num   Suscripciones por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de suscripciones
 */
function subscriptionsList($pag, $num, $order, $json = false)
/**
 * Obtener filtro de suscripciones de usuario
 *
 * @return array $data Filtros
 */
function getSubscriptionsFilters()
/**
 * Guardar filtro de suscripciones de usuario
 */
function setSubscriptionsFilters()
/**
 * Datos de suscripción
 *
 * @param  int     $id   Id de suscripción
 * @param  boolean $json Si el resultado es json para ajax o no
 * @return object  $data Datos de suscripción
 */
function getSubscription($id = false, $json = false)
/**
 * Nueva suscripción
 *
 * @return array $jsondata Mensaje de notificación
 */
function addSubscription()
/**
 * Generar suscripción web
 *
 * @return int $subs_id Id de nueva suscripción
 */
function createSubscription()
/**
 * Generar servicio de suscripción
 *
 * @return int $wash_id Id de nuevo servicio
 */
function createWashSubscription()
/**
 * Añadir cuota de suscripción
 *
 * @param  int    $subs_id ID de suscripción
 * @param  float  $fee     Importe de cuota
 * @param  string $date    Fecha de pago cuota
 * @param  int    $cron    Cuota programada si/no
 * @return int    Id de nueva cuota
 */
function addSubscriptionFee($subs_id, $fee, $date, $cron = 0)
/**
 * Obtener suscripciones de cliente
 *
 * @param  int   $id   ID de cliente
 * @return array $data Datos de suscripciones
 */
function getUserSubscriptions($id)
/**
 * Obtener primera cuota de suscripción
 *
 * @param  int    $subs_id ID de suscripción
 * @return object $data    Datos de cuota
 */
function get_subscription_first_fee($subs_id, $cron = 0)
/**
 * Obtener primera cuota sin pagar de suscripción
 *
 * @param  int    $subs_id ID de suscripción
 * @return object $data    Datos de cuota
 */
function get_subscription_next_fee($subs_id, $paid = 0)
/**
 * Pausar/Reactivar suscripción
 */
function pauseSubscription()
/**
 * Cancelar suscripción
 */
function cancelSubscription()
/**
 * Borrar suscripción
 */
function deleteSubscription()

Funciones de gestión de archivos
functions_uploads.php

/**
 * Subir archivo
 *
 * @param  string $folder    Directorio de subida
 * @param  string $filename  Nombre del archivo
 * @param  string $file_temp Nombre temporal del input tipo file
 * @param  int    $filesize  Tamaño del archivo
 * @param  int    $maxsize   Tamaño máximo aceptado
 * @return string $ruta      Ruta final del archivo
 */
function file_subir($folder, $filename, $file_temp, $filesize, $maxsize)
/**
 * Subir imagen
 *
 * @param  string $filename  Nombre del archivo
 * @param  string $file_temp Nombre temporal del input tipo file
 * @param  string $file_ext  Extensión del archivo
 * @param  int    $filesize  Tamaño del archivo
 * @param  int    $multiple  Subida múltiple de archivos si (1) no (0)
 * @return string $data      Nombre final del archivo
 */
function imagen_subir($filename, $file_temp, $file_ext, $filesize, $multiple = 0)
/**
 * Rotar imagen
 *
 * @param  int      $orientacion Identificador de orientación
 * @param  resource $lienzo      Imagen original
 * @return resource $lienzo      Imagen tras rotación
 */
function rotar_imagen($orientacion, $lienzo)
/**
 * Generar miniatura
 *
 * @param string $size     Tamaño de la miniatura
 * @param string $filename Nombre del archivo
 */
function miniatura($size, $filename)
/**
 * Buscar imagen en internet
 *
 * @param string $search   Cadena a buscar
 * @param string $filename Nombre de archivo
 */
function searchImageAPI($search, $filename)

Funciones de usuarios
functions_users.php

/**
 * Lista de usuarios
 *
 * @param  int     $pag   Página
 * @param  int     $num   Usuarios por página
 * @param  string  $order Orden de listado
 * @param  int     $del   Archivados (1) o Activos (0)
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de usuarios
 */
function usersList($pag, $num, $order, $del = 0, $json = false)
/**
 * Datos de usuario por Id
 *
 * @param  int   $id   Id de usuario
 * @return array $data Datos de usuario
 */
function getUser($id)
/**
 * Datos de usuario por email
 *
 * @param  string $email Email de usuario
 * @return Datos de usuario
 */
function getUserByEmail($email)
/**
 * Nuevo usuario
 *
 * @return array $jsondata Mensaje de notificación
 */
function addUser()
/**
 * Modificar usuario
 *
 * @return array $jsondata Mensaje de notificación
 */
function editUser()
/**
 * Modificar imagen de perfil
 */
function editProfileImage()
/**
 * Comprobar disponibilidad de email
 *
 * @param  int    $id       Id de usuario (enviar 0 si es un nuevo usuario)
 * @param  string $username Nuevo correo
 * @return boolean Si el email es válido
 */
function checkAvailableUserEmail($id, $username)
/**
 * Validar contraseña de usuario
 *
 * @param  int    $id       Id de usuario
 * @param  string $password Contraseña
 * @return boolean Si la contraseña es correcta
 */
function checkValidPassword($id, $password)
/**
 * Archivar usuario
 */
function archiveUser()
/**
 * Desarchivar usuario
 */
function desarchiveUser()
/**
 * Borrar usuario
 */
function deleteUser()
/**
 * Lista de roles
 *
 * @param  int     $pag   Página
 * @param  int     $num   Roles por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de roles
 */
function rolesList($pag, $num, $order, $json = false)
/**
 * Nuevo rol de usuario
 *
 * @return array $jsondata Mensaje de notificación
 */
function addRole()
/**
 * Modificar icono de rol
 */
function editRoleImage()
/**
 * Modificar rol de usuario
 *
 * @return array $jsondata Mensaje de notificación
 */
function editRole()
/**
 * Comprobar permisos de rol
 *
 * @param string $access Acceso
 * @param int    $id     Id de rol
 */
function checkRoleAccess($access, $id = false)
/**
 * Usuarios asignados a un rol
 *
 * @param  int $id   Id de rol
 * @return int $data Nº de usuarios
 */
function rolTotalUsers($id)
/**
 * Borrar rol de usuario
 */
function deleteRole()
/**
 * Comprobar si el usuario actual es de Central
 *
 * @param  int   $id   Id de vehículo de usuario
 * @return array $data Info de servicio
 */
function isCentral()

Funciones de vehículos
functions_vehicles.php

/**
 * Lista de modelos
 *
 * @param  int     $pag   Página
 * @param  int     $num   Registros por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de modelos
 */
function vehiclesList($pag, $num, $order, $json = false)
/**
 * Datos de vehículo
 *
 * @param  int   $id   Id de vehículo
 * @return array $data Datos de vehículo
 */
function getVehicle($id)
/**
 * Nombre de vehículo por Id de modelo
 *
 * @param  int    $id   Id de modelo.
 * @return string $name Nombre completo
 */
function getVehicleName($id)
/**
 * Lista de modelos y tamaños
 *
 * @return array $data Listado de modelos
 */
function vehiclesListSizes()
/**
 * Lista de modelos de una marca
 *
 * @param  int     $id    Id de marca
 * @param  int     $pag   Página
 * @param  int     $num   Registros por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de modelos
 */
function vehiclesListbyCompany($id, $pag, $num, $order, $json = false)
/**
 * Lista de modelos de una marca para rellenar select
 *
 * @param  int     $company Id de marca
 * @param  boolean $json    Si el resultado es json para ajax o no
 * @return array   $data    Listado de modelos
 */
function loadVehiclesByCompany($company = 0, $json = true)
/**
 * Lista de modelos de una marca para rellenar select en la web,
 * solo se cargan los modelos que tengan precio para los 4 servicios principales o que sean de una categoría distinta a vehículos
 *
 * @param  int   $company Id de marca
 * @return array $data    Listado de modelos
 */
function loadVehiclesByCompanyWeb($company)
/**
 * Lista de marcas
 *
 * @param  int     $pag   Página
 * @param  int     $num   Registros por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de marcas
 */
function vehiclesCompaniesList($pag, $num, $order, $json = false)
/**
 * Obtener filtro de marcas
 *
 * @return array $data Filtros
 */
function getCompaniesFilters()
/**
 * Guardar filtro de marcas
 */
function setCompaniesFilters()
/**
 * Datos de marca
 *
 * @param  int   $id   Id de marca
 * @return array $data Datos de marca
 */
function getCompany($id)
/**
 * Lista de colores
 *
 * @param  int     $pag   Página
 * @param  int     $num   Registros por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @param  string  $lang  Código de idioma
 * @return array   $data  Listado de colores
 */
function colorsList($pag, $num, $order, $json = false, $lang = 'es')
/**
 * Lista de tamaños
 *
 * @param  int     $pag   Página
 * @param  int     $num   Registros por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de tamaños
 */
function sizesList($pag, $num, $order, $json = false)
/**
 * Nuevo color
 *
 * @return array $jsondata Mensaje de notificación
 */
function addColor()
/**
 * Modificar color
 *
 * @return array $jsondata Mensaje de notificación
 */
function editColor()
/**
 * Datos de color en un idioma
 *
 * @param  int    $id   Id de producto
 * @param  string $lang Idioma
 * @return array  $data Datos de servicio
 */
function getColorTranslate()
/**
 * Modificar traducción de color
 *
 * @return array $jsondata Mensaje de notificación
 */
function editColorTranslate()
/**
 * Borrar color
 */
function deleteColor()
/**
 * Nuevo tamaño
 *
 * @return array $jsondata Mensaje de notificación
 */
function addSize()
/**
 * Modificar icono de tamaño
 */
function editSizeImage()
/**
 * Modificar tamaño
 *
 * @return array $jsondata Mensaje de notificación
 */
function editSize()
/**
 * Borrar tamaño
 */
function deleteSize()
/**
 * Modificar tamaño de un modelo
 */
function editVehicleSize()
/**
 * Obtener tamaño de un servicio
 *
 * @param int id Id de servicio
 */
function getWashSize($id)
/**
 * Nueva marca
 *
 * @return array $jsondata Mensaje de notificación
 */
function addCompany()
/**
 * Modificar logotipo de marca
 */
function editCompanyImage()
/**
 * Modificar marca
 *
 * @return array $jsondata Mensaje de notificación
 */
function editCompany()
/**
 * Borrar marca
 */
function deleteCompany()
/**
 * Nuevo modelo
 *
 * @return array $jsondata Mensaje de notificación
 */
function addVehicle()
/**
 * Modificar modelo
 *
 * @return array $jsondata Mensaje de notificación
 */
function editVehicle()
/**
 * Borrar modelo
 */
function deleteVehicle()
/**
 * Obtener filtro de modelos
 *
 * @return array $data Filtros
 */
function getVehiclesFilters()
/**
 * Guardar filtro de modelos
 */
function setVehiclesFilters()
/**
 * Listado de vehículos con servicios
 */
function distinctWashesVehicles()

Funciones de servicios
functions_washes.php

/**
 * Lista de servicios
 *
 * @param  int     $pag   Página
 * @param  int     $num   Servicios por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de servicios
 */
function washesList($pag, $num, $order, $json = false)
/**
 * Lista de servicios finalizados con ruta estimada
 *
 * @param  int     $pag   Página
 * @param  int     $num   Servicios por página
 * @param  string  $order Orden de listado
 * @param  string  $from  Desde
 * @param  string  $to    Hasta
 * @param  int     $f_id  Id de franquicia
 * @return array   $data  Listado de servicios
 */
function washesListRoutes($pag, $num, $order, $from = false, $to = false, $f_id = 0)
/**
 * Lista de servicios sin finalizar de días anteriores
 *
 * @return array $data Listado de servicios
 */
function washesPendingList()
/**
 * Lista de servicios entre fechas
 *
 * @param  string $from   Fecha desde
 * @param  string $to     Fecha hasta
 * @param  int    $id     Id de Plazier (0 para todos)
 * @param  array  $status Ids de estados (0 par todos)
 * @return array  $data   Listado de servicios
 */
function washesListRange($from, $to, $id = 0, $status = 0)
/**
 * Lista de servicios generados entre fechas
 *
 * @param  string $from  Fecha desde
 * @param  string $to    Fecha hasta
 * @param  int    $pag   Página
 * @param  int    $num   Servicios por página
 * @param  string $order Orden
 * @return array  $data  Listado de servicios
 */
function washesListCreatedRange($from, $to, $pag, $num, $order)
/**
 * Obtener filtro de servicios de usuario
 *
 * @return array $data Filtros
 */
function getWashFilters()
/**
 * Guardar filtro de servicios de usuario
 */
function setWashFilters()
/**
 * Lista de servicios en un día
 *
 * @param  string $date    Fecha Y-m-d
 * @param  int    $plazier Id de plazier
 * @return array  $data    Listado de servicios
 */
function washesTodayList($date, $plazier = false)
/**
 * Lista de servicios en un mes (añadiendo un mes antes y después)
 *
 * @param  string  $date     Fecha Y-m
 * @param  int     $plazier  Id de plazier
 * @param  boolean $finished Solo finalizados si/no
 * @return array   $data     Listado de servicios
 */
function washesMonthList($date = false, $plazier = false, $finished = false)
/**
 * Lista de servicios en una semana
 *
 * @param  string $date  Fecha Y-m-d H:i:s
 * @param  string $limit IDs de plaziers a excluir
 * @return array  $data  Listado de servicios
 */
function washesWeekList($date = false, $limit = '')
/**
 * Lista de servicios de un cliente
 *
 * @param  int   $id   Id de cliente
 * @return array $data Listado de servicios
 */
function washesUserList($id)
/**
 * Listado de servicios en agenda y sin cancelar de un cliente
 *
 * @param int    $id     Id de cliente.
 * @param string $finish Filtrar por acabados si/no.
 */
function washesUserListActive($id, $finish = 'all')
/**
 * Lista de servicios finalizados de un cliente
 *
 * @param  int   $id   Id del cliente
 * @return array $data Listado de servicios
 */
function getCustomerHistoryWashes($id = 0)
/**
 * Tiempo y agua ahorrado en servicios finalizados de un cliente
 *
 * @param  int $id   Id del cliente
 * @return int $save Total de minutos/litros ahorrados
 */
function getCustomerHistorySaving($id)
/**
 * Lista de complementos de un servicio
 *
 * @param  int   $id   Id de servicio
 * @return array $data Listado de complementos
 */
function washComplements($id)
/**
 * Importe real de un servicio incluyendo descuentos
 *
 * @param  int    $id   Id de servicio
 * @return string $data Importe
 */
function washTotalPrice($id)
/**
 * Importe del producto principal de un servicio (sin descuento), se usa para emitir facturas con el precio real y no el actual
 * Se calcula según los importes guardados para evitar diferencias si el precio se ha modificado:
 * Precio total - (Suma de los precios de los complementos)
 *
 * @param  int    $id   Id de servicio
 * @return string $data Importe
 */
function washProductPrice($id)
/**
 * Datos de servicio
 *
 * @param  int     $id   Id de servicio
 * @param  boolean $json Si el resultado es json para ajax o no
 * @return object  $data Datos de servicio
 */
function getWash($id, $json = false)
/**
 * Obtener mail del plazier de un servicio
 *
 * @param  int    $wash  Id de servicio
 * @return string $email Correo del plazier
 */
function get_wash_plazier_email($wash)
/**
 * Obtener cantidad de un complemento en un servicio
 *
 * @param  int $wash Id de servicio
 * @param  int $comp Id de complemento
 * @return int $data Cantidad
 */
function get_wash_comp_quantity($wash, $comp)
/**
 * Nuevo servicio
 *
 * @return array $jsondata Mensaje de notificación
 */
function addWash()
/**
 * Nuevo servicio interno
 *
 * @return array $jsondata Mensaje de notificación
 */
function addWashInternal()
/**
 * Nuevo servicio web
 *
 * @return int $id Id de nuevo servicio
 */
function addWashWeb()
/**
 * Modificar servicio
 *
 * @return array $jsondata Mensaje de notificación
 */
function editWash()
/**
 * Modificar servicio web
 *
 * @return array $jsondata Mensaje de notificación
 */
function editWashWeb()
/**
 * Modificar notas de servicio
 */
function editWashNotes()
/**
 * Modificar tiempos de servicio desde formulario
 *
 * @return array $jsondata Mensaje de notificación
 */
function editWashTimes()
/**
 * Actualizar una hora de servicio desde botón
 *
 * @param int    $default_id    Id de servicio
 * @param string $default_field Campo
 */
function editWashTime($default_id = 0, $default_field = '')
/**
 * Comprobar si un servicio tiene informe enviado
 *
 * @param  int     $id   Id de servicio
 * @return boolean $data Si/No
 */
function checkSendReport($id)
/**
 * Respuesta de informe según servicio y pregunta
 *
 * @param  int    $wash     Id de servicio
 * @param  string $question Campo de pregunta
 * @return string $data     Respuesta
 */
function getAnswer($wash, $question)
/**
 * Informe completo de servicio
 *
 * @param  int    $id   Id de servicio
 * @return string $data informe
 */
function getWashReport($id = 0)
/**
 * Guardar informe de servicio
 *
 * @return array $jsondata Mensaje de notificación
 */
function editWashReport()
/**
 * Borrar servicio
 *
 * @param int $id Id de servicio
 */
function deleteWash($id = 0)
/**
 * Establecer tiempo/precio de servicio
 *
 * @param  int    $id   Id de servicio
 * @return object $data Tiempo y precio total
 */
function setWashPriceTime($id)
/**
 * Llamar a cliente
 */
function addWashCall()
/**
 * Pausa de servicio, enviar información
 */
function addWashPauseInfo()
/**
 * Nuevo SMS
 *
 * @return array $jsondata Mensaje de notificación
 */
function addWashSms()
/**
 * Aviso de llegada con retraso
 */
function sendWashDelay()
/**
 * Aviso de espera
 */
function sendWashWaiting()
/**
 * Cancelar servicio
 */
function cancelWash()
/**
 * Pausar servicio en curso
 */
function pauseWash()
/**
 * Añadir incidencia a servicio
 */
function incidenceWash()
/**
 * Añadir incidencia de empresa a servicio
 */
function incidenceWashCompany()
/**
 * Borrar incidencia de servicio
 */
function deleteWashIncidence()
/**
 * Listado completo de la galería de fotos
 *
 * @param  int     $pag   Página
 * @param  int     $num   Fotos por página
 * @param  string  $order Orden de listado
 * @return array   $data  Listado de fotos
 */
function galleryList($pag, $num, $order = 'id DESC')
/**
 * Listado de la galería de fotos de un modelo de vehículo
 *
 * @param  int   $vehicle Id de vehículos
 * @return array $data    Listado de fotos
 */
function galleryListVehicle($vehicle)
/**
 * Comprobar si un servicio tiene fotos de Plazier
 *
 * @param  int     $id   Id de servicio
 * @return boolean $data Si/No
 */
function checkWashPhotos($id)
/**
 * Comprobar si un servicio tiene fotos de Plazier de un tipo concreto
 *
 * @param  int     $id     Id de servicio
 * @param  string  $desc   Tipo de fotos
 * @param  boolean $return Return o echo
 * @return boolean $data   Si/No
 */
function checkWashPhotosType($id = 0, $desc = '', $return = 0)
/**
 * Comprobar si un servicio tiene fotos de cliente
 *
 * @param  int     $id   Id de servicio
 * @return boolean $data Si/No
 */
function checkWashCustomerPhotos($id)
/**
 * Obtener fotos de servicio por categoría
 *
 * @param  int   $id   Id de servicio
 * @return array $data Fotos
 */
function getWashPhotos($id = 0, $json = false)
/**
 * Subir fotos de servicio
 */
function addWashPhotos()
/**
 * Guardar rutas a fotos externas
 *
 * @param int    $wash  Id de servicio
 * @param string $image Url de imagen
 * @param int    $web   Subida desde la web Si/No
 */
function addWashPhotosLink($wash, $image, $web)
/**
 * Borrar foto de servicio
 */
function deleteWashPhoto()
/**
 * Borrar fotos mal subidas de servicios
 */
function clearWashPhotos()
/**
 * Nueva limpieza de paños
 *
 * @param  object $plazier Datos de Plazier
 * @return array  $data    Datos de nuevo servicio
 */
function addWashPanhos($plazier)
/**
 * Nuevo servicio a partir de incidencia
 *
 * @param  int    $wash_id    Id de servicio original
 * @param  int    $product_id Id de nuevo servicio (0 para usar el original)
 * @param  int    $plazier_id Id de plazier (0 para cualquiera)
 * @param  string $comments   Comentarios
 * @return int    $id         Id de nuevo servicio generado
 */
function incidenceAddWash($wash_id, $product_id, $plazier_id, $comments)
/**
 * Nuevo descanso
 *
 * @param  int    $plazier Id de Plazier
 * @param  string $date    Fecha
 */
function addWashRest($plazier, $date)
/**
 * Comprobar si un Plazier tiene ya algún descanso en un día
 *
 * @param  int    $plazier Id de Plazier
 * @param  string $date    Fecha
 */
function checkRest($plazier, $date)

Funciones para localizaciones
functions_zones.php

/**
 * Lista de zonas
 *
 * @param  int     $pag   Página
 * @param  int     $num   Zonas por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de zonas
 */
function zonesList($pag, $num, $order, $json = false)
/**
 * Lista de ciudades
 *
 * @param  int     $pag   Página
 * @param  int     $num   Ciudades por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de ciudades
 */
function citiesList($pag, $num, $order, $json = false)
/**
 * Lista de cps
 *
 * @param  int     $pag   Página
 * @param  int     $num   CPs por página
 * @param  string  $order Orden de listado
 * @param  boolean $json  Si el resultado es json para ajax o no
 * @return array   $data  Listado de CPs
 */
function cpsList($pag, $num, $order, $zone = 0, $json = false)
/**
 * Lista de CPs de una ciudad para rellenar select
 *
 * @param  int     $city Id de ciudad
 * @param  boolean $json Si el resultado es json para ajax o no
 * @return array   $data Listado de CPs
 */
function loadCpsByCity($city = 0, $json = true)
/**
 * Previsión meteorológica de un CP en un día
 *
 * @param  string $cp   CP
 * @param  string $date Fecha Y-m-d
 * @return array  $data Info de la previsión
 */
function cpWeather($cp = '', $date = '')
/**
 * Nuevo cp
 *
 * @return array $jsondata Mensaje de notificación
 */
function addCp()
/**
 * Modificar cp
 *
 * @return array $jsondata Mensaje de notificación
 */
function editCp()
/**
 * Comprobar si existe un cp
 *
 * @param  $cp string Código postal
 * @return boolean
 */
function is_valid_cp($cp)
/**
 * Obtener zona por cp
 *
 * @param  $cp   string Código postal
 * @return $zone int    Id de zona
 */
function get_zone_by_cp($cp)
/**
 * Obtener horario en una zona un día de la semana
 *
 * @param  $id   int    Id de zona
 * @param  $day  int    Nº de día de la semana
 * @return $data string Horario
 */
function get_zone_day_schedule($id, $day)
/**
 * Borrar cp
 */
function deleteCp()
/**
 * Nueva zona
 *
 * @return array $jsondata Mensaje de notificación
 */
function addZone()
/**
 * Modificar zona
 *
 * @return array $jsondata Mensaje de notificación
 */
function editZone()
/**
 * Borrar zona
 */
function deleteZone()
/**
 * Nueva ciudad
 *
 * @return array $jsondata Mensaje de notificación
 */
function addCity()
/**
 * Modificar ciudad
 *
 * @return array $jsondata Mensaje de notificación
 */
function editCity()
/**
 * Borrar ciudad
 */
function deleteCity()
/**
 * Obtener coordenadas de CP
 *
 * @param  $city string Ciudad
 * @param  $cp   string CP
 * @return $data array  Latitud y longitud
 */
function getCpCoordenates($city, $cp)
/**
 * Direcciones de Plazy en la zona de un Plazier
 *
 * @param  $id   int   Id de Plazier
 * @return $dirs array Direcciones
 */
function getPlazyAddresses($id)