FIN-68. Sem efeito: diz o que `POST /change-tier` faria com o mesmo corpo. `:id` é a assinatura do plano, do próprio membro, na comunidade do X-CommunityId; de outra pessoa ou de outra comunidade responde 404. As recusas são as mesmas de `change-tier`.
`changeType`: `UPGRADE` (opção mais cara na mesma periodicidade), `DOWNGRADE`, `SAME_PRICE` ou `INTERVAL_CHANGE` (mensal ↔ anual). `mode`: `IMMEDIATE` só para `UPGRADE` com `immediate` ausente ou `true` e sem adicional que a opção nova deixe de oferecer; o resto é `SCHEDULED`, para `effectiveDate` (o fim do período pago), e `scheduledReason` diz por quê (`DOWNGRADE`, `SAME_PRICE`, `INTERVAL_CHANGE`, `ADD_ONS_END` ou `REQUESTED`).
No `IMMEDIATE`: `prorataAmount` é a diferença de preço proporcional aos `remainingDays` de `periodDays`; com menos de 3 dias ou menos de R$ 10, `floorApplied = true` e `amountDueNow = 0` (troca na hora, sem cobrança). `amountToCharge` soma a taxa da plataforma quando o comprador a paga (`feePayer = BUYER`). A cobrança é no cartão salvo (`cardRequired`, `hasSavedCard`), em até `maxInstallments` parcelas (meses restantes no anual; 1 no mensal).
Sempre: `newPrice` (preço por período da opção nova), `nextChargeDate` e `nextChargeTotal` (a primeira cobrança no preço novo, com os adicionais que continuam); `addOns` (cada adicional cobrado com o plano: `outcome = KEPT` continua, no valor da periodicidade nova, `newAmount`; `ENDS` termina com a troca); `contract` (`commitmentEndsAt` depois da troca; `carriedOver = true` quando o contrato atual continua valendo); `couponEnds` (o cupom da assinatura deixa de valer na troca); `replacesScheduledChange` (a troca agendada que esta substituiria, ou `null`).