{"id":31776879,"url":"https://github.com/bernardopg/cmmg-calendar","last_synced_at":"2026-07-29T02:31:24.855Z","repository":{"id":314650284,"uuid":"1034010642","full_name":"bernardopg/cmmg-calendar","owner":"bernardopg","description":"Sincronize o calendário acadêmico do CMMG diretamente com sua Google Agenda ou Apple Calendar. Nunca mais perca um evento importante!","archived":false,"fork":false,"pushed_at":"2026-07-25T11:31:45.000Z","size":961,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-25T13:09:43.764Z","etag":null,"topics":["automation","calendar","cmmg","doctor","education","icalendar","ics","medicine","minas-gerais","parser","python","scraper","web-scraping"],"latest_commit_sha":null,"homepage":"https://calendar.scalpel.com.br","language":"TypeScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bernardopg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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-08-07T17:37:52.000Z","updated_at":"2026-07-25T11:28:36.000Z","dependencies_parsed_at":"2025-09-13T21:28:07.113Z","dependency_job_id":"d4399cf9-48b5-41d6-91db-689481833704","html_url":"https://github.com/bernardopg/cmmg-calendar","commit_stats":null,"previous_names":["bernardopg/cmmg-calendar"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bernardopg/cmmg-calendar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fcmmg-calendar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fcmmg-calendar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fcmmg-calendar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fcmmg-calendar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bernardopg","download_url":"https://codeload.github.com/bernardopg/cmmg-calendar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fcmmg-calendar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36014947,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-29T02:00:04.910Z","response_time":95,"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":["automation","calendar","cmmg","doctor","education","icalendar","ics","medicine","minas-gerais","parser","python","scraper","web-scraping"],"created_at":"2025-10-10T05:59:24.830Z","updated_at":"2026-07-29T02:31:24.849Z","avatar_url":"https://github.com/bernardopg.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CMMG Calendar\n\n\u003e Transforme o quadro de horários do Portal do Aluno CMMG em arquivos prontos para Google Calendar, Thunderbird, Outlook, Apple Calendar e outros apps compatíveis com iCalendar.\n\n[![Produção](https://img.shields.io/website?url=https%3A%2F%2Fcalendar.scalpel.com.br\u0026label=calendar.scalpel.com.br)](https://calendar.scalpel.com.br)\n[![Node](https://img.shields.io/badge/node-%5E22.12%20%7C%7C%20%3E%3D24-brightgreen?logo=node.js\u0026logoColor=white)](https://nodejs.org)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n\n**Acesse em produção:** \u003chttps://calendar.scalpel.com.br\u003e\n\n## Para Que Serve\n\nO CMMG Calendar reduz o trabalho manual de cadastrar aulas uma por uma em um calendário. Ele lê os dados do `QuadroHorarioAluno` do TOTVS, valida a estrutura, calcula estatísticas do semestre e gera arquivos de calendário.\n\nVocê pode usar de três formas:\n\n| Fluxo | Quando usar | O que acontece |\n| --- | --- | --- |\n| Login TOTVS | Fluxo mais simples para estudantes | A API autentica no Portal do Aluno, consulta o horário e devolve a análise. A senha não é armazenada. |\n| Cookie TOTVS | Alternativa avançada quando o login automático falhar | Você cola um cookie de sessão ativo e a API consulta o horário. |\n| Upload JSON | Quando você já tem o arquivo local | Você envia `QuadroHorarioAluno.json` e a API apenas analisa o arquivo. |\n\nArquivos gerados:\n\n- `GoogleAgenda.csv`: importação pelo Google Calendar.\n- `ThunderbirdAgenda.ics`: formato universal para Thunderbird, Outlook, Apple Calendar e outros clientes.\n\n## Início Rápido\n\nPré-requisitos:\n\n- Node.js `^22.12.0` ou `\u003e=24.0.0`\n- npm `\u003e=10`\n- Git\n\n```bash\ngit clone https://github.com/bernardopg/cmmg-calendar.git\ncd cmmg-calendar\nnpm install\nnpm run dev\n```\n\nServiços em desenvolvimento:\n\n| Serviço | URL |\n| --- | --- |\n| Frontend Vite | `http://localhost:5173` |\n| API Fastify | `http://localhost:5000/api/health` |\n\nO frontend usa chamadas relativas (`/api/...`) e o Vite encaminha essas chamadas para o backend local.\n\n## Comandos Principais\n\n| Comando | Descrição |\n| --- | --- |\n| `npm run dev` | Sobe backend e frontend em watch mode. |\n| `npm run dev:server` | Sobe apenas o Fastify em `:5000`. |\n| `npm run dev:client` | Sobe apenas o Vite em `:5173`. |\n| `npm run lint` | Executa lint do frontend. |\n| `npm run test` | Executa testes do backend. |\n| `npm run build` | Compila frontend e backend. |\n| `npm run check` | Executa lint, testes e build. |\n| `npm start` | Inicia o backend compilado, servindo também o build do frontend. |\n\nUtilitários CLI:\n\n```bash\nnpm run schedule:analyze -- --input data/QuadroHorarioAluno.json\nnpm run schedule:export -- --input data/QuadroHorarioAluno.json\nnpm run totvs:fetch -- --cookie 'ASP.NET_SessionId=...; .ASPXAUTH=...'\n```\n\n## Stack Atual\n\n| Camada | Tecnologias |\n| --- | --- |\n| Frontend | React 19, Vite 8, TypeScript 6, CSS próprio |\n| Backend | Node.js, Fastify 5, TypeScript 6, Zod, Undici |\n| Testes | Node Test Runner nativo |\n| Produção | Docker multi-stage em Node 24, DigitalOcean App Platform |\n| CI | GitHub Actions com Node 24, lint, typecheck, build, testes e CodeQL |\n\n## Arquitetura em Uma Página\n\n```text\ncmmg-calendar/\n├── react-app/                 # SPA React/Vite\n│   └── src/\n│       ├── pages/             # rotas /, /gerador, /guia, /faq, /sobre\n│       ├── hooks/             # estado de API, upload, tema e análise\n│       ├── components/        # UI, layout, resultados, gráficos\n│       └── utils/             # exportação CSV/ICS e utilitários\n├── server/                    # API Fastify + CLIs Node\n│   └── src/\n│       ├── routes/            # /api/health, /api/analyze, /api/extract-analyze, /api/totvs-login\n│       ├── services/          # análise, TOTVS, parsing e exportação\n│       └── cli/               # comandos locais\n├── docs/                      # documentação técnica e guias de uso\n├── Dockerfile                 # imagem de produção\n└── .do/app.yaml               # deploy no DigitalOcean App Platform\n```\n\nEm produção, o backend serve a API em `/api/*` e também os arquivos estáticos gerados em `react-app/dist`.\n\n## API Resumida\n\nBase local: `http://localhost:5000/api`\n\n| Método | Endpoint | Uso |\n| --- | --- | --- |\n| `GET` | `/api/health` | Verifica disponibilidade da API. |\n| `POST` | `/api/analyze` | Analisa um `.json` enviado por `multipart/form-data`. |\n| `POST` | `/api/extract-analyze` | Consulta TOTVS usando cookie de sessão. |\n| `POST` | `/api/totvs-login` | Autentica no TOTVS com usuário/senha e busca o horário. |\n\nExemplo:\n\n```bash\ncurl -X POST \\\n  -F \"file=@data/QuadroHorarioAluno.json\" \\\n  http://localhost:5000/api/analyze\n```\n\nVeja contratos completos em [docs/guides/API_REFERENCE.md](docs/guides/API_REFERENCE.md).\n\n## Configuração\n\nA aplicação funciona com valores padrão para o portal CMMG. Sobrescreva apenas se necessário.\n\n```env\nPORT=5000\nHOST=0.0.0.0\nMAX_FILE_SIZE_MB=10\nTOTVS_TIMEOUT_MS=30000\nTOTVS_BASE_URL=https://fundacaoeducacional132827.rm.cloudtotvs.com.br\nTOTVS_DEFAULT_ALIAS=CorporeRM\nCORS_ORIGINS=https://calendar.scalpel.com.br\n```\n\nTambém existem variáveis específicas para endpoints TOTVS, descritas no [guia de instalação](docs/guides/INSTALLATION.md).\n\n## Documentação\n\nComece pelo caminho abaixo:\n\n1. [Manual completo](DOCUMENTACAO.md)\n2. [Índice da documentação](docs/DOCUMENTATION_INDEX.md)\n3. [Instalação e ambiente](docs/guides/INSTALLATION.md)\n4. [Interface web](docs/guides/WEB_INTERFACE.md)\n5. [Referência da API](docs/guides/API_REFERENCE.md)\n6. [CLI](docs/guides/CLI.md)\n7. [Arquitetura](docs/guides/ARCHITECTURE.md)\n8. [Solução de problemas](docs/guides/TROUBLESHOOTING.md)\n\nGuias de importação:\n\n- [Google Calendar](docs/guides/GOOGLE_CALENDAR.md)\n- [Thunderbird e iCalendar](docs/guides/THUNDERBIRD.md)\n\n## Segurança e Privacidade\n\n- Credenciais TOTVS são usadas apenas para a requisição de login e não são persistidas pela aplicação.\n- Cookies e senhas são mascarados nos logs do backend.\n- Uploads têm limite configurável por `MAX_FILE_SIZE_MB`.\n- Endpoints sensíveis têm rate limit.\n- Em produção, CORS só é liberado para origens explicitamente configuradas em `CORS_ORIGINS`.\n\nPara reportar vulnerabilidades, consulte [SECURITY.md](SECURITY.md).\n\n## Contribuição\n\nAntes de abrir PR:\n\n```bash\nnpm run check\n```\n\nLeia [CONTRIBUTING.md](CONTRIBUTING.md) para o fluxo recomendado.\n\n## Licença\n\nMIT. Consulte [LICENSE](LICENSE).\n\n## Créditos\n\nProjeto desenvolvido e mantido por Bernardo Gomes. Veja [CREDITS.md](CREDITS.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbernardopg%2Fcmmg-calendar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbernardopg%2Fcmmg-calendar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbernardopg%2Fcmmg-calendar/lists"}