Categorias de Addons

Punch

Integração com sistemas de controle de ponto corporativo para registro e conferência de horas de trabalho.

Punch (Ponto Eletrônico & Jornada)

Os addons da categoria Punch integram o Pandhora a sistemas formais de Bate-Ponto e Controle de Ponto Eletrônico (como Pontomais, Ahgora, Factorial, Secullum e Kairos).

A finalidade do Punch é permitir que o usuário bata o ponto diretamente pelo Pandhora e realize a conferência automática de jornada — comparando o saldo de horas trabalhadas do dia com o total de horas alocadas em tarefas e projetos.


🎯 Principais Recursos

  • Batida de Ponto Rápida: Botão de 1 clique no menu de contexto ou atalho de teclado para registrar Entrada, Intervalo e Saída.
  • Auditoria de Horas (Jornada vs. Apontamentos): Exibe a diferença entre o tempo formal de trabalho e o tempo apontado em tarefas no DataSource, evitando inconsistências ao final do mês.
  • Histórico e Espelho de Ponto: Visualização do extrato diário de batidas diretamente no Pandhora.

💻 Exemplo de Implementação de Punch

import type { IAddon, AddonContext, AddonSettingsField } from '@pandhora/sdk'

export interface PunchRecordDTO {
  id: string
  timestamp: Date
  type: 'in' | 'out' | 'break_start' | 'break_end'
  source: string
}

export default class PontoCorporativoAddon implements IAddon {
  public id = 'ponto-corporativo'
  public name = 'Ponto Corporativo Integration'
  public version = '1.0.0'
  public description = 'Bate-ponto integrado com conferência de jornada'

  private context?: AddonContext

  public settingsFields: AddonSettingsField[] = [
    {
      key: 'pontoApiUrl',
      label: 'URL da API de Ponto',
      type: 'text',
      required: true,
      description: 'Endereço da API do sistema de ponto da empresa.',
    },
    {
      key: 'pontoToken',
      label: 'Token de Acesso / Chave do Colaborador',
      type: 'password',
      required: true,
    },
  ]

  public async onActivate(context: AddonContext): Promise<void> {
    this.context = context
    console.log('[Punch] Addon de Ponto ativado!')
  }

  public async onDeactivate(): Promise<void> {
    this.context = undefined
  }

  // Executa uma nova batida de ponto
  public async registerPunch(
    type: 'in' | 'out' | 'break_start' | 'break_end',
  ): Promise<PunchRecordDTO> {
    const apiUrl = await this.context?.storage.get('pontoApiUrl')
    const token = await this.context?.storage.get('pontoToken')

    const response = await fetch(`${apiUrl}/punches`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${token}`,
      },
      body: JSON.stringify({
        type,
        timestamp: new Date().toISOString(),
      }),
    })

    if (!response.ok) {
      throw new Error(
        `Falha ao registrar batida de ponto: HTTP ${response.status}`,
      )
    }

    const data = await response.json()

    await this.context?.notifications.show({
      title: 'Ponto Registrado',
      body: `Batida de ponto (${type}) realizada com sucesso!`,
    })

    return {
      id: data.id,
      timestamp: new Date(data.timestamp),
      type,
      source: 'Pandhora Desktop',
    }
  }
}