{"id":50509743,"url":"https://github.com/marcelosanchezdev/bobioproject","last_synced_at":"2026-06-02T19:01:22.385Z","repository":{"id":360995400,"uuid":"1009237654","full_name":"MarceloSanchezDev/BobioProject","owner":"MarceloSanchezDev","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-28T18:07:14.000Z","size":3564,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-28T20:09:09.425Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.bobbio.com.ar","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MarceloSanchezDev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-26T19:56:42.000Z","updated_at":"2026-05-28T15:13:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/MarceloSanchezDev/BobioProject","commit_stats":null,"previous_names":["marcelosanchezdev/bobioproject"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/MarceloSanchezDev/BobioProject","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarceloSanchezDev%2FBobioProject","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarceloSanchezDev%2FBobioProject/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarceloSanchezDev%2FBobioProject/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarceloSanchezDev%2FBobioProject/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MarceloSanchezDev","download_url":"https://codeload.github.com/MarceloSanchezDev/BobioProject/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarceloSanchezDev%2FBobioProject/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33833277,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-02T19:01:21.189Z","updated_at":"2026-06-02T19:01:22.371Z","avatar_url":"https://github.com/MarceloSanchezDev.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bobbio Project\n\n\u003e ERP liviano para PYMEs: ventas, inventario, finanzas, reportes y más. Construido con **React + Vite** y backend serverless con **Firebase**.\n\n![Bobbio Banner](./docs/banner.png)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#caracteristicas\"\u003eCaracterísticas\u003c/a\u003e •\n  \u003ca href=\"#demo\"\u003eDemo\u003c/a\u003e •\n  \u003ca href=\"#stack\"\u003eStack\u003c/a\u003e •\n  \u003ca href=\"#inicio-rapido\"\u003eInicio rápido\u003c/a\u003e •\n  \u003ca href=\"#scripts\"\u003eScripts\u003c/a\u003e •\n  \u003ca href=\"#testing\"\u003eTesting\u003c/a\u003e •\n  \u003ca href=\"#estructura-de-carpetas\"\u003eEstructura\u003c/a\u003e •\n  \u003ca href=\"#despliegue\"\u003eDespliegue\u003c/a\u003e •\n  \u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n![Build](https://img.shields.io/badge/build-vite%206-success)\n![React](https://img.shields.io/badge/react-19-61dafb)\n![Firebase](https://img.shields.io/badge/firebase-11-ffca28)\n![Tests](https://img.shields.io/badge/tests-vitest%20%2B%20RTL-8A2BE2)\n![License](https://img.shields.io/badge/license-MIT-informational)\n\n## 🚀 Estado\n\nProyecto activo en desarrollo.\n\n## ✨ Características\n\n- **Autenticación** con Firebase Authentication (email/password, Google, etc.).\n- **Gestión de Ventas** y **Productos** con filtros y paginación.\n- **Inventario**: altas/bajas, alertas por stock bajo (en progreso).\n- **Reportes**: métricas y panel visual (gráficos), selector de fechas con `react-calendar`.\n- **UI responsiva** con Bootstrap 5 + React-Bootstrap.\n- **Ruteo** con React Router v7.\n- **Arquitectura modular** y contextos para estado global.\n\n## 🧪 Demo\n\n\u003e _Opcional:_ agrega aquí el link cuando esté público (Vercel/Firebase Hosting).\n\n- Producción: **[https://…](#)**\n- Staging: **[https://…](#)**\n\n## 🧰 Stack\n\n\u003ca id=\"stack\"\u003e\u003c/a\u003e\n\n- **Frontend**: React 19, Vite 6, React Router v7, React-Bootstrap, Bootstrap 5.\n- **Estado**: Context API / hooks.\n- **Backend/DB**: Firebase 11 (Auth, Firestore, Storage) _(ajusta según uso real)_.\n- **Utilidades**: `react-calendar` para rangos de fechas.\n- **Calidad**: ESLint 9.\n- **Testing**: Vitest 3, React Testing Library, Jest-DOM, JSDOM.\n\n## ⚙️ Requisitos previos\n\n- **Node.js ≥ 18** (recomendado LTS).\n- **npm** ≥ 9 o **pnpm/yarn** (a gusto).\n- Cuenta de **Firebase** con un proyecto creado.\n\n## 🏁 Inicio rápido\n\n\u003ca id=\"inicio-rapido\"\u003e\u003c/a\u003e\n\n```bash\n# 1) Clonar\ngit clone https://github.com/tu-usuario/bobbio-project.git\ncd bobbio-project\n\n# 2) Instalar dependencias\nnpm install\n\n# 3) Variables de entorno\ncp .env.example .env.local\n# Completar credenciales Firebase en .env.local\n\n# 4) Ejecutar en desarrollo\nnpm run dev\n# abre http://localhost:5173\n```\n\n### 🔐 Variables de entorno\n\n\u003e Vite expone variables con prefijo `VITE_`. No subas `.env.local` al repo.\n\n```dotenv\n# .env.example\nVITE_FIREBASE_API_KEY=\nVITE_FIREBASE_AUTH_DOMAIN=\nVITE_FIREBASE_PROJECT_ID=\nVITE_FIREBASE_STORAGE_BUCKET=\nVITE_FIREBASE_MESSAGING_SENDER_ID=\nVITE_FIREBASE_APP_ID=\n# Si usas Analytics u otros servicios, agrégalos aquí\n```\n\n### 🔧 Configuración de Firebase (resumen)\n\n1. Crea un proyecto en **Firebase Console**.\n2. Agrega una **app web** y copia las credenciales al `.env.local` (ver arriba).\n3. Habilita **Authentication** (proveedores que uses).\n4. Crea **Firestore** en modo de seguridad apropiado (reglas estrictas en prod).\n5. (Opcional) Configura **Storage** para subir archivos/imagenes.\n\n## 📜 Scripts disponibles\n\n\u003ca id=\"scripts\"\u003e\u003c/a\u003e\n\nDel `package.json`:\n\n```json\n{\n  \"dev\": \"vite\",\n  \"build\": \"vite build\",\n  \"preview\": \"vite preview\",\n  \"lint\": \"eslint .\",\n  \"test\": \"vitest\",\n  \"test:ci\": \"vitest run --coverage\"\n}\n```\n\n- `npm run dev` — servidor de desarrollo.\n- `npm run build` — build de producción en `dist/`.\n- `npm run preview` — sirve el build localmente.\n- `npm run lint` — corre ESLint.\n- `npm test` — corre Vitest en modo watch.\n- `npm run test:ci` — corre tests una vez con **coverage**.\n\n## 🧪 Testing\n\n\u003ca id=\"testing\"\u003e\u003c/a\u003e\n\nEste proyecto usa **Vitest + React Testing Library** y **jest-dom** con **jsdom**:\n\n- Render con `render(...)` y consultas `getBy*/queryBy*/findBy*`.\n- Interacciones de usuario con `@testing-library/user-event`.\n- Asincronía con `waitFor`/`findBy*`.\n- Cobertura con `@vitest/coverage-v8`.\n\nEjemplos mínimos:\n\n```ts\n// src/components/Example/Example.test.tsx\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport Example from \"./Example\";\n\ntest(\"muestra el título y reacciona al click\", async () =\u003e {\n  render(\u003cExample /\u003e);\n  expect(screen.getByRole('heading', { name: /example/i })).toBeInTheDocument();\n  await userEvent.click(screen.getByRole('button', { name: /sumar/i }));\n  expect(await screen.findByText(/total: 1/i)).toBeVisible();\n});\n```\n\n\u003e **Consejos**: testea por comportamiento (accesible) y no por implementación; usa roles/labels; evita IDs frágiles.\n\n## 📁 Estructura de carpetas\n\n\u003ca id=\"estructura-de-carpetas\"\u003e\u003c/a\u003e\n\n```\n├─ public/\n├─ src/\n│  ├─ assets/\n│  ├─ components/\n│  │  └─ Example/\n│  ├─ context/\n│  ├─ hooks/\n│  ├─ pages/\n│  ├─ routes/\n│  ├─ services/    # firebase.ts, api wrappers\n│  ├─ utils/\n│  ├─ styles/\n│  ├─ App.tsx\n│  └─ main.tsx\n├─ tests/           # (opcional) helpers/mocks\n├─ .env.example\n├─ .env.local       # (gitignored)\n├─ vite.config.ts\n└─ package.json\n```\n\n## 🚢 Despliegue\n\n\u003ca id=\"despliegue\"\u003e\u003c/a\u003e\n\n### Opción A) Vercel (SPA React)\n\n1. Conecta el repo a **Vercel**.\n2. Framework Preset: **Vite**.\n3. Variables de entorno: pegar las `VITE_*`.\n4. Build Command: `npm run build` • Output Dir: `dist`.\n\n### Opción B) Firebase Hosting\n\n1. `npm i -g firebase-tools` y `firebase login`.\n2. `firebase init hosting` (selecciona proyecto existente).\n3. Configura **public** = `dist` y `Single Page App` = `yes`.\n4. `npm run build` y `firebase deploy`.\n\n\u003e Asegúrate de configurar headers de caché y reglas de seguridad adecuadas.\n\n## 🧹 Calidad y estilo\n\n- **ESLint**: `npm run lint` (plugins: react-hooks, react-refresh).\n- (Opcional) Agrega **Prettier** si prefieres formateo consistente.\n\n## 🔒 Seguridad\n\n- Mantén las **reglas de Firestore/Storage** estrictas.\n- No subas secretos al repo. Usa `.env.local` y secretos de CI/CD.\n- Revisa dependencias con `npm audit` periódicamente.\n\n## 🗺️ Roadmap\n\n\u003ca id=\"roadmap\"\u003e\u003c/a\u003e\n\n- [ ] Panel de KPIs con gráficos (ventas por período, top productos).\n- [ ] Roles y permisos (admin/operador/consulta).\n- [ ] Alertas de stock bajo + notificaciones.\n- [ ] Importación/exportación CSV.\n- [ ] i18n (ES/EN).\n- [ ] Tests E2E (Playwright/Cypress).\n\n## 🤝 Contribuir\n\n1. Haz un fork y crea tu rama: `git checkout -b feature/mi-feature`.\n2. Corre lint/tests antes de pushear.\n3. Abre un PR describiendo cambios y screenshots.\n\n## 📜 Licencia\n\nMIT © 2025 Marcelo Sánchez\n\n## 👤 Autor\n\n**Marcelo Sánchez**\n\n- GitHub: [@MarceloSanchezDev](https://github.com/MarceloSanchezDev)\n- Web: [marcelosanchezdev.com.ar](https://marcelosanchezdev.com.ar)\n- LinkedIn: _(agrega link)_\n\n## 📎 Recursos\n\n- [Documentación de Vite](https://vitejs.dev/)\n- [React Router](https://reactrouter.com/)\n- [Firebase](https://firebase.google.com/docs)\n- [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/)\n\n---\n\n\u003e _Tip_: guarda los screenshots en `./docs/` y referencia imágenes reales del sistema (pantallas de login, dashboard, reportes).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcelosanchezdev%2Fbobioproject","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcelosanchezdev%2Fbobioproject","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcelosanchezdev%2Fbobioproject/lists"}