Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
Translation pending
Simula el ROI y genera cotizaciones de campañas de vacunación corporativa
Translation pending
AI summary · revised during review
BusinessTypeScript · JavaScriptGitHub @RicmonpaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Cotizador y Simulador de ROI · Grupo Leucotec Automatización del proceso de cotizar campañas de vacunación corporativa. El producto final es la cotización: un documento ultradetallado que el cliente firma. Hecho por N3 · Thinktech IA Laboratory Este repositorio es público. Antes de escribir una sola línea, lee Reglas de confidencialidad. Los costos de compra de Leucotec jamás pueden llegar al código, al bundle, a un comentario ni a un mensaje de commit.Read the full README ↗
Automatización del proceso de cotizar campañas de vacunación corporativa. El producto final es la cotización: un documento ultradetallado que el cliente firma.
Simulador · Cotizador para vendedores · Guía de venta
Hecho por N3 · Thinktech IA Laboratory
[!WARNING] Este repositorio es público. Antes de escribir una sola línea, lee Reglas de confidencialidad. Los costos de compra de Leucotec jamás pueden llegar al código, al bundle, a un comentario ni a un mensaje de commit.
Grupo Leucotec aplica campañas de vacunación dentro de empresas. Sus vendedores cotizan hoy con un Excel que armó Martin, el dueño, y que el equipo domina. Este proyecto automatiza ese proceso sin obligarlos a cambiar de herramienta.
El vendedor tiene dos puertas, y ambas terminan en la misma cotización impresa:
| Puerta | Para quién | Qué ofrece |
|---|---|---|
| Sheet de Martin (V10.4) | Vendedores que ya dominan el Excel | Su archivo de siempre, subido tal cual a Google Sheets, con un botón IMPRIMIR COTIZACION |
Cotizador en línea (/cotizador) | Vendedores en visita, desde el celular | Mismo orden y colores que el Excel, semáforo de margen, historial y botón de imprimir |
Y dos herramientas frente al cliente:
| Herramienta | Qué hace |
|---|---|
Propuesta de retorno (/propuesta) | El anexo de la cotización para un prospecto calificado. Recibe el mismo enlace (mismo folio, mismos renglones) y es de sólo lectura: su inversión es, al peso, el total de la cotización |
Simulador de ROI (/) | Versión editable para una fase posterior de captación de leads. Traduce la vacunación de "gasto médico" a "continuidad operativa": cuánto pierde la empresa por ausentismo, cuánto cuesta protegerse al año y cuál es el ahorro neto |
flowchart LR
subgraph Privado["🔒 Privado · detrás del login de Google"]
SM["Sheet de Martin<br/>(copia fiel V10.4)"]
SC["Sheet construido<br/>costos · historial · semáforo"]
end
subgraph Publico["🌐 Público · Vercel"]
CZ["/cotizador<br/>vendedores"]
CT["/cotizacion<br/>documento imprimible"]
PR["/propuesta<br/>retorno · sólo lectura"]
SIM["/<br/>simulador de ROI (leads)"]
end
SM -- "botón IMPRIMIR<br/>(solo precios de venta)" --> CT
CZ -- "Imprimir cotización" --> CT
CZ -- "producto, dosis, precio" --> SC
SC -- "OK / REVISAR<br/>(nunca el costo)" --> CZ
SM -- "VER RETORNO" --> PR
CZ -- "Ver retorno" --> PR
CT <-->|"mismo enlace,<br/>mismo folio"| PR
SIM -- "PDF cierra con<br/>la cotización" --> CT
La idea central: una sola cotización, varias puertas. Si cada puerta armara su propio documento, en un mes dejarían de coincidir. Cualquier renglón nuevo se agrega en un solo lugar (CotizacionDetallada.tsx) y aparece en todas.
Requisitos: Node 20 o superior.
npm install
npm run dev # http://localhost:5173
npm run build # typecheck + build de producción en ./dist
npm run preview # sirve el build localmente
npm run lint
npm test # motor de logística contra el Excel de Martin
Para probar la cotización impresa sin pasar por una hoja, abre /cotizacion?c=… con un enlace generado desde /cotizador (botón Imprimir cotización).
| Ruta | Componente | Registro previo | Audiencia |
|---|---|---|---|
/ | Simulator (vía EntradaSimulador) | ✅ nombre y correo | Prospectos y clientes |
/cotizador | Cotizador | — | Vendedores de Leucotec |
/cotizacion?c=… | PaginaCotizacion | — | Vendedores (lo imprimen para el cliente) |
/propuesta?c=… | PaginaPropuesta | — | Prospecto calificado (anexo de la cotización) |
/guia | public/guia/index.html | — | Guía de venta estática |
/n3 | public/n3/index.html | — | Diapositiva del mapa de herramientas |
El ruteo es deliberadamente mínimo: App.tsx lee window.location.pathname. No hay router; agrega uno sólo si las rutas crecen.
src/
├── App.tsx Ruteo por pathname y entrada del simulador
├── lib/
│ ├── calculations.ts ⚙️ Motor puro: ROI, amortización, logística multi-sede
│ ├── cotizacionImprimible.ts 📄 Modelo de la cotización + codificación del enlace
│ ├── propuestaRoi.ts 📈 Cotización → simulación de ROI que cuadra al peso
│ ├── cotizador.ts 📡 Envío al Sheet privado y lectura del semáforo
│ ├── enlaceCotizacion.ts 🔗 Enlace Sheet → simulador de ROI
│ ├── catalogoProductos.ts 💉 Productos y PRECIOS DE VENTA (nunca costos)
│ ├── insumosCatalogo.ts 🧤 Cantidades de insumos por dosis y manejo de RPBI
│ └── lead.ts 📝 Registro de prospectos del simulador
├── hooks/
│ ├── useRoiCalculator.ts Estado del simulador y catálogo de enfermedades
│ └── useCountUp.ts Animación de cifras con salvavidas de pestaña en segundo plano
└── components/
├── Cotizador.tsx /cotizador
├── PaginaCotizacion.tsx /cotizacion
├── PaginaPropuesta.tsx /propuesta (sólo lectura)
├── CotizacionDetallada.tsx El documento. Un solo lugar para todos los renglones
├── SedesCampana.tsx Captura de hasta 4 sedes (compartido)
├── ui/Field.tsx Campo numérico que nunca emite NaN
└── … Piezas del simulador (KPIs, gráfica, alertas)
apps-script/
├── cotizador-v10-4.gs Script de la copia fiel del Excel de Martin
└── cotizador.gs Porción "Cotizar" del Sheet construido desde cero
public/
├── guia/ n3/ Páginas estáticas
└── logo-leucotec.png
calcularLogistica en src/lib/calculations.ts reproduce su hoja. Si cambias una constante, el margen deja de cuadrar con su Excel.
| Concepto | Regla | Celda en su Excel |
|---|---|---|
| Enfermera por jornada | $600 local de 1 a 4 h · $800 local de más de 4 h · $801 foránea | G30 |
| Total enfermeras | tarifa × enfermeras por día × jornadas | J30 |
| Prueba COVID del equipo | $335, una vez por sede, no por jornada | H38 |
| Viáticos | transporte + comidas + prueba COVID | J38 |
| Insumos por dosis | $18.073, el promedio de sus tres escenarios de volumen. Ya incluye botes y servicio de RPBI | L38 → Insumos!B37 |
| Logística total | suma de las hasta 4 sedes | N42 |
Detalles que ya costaron bugs:
I5:I12; web: botón Cajas de 10). La caja multiplica dosis y costo por 10 y divide el precio, así que 2 cajas a $9,500 y 20 dosis a $950 dan el mismo importe, costo, insumos y semáforo. La cotización siempre sale en dosis.Es el ejercicio que Martin capturó en su propio archivo. Cualquier cambio al motor debe seguir dando esto:
| Entrada | Resultado esperado |
|---|---|
| 30 dosis de Fluzactal Tetra a $405 · sede LOCAL de 1 a 4 h · 1 enfermera · 1 jornada · transporte $800 · comidas $0 | enfermeras $600 · viáticos $1,135 · insumos $542.19 · logística $2,277.19 · precio $12,150 · semáforo ok |
Modelo determinista de valor esperado, defendible ante un CFO:
inversión × 53% × 30%.Todo supuesto es un parámetro editable: el vendedor debe poder justificarlo.
Este repo es público y todo lo que llega al navegador se puede inspeccionar. Estas reglas no se negocian:
src/, en apps-script/, en un comentario, en un ejemplo ni en un mensaje de commit.OK o REVISAR. Nunca el costo ni el porcentaje de margen. Por la misma razón que el punto 2./cotizacion?c=, enlace al ROI)..gitignore bloquea *.xlsx, *.xls, *.xlsm, *.xlsb, *.docx, *.doc y *.pdf. No lo aflojes.Martin les oculta los costos a sus propios vendedores. Respetamos esa decisión en cada herramienta.
Hay dos hojas privadas, cada una con su Apps Script. Pide acceso a Ricardo: sus IDs y enlaces no se publican aquí.
Su archivo convertido a Sheets sin reconstruir nada. De la fila 1 a la 42 es intocable; lo nuestro vive debajo:
COTIZACIONURL).ENLACEROI).Código fuente: apps-script/cotizador-v10-4.gs.
Tiene las pestañas Costos, Catalogo, Cotizaciones, Resumen y Config, y el receptor doPost que usa /cotizador para el semáforo y el historial.
| Tema | Detalle |
|---|---|
| Idioma de la hoja | Están en es-ES: las fórmulas separan argumentos con punto y coma. Con coma devuelven #ERROR! |
| Funciones personalizadas | Reciben como argumentos todas las celdas de las que dependen, aunque no las usen. Sin eso, Sheets no las recalcula y el vendedor imprime la cotización anterior |
| Protección | Bloqueo duro por identidad: sólo los correos de EDITORES tocan fórmulas, y los vendedores sólo las celdas verdes. Sheets no tiene contraseñas |
| Hojas ocultas | Ocultar no es un candado: cualquier editor las vuelve a mostrar. La protección impide escribir, no leer |
| Despliegue | Los scripts se pegan a mano en Extensiones → Apps Script. El .gs del repo es la fuente de verdad: mantenlos iguales |
| Convención de color | Verde fuerte = elegir de una lista · verde claro = escribir el valor · gris = se calcula solo. Viene del Excel de Martin y se respeta en /cotizador |
/cotizacion?c=<base64url>JSON codificado en base64 URL-safe. Se descartó un formato con separadores porque las descripciones del catálogo de Martin traen comas, dos puntos y acentos. Las llaves son cortas porque el enlace se arma dentro de una celda.
{
"f": "COT-20260913-1203", // folio
"c": "Grupo Ejemplo", // cliente
"e": 120, // plantilla
"l": [["Fluzactal Tetra", 30, 405]],// producto, dosis, precio de venta
"s": [["CDMX", 30, 0, 0, 1, 1, 800, 0]],
// destino, dosis, foránea(1/0), jornada larga(1/0),
// enfermeras/día, jornadas, transporte, comidas
"cl": 0, // cobrar logística (1/0)
"d": 1300 // costo de un día de ausencia (sólo lo usa /propuesta)
}
Modelo y codificación: src/lib/cotizacionImprimible.ts.
/propuesta?c=<base64url>El mismo parámetro c que la cotización. Para pasar de una a otra basta cambiar la ruta. src/lib/propuestaRoi.ts convierte la cotización en una simulación:
enfermedadDeProducto (sin distinguir acentos: la hoja escribe "solo A" y el catálogo "sólo A"). Los renglones de la misma enfermedad se juntan.% en riesgo = dosis / plantilla y precio = importe / dosis, para que el motor reconstruya exactamente las dosis y el importe. La plantilla nunca es menor a la mayor cantidad de dosis.resultado.inversionTotal contra el total de la cotización y avisa si no cuadran.d viene en 0 se usa la referencia de $1,300 y la página lo dice./?…?empresa=Grupo+Ejemplo&emp=400&dia=1300
&v=Vaxigrip Tetra:400:440,Prevenar 20:400:1800
&log=0
&sedes=CDMX:400:local:mas4:2:3:1500:0|Toluca:120:foranea:mas4:1:2:3000:450
Los enlaces del formato anterior, con una sola sede (dias, enf, via, sede, hrs), se siguen leyendo. Lógica en src/lib/enlaceCotizacion.ts.
main.vercel.json reescribe /guia y /n3 a sus páginas estáticas, y todo lo demás a index.html (SPA).leucotec.ia.potenttial.site.Compatibilidad: se usa Tailwind v3 a propósito, no v4. La v4 emite oklch y @property, que rompen en Chrome anterior a 111 y en Androids viejos, y los vendedores y clientes sí usan esos teléfonos. El browserslist es amplio por la misma razón.
npx tsc --noEmit -p tsconfig.app.json # tipos
npm run build # build limpio
dist/assets/*.js los costos de la hoja Costos (tómalos de la hoja, no los escribas en ningún archivo). Tiene que salir vacío./cotizador: logística $2,277.19 y precio $12,150..gs del repo.ui/Field.tsx, que convierte un campo vacío en 0.Esperando respuesta de Leucotec
Producto
/cotizador restringido a correos de Leucotec. Hoy cualquiera con el enlace lo abre; no ve costos, pero podría sondear el semáforo.apps-script/semaforo-web.gs); el historial sigue en el Sheet construido. Un producto sin costo responde REVISAR./cotizador trae 21 productos; el Excel de Martin, 35. Faltan pediátricos, rotavirus y hexavalentes.Técnica
calculations.ts (npm test).npm run lint reporta 4 errores preexistentes en LeadGate.tsx (no-useless-escape).MaintenancePage.tsx no se usa en ninguna ruta.