Pre-launch · ERPlora is in active development. You're viewing a product preview.
Back to apps Customers, schedule and team

Customers

Your customers' file: contact and tax details, notes, groups, consent and what they bought.

Free
Start free
Turn it on from your Hub

Apps are turned on from the Apps page of your Hub. Create your free account to get one.

This documentation is only available in Spanish.

Para qué sirve y para quién

Clientes es el fichero de personas y empresas del negocio y el dueño de su dato personal: la ficha con el contacto y los datos fiscales, sus grupos, etiquetas y campos propios, sus notas y su actividad, su consentimiento para recibir publicidad por cada canal y lo que ha comprado.

  • En la peluquería es la clienta de la agenda: Citas cuelga sus visitas de la ficha y la reconoce cuando escribe por WhatsApp.
  • En el restaurante es el comensal que reserva o pide factura: el TPV le pone su ficha a la cuenta y la factura sale con sus datos fiscales.

Es la app de la que más dependen las demás: el TPV le pide el cliente de la venta y su copia fiscal, Citas y Reservas lo buscan por nombre o teléfono, WhatsApp lo reconoce por su número y todas se enteran cuando se unen dos fichas o se borran los datos de una persona. Clientes no necesita ninguna otra app.

Quién la usa:

  • El propietario y el administrador: todo, también eliminar fichas y borrar datos personales.
  • El responsable: edita fichas, une duplicados, crea y cambia grupos, etiquetas y campos (y elimina campos), exporta y anota en la actividad lo que traen otras apps.
  • El empleado (también en la caja): consulta, da de alta, edita la ficha, importa, añade notas, asigna grupos y etiquetas, registra el consentimiento y pone el cliente a la venta.
  • El cliente no usa estas pantallas: sus datos entran por el mostrador, el TPV o su WhatsApp.

Referencia adoptada

ERPlora no inventa flujos: adopta los que el mercado ya probó.

  • Teléfonos en formato internacional E.164 (UIT-T), con las reglas de libphonenumber de Google: el número sin prefijo se lee en el país del negocio, como hacen los TPV de referencia.
  • Alta de ficha como Odoo, Shopify, Square, Toast, Lightspeed, Fresha y Holded: solo el nombre es obligatorio; teléfono, email y NIF a la vista y el resto a un toque.
  • Unir fichas duplicadas como Square, Shopify, Odoo, Fresha, Lightspeed y Mindbody: una ficha se queda, completa sus huecos con la otra y cada app re-apunta lo suyo.
  • Cliente en el TPV como Square, Toast, Lightspeed, Shopify POS y Fresha: buscar por nombre o teléfono y «+ nuevo cliente» en dos toques, sin salir de la venta.
  • Consentimiento por canal, con la frase guardada palabra por palabra y retirarlo tan fácil como darlo: RGPD arts. 7 y 17 y Directrices 05/2020 del CEPD, como Shopify, Klaviyo, Mailchimp y HubSpot.
  • Borrado de datos personales como el aviso customers/redact de Shopify y el buscador de privacidad de Odoo: se borra a la persona y se conserva lo que la ley obliga a guardar (las ventas).
  • Notas y actividad en una sola línea de tiempo, como el «chatter» de Odoo y la línea de tiempo de Shopify.
  • Alergias y prueba de sensibilidad en su propio bloque de la ficha, a la vista de quien atiende, como Fresha, Phorest, Timely, Vagaro, Zenoti, Mindbody, Shortcuts y Kitomba; y, por ser datos de salud, solo con el permiso expreso de la persona (RGPD art. 9.2.a), que se retira tan fácil como se da y al retirarlo se borran (arts. 7.3 y 17).
  • Permisos por acción como los de personal de Shopify: ver, gestionar, exportar, unir, eliminar y borrar datos personales son permisos distintos.

Antes de empezar

  1. Encender Clientes en la página de apps del negocio. No necesita ninguna otra app. Con Venta aparece el buscador en el TPV y las compras se apuntan solas; con Citas, el historial de visitas en la ficha; con la Bandeja de WhatsApp, el reconocimiento por teléfono.
  2. El país que se supone para un teléfono escrito sin prefijo es España mientras el negocio no tenga su país en los ajustes (CUSTOMER-F11).
  3. Si hace falta segmentar, crear los grupos, las etiquetas (CUSTOMER-F27, F28) y los campos propios del negocio (CUSTOMER-F29). Marcar como obligatorios solo los imprescindibles: se exigen cada vez que se guarda la ficha completa (no al darla de alta).
  4. Traer los clientes que ya se tienen con Importar CSV (CUSTOMER-F08) o darlos de alta (CUSTOMER-F01).
  5. Comprobar en el TPV que la ficha sale en el buscador y que la venta se cobra con ella (CUSTOMER-F17).

⚠️ En la fase 1 el negocio es la primera parte de la dirección (a.localhost:8000 es el negocio a) y los negocios comparten las fichas (una sola base de datos). Lo que ya se separa es el aviso en vivo. En la fase 2 cada negocio tendrá su base de datos.

Pantallas

Clientes se abre desde el menú Clientes y tiene cuatro pestañas: Clientes, Grupos, Etiquetas y Campos. No tiene pestaña de ajustes.

Clientes

Arriba, cuatro cifras: «Clientes», «Activos», «VIP» e «Ingresos» (lo gastado por las fichas vivas). Debajo, la tabla: «Nombre», «Email», «Teléfono», «Etapa» y «Gastado»; buscador «Buscar nombre, teléfono o email…» (busca también NIF y empresa); filtros por etapa, origen, activo y gastado («Desde / Hasta», en euros); orden por cualquier columna; 50 por página. En la barra, Añadir e Importar CSV a quien puede gestionar fichas, y Exportar CSV a quien puede exportar. Tocar una fila abre la ficha.

Ficha de cliente

El nombre y los botones que permite el perfil: Editar, Eliminar, Fusionar con… y Borrar datos personales. Bloques: los datos (Email, Teléfono, NIF/CIF, Empresa, Dirección, Etapa, Origen, Canal preferido, Compras, Gastado, Última compra, Activo, notas internas, cumpleaños, aniversario y campos personalizados); «Grupos» y «Etiquetas» con casillas; «Consentimiento de marketing» con una línea por canal y «Todo lo que se decidió»; «Añadir nota»; «Actividad»; «Compras» (cada venta con su importe y su estado); y al final los bloques de otras apps (hoy, el «Historial de visitas» de Citas).

Grupos

Tabla «Nombre», «Descripción», «Clientes» (cuántas fichas vivas tiene), «Orden» y «Activo»; buscador «Buscar grupo…» y filtro de activos; Añadir y Editar a quien puede configurar, Eliminar al propietario y al administrador.

Etiquetas

Tabla «Nombre», «Color», «Clientes» y «Activa»; buscador «Buscar etiqueta…»; mismas acciones que Grupos.

Campos

Tabla «Nombre», «Tipo», «Obligatorio» (Sí/No), «Orden» y «Activo»; buscador «Buscar campo…»; filtros por tipo, obligatorio y activo; Añadir, Editar y Eliminar a quien puede configurar.

Buscador de cliente del TPV

Vive dentro de la pantalla de venta de Venta: un botón «Asignar cliente» (o el nombre del cliente ya elegido) abre un buscador por nombre, teléfono o email, con «+ Nuevo cliente «…»» (nombre y teléfono) y Quitar cliente. Lo pinta Clientes; el hueco lo reserva Venta.

Buscador de cliente del TPV · API

El componente CustomerSearch de Clientes (Venta lo importa por su ruta, de los componentes de Clientes).

<CustomerSearch v-model="venta.cliente" v-model:open="eligiendo" />
  • v-model (CustomerSnapshot | null): el cliente asignado, como COPIA de su ficha fiscal en el momento: customer_id, customer_name, customer_tax_id, customer_address («calle, CP ciudad, país», en el idioma de la página) y customer_country (código ISO de dos letras, o vacío). null = sin cliente.
  • v-model:open (opcional): abre y cierra el buscador; Venta lo pone a true cuando exige cliente y no hay.
  • El botón dice «Asignar cliente» o el nombre del cliente. El buscador (un ion-modal) busca por nombre, teléfono o email entre las 20 primeras fichas, en vivo, y distingue «buscando», «sin resultados», «caído» (con «Reintentar») y «sin permiso». Al elegir lee la ficha entera (customer.customer.detail); si no se puede leer, no asigna y lo dice. «+ Nuevo cliente «…»» (quien gestiona fichas) crea con nombre y teléfono; si fichas vivas ya tienen ese teléfono, las enseña y pregunta «usar o crear una nueva» (nunca asigna sin elegir; F12, F18). «Quitar cliente» devuelve null.
  • No enlaza el pedido: eso es de Venta, con customer.order.link y customer.order.customer (F19).
  • Mientras Venta no existe, se ve y se prueba en /customer/preview/customer-search (solo en el servidor de desarrollo; nunca en el build de producción).

Estados de cada pantalla

Estado Qué ve la persona
Cargando «Cargando…» mientras llega el primer resultado.
Vacío «Sin clientes.» (o «Sin resultados» si hay búsqueda o filtro); «Sin grupos.», «Sin etiquetas.», «Sin campos personalizados.», «Sin actividad registrada.»
Error El motivo con «Reintentar»; lo tecleado se conserva.
Reconectando Lo pintado se queda; una franja avisa «Reconectando…».
App inactiva «Esta app no está activa en este negocio».
Sin permiso No aparece lo que no puede hacer; si llega por otra puerta, «No tienes permiso».
Ficha que ya no está «Este cliente ya no está disponible.» (eliminada, unida a otra o con los datos borrados).

Flujos

ID Flujo Estado Vertical
CUSTOMER-F01 Dar de alta una ficha hecho común
CUSTOMER-F02 Buscar y filtrar fichas hecho común
CUSTOMER-F03 Abrir la ficha de un cliente hecho común
CUSTOMER-F04 Editar la ficha y sus campos personalizados hecho común
CUSTOMER-F05 Añadir una nota a la ficha hecho común
CUSTOMER-F06 Poner grupos y etiquetas a una ficha hecho común
CUSTOMER-F07 Eliminar una ficha hecho común
CUSTOMER-F08 Importar fichas desde un CSV hecho común
CUSTOMER-F09 Exportar las fichas a CSV hecho común
CUSTOMER-F10 Reconocer a una persona por su número de teléfono hecho común
CUSTOMER-F11 Guardar el teléfono en formato internacional (E.164) hecho común
CUSTOMER-F12 Evitar fichas duplicadas de la misma persona hecho común
CUSTOMER-F13 Unir dos fichas de la misma persona hecho común
CUSTOMER-F14 Registrar el consentimiento de un canal hecho común
CUSTOMER-F15 Retirar el consentimiento de un canal hecho común
CUSTOMER-F16 Borrar los datos personales de un cliente (RGPD) hecho común
CUSTOMER-F17 Asignar un cliente a la venta en el TPV hecho común
CUSTOMER-F18 Crear un cliente desde el buscador del TPV hecho común
CUSTOMER-F19 Enlazar el cliente al pedido abierto hecho común
CUSTOMER-F20 Sumar la compra a la ficha al cobrar hecho común
CUSTOMER-F21 Restar una venta anulada hecho común
CUSTOMER-F22 Restar una devolución hecho común
CUSTOMER-F23 Ver el historial de compras de un cliente hecho común
CUSTOMER-F24 Ver en la ficha lo que otras apps saben del cliente hecho común
CUSTOMER-F25 Crear la clienta sin salir de la agenda hecho peluquería
CUSTOMER-F26 Crear la ficha de quien pide cita por WhatsApp parcial peluquería
CUSTOMER-F27 Crear, cambiar y eliminar grupos de clientes hecho común
CUSTOMER-F28 Crear, cambiar y eliminar etiquetas de clientes hecho común
CUSTOMER-F29 Definir los campos personalizados de la ficha hecho común
CUSTOMER-F30 Dar la ficha de un cliente a otras apps hecho común
CUSTOMER-F31 Ver las cifras de los clientes hecho común
CUSTOMER-F32 Apuntar alergias o la prueba de sensibilidad con su permiso hecho peluquería

«Hecho»: servidor y páginas con sus tests (de las páginas y de extremo a extremo en Chrome). «Parcial»: lo que falta y por qué va en su «Estado».

CUSTOMER-F01 Dar de alta una ficha

Estado: hecho Vertical: común Actor: propietario, administrador, responsable, empleado Pantalla: Clientes Pasos: 1. En Clientes pulsa Añadir: se abre el diálogo «Nuevo cliente» (el panel lateral del producto, pedido a @erplora/ui en UI-REQUESTS.md). 2. A la vista: «Nombre», «Teléfono», «Email», «NIF/CIF» y «Empresa». Detrás de «Más datos»: «Dirección», «Ciudad», «Código postal», «País», «Foto» (su dirección), «Cumpleaños», «Aniversario», «Origen» («En el local» de entrada), «Etapa» («Contacto» de entrada), «Canal preferido» («Ninguno» de entrada) y «Notas internas». 3. Solo el nombre es obligatorio: hasta que no lo hay, Guardar no se puede pulsar. 4. Pulsa Guardar: el panel se cierra y la ficha aparece en la lista; las cifras se recalculan. Entra: lo que se teclea. El país se guarda con su código de dos letras (ES, FR). El teléfono se guarda en formato internacional (+34 y las cifras seguidas, CUSTOMER-F11); el email y el NIF, sin los espacios de los extremos. Sale: la ficha nueva, activa y sin consentimiento de ningún tipo (CUSTOMER-F14), y el aviso de ficha creada (customer.customer.created), que escucha WhatsApp para unir a la ficha las conversaciones que ya tenía ese número. Si falla: el motivo sale debajo de su campo y lo tecleado se conserva. Un email mal formado: «Escribe un email válido.». Un teléfono que no es un número de su país: «No es un teléfono válido de su país: revisa las cifras o escríbelo con su prefijo internacional (+44…).». Un país que no existe: «Elige un país de la lista.». No se guarda nada. Los campos personalizados no se piden en el alta. Implicados: WHATSAPP_INBOX-F04

CUSTOMER-F02 Buscar y filtrar fichas

Estado: hecho Vertical: común Actor: todos Pantalla: Clientes Pasos: 1. Escribe en el buscador. Busca a la vez en nombre, email, teléfono, NIF y empresa, sin distinguir mayúsculas ni acentos («garcia» encuentra «García»). Un término hecho solo de cifras y signos de teléfono (con espacios, guiones o paréntesis, con + o 00 delante) se busca por sus cifras, sin el 00 ni el cero nacional, así que la ficha se encuentra se escriba como se escriba. 2. Con los filtros: etapa, origen, activo y gastado por rango («Desde / Hasta», en euros). 3. Ordena por nombre, email, teléfono, etapa, gastado, última compra o fecha de alta. De entrada, por nombre de la A a la Z, 50 por página (como mucho 100). 4. Toca una fila para abrir su ficha (CUSTOMER-F03). Entra: el texto, los filtros y el orden. Sale: nada; solo lectura. Las fichas eliminadas, unidas a otra o con los datos borrados no salen; las marcadas como no activas, sí. Si falla: la tabla enseña el error con «Reintentar». Sin resultados: «Sin clientes.». Implicados: ninguno

CUSTOMER-F03 Abrir la ficha de un cliente

Estado: hecho Vertical: común Actor: todos Pantalla: Ficha de cliente Pasos: 1. Desde Clientes, toca la fila. 2. La ficha enseña todos sus datos (también notas internas, cumpleaños, aniversario y campos personalizados, que en el producto actual solo se veían al editar), sus grupos y etiquetas, su consentimiento por canal, la actividad (más reciente primero, 50 por página), sus compras y los bloques de otras apps. 3. ← Volver regresa a la lista. Entra: la ficha y, aparte, su actividad, sus compras y su historial de consentimientos. Sale: nada; solo lectura. Si otra persona la cambia mientras está abierta, se ve el cambio sin recargar. Si falla: «Este cliente ya no está disponible.» si se eliminó, se unió a otra o se borraron sus datos. Implicados: CUSTOMER-F24

CUSTOMER-F04 Editar la ficha y sus campos personalizados

Estado: hecho Vertical: común Actor: todos los que gestionan fichas (propietario, administrador, responsable, empleado) Pantalla: Ficha de cliente Pasos: 1. En la ficha pulsa Editar: los datos pasan a ser el formulario del alta, más los «Campos personalizados» del negocio (cada uno con su forma: texto, número, fecha, sí/no, lista o texto largo; los obligatorios llevan *) y la casilla «Activo». 2. Cambia lo que haga falta. Vaciar un campo también es un cambio. 3. Pulsa Guardar. Sale «Cliente actualizado». Entra: los datos cambiados y el valor de cada campo personalizado. El teléfono se guarda en formato internacional, como en el alta. Sale: la ficha y sus campos guardados en una sola escritura, y el aviso de ficha actualizada (customer.customer.updated), que escucha WhatsApp para unir conversaciones de un teléfono recién corregido. Guardar sin cambiar nada no avisa a nadie. El consentimiento queda anotado con la dirección para la que se dio: cambiar el teléfono o el email no lo traslada (CUSTOMER-F14). Si falla: un campo obligatorio vacío («Este campo es obligatorio.»), un valor que no encaja con su tipo («Escribe un número.», «Escribe una fecha válida.», «Elige una de las opciones.»), un campo que ya no existe o un teléfono que no es de su país rechazan TODO el guardado y el motivo sale junto a su campo. La casilla «Activo» desmarcada solo cambia la cifra «Activos»: la ficha sigue saliendo en búsquedas, en el TPV y en WhatsApp. Implicados: WHATSAPP_INBOX-F04

CUSTOMER-F05 Añadir una nota a la ficha

Estado: hecho Vertical: común Actor: todos los que gestionan fichas Pantalla: Ficha de cliente Pasos: 1. En «Añadir nota», escribe la nota. 2. Pulsa Añadir. Sale «Nota añadida» y la nota aparece arriba de la «Actividad», con quién la escribió y cuándo. Entra: el texto (hasta 5.000 caracteres) y, si lo pone quien la escribe por otra vía (una automatización), un título propio y el nombre del autor. Sale: la nota, que ES su entrada de la actividad (una sola fila: no puede haber nota sin actividad), y el aviso de nota añadida (customer.note.added). Las notas no se editan ni se borran. Una automatización puede escribir notas por el mismo servicio. Si falla: una nota vacía sale debajo del campo; «Este cliente ya no está disponible.» si la ficha ya no existe. Implicados: ninguno

CUSTOMER-F06 Poner grupos y etiquetas a una ficha

Estado: hecho Vertical: común Actor: todos los que gestionan fichas Pantalla: Ficha de cliente Pasos: 1. En «Grupos», marca o desmarca las casillas. 2. Pulsa Guardar grupos. Sale «Grupos asignados». 3. Igual con «Etiquetas» y Guardar etiquetas («Etiquetas asignadas»). Entra: la selección completa de grupos o de etiquetas. Sale: la selección SUSTITUYE a la anterior (no se añade), y el aviso de grupos o etiquetas cambiados (customer.customer.groups_changed, customer.customer.tags_changed) si algo cambió. El recuento «Clientes» de Grupos y Etiquetas se actualiza solo. Si falla: un grupo o una etiqueta que otra persona acaba de eliminar: «Ese grupo ya no existe.» / «Esa etiqueta ya no existe.», y no se guarda nada. Sin grupos o etiquetas: «No hay grupos.» / «No hay etiquetas.». Implicados: ninguno

CUSTOMER-F07 Eliminar una ficha

Estado: hecho Vertical: común Actor: propietario, administrador Pantalla: Ficha de cliente Pasos: 1. En la ficha pulsa Eliminar. 2. Un diálogo pregunta «Eliminar cliente» — «¿Eliminar {nombre}? Deja de salir en la lista, en el TPV y en la búsqueda por teléfono. Sus ventas se conservan.» con Cancelar y Eliminar. 3. Al confirmar sale «Cliente {nombre} eliminado» y la ficha desaparece de la lista, del TPV y de la búsqueda por teléfono. Entra: la ficha. Sale: la ficha marcada como eliminada CONSERVANDO sus datos, su actividad, sus consentimientos, sus compras y sus pedidos enlazados, y el aviso de ficha eliminada (customer.customer.deleted). Una ficha con compras se elimina igual: las ventas y facturas guardan su propia copia fiscal. Una venta que llegue después para esa ficha ya no suma (CUSTOMER-F20). No es el borrado de datos personales: eso es CUSTOMER-F16. Si falla: una ficha que no existe: «Este cliente ya no está disponible.», sin avisar a nadie. Sobre una ficha ya eliminada, unida a otra o con los datos borrados NO falla: responde bien y vuelve a avisar. Implicados: SERVICE-F29

CUSTOMER-F08 Importar fichas desde un CSV

Estado: hecho Vertical: común Actor: todos los que gestionan fichas Pantalla: Clientes Pasos: 1. Pulsa Importar CSV y elige el fichero. 2. Cabeceras que entiende: name/«Nombre», email/«Email»/«correo», phone/«Teléfono»/«tel», tax_id/«NIF»/«CIF», company_name/«Empresa», address/«Dirección», city/«Ciudad», postal_code/«CP»/«Código postal», country/«País», lifecycle_stage/«Etapa» y notes/«Notas» (las mismas columnas que da la exportación, CUSTOMER-F09), y además source, preferred_channel, birthday, anniversary y avatar. 3. Mientras trabaja sale «Importando…». Al acabar, un resumen «Importación: {total} filas — {creadas} creadas, {omitidas} omitidas.» con cada fila omitida y su motivo, que empieza por la columna de la que habla («Nombre: Este campo es obligatorio.»; igual con un email o un teléfono que no son válidos), y las que tienen algo que revisar («país no reconocido: importado sin país, revísalo en la ficha»). Entra: el fichero, que la pantalla envía en bloques de 50 filas. Sale: las fichas creadas, con origen «Importación», el teléfono en formato internacional y sin consentimiento (aunque el fichero traiga una columna de consentimiento), y un aviso de ficha creada por cada una, así WhatsApp une sus conversaciones como en el alta a mano. Una fila sin etapa entra como «Activo» (es un cliente que ya se tenía), igual que en el producto actual; la etapa antigua customer también se lee como «Activo». Una fila sin origen entra como «Importación». Si falla: una fila mala se omite con su motivo y las demás se crean. Una fila con el mismo nombre, teléfono y email que una ficha que ya está (porque ya se importó o porque el fichero la repite) se omite con «Ya hay una ficha con este nombre, teléfono y email: no se vuelve a crear.»; así, volver a importar el mismo fichero tras un corte a mitad solo crea lo que faltaba. Basta que cambie uno de los tres para que se cree (una madre y su hija comparten teléfono, CUSTOMER-F12). Implicados: WHATSAPP_INBOX-F04

CUSTOMER-F09 Exportar las fichas a CSV

Estado: hecho Vertical: común Actor: propietario, administrador, responsable Pantalla: Clientes Pasos: 1. Con la búsqueda y los filtros que se quieran, pulsa Exportar CSV. 2. El navegador descarga customers.csv con TODAS las fichas que cumplen la búsqueda, no solo la página que se ve. Entra: la búsqueda y los filtros de la tabla. Sale: un fichero con las columnas name, email, phone, tax_id, company_name, address, city, postal_code, country, lifecycle_stage, notes, source, is_active, total_purchases, total_spent (en euros, con dos decimales), last_purchase_at, created_at, groups y tags. Un valor que empieza por =, +, - o @ (un teléfono, por ejemplo) sale con un apóstrofo delante para que la hoja de cálculo no lo lea como una fórmula; la importación lo quita. Si falla: sin permiso de exportar, el servidor lo rechaza aunque se llame por la API. Sin fichas, sale un fichero solo con las cabeceras. Implicados: ninguno

CUSTOMER-F10 Reconocer a una persona por su número de teléfono

Estado: hecho Vertical: común Actor: sistema Pantalla: ninguna Pasos: 1. Otra app (WhatsApp, Reservas al apuntar una reserva a mano) o el alta rápida del TPV (CUSTOMER-F12) pregunta qué fichas llevan un número. 2. El número se lee con las mismas reglas con que se guarda (CUSTOMER-F11): con el prefijo que lleve (+ o el 00 del país del negocio) o, si no lleva, en el país del negocio. 3. Unas cifras sin + se leen además como número internacional, que es como las da WhatsApp: en un negocio de España, unas cifras que empiezan por 44 son también un número del Reino Unido. 4. Casan las fichas vivas cuyo teléfono es uno de esos números. En un negocio de España, el mismo móvil escrito con espacios, con guiones o con +34, 0034 o 34 delante es la misma persona. 5. Las mismas cifras detrás del prefijo de otro país son otra persona: ese móvil con el prefijo de Francia (+33) no es la ficha del móvil español de un salón español. Entra: el número tal como llegue. Sale: las fichas que casan (nombre, email y teléfono), por nombre. Si son dos o más, decide quien pregunta. Si falla: un número vacío, con letras o que no es posible en su país no casa con nadie (nunca devuelve la lista entera). Las fichas eliminadas, unidas o con los datos borrados no salen. Implicados: RESERVATION-F06, WHATSAPP_INBOX-F04

CUSTOMER-F11 Guardar el teléfono en formato internacional (E.164)

Estado: hecho Vertical: común Actor: quien da de alta o edita Pantalla: Ficha de cliente Pasos: 1. Al dar de alta, editar, importar o crear en el TPV o por WhatsApp, se escribe el teléfono como se tenga (con espacios o guiones, con 0034 o +34 delante, o con el prefijo de otro país y el cero nacional entre paréntesis). 2. Al guardar se leen las reglas de libphonenumber: con el prefijo que lleve o, si no lleva, en el país del negocio (España mientras no haya otro); fuera espacios, guiones, puntos, barras, paréntesis y el cero nacional (también entre paréntesis tras el prefijo). Italia y los demás países que conservan el 0 tras el prefijo lo conservan. El número tiene que ser un número válido de su país (su numeración, no solo su longitud). Se guarda con su prefijo y las cifras seguidas (+34 y las nueve cifras, para un número español). 3. Vaciar el teléfono está permitido: solo el nombre es obligatorio. Entra: el teléfono tecleado. Sale: el teléfono en E.164 en la ficha. Quien lo copia (Citas en la cita) lo copia ya normalizado. Si falla: un número que no es válido en su país (600111 en España, un rango que no se usa), con letras (una extensión) o con dos números en el mismo campo se rechaza con «No es un teléfono válido de su país: revisa las cifras o escríbelo con su prefijo internacional (+44…).» y no se guarda nada. Implicados: APPOINTMENT-F01, WHATSAPP_INBOX-F04

CUSTOMER-F12 Evitar fichas duplicadas de la misma persona

Estado: hecho Vertical: común Actor: todos los que gestionan fichas Pantalla: Clientes y Buscador de cliente del TPV Pasos: 1. Antes de crear, se busca por nombre, teléfono, email o NIF (CUSTOMER-F02). 2. En el alta rápida del TPV, si el teléfono es el de una o más fichas vivas (CUSTOMER-F10), se enseñan y se pregunta: usar una de ellas o crear otra (puede ser otra persona con el mismo teléfono). Nunca se asigna sin elegir (CUSTOMER-F18). 3. Por WhatsApp, la respuesta de citas solo crea ficha si la búsqueda por número no encuentra a nadie. 4. Si ya hay dos fichas de la misma persona, se juntan con CUSTOMER-F13. Entra: lo que se teclea. Sale: nada propio. A propósito, ninguna regla impide dos fichas con el mismo teléfono, email o NIF: una madre y su hija comparten teléfono, y una empresa da el mismo email a varias personas. Si falla: la ficha duplicada se crea; se junta después. Implicados: WHATSAPP_INBOX-F37

CUSTOMER-F13 Unir dos fichas de la misma persona

Estado: hecho Vertical: común Actor: propietario, administrador, responsable Pantalla: Ficha de cliente Pasos: 1. Abre la ficha que se va a QUEDAR y pulsa Fusionar con…. 2. Busca la duplicada (nombre, email, teléfono, NIF o empresa) y tócala. 3. Lee el aviso: «{absorbida} se fusionará en {superviviente}: sus citas, ventas, reservas, conversaciones, bonos, notas y consentimientos pasan a {superviviente}, los datos que falten se completan con los suyos y {absorbida} desaparece de la lista. No se puede deshacer.». 4. Pulsa Fusionar. Sale «{nombre} se ha fusionado en esta ficha.». Entra: las dos fichas, vivas y distintas. Sale: la que se queda conserva sus datos y solo rellena sus campos VACÍOS con los de la otra (también el canal preferido si era «Ninguno»); las notas internas se juntan una detrás de otra; compras y gastado se suman y la última compra es la más reciente. Pasan a ella la actividad (notas incluidas), los campos personalizados que no tenía, los grupos y las etiquetas (unidos), las compras, los pedidos enlazados y todos los consentimientos, que conservan la dirección para la que se dieron. Nombre, etapa, origen y «Activo» son los suyos. En su actividad queda «Ficha duplicada fusionada en esta». La otra queda retirada, con las cifras a cero, y conserva sus datos y los valores de campo que chocaban hasta que se borren los datos de la que se queda: CUSTOMER-F16 borra las dos a la vez (es la misma persona). Las fichas que antes se habían unido en la absorbida pasan a apuntar a la que se queda, así nunca hay cadenas. El aviso de fichas unidas (customer.customer.merged) hace que Citas, Ventas, Reservas, WhatsApp y Servicios re-apunten lo suyo; Reservas online lo sigue a través de Citas. Cocina no guarda cliente: no tiene nada que re-apuntar. Si falla: «Este cliente ya no está disponible.» si una de las dos ya no está; elegir la misma ficha: «Elige otra ficha: no se puede fusionar una ficha consigo misma.». No cambia nada. Implicados: APPOINTMENT-F23, RESERVATION-F21, SALE-F33, SERVICE-F28, WHATSAPP_INBOX-F12, ONLINE_BOOKING-F09

CUSTOMER-F14 Registrar el consentimiento de un canal

Estado: hecho Vertical: común Actor: todos los que gestionan fichas Pantalla: Ficha de cliente Pasos: 1. En «Consentimiento de marketing» hay una línea para Email, WhatsApp y SMS (y otra por cada canal con algo apuntado: Teléfono, Correo postal), con su estado: «Nunca se le ha preguntado», «Dado» o «Retirado», y la fecha y la dirección si las hay. 2. Pulsa Registrar consentimiento. Sale la frase «Quiero recibir ofertas y novedades de este negocio por este canal. Puedo darme de baja cuando quiera.» con la indicación «Léelo en voz alta y pulsa solo si dice que sí. Esta frase exacta es la que queda guardada como prueba, junto a tu nombre y la hora.». 3. Si el cliente dice que sí, pulsa Ha dicho que sí. Sale «Consentimiento registrado.». Entra: el canal, la frase exacta y su versión, el origen («en el mostrador» de entrada) y, si lo hay, un justificante. La dirección la pone el servidor con la de la ficha en ese momento (el email, el teléfono para WhatsApp, SMS y llamadas, o la dirección postal) y quién lo apunta sale de la sesión. Sale: un hecho nuevo que nunca se edita ni se borra, una entrada «Consentimiento dado» en la actividad y el aviso de consentimiento dado (customer.consent.granted). Si falla: una frase vacía o una fecha en el futuro se rechazan junto a su campo; «Este cliente ya no está disponible.» si la ficha ya no está. Quien no gestiona fichas ve el estado sin botones. Editar, crear o importar una ficha NUNCA pone consentimiento. Implicados: ninguno

CUSTOMER-F15 Retirar el consentimiento de un canal

Estado: hecho Vertical: común Actor: todos los que gestionan fichas Pantalla: Ficha de cliente Pasos: 1. En un canal «Dado», pulsa Retirar: un solo toque, sin diálogo y sin pedir motivo. 2. Sale «Consentimiento retirado. Está en vigor desde ya.» y la línea pasa a «Retirado». Entra: el canal y, si se quiere, un motivo. Sale: un hecho nuevo (el «Dado» anterior se conserva: prueba el tiempo en que sí se podía escribir), «Consentimiento retirado» en la actividad y el aviso customer.consent.withdrawn. Volver a darlo después es otro hecho. Si falla: como CUSTOMER-F14. Implicados: ninguno

CUSTOMER-F16 Borrar los datos personales de un cliente (RGPD)

Estado: hecho Vertical: común Actor: propietario, administrador Pantalla: Ficha de cliente Pasos: 1. En la ficha pulsa Borrar datos personales. 2. Sale «Borrar datos personales (RGPD)» con el texto «Borra los datos personales de {nombre}, sus notas, su actividad, sus datos de salud y sus campos personalizados, y no se puede deshacer. Las ventas y facturas conservan su referencia. Queda una entrada de auditoría con quién, cuándo y por qué.» y el campo «Motivo (queda en la auditoría)». 3. Pulsa Borrar datos personales. La ficha se cierra y sale «Datos personales borrados.». Entra: la ficha y el motivo (opcional, hasta 500 caracteres). Vale también para una ficha ya eliminada o unida a otra. Las fichas duplicadas que se unieron en ella (CUSTOMER-F13) son la misma persona: sus datos se borran en el mismo paso, cada una con su auditoría y su aviso. Sale: la ficha se queda con su identificador, el nombre fijo Deleted customer y sin contacto, NIF, dirección, fechas, notas internas ni canal, y desaparece de todas las listas. Se borran su actividad (notas incluidas), sus datos de salud (CUSTOMER-F32), sus valores de campos personalizados y su pertenencia a grupos y etiquetas; sus consentimientos se quedan sin dirección, justificante ni motivo. Se conservan el origen, la etapa, las compras, el gastado, la última compra y la fecha de alta, las compras y los pedidos enlazados (prueba comercial y fiscal) y una única entrada de auditoría (quién, cuándo, el motivo y qué se borró y qué se guardó). El aviso de datos borrados (customer.customer.erased) lo escuchan WhatsApp, Servicios, Citas, Reservas, Reservas online y Mesas para vaciar sus copias. Ventas y Facturación conservan su copia fiscal (es un documento fiscal). Si falla: «Este cliente ya no está disponible.» si no existe. Repetirlo no cambia los datos ni duplica la auditoría, pero vuelve a avisar. Implicados: RESERVATION-F22, SERVICE-F29, WHATSAPP_INBOX-F11, APPOINTMENT-F24, ONLINE_BOOKING-F12, TABLE-F31

CUSTOMER-F17 Asignar un cliente a la venta en el TPV

Estado: hecho — el buscador es CustomerSearch (ver «Buscador de cliente del TPV · API»); lo monta Venta en su pantalla Vertical: común Actor: todos Pantalla: Buscador de cliente del TPV Pasos: 1. En la pantalla de venta toca «Asignar cliente». Si el negocio exige cliente, al cobrar sin él el buscador se abre solo. 2. El buscador enseña las 20 primeras fichas por nombre; al escribir busca como CUSTOMER-F02. 3. Toca la ficha: el botón pasa a enseñar su nombre y la venta recibe una COPIA de sus datos fiscales (nombre, NIF, dirección y país). 4. Quitar cliente deja la venta sin cliente. Al cobrar, aparcar, dejar en la mesa o eliminar la cuenta, Venta suelta el cliente y quita su enlace al pedido (CUSTOMER-F19). 5. Al recargar, recuperar una cuenta aparcada o retomar una mesa, la cuenta vuelve con su cliente: Venta pregunta a Clientes qué cliente tiene ese pedido. Entra: la búsqueda y, al elegir, la ficha completa (CUSTOMER-F30). Sale: a Venta, el cliente y la copia fiscal. Cambiar la ficha después no cambia una factura emitida. Si falla: el motivo con «Reintentar»; sin resultados, «Sin resultados.»; si la ficha completa no se puede leer, el cliente no se asigna. Si al recuperar la cuenta su cliente ya no está disponible, la cuenta sigue sin cliente y sale «No se pudo recuperar el cliente de esta cuenta. Vuelve a asignarlo antes de cobrar.». Implicados: SALE-F04, SALE-F05, SALE-F17, INVOICE-F02

CUSTOMER-F18 Crear un cliente desde el buscador del TPV

Estado: hecho — el buscador es CustomerSearch (ver «Buscador de cliente del TPV · API»); lo monta Venta en su pantalla Vertical: común Actor: todos los que gestionan fichas Pantalla: Buscador de cliente del TPV Pasos: 1. Escribe algo que no encuentra y pulsa + Nuevo cliente «{lo escrito}». Si parece un teléfono, va a «Teléfono»; si no, a «Nombre». 2. Completa «Nombre» y «Teléfono» y pulsa Crear y asignar. 3. Si ese teléfono ya es el de una ficha viva, sale «Ya existe {nombre} con este teléfono. ¿Usar esa ficha o crear una nueva?» (con varias, «Estas fichas ya tienen este teléfono…» y la lista) con Usar {nombre} y Crear una nueva; nada se asigna hasta elegir (como Square y Lightspeed). 4. La ficha elegida o la nueva queda asignada a la venta como en CUSTOMER-F17. Entra: nombre y teléfono. Sale: la ficha con origen «En el local», el teléfono en E.164, el aviso de ficha creada y la venta con cliente. Si falla: sin nombre no se puede pulsar; un teléfono que no es de su país sale dentro del formulario; si no se puede consultar quién tiene ese teléfono, la ficha se crea (la venta no se bloquea; si era la misma persona se juntan con CUSTOMER-F13). Implicados: SALE-F05, WHATSAPP_INBOX-F04

CUSTOMER-F19 Enlazar el cliente al pedido abierto

Estado: hecho Vertical: común Actor: sistema (lo pide Venta) Pantalla: ninguna Pasos: 1. Con un cliente asignado, Venta abre o guarda el pedido (la cuenta de la mesa, el carrito) y le pide a Clientes que lo enlace. 2. Clientes anota qué cliente tiene ese pedido. Reasignar otro cliente al mismo pedido sustituye el anterior (un pedido, como mucho un cliente); el mismo cliente otra vez no reescribe nada. 3. Al soltar el cliente (quitarlo, dejar la cuenta en la mesa, eliminar la cuenta), Venta pide el enlace sin cliente y el enlace se quita. Entra: el pedido y el cliente (o ninguno), con el permiso de quien está en la caja. Sale: el enlace cliente ↔ pedido y su aviso (customer.order.linked o customer.order.unlinked). Venta lo lee para devolver el cliente a la cuenta (CUSTOMER-F17). Si falla: la venta sigue; Venta enseña «La venta sigue, pero el cliente no se pudo asociar al pedido.». Un cliente que ya no está disponible no se enlaza. Implicados: SALE-F17

CUSTOMER-F20 Sumar la compra a la ficha al cobrar

Estado: hecho — la reacción está declarada (events.REACTIONS, events.react); la entrega entre apps la hace el relay del outbox (fase 2) Vertical: común Actor: sistema Pantalla: ninguna Pasos: 1. Se cobra una venta con cliente. 2. En su ficha suben «Compras» en una y «Gastado» en el total de la venta, «Última compra» pasa a ese momento y la «Actividad» gana «Compra registrada». 3. La etapa avanza sola: «Contacto» o «Prospecto» → «1ª compra»; «1ª compra», «En riesgo» o «Inactivo» → «Activo». «Perdido» y «VIP» no se tocan. Entra: la venta cobrada, con su cliente y su total en céntimos (aviso sale.sale.completed de Venta). Sale: una línea en el historial de compras por venta, las cifras y la etapa de la ficha, la entrada de actividad y el aviso customer.purchase.recorded. Si falla: una venta sin cliente no hace nada; la misma venta entregada dos veces cuenta una sola vez; una ficha eliminada, unida o con los datos borrados no suma. Implicados: SALE-F01

CUSTOMER-F21 Restar una venta anulada

Estado: hecho — la reacción está declarada (events.REACTIONS, events.react); la entrega entre apps la hace el relay del outbox (fase 2) Vertical: común Actor: sistema Pantalla: ninguna Pasos: 1. Se anula una venta que tenía cliente. 2. En su ficha bajan «Compras» y «Gastado», «Última compra» vuelve a la compra anterior que siga en pie y la «Actividad» gana «Compra anulada» con el motivo. 3. La etapa retrocede: sin compras, «1ª compra» o «Activo» → «Contacto»; con una, «Activo» → «1ª compra». «VIP» y las demás no se tocan. Entra: la venta anulada (aviso sale.sale.voided de Venta). Sale: la línea del historial marcada como anulada (no se borra), las cifras, la etapa y el aviso customer.purchase.voided. Si falla: anular dos veces la misma venta resta una sola vez; una venta que no estaba apuntada no hace nada. Implicados: SALE-F30

CUSTOMER-F22 Restar una devolución

Estado: hecho — la reacción está declarada (events.REACTIONS, events.react); la entrega entre apps la hace el relay del outbox (fase 2) Vertical: común Actor: sistema Pantalla: ninguna Pasos: 1. Se devuelve todo o parte de una venta que tenía cliente. 2. En su ficha, «Gastado» baja en lo devuelto; «Compras», «Última compra» y la etapa no cambian; la «Actividad» gana «Devolución de compra» con el importe y el motivo. Entra: la devolución de la venta (aviso sale.sale.refunded de Venta: venta, devolución, importe devuelto, motivo y momento). Sale: una línea de devolución en el historial de compras, con su importe en negativo y el estado «Devolución», y el aviso customer.purchase.refunded. El «Gastado» de la ficha es lo cobrado menos lo devuelto, también para la auditoría de cifras (customer.purchase.divergences). Si falla: la misma devolución entregada dos veces cuenta una sola vez; la devolución de una venta que no está apuntada (sin cliente) o que se anuló no hace nada; en una ficha con los datos borrados resta pero no deja actividad. Implicados: SALE-F31

CUSTOMER-F23 Ver el historial de compras de un cliente

Estado: hecho Vertical: común Actor: todos Pantalla: Ficha de cliente Pasos: 1. Abre la ficha (CUSTOMER-F03). 2. En «Compras» sale cada venta con su fecha, su importe y su estado («Cobrada» o «Anulada»), y cada devolución en su propia línea («Devolución», importe en negativo), la más reciente primero, 50 por página; se puede filtrar por estado. Entra: el historial de compras de la ficha. Sale: nada; solo lectura. Si falla: «Sin compras.» si no hay ninguna. Implicados: ninguno

CUSTOMER-F24 Ver en la ficha lo que otras apps saben del cliente

Estado: hecho Vertical: común Actor: todos Pantalla: Ficha de cliente Pasos: 1. Abre la ficha. Al final aparece el bloque de cada app encendida que lo ofrece (hoy, Citas con el «Historial de visitas»); si la app está apagada, su bloque no sale. 2. Lee el bloque: en «Historial de visitas» salen sus diez últimas citas, la más reciente primero, con los servicios, el profesional, el estado y las notas de la visita. Una cita nueva aparece sin recargar la ficha. Entra: qué cliente está abierto (Clientes se lo dice al bloque; no le pasa más datos). Sale: nada; solo lectura. Si falla: cada bloque enseña su propio error en su sitio («No se pudo mostrar este bloque.») y el resto de la ficha sigue. Implicados: APPOINTMENT-F20

CUSTOMER-F25 Crear la clienta sin salir de la agenda

Estado: hecho Vertical: peluquería Actor: todos los que gestionan fichas Pantalla: Citas: Agenda Pasos: 1. En la agenda, pulsa «Añadir cita» y, en «Nueva cita», elige los servicios, el profesional, el día y la hora en el orden que quieras. 2. En «Cliente», pulsa «Asignar cliente» y escribe el nombre o el teléfono de la clienta. Si no tiene ficha, sale «Sin resultados.» y, debajo, «+ Nuevo cliente «…»» con lo que has escrito. 3. Púlsalo. Lo escrito pasa a «Nombre» (o a «Teléfono», si es un número); completa el otro (solo el nombre es obligatorio) y pulsa «Crear y asignar». 4. Si ese teléfono ya está en otra ficha, se enseña y eliges: «Usar» esa ficha o «Crear una nueva» (una madre y su hija pueden compartir teléfono). 5. La clienta queda elegida en «Cliente» y el resto de la cita sigue como estaba; pulsa «Añadir cita». Entra: el nombre y, si lo das, el teléfono. Sale: la ficha nueva, con origen «En el local», y la cita con ella. Si falla: el motivo sale dentro de «Elegir cliente», junto a lo que has escrito (un teléfono que no es de su país, debajo de «Teléfono»), y no se pierde nada: ni el nombre y el teléfono tecleados ni los servicios, el profesional, el día y la hora de la cita. Corrige y vuelve a pulsar «Crear y asignar». Quien no gestiona fichas no ve «+ Nuevo cliente». Implicados: APPOINTMENT-F01, CUSTOMER-F18

CUSTOMER-F26 Crear la ficha de quien pide cita por WhatsApp

Estado: parcial — el alta con origen «WhatsApp» está (también a mano desde la Bandeja, WHATSAPP_INBOX-F37); falta la respuesta automática de citas de la Bandeja de WhatsApp, que aún no está migrada Vertical: peluquería Actor: asistente Pantalla: ninguna Pasos: 1. Una clienta escribe al WhatsApp del salón con la respuesta automática de citas encendida. 2. La respuesta busca su ficha por el número (CUSTOMER-F10). Si la encuentra, la usa. 3. Si no, crea una ficha con el nombre que la clienta haya dado (o su teléfono como nombre), su teléfono en E.164 y origen «WhatsApp». 4. En el restaurante la respuesta de mesas NO crea ficha: solo liga la reserva a la que ya exista. Entra: el número y el mensaje. Sale: la ficha nueva y el aviso de ficha creada. Si falla: un número que no es válido no crea ficha; si casa con dos o más fichas, no crea ninguna. Implicados: WHATSAPP_INBOX-F37, APPOINTMENT-F18

CUSTOMER-F27 Crear, cambiar y eliminar grupos de clientes

Estado: hecho Vertical: común Actor: propietario, administrador, responsable (eliminar: propietario y administrador) Pantalla: Grupos Pasos: 1. En Grupos pulsa Añadir («Nuevo grupo»): «Nombre» (obligatorio), «Descripción», «Color» y «Orden». Guardar → «Grupo creado». 2. Para cambiarlo, toca la fila («Editar · {nombre}»), que añade la casilla «Activo». Guardar → «Grupo actualizado». Un grupo desactivado deja de ofrecerse en las fichas (las que lo tienen lo conservan) y sigue en la lista con el filtro de inactivos, desde donde se vuelve a activar. 3. Para quitarlo, Eliminar: «¿Eliminar {nombre}? Las fichas que lo tienen lo pierden.» → «Grupo {nombre} eliminado». Entra: los datos del grupo. Sale: el grupo, que se asigna desde cada ficha (CUSTOMER-F06), y su aviso (customer.group.created, .updated, .deleted). Eliminar un grupo lo quita de todas sus fichas de verdad. Un grupo no lleva descuento ni precio. Si falla: un nombre ya usado por otro grupo activo (sin distinguir mayúsculas ni espacios de los extremos): «Ya hay un grupo con ese nombre. Elige otro nombre.» debajo de «Nombre»; un grupo inactivo libera su nombre, y reactivarlo con un nombre que ya tiene otro se rechaza igual. Implicados: ninguno

CUSTOMER-F28 Crear, cambiar y eliminar etiquetas de clientes

Estado: hecho Vertical: común Actor: propietario, administrador, responsable (eliminar: propietario y administrador) Pantalla: Etiquetas Pasos: 1. En Etiquetas pulsa Añadir («Nueva etiqueta»): «Nombre» y «Color». Guardar → «Etiqueta creada». 2. Al editar («Editar · {nombre}») aparece «Activa», como en los grupos. Guardar → «Etiqueta actualizada». 3. Eliminar: «¿Eliminar {nombre}? Las fichas que la tienen la pierden.» → «Etiqueta {nombre} eliminada». Entra: nombre y color. Sale: la etiqueta, que se asigna desde cada ficha (CUSTOMER-F06), y su aviso (customer.tag.created, .updated, .deleted). Eliminarla la quita de todas sus fichas. Si falla: «Ya hay una etiqueta con ese nombre. Elige otro nombre.» debajo de «Nombre». Implicados: ninguno

CUSTOMER-F29 Definir los campos personalizados de la ficha

Estado: hecho Vertical: común Actor: propietario, administrador, responsable Pantalla: Campos Pasos: 1. En Campos pulsa Añadir («Nuevo campo personalizado»): «Nombre», «Tipo» («Texto», «Número», «Fecha», «Sí/No», «Selección» o «Texto largo»), las «Opciones» si es de selección, «Orden» y, si hace falta, «Obligatorio». 2. Guardar → «Campo creado». El campo aparece en la ficha de TODOS los clientes (CUSTOMER-F03, F04), con su forma. 3. Al editar («Editar · {nombre}») aparece «Activo»: un campo inactivo no sale en las fichas ni se exige, y sus valores se quedan. Se cambia todo menos el tipo, si ya hay fichas con un valor. Eliminar → «¿Eliminar {nombre}? Se borran también los valores guardados en las fichas.» → «Campo {nombre} eliminado». Entra: la definición del campo. Sale: el campo y su aviso (customer.field.created, .updated, .deleted). «Obligatorio» solo se exige al guardar la ficha completa (CUSTOMER-F04), nunca al darla de alta (Clientes, TPV, importación ni WhatsApp). Si falla: «Ya hay un campo con ese nombre. Elige otro nombre.» debajo de «Nombre»; un campo de selección sin opciones: «Añade al menos una opción.»; cambiar el tipo de un campo con valores: «Este campo ya tiene valores en algunas fichas: su tipo no se puede cambiar.». Implicados: ninguno

CUSTOMER-F30 Dar la ficha de un cliente a otras apps

Estado: hecho Vertical: común Actor: sistema Pantalla: ninguna Pasos: 1. Otra app pide la ficha de un cliente por su identificador: Citas al reservar, Servicios al pintar la titular de un bono, Venta al asignar el cliente (CUSTOMER-F17); y la propia ficha. 2. Clientes contesta con la ficha: nombre, email, teléfono, NIF, empresa, dirección, ciudad, código postal, país, notas, cumpleaños, aniversario, canal preferido, etapa, origen, si está activa, los acumulados de compra, sus grupos, sus etiquetas, sus campos personalizados y su consentimiento por canal. Entra: el identificador de la ficha y el permiso de ver clientes. Sale: nada guardado; solo lectura. Si falla: una ficha que no existe, eliminada, unida a otra o con los datos borrados no se devuelve: «Este cliente ya no está disponible.». Una ficha desactivada sí se devuelve. Implicados: APPOINTMENT-F01, SERVICE-F16, SALE-F05

CUSTOMER-F31 Ver las cifras de los clientes

Estado: hecho Vertical: común Actor: todos Pantalla: Clientes Pasos: 1. Abre Clientes: arriba, encima de la tabla, salen cuatro cifras: «Clientes», «Activos», «VIP» e «Ingresos». 2. «Clientes» cuenta las fichas que siguen en la lista; «Activos», las que tienen marcada la casilla «Activo»; «VIP», las de la etapa «VIP», e «Ingresos» suma lo que han gastado todas ellas, en euros. 3. Las cifras cambian solas, sin recargar, cuando alguien da de alta, edita, elimina, une o borra los datos de una ficha, o cuando se cobra, se anula o se devuelve una venta con cliente. Entra: nada: cuentan todas las fichas que siguen en la lista, no solo las que deja ver la búsqueda o los filtros de la tabla. Sale: nada; solo lectura. Si falla: «No se pudieron cargar las cifras» en su sitio, y la tabla sigue funcionando. Mientras llegan, cada cifra enseña «…». En el móvil van de dos en dos, para que la tabla se siga viendo debajo. Implicados: ninguno

CUSTOMER-F32 Apuntar alergias o la prueba de sensibilidad con su permiso

Estado: hecho Vertical: peluquería Actor: todos los que gestionan fichas (verlo: todos) Pantalla: Ficha de cliente Pasos: 1. En la ficha, el bloque «Salud y alergias» dice «Para apuntar alergias o pruebas de sensibilidad hace falta su permiso expreso.» y enseña Pedir permiso. 2. Púlsalo: sale la frase «Doy mi permiso para que este negocio guarde mis alergias y mis pruebas de sensibilidad para atenderme con seguridad. Puedo retirarlo cuando quiera y entonces se borrarán.» con la indicación «Léelo en voz alta y pulsa solo si dice que sí. Esta frase exacta es la que queda guardada como prueba, junto a tu nombre y la hora.». 3. Si dice que sí, pulsa Ha dicho que sí: sale «Permiso registrado.» y el bloque enseña sus datos de salud (al principio, «Sin alergias apuntadas.» y «Sin prueba de sensibilidad.»). 4. Pulsa Editar: «Alergias y sensibilidades», «Fecha de la prueba de sensibilidad» y «Resultado» («Sin resultado», «Negativa» o «Positiva»). Guardar → «Datos de salud guardados.». 5. Con alergias apuntadas, el bloque las enseña destacadas, como aviso, para que quien atienda las vea antes del servicio. 6. Retirar permiso pregunta «¿Retirar el permiso? Se borran sus alergias y su prueba de sensibilidad.» y, al confirmar, sale «Permiso retirado y datos de salud borrados.». Entra: la frase exacta y su versión (quién lo apunta sale de la sesión); las alergias (hasta 2.000 caracteres), la fecha de la prueba y su resultado. Sale: el permiso, como un hecho más del libro de consentimientos (finalidad «datos de salud», con su entrada en la «Actividad» y su aviso customer.health.consent_granted o customer.health.consent_withdrawn), y los datos de salud, con «Datos de salud actualizados» en la actividad (sin su contenido) y el aviso customer.health.updated. Los avisos solo llevan identificadores. Retirar el permiso BORRA los datos de salud en el mismo paso. Si falla: sin el permiso en vigor no se guarda nada: «Registra antes su permiso para guardar datos de salud.». Una prueba con fecha futura: «Esta fecha está en el futuro.»; un resultado sin fecha: «Pon la fecha de la prueba.». «Este cliente ya no está disponible.» si la ficha ya no está. Quien no gestiona fichas ve el bloque sin botones. Implicados: CUSTOMER-F13, CUSTOMER-F16

Qué comparten los verticales

Tocar una pieza de esta tabla afecta a la peluquería y al restaurante.

Pieza compartida Flujos que la usan
Un solo formulario de ficha para el alta y la edición F01, F04, F11
La lectura del teléfono (las mismas reglas al guardar y al buscar por número) F01, F04, F08, F10, F11, F18, F26
La búsqueda de texto de la lista (tabla, fusión, TPV y selector de Citas) F02, F13, F17, F18, F25
El aviso de ficha creada o actualizada, que escucha WhatsApp F01, F04, F08, F18, F26
La fusión y su aviso F13
El borrado de datos y su aviso, y la eliminación F07, F16
El buscador del TPV, la copia fiscal y el historial de compras F17, F18, F19, F20, F21, F23
El consentimiento por canal F14, F15
Grupos, etiquetas y campos personalizados F06, F27, F28, F29

Lo que no se comparte: crear la ficha de quien escribe por WhatsApp (solo la peluquería, F26), el historial de visitas en la ficha (solo Citas, F24) y el alta desde la agenda (F25).

Servicios: lo que entra y lo que sale

Todo se puede pedir por las pantallas, el asistente (por voz o por texto, con la sesión de quien lo usa) y la API, con las mismas reglas y los mismos permisos. Las listas van por páginas de hasta 100 y todas tienen buscador. Para hablar con naturalidad, un cliente se puede nombrar por su id o por su nombre exacto, su teléfono o su email («añade una nota a Ana García»), y un grupo, una etiqueta o un campo, por su nombre; si dos fichas encajan, se pide el id, el teléfono o el email.

Lo que ofrece: consultas (leen, no cambian nada)

Qué da Quién puede Flujos En vivo Servicio
Las fichas, con búsqueda, filtros, orden y páginas ver F02, F17 sí customer.customer.list
La ficha completa, con grupos, etiquetas, campos y consentimiento por canal ver F03, F30 sí customer.customer.detail
Las cifras: clientes, activos, VIP e ingresos ver F02, F31 sí customer.customer.stats
Las fichas que llevan un número de teléfono ver F10, F12, F18 no customer.customer.by_phone
El CSV de todas las fichas que cumplen la búsqueda exportar F09 no customer.customer.export
Los grupos, con cuántas fichas tiene cada uno ver F06, F27 sí customer.group.list
Las etiquetas, con cuántas fichas tiene cada una ver F06, F28 sí customer.tag.list
Los campos personalizados ver F04, F29 sí customer.field.list
La actividad de una ficha, más reciente primero ver F03, F05 sí customer.activity.list
Las compras de una ficha ver F23 sí customer.purchase.list
Las fichas cuyas cifras no cuadran con sus compras (auditoría) ver F20, F21 sí customer.purchase.divergences
El consentimiento en vigor de una ficha, por finalidad y canal (también para las API keys) ver F14, F15 sí customer.consent.state
Todo lo que se decidió sobre el consentimiento de una ficha ver F14, F15 sí customer.consent.history
Qué cliente tiene un pedido ver F17, F19 sí customer.order.customer
Los pedidos de una ficha (también para las API keys) ver F19 sí customer.order.list
Los datos de salud de una ficha y su permiso (solo en pantalla) ver F32 sí customer.health.detail

Lo que ofrece: acciones (cambian datos)

Qué hace Quién puede Flujos Servicio
Da de alta una ficha gestionar F01, F18, F25, F26 customer.customer.create
Cambia la ficha (solo lo enviado) y sus campos personalizados gestionar F04 customer.customer.update
Crea hasta 50 fichas de un CSV, fila a fila gestionar F08 customer.customer.import
Sustituye los grupos de una ficha gestionar F06 customer.customer.set_groups
Sustituye las etiquetas de una ficha gestionar F06 customer.customer.set_tags
Elimina una ficha (conserva sus datos) eliminar F07 customer.customer.delete
Une una ficha duplicada en otra unir F13 customer.customer.merge
Borra los datos personales de una ficha borrar datos F16 customer.customer.erase
Añade una nota gestionar F05 customer.note.add
Anota en la actividad una entrada de otra app (una visita, una reserva) anotar actividad F24 customer.activity.add
Registra un consentimiento dado gestionar F14 customer.consent.grant
Registra un consentimiento retirado gestionar F15 customer.consent.withdraw
Enlaza (o desenlaza) el cliente de un pedido gestionar F19 customer.order.link
Registra el permiso para guardar datos de salud gestionar F32 customer.health.grant
Retira ese permiso y borra los datos de salud gestionar F32 customer.health.withdraw
Guarda las alergias y la prueba de sensibilidad (con el permiso en vigor) gestionar F32 customer.health.update
Crea y cambia grupos; los elimina configurar; eliminar F27 customer.group.create, .update; .delete
Crea y cambia etiquetas; las elimina configurar; eliminar F28 customer.tag.create, .update; .delete
Crea, cambia y elimina campos personalizados configurar F29 customer.field.create, .update, .delete
Apunta la compra de una venta cobrada (solo el sistema) sistema F20 customer.purchase.record
Resta la compra de una venta anulada (solo el sistema) sistema F21 customer.purchase.void
Apunta una devolución y la resta del gastado (solo el sistema) sistema F22 customer.purchase.refund

Lo que avisa (para las apps que quieran reaccionar)

Los avisos llevan solo identificadores, nunca datos personales: quien necesite la ficha la pide (CUSTOMER-F30).

Aviso Cuándo Qué lleva Servicio
Ficha creada Alta, alta rápida, WhatsApp e importación (uno por fila) id customer.customer.created
Ficha actualizada Editar con algún cambio id customer.customer.updated
Grupos cambiados Guardar grupos con algún cambio id customer.customer.groups_changed
Etiquetas cambiadas Guardar etiquetas con algún cambio id customer.customer.tags_changed
Ficha eliminada Eliminar (también la repetición) id customer.customer.deleted
Fichas unidas Fusionar id (la que se queda) y absorbed_id customer.customer.merged
Datos personales borrados Borrar datos (también la repetición) id customer.customer.erased
Nota añadida Añadir nota id (la nota) y customer_id customer.note.added
Actividad anotada por otra app Anotar actividad id (la entrada) y customer_id customer.activity.recorded
Consentimiento dado / retirado Registrar / retirar id, customer_id y channel customer.consent.granted, customer.consent.withdrawn
Pedido enlazado / desenlazado Enlazar con otro cliente / soltarlo order_id y customer_id customer.order.linked, customer.order.unlinked
Compra apuntada / anulada Venta cobrada / anulada customer_id y sale_id customer.purchase.recorded, customer.purchase.voided
Devolución apuntada Venta devuelta (toda o parte) customer_id, sale_id y refund_id customer.purchase.refunded
Grupo, etiqueta o campo creado, cambiado o eliminado Configurar id customer.group.*, customer.tag.*, customer.field.*
Permiso de datos de salud dado / retirado Registrar / retirar id (el hecho) y customer_id customer.health.consent_granted, customer.health.consent_withdrawn
Datos de salud guardados Guardar con algún cambio id y customer_id customer.health.updated

A qué reacciona (avisos de otras apps)

Aviso De Qué hace Servicio
Venta cobrada (sale.sale.completed) Venta Apunta la compra (CUSTOMER-F20) customer.purchase.record
Venta anulada (sale.sale.voided) Venta Resta la compra (CUSTOMER-F21) customer.purchase.void
Venta devuelta (sale.sale.refunded) Venta Apunta la devolución y la resta del gastado (CUSTOMER-F22) customer.purchase.refund

Las tres reacciones son de Clientes (como las de Inventario) y están probadas con los avisos reales de Venta; las ejecuta el sistema, cada una en su transacción, cuando el relay del outbox reparta los avisos entre apps (fase 2). Clientes no depende de Venta: es el único enlace.

Lo que necesita de otras apps

Nada para funcionar. Con Venta se usan el buscador del TPV, el enlace al pedido y las compras; con Citas, el bloque de visitas y el alta desde la agenda; con la Bandeja de WhatsApp, el reconocimiento por número y el alta automática. Ninguna de esas apps es requisito de Clientes: son ellas las que usan los servicios de Clientes.

Quién puede qué

Permiso Propietario Administrador Responsable Empleado Servicio
Ver fichas, grupos, etiquetas, campos, actividad, compras y consentimientos sí sí sí sí customer.view
Dar de alta, editar, importar, añadir notas, asignar grupos y etiquetas, registrar el consentimiento y enlazar pedidos sí sí sí sí customer.manage
Crear y cambiar grupos, etiquetas y campos personalizados; eliminar campos sí sí sí no customer.configure
Unir fichas duplicadas sí sí sí no customer.merge
Exportar a CSV sí sí sí no customer.export
Anotar en la actividad lo que traen otras apps sí sí sí no customer.record_activity
Eliminar fichas, grupos y etiquetas sí sí no no customer.delete
Borrar datos personales sí sí no no customer.erase

Apuntar y anular compras no es de ningún papel: lo hace el sistema al cobrarse o anularse una venta (customer.record_purchase, que ninguna app declara y por eso solo tiene el sistema).

El servidor aplica estos permisos aunque la pantalla enseñe el botón, también por la API y el asistente. Lo que en el producto actual tenía el perfil «Cajero» lo tiene aquí el empleado.