Lalabase
티켓·문서·근무시간·고객대화를 한 곳에 모아 KI로 검색, 소프트웨어 기업 고객 프로젝트용, 오픈소스로 자체 서버·독일 클라우드에 배포
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
CRM para el equipo de ventas del hotel: cartera de clientes, bitácora de actividad y generación de cartas-convenio con firma digital. Es un solo archivo HTML: no hay que instalar nada ni levantar un servidor — se abre con doble clic en cualquier navegador.README 전문 보기 ↗
CRM para el equipo de ventas del hotel: cartera de clientes, bitácora de actividad y generación de cartas-convenio con firma digital. Es un solo archivo HTML: no hay que instalar nada ni levantar un servidor — se abre con doble clic en cualquier navegador.
El código es público; los datos no. Este repositorio se abrió para poder publicar la aplicación automáticamente. La cartera —clientes, actividades, convenios firmados, huéspedes y tarifas pactadas— vive en Supabase, detrás de cuentas con contraseña, y nunca toca este repositorio. Aquí no hay llaves ni contraseñas, y todos los datos de ejemplo son inventados. Está hecho a la medida de Quartz Hotel & Spa, así que a otro hotel le servirá de punto de partida, no de producto terminado.
Morado #39104e, oro #b2aa6d y blanco. El logotipo —hexágono con seis flechas que
convergen en el núcleo— va dibujado como SVG en línea, no como imagen incrustada: se ve
nítido a cualquier tamaño, cambia de tono con el tema y pesa unos cientos de bytes. El
favicon usa la misma geometría sin las puntas de flecha, que a 16 px no se resuelven.
Los tres estados que cargan significado se derivan de esa paleta para no perder la lectura: Ganado en oro, pendiente en bronce y perdido/error en un rojo apagado. El embudo es una rampa de morado que se cierra hacia la venta. Los chips de estatus van sólidos con su propia tinta, para que se lean igual en tema claro y oscuro.
El verde de WhatsApp se respeta: es marca de un tercero y funciona como señal. Sus botones
llevan el glifo de WhatsApp en vez de la palabra —identifica el destino mejor y ocupa la
mitad— con title y aria-label para que sigan teniendo nombre accesible.
La carta-convenio toma los colores (membrete con regla dorada, encabezados de tabla en morado, viñetas con filete de oro) pero no lleva el logotipo de CORE: es un documento del hotel, no del CRM.
Al abrir el CRM se muestra durante dos segundos una animación del logotipo: el hexágono se traza, las seis flechas convergen en el núcleo, aparece la palabra CORE y al final el propio logo vuela hasta el botón de inicio del encabezado, que es el mismo logo, tiñéndose de sus colores en el camino. El del encabezado se esconde mientras tanto, así que el relevo entre uno y otro no se nota: la entrada termina siendo una transición y no una interrupción.
Está hecha con CSS y SVG, no con video: pesa unos cientos de bytes en vez de varios megabytes, se ve nítida en cualquier pantalla y no reproduce sonido.
Tres detalles pensados para que nunca estorbe:
pointer-events:none, así que no bloquea nada aunque coincida con un clic.index.html en Chrome, Edge, Firefox o Safari.Los datos se guardan en el almacenamiento local del navegador (localStorage), en el
equipo donde lo abres. Trae clientes de ejemplo para que se entienda el funcionamiento;
para empezar limpio usa Exportar → Borrar todos los datos, o marca "Reemplazar la
cartera actual" al importar tu archivo.
En operación, el CRM vive en https://core-quartz.vercel.app y los datos en Supabase. Para montarlo desde cero —o para entender cómo está armado— sigue NUBE.md: son unos 20 minutos, una sola vez, y no cuesta nada para este tamaño de equipo.
Son tres cosas encadenadas: un cliente tiene muchas actividades y muchos convenios.
Cada cliente guarda empresa, contacto, teléfono, correo, ubicación, tarifa, ejecutivo de venta, estatus y notas. Se ven de dos formas:
‹ › de cada tarjeta hacen lo mismo. El logotipo CORE del encabezado funciona
como botón de inicio: desde cualquier pestaña regresa aquí.El embudo tiene seis estatus: Contactado → Propuesta → Negociación → Cotización enviada → Ganado / Perdido. Los dos últimos pasos los mueve el convenio solo (ver abajo).
La misma cartera, dos lecturas. Ventas y banquetes comparten los clientes, pero no la información que les sirve de ellos. Las columnas Estatus, Tarifa y Ejecutivo son de hospedaje; en el apartado de banquetes esas tres dicen lo suyo:
| En ventas | En banquetes |
|---|---|
| Estatus del convenio | Estatus de banquetes, su propio embudo |
| Tarifa negociada | Vendido: la suma de sus eventos confirmados |
| Ejecutivo de ventas | Ejecutivo de banquetes |
Un cliente que nadie de banquetes ha tratado sale con guiones en las tres: ésa es la respuesta a «¿ya le habló alguien?». La columna de ejecutivo se llena sola en cuanto alguien de banquetes le guarda una cotización o un contrato, y no se la quita la siguiente persona que le cotice. El tablero de banquetes abre con una columna de más, Sin tratar, para los que todavía no tiene nadie; arrastrar ahí una tarjeta mueve el embudo de banquetes y no toca el de ventas.
Cada quien edita lo suyo: la ficha, abierta desde banquetes, no pide tarifa ni estatus ni ejecutivo de ventas, y guardarla no se los borra.
Hay un acceso directo a WhatsApp en la tarjeta, en la tabla y en la ficha, que abre el chat con el número registrado y un saludo ya redactado. A los números de 10 dígitos les antepone la lada del país (configurable, México por omisión).
Dentro de cada cliente, la pestaña Actividad lleva la bitácora. No hay límite de registros por cliente. Cada uno lleva:
La tarjeta del tablero muestra el conteo y la última actividad. Los hitos del convenio se registran solos en esta bitácora.
Las actividades viven en la ficha de cada cliente, pero para saber qué hizo alguien en la semana había que abrir cliente por cliente. La pestaña Actividades las junta todas y las mira desde el otro lado: por quien las hizo.
Arriba, un resumen con una fila por ejecutivo: cuántas llamadas, reuniones, correos y WhatsApp lleva en el periodo, el total, y cuándo fue la última. Debajo, el detalle renglón por renglón, de lo más reciente a lo más viejo.
Se filtra por periodo (hoy, 7 días, 30 días, este mes, todo, o entre dos fechas), por ejecutivo y por tipo; los filtros se acumulan. El buscador de arriba también alcanza aquí, y busca dentro del asunto y de las notas.
Un detalle a propósito: el filtro de ejecutivo de la barra superior se esconde en esta vista. Ese filtra por el ejecutivo asignado al cliente, y aquí lo que importa es quién hizo la actividad — que no siempre son la misma persona. Mezclarlos daría números que parecen correctos y no lo son.
Al hacer clic en un renglón se abre la actividad para editarla. + Registrar actividad deja capturar sin entrar a la ficha del cliente: primero pregunta con cuál es. Y Exportar CSV saca exactamente lo que esté filtrado a la vista, no toda la bitácora.
Un convenio se arma eligiendo el cliente y marcando las habitaciones que entran:
No se puede guardar ni firmar hasta que se cumplan las tres reglas. Lo que falte se enumera arriba del formulario y las filas incompletas se marcan en rojo:
Cada paso deja constancia en la bitácora del cliente.
Copiar el enlace cuenta como enviarlo. La columna Enviado se marcaba sólo si se usaba uno de los dos botones de adentro —correo o WhatsApp—, así que el caso más común quedaba mintiendo: el ejecutivo copia el enlace, se lo manda al cliente por donde quiera, y la lista seguía diciendo Sin enviar. A partir de que se copia, el enlace anda fuera del hotel; eso es haberlo mandado, y así queda apuntado —con la fecha, con quién, y en la bitácora del cliente—.
firmas.sql.Los tres pasan por la misma función a propósito: si cada camino cerrara el convenio a su manera, el tablero acabaría diciendo una cosa y la carta otra.
El cliente no tiene cuenta ni tiene por qué tenerla. El enlace lleva una clave larga y al azar, y esa clave es lo único que abre ese convenio y ningún otro. Al abrirlo, la aplicación se convierte en su documento: no enseña tablero, ni cartera, ni pestañas.
Al cliente no se le pide nada más que firmar. Antes la pantalla le exigía escribir su nombre completo —sin eso el botón no dejaba pasar— y le enseñaba dos campos más vacíos. Pero el hotel ya tiene esos datos: los capturó su ejecutivo en el destinatario. Ahora el cliente ve un renglón con de quién es la firma que está dando —Firma como Juan Pérez · 664 000 0000— y, si algo está mal, le pica a Corregir y los campos aparecen ya llenos. Nada es obligatorio salvo el trazo. Si el documento no va dirigido a nadie —una orden de trabajo— los campos salen a la vista y se puede firmar igual.
Si al servidor le falta el buzón, el aviso trae un botón Arreglar esto que copia
firmas.sql completo del propio servidor del CRM y, al terminar, verifica ahí mismo. El aviso
desaparece solo en cuanto el archivo esté corrido, sin recargar.
Y para que no llegue a fallar: no se reparte un enlace que no va a funcionar. Antes de ofrecerle el enlace al ejecutivo, el CRM le pregunta al servidor si el buzón de firmas está montado. Si no lo está, el enlace no se ofrece y se le dice por qué, en su pantalla, que es quien puede hacer algo al respecto. Esto existe porque pasó al revés: un cliente recibió un enlace que nunca pudo funcionar, y nadie se enteró hasta que él se topó con el error.
Si aun así algo falla del lado del servidor, al cliente se le avisa pero no se le encarga nada: no ve el error de la base de datos, no ve nombres de archivos y no se le pide que llame al hotel. Quien tiene que enterarse es el hotel, y para eso está el renglón del buzón de firmas en Ajustes → Nube y equipo → Probar conexión.
El convenio se le enseña como papel: tinta oscura sobre blanco, traiga su teléfono el tema que traiga. Y el destinatario va congelado dentro del propio convenio, junto con las tarifas y los textos: la carta que ve el cliente no depende de que nadie ande editando su ficha mientras tanto.
La firma no se escribe encima del convenio. El visitante la deja en un buzón aparte donde puede depositar pero no leer ni corregir, y de ahí la levanta el CRM en la siguiente sincronización. Así, aunque alguien anduviera de mirón, no podría leer convenios ajenos ni alterar el suyo. La clave deja de servir en cuanto se firma.
Todo esto lo habilita firmas.sql. Sin correrlo, el CRM funciona igual: el enlace no se
ofrece y quedan los otros dos caminos.
Se arma solo: CV-2027-003. El año sale de la vigencia, no de la fecha de hoy —un convenio
que se captura en diciembre para el año que entra lleva el año que entra—, así que al cambiar
Vigencia desde a otro año el folio se acomoda mientras nadie lo haya escrito a mano.
El consecutivo se cuenta por año, y sale del folio más alto que ya exista para ese año, no
de cuántos convenios haya en total: contar el total repetía folios en cuanto se borraba uno, y
hacía que enero arrancara donde se quedó diciembre. Un año sin convenios empieza en 001.
Se decide al guardar, no al abrir el editor: entre que alguien lo abre y le da guardar pueden pasar minutos, y en ese rato otro pudo haber tomado el número.
Dos ejecutivos capturando a la vez, cada uno en su equipo, pueden tomar el mismo folio: cada quien cuenta con lo que tiene bajado y ninguno ve todavía el convenio del otro. Se detecta al sincronizar, segundos después, y se resuelve solo: el que se creó primero conserva su folio y el otro toma el siguiente libre, con constancia en la bitácora del cliente.
Con una excepción deliberada: un convenio ya firmado o ya enviado no se renumera por detrás. Su folio va impreso en un PDF que anda en el correo de un cliente, y cambiárselo a escondidas sería peor que el problema. Esos se marcan como repetido en la lista, con un aviso arriba, para que una persona decida qué folio lleva cada uno.
La columna Habitaciones enseña las claves del convenio —STKN, GDDO, CARE— y no
cuántas son: un número no dice nada de un vistazo, y la clave es la que usa el equipo a
diario. Las de Recovery van en dorado, que es lo que antes decía el "+R". Al pasar el cursor
salen los nombres completos, para quien no se las sepa de memoria.
Cuando un cliente firma, aparece un aviso en el encabezado del CRM: «Grupo Marín firmó el convenio CV-2026-002». Se apaga al abrir la carta — ya la está viendo. Sólo le sale a quien le toca: el ejecutivo dueño del cliente, la gerencia y el administrador.
Por correo no. Una página web no puede mandar correos por sí sola; hace falta un servicio de envío. Queda pendiente y está anotado al final.
Límite que conviene tener claro: el CRM no manda el correo ni el mensaje por sí solo: abre el tuyo con todo redactado y tú le das enviar. Y el aviso de que el cliente firmó sale dentro del CRM, no por correo.
El documento reproduce el machote del hotel: encabezado con nombre, dirección y teléfono; línea de fecha con ciudad; domicilio del destinatario; párrafo de presentación; tablas de tarifas por bloque (Deluxe y Recovery) con lo que incluye cada habitación; el bloque Surgery Recovery a dos columnas; ESPECIFICACIONES DE TARIFAS; VALORES AGREGADOS y NUESTROS SERVICIOS; CONDICIONES; RESERVACIONES; POLÍTICAS de garantía, pago y cancelación; y los dos bloques de firma (De conformidad Hotel y De conformidad Empresa) con Nombre, Puesto, Fecha y Celular.
Lleva membrete y marca de agua: el logotipo (o el monograma Q, redibujado en SVG) arriba, y la marca al fondo de la primera hoja. La marca de agua va como elemento, no como fondo CSS, para que también salga al imprimir.
El logotipo no se congela en los convenios firmados, a diferencia de las tarifas y los textos: es identidad del hotel, no una condición pactada, así que si cambia, las cartas viejas se reimprimen con el logotipo vigente.
Imprimir saca la carta sola, sin la interfaz, en tamaño carta (216 × 279 mm) con
márgenes de 16 × 18 mm. El tamaño se fija con una regla @page: sin ella lo decidía la
impresora de cada quien y el mismo documento podía salir en A4. Para cambiarlo, es una
palabra en el CSS (size: letter → size: A4).
Descargar PDF arma el archivo aquí mismo, sin pasar por el diálogo de impresión, y es el mismo que sale adjunto al enviarlo. La carta-convenio ocupa tres hojas y el navegador sólo sabe partirla al imprimir —no al dibujarla—, así que la paginación se hace a mano: se mide dónde termina cada bloque, se elige en cuál cortar sin partirlo a la mitad (y sin dejar un título solo al pie de una hoja), se dibuja el documento entero de una vez y esa tira se reparte en hojas. Los dos bloques de firma quedan juntos en la última. Cada confirmación de hospedaje cabe en una hoja y no necesita nada de esto.
Chrome imprime por su cuenta la URL del archivo, la fecha y el número de página. No es parte del documento: aparece siempre que la hoja tenga margen.
En las confirmaciones ya no sale: la hoja se manda con margen cero y los márgenes los pone el contenido, así que el navegador no encuentra sitio donde escribirlos.
En el convenio no se puede hacer lo mismo, porque fluye en varias páginas y la segunda arrancaría pegada al borde del papel. Ahí se apaga desde el diálogo de impresión: Más ajustes → Encabezados y pies de página. Chrome recuerda la casilla.
{{HOTEL}}, {{EMPRESA}},
{{CONTACTO}}, {{VIGENCIA}} y {{ANIO}} que se sustituyen al generar cada carta.Un convenio guarda su propia copia de los textos y de las tarifas al crearse, así que cambiar el catálogo o los textos no altera los convenios ya emitidos. Al reabrir un borrador, las tarifas que ya se habían negociado se reconocen por identificador y por clave (STKN, GDDB…): así, si alguna vez se borra un tipo de habitación y se vuelve a dar de alta, el trabajo de la negociación no se pierde.
En el convenio, el contrato, la cotización de banquetes, al subir un documento firmado y al registrar una actividad suelta, arriba de la lista de clientes hay un campo de búsqueda. Al teclear, la lista se acorta a lo que coincida en empresa o contacto —sin que estorben mayúsculas ni acentos: avila encuentra Textiles Ávila—, y si queda uno solo se escoge solo. Borrar la búsqueda devuelve la lista completa.
Pestaña Contratos. Cotiza una estancia concreta: estas fechas, estas habitaciones y, si lo hay, el salón del evento. No hay que confundirla con Convenios, que fija las tarifas de empresa de todo el año; son dos documentos distintos y cada uno vive en su pestaña.
El machote sale del que ventas traía en Word, sección por sección y en el mismo orden: membrete, fecha, título, destinatario, saludo, servicios cotizados, propuesta económica · hospedaje, salones y eventos, costos adicionales no incluidos, vigencia, forma de pago y el bloque de firmas.
CT-2026-001, que sigue al año de la fecha del documento.Igual que el convenio: al mandarlo, Copiar el enlace —o mandarlo por correo o WhatsApp— y el cliente lo abre, lo lee y lo firma con el dedo, sin instalar nada ni crear una cuenta. Cuando firma, el documento pasa a Aceptado solo y el CRM avisa.
El enlace sólo abre ese documento y deja de servir en cuanto se firma. Hace falta tener la
nube configurada —el enlace vive ahí— y haber corrido firmas.sql.
En Convenios y en Contratos hay un botón Subir uno firmado: registra un convenio, una cotización o un contrato que ya andaba firmado antes de usar el CRM, o que se hizo en Word como siempre.
Se pide el cliente, el ejecutivo —que sigue al del cliente—, el folio que traiga el papel, la fecha y el archivo escaneado (PDF o foto). No se vuelve a armar el documento: lo que vale es el escaneado, y por eso la ficha queda marcada como externa y al abrirla enseña el archivo en vez de una carta en blanco. En la lista lleva su etiqueta, para que nadie se pregunte por qué no tiene carta.
Un convenio externo cierra igual que uno firmado en pantalla: el cliente pasa a Ganado y queda su línea en la bitácora. Una cotización o un contrato externo caen en Contratos como Aceptados.
Con el almacén del proyecto montado —se corre archivos.sql una vez— el archivo va a un
depósito aparte de Supabase y del documento cuelga nada más la ruta. Caben hasta 20 MB por
archivo y 1 GB en total en el plan gratuito, y el navegador deja de cargar con ellos.
Sin montar, el escaneado se guarda dentro del propio documento. Así empezó, y funciona, pero el navegador corta cerca de los 5 MB: con tres o cuatro escaneados se llena y la aplicación avisa que ya no cabe. El límite por archivo baja entonces a 2 MB.
Si ya había escaneados guardados así, no hay que volver a subirlos: Ajustes → Nube y equipo → Mover los escaneados al almacén los muda de uno en uno y libera el navegador de todo el equipo. Si se corta a la mitad, lo que ya subió quedó bien y volver a darle continúa donde se quedó.
Banquetes no vende noches: vende eventos. Tiene sus propias pestañas —Eventos para las cotizaciones, Contratos banquetes para el legal— con su estructura y sus cuentas: IVA del 8% para todo y cargo por servicio del 15% sólo en los renglones de alimentos y bebidas, que se marcan uno por uno.
El Calendario muestra el mes con los eventos y las actividades agendadas del equipo, y los Reportes dan el ingreso cerrado y el que sigue en la mesa, por área, por ejecutivo y por mes, contando cada documento en el mes en que ocurre el evento.
Todo eso lo ven las cuatro cuentas del departamento y la del administrador, y nadie más: ventas —gerencia incluida— no ve las pestañas de banquetes, ni sus eventos en el calendario, ni su dinero en los reportes. Del otro lado, banquetes comparte la cartera de clientes con ventas pero no ve los convenios ni los contratos de hospedaje. Hay dos papeles: gerencia de banquetes, que alcanza lo de todo su equipo, y ejecutivo de banquetes, que alcanza lo suyo. Quién es quién, y los datos legales que hay que capturar antes del primer contrato, en BANQUETES.md.
En Nueva cotización la lista de Ejecutivo de banquetes ofrece sólo a los de banquetes: la gerencia y las ejecutivas, sin la dirección ni la administración, que alcanzan el área pero no llevan eventos. Una cotización vieja que traiga un nombre de otra área no lo pierde: se conserva marcado · de otra área, porque perderlo callando sería peor.
Pestaña Formulario. Para levantar contactos en una expo, una feria o un evento del hotel, de pie y con prisa.
Existe un papel de usuario, Sólo prospección, que no ve más que esta pestaña: es el de la cuenta de la tableta del lobby. Ver ROLES.md.
El botón Abrir modo tableta deja la pantalla completa con nada más el formulario, para entregarle el aparato al cliente y que se registre él mismo.
Su propio departamento, con sus cuentas y sus pestañas. Marketing no alcanza la cartera —se decidió así—: ve sus campañas, sus ligas y los prospectos, y nada más.
El dinero del tablero lo suma el servidor y entrega cuentas, no renglones: ni un contrato baja a esas computadoras. Y mientras una campaña tenga menos de tres cierres, el monto se reserva, porque con uno solo la cifra señalaría al cliente de ese contrato.
El detalle —quién entra, qué se corre en Supabase y qué falta— está en MARKETING.md.
Pestaña Confirmaciones. Genera la carta que acredita la reservación de un huésped ante terceros (visas, empresas, aseguradoras).
.xlsx —el archivo tal cual, sin convertir— o un CSV. El lector de Excel
está escrito a mano sobre DecompressionStream, que traen los navegadores modernos: un
.xlsx es un ZIP con XML dentro, así que no hace falta ninguna librería externa y el
archivo sigue siendo uno solo. Si el navegador no lo soporta, avisa y pide un CSV.04/09/2026 o 2026-09-04.Cada renglón trae una columna Envío: Sin enviar, o un sello verde con por dónde salió
y cuándo (✓ correo · 08 sep 2026). Al pasar el cursor dice la hora exacta y desde qué
cuenta se mandó. Arriba va la cuenta —2 de 4 enviadas— y un botón Sólo pendientes, que
es lo que se usa cuando llegan cuarenta huéspedes de golpe: filtra la lista y Imprimir todas
pasa a imprimir nada más las que faltan.
Con las casillas de la izquierda se marcan varias de un jalón: útil al estrenar el indicador, cuando todo lo mandado antes aparece como pendiente y corregirlo uno por uno es media tarde. Pregunta qué día se enviaron en vez de poner la de hoy: el envío fue otro día y una constancia con fecha falsa no sirve de nada.
La marca se pone sola al mandar la carta desde la aplicación. Descargar el PDF no cuenta como enviar, a propósito: bajar el archivo para revisarlo no es lo mismo que mandárselo al huésped.
Conviene tener claro qué significa el sello. La aplicación abre tu correo o WhatsApp, pero no alcanza a ver si de verdad le diste enviar — nada en el navegador se lo permite. Así que el sello dice "de aquí salió la carta", no "el huésped ya la tiene". Por eso se puede corregir a mano: abre la ficha del huésped y ahí está el botón para marcarla o desmarcarla. Con la nube conectada, la marca la ven todos, así que dos ejecutivos no le mandan la misma carta al mismo huésped.
Ni mailto: ni el enlace de WhatsApp admiten adjuntos: esos protocolos sólo transportan
texto, y ninguna página web puede saltárselo. Para poder mandar el archivo hay que tener un
PDF de verdad hecho en el navegador, así que el CRM lo genera solo: rasteriza la hoja tal como
se ve —vía un foreignObject de SVG, sin librerías— y envuelve esa imagen en un PDF mínimo
escrito a mano. Es fiel al documento impreso porque es el mismo render; a cambio, su texto no
es seleccionable.
Con el archivo en mano hay dos caminos, y el botón de envío elige el que corresponda:
Confirmacion-R-1201-Ana-Lopez-Ramirez.pdf) y se abre la app con el mensaje listo, para
adjuntarlo a mano.La carta-convenio usa exactamente la misma ruta, con la paginación descrita arriba: el
archivo sale como Convenio-CV-2026-001-CLINICA-DEL-VALLE.pdf y el envío queda anotado en la
bitácora del cliente.
También se puede capturar un huésped a mano.
Botón Importar. Acepta un .csv / .tsv o texto pegado. Si tus datos están en Excel o
Google Sheets, guárdalos como CSV (Archivo → Descargar → CSV).
,, ; o tabulador) y respeta las comillas.$2,950.00, 3.100, 89500,75, (1,200).En plantilla.csv está el formato exacto.
Abajo a la derecha hay un botón redondo. Abre un recuadro donde se le puede preguntar en español sobre la cartera —a quién le hablo primero hoy, qué convenios están a medio firmar, escríbeme un correo de seguimiento— y contesta sobre lo que esa persona ya ve: a un ejecutivo, con su cartera; a gerencia, con la de todo el equipo.
Usa Google Gemini, que tiene capa gratuita. Hace falta montarlo una vez: la llave de
Google no puede vivir en index.html, que es una página pública, así que se queda en
Supabase y ahí corre la función supabase/functions/ia, la única que habla con Google.
Mientras no esté montada, el botón lo explica en vez de fallar. Los pasos, lo que se manda y
lo que no, y cómo apagarlo están en IA.md.
Siete papeles: administrador (todo, y el único con Ajustes), dirección (todo el hotel, de todo el equipo, sin Ajustes), gerencia de ventas (la cartera y la actividad de todo el equipo, sin Ajustes), ejecutivo de ventas (sólo lo suyo, más las actividades que él mismo hizo), gerencia de banquetes (los eventos y contratos de todo su equipo), ejecutivo de banquetes (nada más los suyos) y sólo prospección (nada más la pestaña Formulario y lo que esa cuenta capturó). Se administran en Ajustes → Usuarios y permisos.
Ventas y banquetes no se ven los papeles del otro: ventas no alcanza los eventos ni los contratos de banquetes —ni en el calendario ni en los reportes—, y banquetes no alcanza los convenios ni los contratos de hospedaje. La cartera de clientes sí es una sola.
Quien alcanza los dos departamentos —la dirección y la administración— escoge en cuál entra en una pantalla que sale al abrir, y se cambia de uno a otro con el botón del encabezado, sin volver a entrar. Agregar un departamento más adelante son dos renglones de configuración; el detalle está en ROLES.md.
Lo que amarra a una persona con su cartera es el nombre, no el correo: se compara contra el campo Ejecutivo de cada cliente. Escribirlos distinto es el error más fácil de cometer y el más difícil de ver.
En banquetes la regla es otra, y es más abierta a propósito: cada ejecutiva ve los clientes que trae a su nombre en la columna de banquetes, más los que nadie de banquetes ha tomado —para que pueda levantar uno sin esperar a que se lo pasen—. Los que ya lleva una compañera no le salen; la gerencia de banquetes los sigue viendo todos. Y nadie pierde nada: los clientes que una ejecutiva veía por el campo de ventas los sigue viendo igual.
Los permisos van en dos niveles y conviene no confundirlos: lo configurado en Ajustes acomoda
lo que cada quien ve en pantalla, pero los datos siguen bajando completos a cada equipo.
Para que el servidor mismo niegue la cartera ajena hay que correr roles.sql. Todo el
detalle, los pasos y cómo deshacerlo están en ROLES.md.
Si alguien deja de ver algo que le tocaba, el chip con su nombre —arriba a la derecha— abre ¿Por qué no veo algo?: dice cuántos registros de cada tipo le está entregando el servidor, nombra la causa cuando la hay y trae un Volver a bajar todo. Lo alcanza cualquiera, no sólo el administrador.
Ese mismo chip dice siempre en qué estado está el aparato. Cuando marca Sólo este equipo es que ese navegador no está conectado a la nube: lo que muestra es nada más lo capturado ahí, y nada de lo que se capture le llega al resto. Pasa sin querer, porque la conexión se guarda por navegador y por dirección —otro navegador del mismo aparato, o el modo privado, empiezan de cero—, y antes se veía igual que un equipo conectado pero vacío.
El CRM puede abrirse desde Core Quartz, el portal del hotel: una sola contraseña para el CRM y el CDH, y un solo lugar para dar de alta y de baja al personal. El portal manda un pase de un solo uso en la dirección y el CRM lo canjea para abrir su propia sesión, la misma de siempre.
No sustituye nada: la pantalla de acceso con correo y contraseña sigue
funcionando igual, y sin el portal el CRM se comporta como hoy. El enlace de
firma que se le manda al cliente (#firmar=…) tampoco cambia.
El paso a paso y lo que conviene saber para una computadora compartida están en NUBE.md → Entrar desde Core Quartz.
Sin configurar nada, cada computadora guarda lo suyo. En Ajustes → Nube y equipo se pega
la dirección y la llave pública de un proyecto de Supabase y a partir
de ahí todos trabajan sobre los mismos datos, cada quien con su correo y contraseña. El paso
a paso —crear el proyecto, correr nube.sql, dar de alta al equipo y dejar la aplicación en
una dirección de internet— está en NUBE.md.
Cómo se comporta, en corto:
# —esa parte no llega al servidor— y se borra de la barra
de direcciones al abrirla.La llave que se pega en Ajustes es la anon, pública por diseño: viaja dentro de la página
y por sí sola no abre nada, porque la tabla exige haber entrado con una cuenta del equipo
(row level security). La llave service_role no se usa aquí y no debe pegarse en ningún
lado. nube.sql deja además una bitácora (crm_bitacora) con quién cambió qué y cuándo.
Sin nube, los datos viven en el navegador: se pierden si borras el historial y la caché del sitio, y no se comparten entre computadoras. Con nube configurada siguen viviendo también ahí, pero el respaldo local sigue siendo la única copia que te llevas contigo. Usa Exportar seguido:
| Clave | Tipo | Bloque | Tarifa pública |
|---|---|---|---|
| STKN | Standard King | Deluxe | 5,300 |
| STQU | Standard Queen | Deluxe | 5,300 |
| STDB | Standard Double | Deluxe | 5,300 |
| GDKN | Garden King | Deluxe | 6,460 |
| GDDO | Garden Double | Deluxe | 6,460 |
| SUKN | Suite King | Deluxe | 5,300 |
| MSTR | Master Suite | Deluxe | 12,031 |
| PSDT | Presidencial | Deluxe | 14,601 |
| CARE | Care | Recovery | N/A |
Una cortesía con folio del hotel: una noche de hospedaje, un masaje, un facial, el temazcal o un consumo en el restaurante. Antes se hacían en un PowerPoint de 279 diapositivas —se duplicaba la última y se le cambiaban a mano el nombre, las fechas y el número—, y en ese archivo se ve lo que eso cuesta: folios repetidos, folios saltados, «31 DE DICIEMBRE 224», y las mismas condiciones redactadas de tres maneras distintas.
Aquí:
ROLES.md.La hoja es la única del CRM que va a sangre: la foto del servicio llega hasta la orilla. Las
fotos viven en certificados/ con el nombre de su tipo; mientras no estén, el certificado sale
con el fondo del hotel y su monograma.
Todas las empresas, personas, teléfonos y correos que trae el código son inventados, y los
dominios usan .example, que está reservado justo para esto y nunca va a existir. El
repositorio es público: ningún cliente real puede aparecer aquí. La cartera de verdad vive en
Supabase, y ni la dirección del proyecto ni las llaves están en el código — se capturan una
vez por equipo en Ajustes → Nube y equipo.
Las tarifas rack del catálogo sí son las del hotel, pero son públicas por definición: es lo que paga quien llega sin convenio. Las tarifas convenio, que sí son confidenciales, se pactan por cliente y viven en Supabase.