Trabalhos a mais — Etapa 1
GET /v1/extras, GET /v1/extras/{id}, POST /v1/extras. GET exige read; POST exige write e Idempotency-Key. Listas têm limit entre 1 e 100 e cursor opaco ligado à organização e ao recurso. Respostas no-store; IDs de outra organização devolvem 404.
A criação recebe folderId, description não vazia, type (material, labour, equipment, external-service, other), unit, amount e purchasePrice não negativos. materialId e wageGroupId são metadados opcionais do modelo existente. folderId tem de identificar uma obra na organização; caso contrário devolve 422. O servidor gera id, fixa source: additional e calcula purchasePriceTotal, arredondado a duas casas decimais, a partir de amount × purchasePrice.
Escolha de design Etapa 1: usa projectConsumptionSchema e o envelope L1 em organizations/{org}/extras/{id}. A UI existente continua a ler projectExtras/default; esta etapa expõe os dados primeiro pela API, sem sincronização nem segunda fonte de verdade na UI. Aceitação/pagamento no portal, faturação e fotografias obrigatórias ficam fora desta etapa.
MCP: list_extras, get_extra, create_extra. O schema completo está em OpenAPI; a criação MCP recebe {data, idempotencyKey}.