Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
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.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.