Pular para o conteúdo principal

ADR-009: Custeio de Mão de Obra na OS

Status: Aprovado (Agosto 2026)


Contexto

O custo de uma OS é Peças + Mão de obra. As peças já são materializadas (custo real da solicitação), mas a mão de obra é um valor de seed (fixo, não real) — todo custo e relatório que envolve MO está incorreto.

As horas já existem (ServiceExecutionLog.actualDurationHours, horas-homem por colaborador por serviço). Falta só o valor/hora para custo de MO = horas × valor/hora. A decisão é sobre a origem do valor/hora e como cadastrá-lo com segurança.

Detalhes de pesquisa e opções na proposta Custeio de Mão de Obra.


Decisão

Valor/hora com default no cargo e override opcional por colaborador, cadastrado numa área protegida pela permissão de custo. Custo materializado numa segunda fase.


Decisões Arquiteturais

#DecisãoJustificativa
1Valor/hora default no Job (cargo) + override opcional no EmployeePouca manutenção de cadastro (poucos cargos) e não expõe salário individual. Padrão Limble (categoria por função).
2Resolução employee.hourlyLaborRate ?? job.hourlyLaborRateOverride prevalece quando preenchido; senão herda o cargo.
3Rate cadastrado é o custo carregado (salário + encargos)Salário bruto subestima o custo real em ~20–40%.
4Cadastro do rate por endpoint dedicado gateado por Manage/CostCenter (não gate de campo)O sistema não tem gate por campo; gatear o endpoint inteiro é o padrão existente. Protege dado quase-salarial atrás do financeiro, mantendo o campo nos forms de cargo/colaborador só para quem tem custo.
5Custo materializado a partir do tempo líquido (não do actualDurationHours bruto)O campo atual é fim − início (inclui pausas) → superfaturaria (~+28%). Tempo líquido vem das transições de estado (pauseReason).
6Custo snapshotado na OS ao lançarReajuste futuro não reescreve o custo de OS já fechadas. Casa com o fechamento de competência (rateio).
7Grava em WorkOrder.labourCost; oficina terceirizada fica fora (usa externalCost)Terceirizada é outro modelo (cobra por preço/tabela, não pela nossa hora) → fase futura.

Escopo (fases)

  • Fase 1 (aprovada): cadastro do valor/hora — campo no cargo + override no colaborador, gateado por CostCenter (endpoints dedicados). Só persiste e resolve o valor.
  • Fase 2: materialização horas líquidas × valor/hora → WorkOrder.labourCost (evento, análogo à materialização de peças, FACTRK-8), resolvendo antes a dívida técnica do tempo bruto.
  • Fora de escopo: oficina terceirizada (ver Backlog & Ideias).

Consequências

Positivas

  • Custo de MO real, com pouca fricção de cadastro e privacidade salarial.
  • Base comum com a análise de produtividade (mesma hora-homem).
  • Não fecha porta para terceirizada (costura via externalCost).

Negativas / dívidas

  • Depende de resolver o tempo líquido antes da Fase 2 (dívida técnica do ServiceExecution).
  • Rate por cargo é um proxy — dispersão salarial dentro do cargo só é capturada via override.

Referências