Categorias de Addons
Calendars
Como integrar agendas externas (Google Calendar, Outlook) para sincronizar compromissos e convertê-los em tempo registrado.
Calendars (Agendas & Reuniões)
Os addons da categoria Calendars conectam o Pandhora a provedores de agenda como Google Calendar, Microsoft Outlook / 365 e calendários baseados em iCal.
Essa integração permite que os compromissos diários apareçam diretamente na visualização de agenda do Pandhora, possibilitando que o usuário transforme reuniões passadas em apontamentos de horas reais com um simples clique.
🎯 Estrutura de um Evento de Calendário
Para alimentar a interface do Pandhora, o plugin de calendário normaliza os eventos externos para uma estrutura padrão:
export interface CalendarEventDTO {
id: string // Identificador único do evento no provedor externo
title: string // Título ou assunto da reunião
description?: string // Pauta ou descrição do evento
startDate: Date // Data e hora de início
endDate: Date // Data e hora de término
attendeesCount?: number // Quantidade de participantes
meetLink?: string // Link da chamada (Google Meet, Teams, Zoom)
isAllDay?: boolean // Indica se é um evento de dia inteiro
}
💻 Exemplo de Implementação de Calendário
import type { IAddon, AddonContext, AddonSettingsField } from '@pandhora/sdk'
export interface CalendarEventDTO {
id: string
title: string
startDate: Date
endDate: Date
meetLink?: string
}
export default class GoogleCalendarAddon implements IAddon {
public id = 'google-calendar-addon'
public name = 'Google Calendar Integration'
public version = '1.0.0'
public description = 'Sincroniza reuniões do Google Calendar com o Pandhora'
private context?: AddonContext
public settingsFields: AddonSettingsField[] = [
{
key: 'calendarId',
label: 'ID do Calendário',
type: 'text',
defaultValue: 'primary',
description:
'Identificador do calendário (use "primary" para o principal).',
},
]
public async onActivate(context: AddonContext): Promise<void> {
this.context = context
console.log('[GoogleCalendar] Addon ativado com sucesso!')
}
public async onDeactivate(): Promise<void> {
this.context = undefined
}
// Busca os eventos do dia especificado
public async fetchDayEvents(targetDate: Date): Promise<CalendarEventDTO[]> {
const accessToken = await this.context?.storage.get('accessToken')
if (!accessToken) {
throw new Error('Usuário não autenticado no Google Calendar.')
}
const startOfDay = new Date(targetDate)
startOfDay.setHours(0, 0, 0, 0)
const endOfDay = new Date(targetDate)
endOfDay.setHours(23, 59, 59, 999)
const url = new URL(
'https://www.googleapis.com/calendar/v3/calendars/primary/events',
)
url.searchParams.set('timeMin', startOfDay.toISOString())
url.searchParams.set('timeMax', endOfDay.toISOString())
url.searchParams.set('singleEvents', 'true')
url.searchParams.set('orderBy', 'startTime')
const response = await fetch(url.toString(), {
headers: { Authorization: `Bearer ${accessToken}` },
})
const data = await response.json()
return (data.items || []).map((item: any): CalendarEventDTO => ({
id: item.id,
title: item.summary || 'Sem título',
startDate: new Date(item.start.dateTime || item.start.date),
endDate: new Date(item.end.dateTime || item.end.date),
meetLink: item.hangoutLink,
}))
}
}
🚀 Conversão Rápida para Apontamento de Horas
Quando o usuário visualiza suas reuniões no Pandhora:
- O Pandhora destaca reuniões já encerradas.
- Com o botão "Apontar Horas", o Pandhora abre o formulário pré-preenchido com o título da reunião, as horas calculadas (
(endDate - startDate)) e a atividade sugerida. - Ao salvar, a entidade
TimeEntryé criada e enviada para o Motor de Sincronização.