BossHunter
스마트 구직 에이전트(소스 공개, PolyForm 비상업적 라이선스; 상업적 이용은 별도 서면 허가 필요)
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗PWA móvil para gestión de clientes y cotizaciones con Firestore (sincronización en la nube + offline) y Firebase Cloud Messaging (notificaciones push web).
firebaseConfig (apiKey, authDomain, projectId, storageBucket, messagingSenderId, appId).Editá los mismos valores en dos lugares:
firebase-config.js (módulo ES que usa la app)firebase-messaging-sw.js (config embebida que usa el service worker de FCM)La VAPID Public Key ya está cargada:
BG51GzCL7b78_tnJ1GzvV53HimMawsAwPPdTCKM8XPAKV6RS8arlEQZ-BxzQqyFLxCJaY-durev5H6GyJysO9HU
firestore.rules en Rules y publicar.Acceso del equipo (importante). Las cotizaciones, clientes y plantillas ya no son accesibles para cualquier cuenta que inicie sesión. Como el registro de cuentas es abierto, el acceso a datos de negocio requiere aprobación de un admin: la función
isMember()defirestore.rules(y la Cloud FunctionparseDictation) solo permiten al dueño, a los admins (isAdmin == true) y a usuarios conapproved == trueenusers/{uid}.Cómo aprobar a alguien: que la persona inicie sesión una vez (se crea su
users/{uid}), luego en /administracion → Usuarios tocá "Aprobar" junto a su nombre. Mientras no esté aprobada, verá la app pero sin datos. Los admins (y el dueño) tienen acceso siempre.
En Authentication → Settings → Authorized domains, agregá el dominio donde alojás la app (ej. tu-usuario.github.io). localhost ya viene autorizado.
users/{uid}/
├─ quotes/{id} → { empresa, numero, fecha, descripcion, valor,
│ contactos, estado, seguimiento, notas, createdAt, updatedAt }
├─ clients/{id} → { empresa, nombre, email, telefono, cargo, notas }
└─ fcmTokens/{token} → { token, ua, createdAt }
Cada teléfono recibe un UID anónimo persistente. Si reinstalás la app, generá un respaldo (Ajustes → Exportar JSON) o usá login Google en el futuro para enlazar datos entre dispositivos.
createdByName) y responsable del seguimiento (responsableUid + responsableNombre). El estado Backlog archiva la cotización: pasa manualmente o automático tras 3 meses (92 días) sin actualización, queda fuera del Dashboard, métricas, pipeline y recordatorios, y solo se ve activando el filtro "Backlog" en Cotizaciones (campos: backlogAt, backlogMotivo auto/manual, estadoPrevio).
normalizeEstado() en lib/format.js traduce el valor antiguo al leer y migrateEstadoLegacy() (app.js) migra los documentos una sola vez; las queries de Cloud Functions consultan ambos textos y normEstado() evita que la migración dispare notificaciones.parseValor(), que interpreta el formato chileno (punto = miles, coma = decimales). Sin eso, "6.292.532" se guardaba como null y "6.292" como 6,292 pesos.esRestauracionBacklog() (app.js) y backlogRestore() (firestore.rules) eximen ese cambio del flujo de aprobación, que si no dejaba atrapada una cotización Adjudicada→Backlog para un usuario supervisado.cursoFecha). Los campos de nombre, modalidad y cupos se retiraron del formulario en ago-2026 por pedido del área comercial.users/{uid}/fcmTokens para enviar mensajes desde tu backend o Cloud Functions.cd SonqollayAPP
python3 -m http.server 8080
# abrir http://localhost:8080
Importante: FCM requiere HTTPS (o
localhost). Para usarlo desde un teléfono real, hostealo en GitHub Pages / Netlify / Firebase Hosting.
El proyecto ya viene con firebase.json y .firebaserc apuntando al proyecto sonqollayapp.
npm i -g firebase-tools
firebase login
# Instalar deps de las functions
cd functions && npm install && cd ..
# Deploy completo (hosting + reglas + functions)
firebase deploy
Deploy parcial:
firebase deploy --only hosting
firebase deploy --only firestore:rules
firebase deploy --only functions
firebase deploy --only functions:dailyFollowUpReminders
Ubicadas en functions/index.js:
여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗