Commit graph

76 commits

Author SHA1 Message Date
Gabriel Menezes
f1782171ff feat(ai): adicionar criacao de tarefas por linguagem natural e enriquecimento com Ollama/Qwen 2026-11-04 15:12:07 -04:00
Gabriel Menezes
977c7ffd7a feat(reports): add PDF report download via headless LibreOffice converter 2026-11-01 12:50:42 -04:00
Gabriel Menezes
b8c23d5faa feat(reports): add AI_TEXT section type powered by local Ollama qwen3.5 2026-11-01 12:19:58 -04:00
Gabriel Menezes
c00a5ff4b7 feat(reports): add SIGNATURE section type inserting user default signature into docx 2026-11-01 11:14:10 -04:00
Gabriel Menezes
cc317e274b refactor(reports): remove atividades as default built-in tag 2026-11-01 09:53:38 -04:00
Gabriel Menezes
fe1412de23 feat(profile): add user digital signatures with upload, canvas drawing, and cursive template fonts 2026-11-01 09:49:09 -04:00
Gabriel Menezes
a569f1d9b8 refactor(reports): remove tarefas, periodo and total_horas native tags 2026-11-01 09:33:27 -04:00
Gabriel Menezes
d3243b3fb5 fix(reports): resolve ResultSet is closed error on list templates by eager fetching associations with transactional 2026-10-31 19:36:33 -04:00
Gabriel Menezes
57165fdbe9 feat(reports): add edit template capability with updated sections and optional docx replacement 2026-10-31 15:29:26 -04:00
Gabriel Menezes
7624cff094 feat(reports): configure date format per section when type is date 2026-10-31 12:10:33 -04:00
Gabriel Menezes
8054ca9a6d feat(reports): allow fully customizable sections with pre-filled fixed values 2026-10-31 11:54:49 -04:00
Gabriel Menezes
5b4135b125 feat(reports): add standard header section with manager, project name and configurable period format 2026-10-31 11:39:27 -04:00
Gabriel Menezes
55fd823b2d feat(reports): add docx template management and dynamic report generation module 2026-10-31 11:07:13 -04:00
Gabriel Menezes
d3174653b1 feat: add scope toggles for individual vs team metrics, add GEMINI.md guidelines 2026-10-22 09:41:58 -04:00
Gabriel Menezes
d1bfe4d1cb feat: migrate to frontend v2, add task external links, auto-assign logged user, and preferences support 2026-10-15 09:04:24 -04:00
Gabriel Menezes
8015b3ff77 feat: add auth page with login/register and enable task3 CORS origin 2026-10-10 21:34:38 -04:00
Gabriel Menezes
1a5a835d33 feat(auth): increase access token expiry to 24h and refresh token to 7 days 2026-10-09 13:39:02 -04:00
Gabriel Menezes
5b0d1c6dea fix: correctly cap worked hours calculation to current time 2026-10-08 10:26:15 -04:00
Gabriel Menezes
fa5d400a0d fix: resolve hibernate query error in task repository 2026-10-08 10:22:29 -04:00
Gabriel Menezes
791d184954 chore: configure docker-compose for homelab with task2.beetech.dev domain
- Replace archived MinIO images with community-maintained pgsty images
- Change routing domain to task2.beetech.dev across frontend, backend, and minio
- Avoid port collisions with existing homelab services (postgres port 5434)
- Add .env and *.pem to .gitignore
- Remove legacy deploy/ directory and deploy-main.yml workflow
2026-10-07 14:56:34 -04:00
Gabriel Menezes
607bbef7d1
feat: add periodStats to user dashboard endpoint
feat: add periodStats to user dashboard endpoint
2026-05-22 20:28:28 -04:00
Gabriel Santana de Menezes
1b337e53c2 feat: add periodStats to dashboard output
Adiciona breakdown diário/mensal ao endpoint /dashboard do usuário:
- Novo record DashboardPeriodStats com year, month, day, finishedTasksCount e totalMinutesWorked
- DashboardUseCase agrupa history items por LocalDate para minutos e finishedAt para contagem de tarefas
- Lógica groupedBy: ≤62 dias → DAY, caso contrário → MONTH

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 16:06:24 -04:00
Gabriel Santana de Menezes
59a5c61585 feat: add MinIO image server and profile photo upload
Infrastructure: MinIO service added to docker-compose (prod + dev) with
minio-init container that creates the avatars bucket with public read
policy. Traefik routes minio.task.beetech.dev → port 9000.

Backend: native MinIO SDK integration via MinioStorageService;
UploadUserPhotoUseCase validates 5 MB limit and image content-type;
new POST /auth/profile/photo endpoint (multipart). All hardcoded
ui-avatars.com fallback URLs removed from 6 use cases — backend now
returns null when user has no photo.

Frontend: ProfilePage gains clickable avatar with camera overlay,
file picker, preview, and photo upload on save. UserAvatar gains
onError handler for broken URLs and xs size. OrganizationAdminPage
replaces hardcoded ui-avatars.com with UserAvatar component.

CI/CD: deploy-main.yml passes 5 new MinIO secrets to the server and
writes them to .env.production.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 18:01:59 -04:00
Gabriel Santana de Menezes
769791b25c feat: add user profile page with name and email editing
Backend: new UpdateUserProfileUseCase with email uniqueness validation,
PUT /auth/profile endpoint. Frontend: ProfilePage with avatar initials,
inline success/error feedback, and refreshUser() sync after save.
Avatar dropdown in AppShell gains a "Meu Perfil" link.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 15:03:45 -04:00
Gabriel Santana de Menezes
f01d72c2bb Fix task timer desync between server and browser clocks
Calculate elapsed time server-side and return it to client. Timer now adds
elapsedSeconds from server to local increments since response received, instead
of calculating from startAt with potentially mismatched browser clock.

Backend changes:
- TaskHistoryItem: add getElapsedSeconds() to calculate time since startAt
- TaskHistoryItemOutput: add elapsedSeconds field
- CreateTaskResponse.TaskHistoryItemResponse: add elapsedSeconds field
- CreateTaskMapper: map elapsedSeconds in toTaskHistoryItemOutput()

Frontend changes:
- TaskTimer: track responseTimestamp when running item changes
- Calculate: accumulatedSeconds + elapsedSeconds + (now - responseTimestamp)
- Remove parseISO import (no longer needed)
- TaskHistoryItem type: add optional elapsedSeconds field

This fixes the issue where timer doesn't update until task is stopped if
server and browser clocks are out of sync.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-18 10:59:16 -04:00
Gabriel Santana de Menezes
3f67d34306 Fix task listing and filters, add project colors/icons
- Remove user membership filter from task query — show all org tasks, not just user's accessible ones
- Add color and icon fields to projects with DB migration and entity updates
- Fetch org members and projects upfront for filters, not just from task results
- Convert project and status filters to chips like categories, with color/icon display
- Add icon and color picker to project creation form

Backend changes:
- TaskRepositoryImpl: remove (pu.email = ?2 or tu.email = ?2) from WHERE clause
- TaskRepository interface: remove email param from findAccessibleTasksFiltered
- ListAllTasksUseCase: adjust call without email
- CreateProjectUseCase: accept color and icon params
- ProjectController: update request/response records, map new fields
- ProjectEntityMapper: map color/icon in both directions
- Add V3 migration for color/icon columns

Frontend changes:
- TaskListPage: fetch org members and projects on org change
- TaskFilterBar: replace dropdowns with chips for projects and status
- ProjectsPage: add color picker and icon picker to form
- Project type: add optional color/icon fields
- TaskAssignee: allow photo to be nullable

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-18 10:19:12 -04:00
Gabriel Santana de Menezes
ae0d536ff7 Add optional assignee to task form 2026-05-17 21:18:07 -04:00
Gabriel Santana de Menezes
7f05ebdf61 Add assignee filtering to task listings 2026-05-17 20:55:29 -04:00
Gabriel Santana de Menezes
ea7ffaaffd Add multi-select task filters for projects and statuses 2026-05-17 19:22:44 -04:00
Gabriel Santana de Menezes
2d14ae480d feat: criar landing page pública com endpoint de estatísticas
Backend:
- Adicionar métodos de contagem/agregação aos repositórios (UserRepository, OrganizationRepository, TaskRepository)
- Implementar nova use case PublicStatsUseCase que retorna estatísticas públicas (usuários, organizações, tarefas completas, horas registradas)
- Criar novo controller público GET /public/stats sem autenticação
- Configurar CDI factory PublicStatsUseCaseConfig

Frontend:
- Criar nova landing page pública (LandingPage.tsx) com seções:
  * Hero com CTAs (Começar grátis / Ver demo)
  * 4 cards de funcionalidades principais (dashboard, produtividade, rastreamento, Kanban)
  * Seção "Como funciona" com 3 passos
  * Showcase visual do dashboard com leaderboard fake
  * Estatísticas reais da plataforma (consumidas do backend)
  * CTA final e footer
- Criar serviço publicStatsService para consumir o endpoint público
- Adicionar rota /landing na router
- Design alinhado com o sistema de cores e tipografia existente (Plus Jakarta Sans, Tailwind v4)

Stats reais são animadas ao fazer scroll (Framer Motion counter).
2026-05-16 17:14:42 -04:00
Gabriel Santana de Menezes
66782dda0c bora cors ajuda nois 2026-05-16 16:47:44 -04:00
Gabriel Santana de Menezes
fb6f22ed7a no more cors 2026-05-16 16:24:07 -04:00
Gabriel Santana de Menezes
de8d813b2c cors fixs 2026-05-16 11:41:48 -04:00
Gabriel Santana de Menezes
682280fefd chore: configurar domínios customizados task.beetech.dev e api.task.beetech.dev
- Frontend: remover basename '/frontend' do router
- Frontend: criar .env.production com VITE_API_URL
- Backend: remover root-path=/backend, atualizar CORS origins
- Docker Compose: atualizar Traefik labels para Host-based routing

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 11:14:07 -04:00
Gabriel Santana de Menezes
2fdb375462 feat: adicionar categorias para tasks (#23)
Adiciona conceito de Categoria por organização (nome, cor e ícone lucide),
com CRUD restrito a OWNER/ADMIN. Tasks ganham categoria opcional, filtros
multiselect de status e categoria nas listagens, badges nos cards, e
gráficos de pizza de tempo por categoria nos dashboards pessoal, da
organização e no modal de detalhes do membro.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 16:18:41 -04:00
Gabriel Santana de Menezes
9ba47e0ae5 fix: corrigir expiração de token e padronizar constantes
- Substitui LocalDateTime.now() por Instant.now() no issuedAt — a string
  produzida por LocalDateTime não contém timezone e era interpretada como
  hora local pelo browser, fazendo o frontend calcular expiresAt errado e
  nunca deslogar o usuário quando o token vencia.
- Cria TokenConstants com ACCESS_TOKEN_EXPIRY_SECONDS e
  REFRESH_TOKEN_EXPIRY_SECONDS, eliminando os valores hardcoded em
  LoginUseCase e RefreshTokenUseCase.
- Remove imports não utilizados em AuthController.

closes #24

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 22:45:42 -04:00
Gabriel Santana de Menezes
db463551e6 feat: filtros de busca nas listagens de tasks (#26)
Backend: adiciona ListMyTasksInput, ListMyTasksRequest (@BeanParam) com
parâmetros text, projectId e status; novo método findTasksByUserFiltered
no repositório com query dinâmica via Panache; mapper atualizado;
CLAUDE.md documenta regra de DTO Request para 3+ parâmetros.

Frontend: componente reutilizável TaskFilterBar (texto, projeto, status)
integrado em TaskListPage e TaskBoardPage; getMyTasks() aceita filtros
repassados como query params ao backend.

closes #26

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 22:12:05 -04:00
Gabriel Santana de Menezes
345a41cf13 fix: salvar histórico ao criar task
Propagava o campo history do CreateTaskRequest até o use case e persistência.
O mapeamento em TaskControllerMapper ignorava o history; CreateTaskInput não
tinha o campo; e CreateTaskUseCase não aplicava os itens à entidade antes
de salvar.

Closes #22

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 21:33:44 -04:00
Gabriel Santana de Menezes
0a0228c93e fix health endpoint path and simplify traefik labels
- Remove leading slash from smallrye-health.root-path so the health
  endpoint resolves to /backend/q/status (relative to non-app root)
  instead of the unreachable absolute path /status
- Clean up docker-compose traefik labels (remove stale comments)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 21:46:42 -04:00
Gabriel Santana de Menezes
c6e9e6cc77 adicionando prefix on backend 2026-05-13 20:47:06 -04:00
Gabriel Santana de Menezes
6df7905164 savepoint 2026-05-12 20:14:37 2026-05-12 20:14:37 -04:00
Gabriel Santana de Menezes
23ec0a9066 keys 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
54d75ec6f4 fix: change abckend port 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
2e9014bb6a fix: using maven installed intead ow wrapper 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
5620c71ed3 fix: removing dockerignore 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
b87ab63ac2 chore: deploy 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
78bf1be42b fix: database errors and version on status 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
c2a6c52141 chore: first migration 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
6537e96e46 chore: logging 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
92847f4095 feat: reduce org dashboard top tasks from 5 to 3
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 20:06:44 -04:00