Create a transfer between two bank accounts of the same company.
Creates a new account transfer, debiting the origin account and crediting the destination account atomically. Send idempotency_key on every request to make retries safe: replaying the same key (even after the transfer was reversed) returns the existing transfer with 200 instead of moving money again. Returns 201 for a newly created transfer and 200 for an idempotent replay — in both cases the body includes the two resulting account balances.
Authorizations
Token da sessão no cabeçalho Authorization, no formato Bearer (mesmo esquema ApiKeyAuth do contrato).
Headers
company uuid
Body
Transfer data
Amount NÃO carrega validate:"required": para go-playground/validator,
"required" num float64 rejeita o ZERO VALUE — e amount=0 é exatamente o
caso de negócio que precisa produzir "valor da transferência deve ser
maior que zero" (400, mensagem literal da tabela do plan.md), não o
genérico "erro ao validar a requisição". Deixar o campo passar por esta
validação de forma e cair na validação de NEGÓCIO do use case (T7,
toRegisterParams) é o que garante a mensagem certa em amount<=0.
IdempotencyKey é opcional no schema (plan.md), mas o front DEVE sempre enviá-la — ver spec.md § "Regras de negócio". Aceita nil (campo ausente).
Response
idempotent replay (same idempotency_key); reversed_at may be filled if the original transfer was already reversed
OriginBalance/DestinationBalance só vêm preenchidos na resposta de criação (201/200 do POST) e de estorno (DELETE) — plan.md: "a resposta inclui os saldos resultantes das duas contas, para o front atualizar a tela sem refetch". GetByID/GetAll/PATCH não carregam efeito de saldo nenhum, então ficam de fora (omitempty) para não sugerir um refetch de saldo que a operação não fez.
ReversedAt só aparece (ponteiro não-nil) quando a transferência foi estornada (D5b) — inclusive no replay idempotente pós-estorno (T4b): o handler responde 200 e o cliente vê, pelo campo preenchido, que aquela chave já havia sido usada e a transferência desfeita.