# Api Movimentação de Etapa de Atividade

A API de movimentação de etapa permite mover uma ou várias atividades para outra etapa do funil, respeitando as mesmas regras de segurança, permissões, hierarquia e histórico utilizadas no Xeotech.

Essa operação não altera diretamente o pedido sem controle. Ela executa o processo de movimentação, registra o histórico e valida as regras da atividade.

## Endereço

```
POST https://api.xeotech.com.br/api/v1/pedidos/alterar-etapa/{token}
```

O token é informado na URL. Não envie o token no payload.

## Autorização e estrutura

O token precisa pertencer a um usuário ativo, com vínculo ativo em uma estrutura ativa. A estrutura é obtida automaticamente pelo vínculo do usuário; não é possível informar `estruturaId` no payload.

A etapa de destino é localizada pelo Xeotech usando:

- estrutura do usuário do token;
- tipo do pedido informado;
- nome exato da etapa;
- origem padrão do pedido, atualmente `5`;
- etapa ativa.

## Payload

```
{
  "numerosAtividades": ["49565585", "49565586"],
  "pedidoTipo": "COMERCIAL",
  "nomeEtapa": "ATIVO"
}
```

<table id="bkmrk-campos-payload-alterar-etapa"><thead><tr class="header"><th>Campo</th><th style="text-align: right;">Obrigatório</th><th>Descrição</th></tr></thead><tbody><tr class="odd"><td>`numerosAtividades`</td><td style="text-align: right;">Sim</td><td>Lista com 1 a 50 números de atividades. Envie os números como texto, mesmo quando forem numéricos. Não pode haver repetição.</td></tr><tr class="even"><td>`pedidoTipo`</td><td style="text-align: right;">Sim</td><td>Aceita `COMERCIAL` ou `POS_VENDA`.</td></tr><tr class="odd"><td>`nomeEtapa`</td><td style="text-align: right;">Sim</td><td>Nome exato da etapa ativa cadastrada para o tipo de pedido e estrutura do token.</td></tr></tbody></table>

O payload aceita somente esses três campos. Campos desconhecidos, números vazios, duplicados ou acima de 50 atividades são rejeitados.

## Header obrigatório

```
Idempotency-Key: alteracao-etapa-20261001-0001
```

A chave deve conter de 16 a 64 caracteres usando letras, números, hífen ou sublinhado.

Use a mesma chave somente para repetir exatamente a mesma operação. A chave é controlada por usuário, atividade e payload. Não reutilize uma chave para outra etapa ou outro pedido.

## Regras de processamento

- Cada atividade é processada em uma transação independente.
- Uma falha em uma atividade não impede o processamento das demais.
- A atividade precisa pertencer à estrutura do token e ser acessível pela hierarquia do usuário.
- Se a etapa atual não estiver no Kanban do solicitante, é necessária a permissão `MOVER_SEM_ESTAR_NO_KANBAN`.
- Se a etapa de destino não estiver no Kanban do solicitante, é necessária a permissão `MOVER_ATIVIDADE_FORA_KANBAN`.
- Para sair de uma etapa não editável, é sempre necessária a permissão `ATIVIDADE_MOVER_NAO_EDITAVEIS`, mesmo que a etapa esteja no Kanban.
- Para entrar em uma etapa não editável fora do Kanban, também é necessária a permissão `MOVER_ATIVIDADE_PARA_NAO_EDITAVEIS`. Quando o destino está no Kanban, essa permissão específica é dispensada.
- Se a atividade já estiver na etapa informada, o resultado será `SEM_ALTERACAO`.
- A movimentação registra o status e o histórico da atividade.
- Se a etapa de destino atualizar a data de referência, os itens do pedido terão a data atualizada conforme a regra do sistema.
- Se houver formulário ativo vinculado à etapa atual, a API recusa a operação. Nesse caso, a movimentação deve ser feita pela tela do Xeotech.
- Negociações vinculadas podem ser movimentadas quando atendem às regras de sincronização, hierarquia, permissões e formulário. As mesmas validações de Kanban são aplicadas usando o tipo da negociação vinculada; se ela for recusada, a alteração do pedido principal também é revertida.

## Permissões

<table id="bkmrk-permissoes-alterar-etapa-tabela"><thead><tr class="header"><th>Permissão</th><th>Quando é necessária</th></tr></thead><tbody><tr class="odd"><td>`PAINEL_ATIVIDADE_ETAPA_CHANGE`</td><td>Obrigatória em todas as chamadas, inclusive para uma única atividade. A permissão `KANBAN_ETAPA_CHANGE` sozinha não autoriza esta API.</td></tr><tr class="even"><td>`ATIVIDADE_ALTERACAO_EM_LOTE`</td><td>Obrigatória quando o payload contém mais de uma atividade.</td></tr><tr class="odd"><td>`ATIVIDADE_MOVER_NAO_EDITAVEIS`</td><td>Necessária para sair de uma etapa não editável.</td></tr><tr class="even"><td>`MOVER_ATIVIDADE_PARA_NAO_EDITAVEIS`</td><td>Necessária para entrar em uma etapa não editável que não esteja no Kanban do solicitante.</td></tr><tr class="even"><td>`MOVER_SEM_ESTAR_NO_KANBAN`</td><td>Necessária quando a etapa atual da atividade não está no Kanban do solicitante.</td></tr><tr class="odd"><td>`MOVER_ATIVIDADE_FORA_KANBAN`</td><td>Necessária quando a etapa de destino não está no Kanban do solicitante.</td></tr><tr class="odd"><td>`IGNORAR_HIERARQUIA`</td><td>Permite ignorar a validação de hierarquia, conforme as regras do usuário.</td></tr></tbody></table>

As permissões de Kanban e de etapas não editáveis são cumulativas. Por exemplo, mover uma atividade de uma etapa não editável fora do Kanban para outro destino não editável fora do Kanban exige as quatro permissões específicas, além das permissões gerais da operação.

## Exemplo cURL

```
curl --fail-with-body --location \
  --request POST \
  'https://api.xeotech.com.br/api/v1/pedidos/alterar-etapa/SEU_TOKEN' \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: alteracao-etapa-20261001-0001' \
  --data '{
    "numerosAtividades": ["49565585", "49565586"],
    "pedidoTipo": "COMERCIAL",
    "nomeEtapa": "ATIVO"
  }'
```

## Retorno

A resposta informa o resultado individual de cada atividade. O HTTP `200` indica que o lote foi processado; verifique os campos `sucessos`, `falhas` e `resultados`.

```
{
  "requestId": "d8e4c3c2-0000-0000-0000-000000000000",
  "total": 2,
  "sucessos": 1,
  "falhas": 1,
  "resultados": [
    {
      "numeroAtividade": "49565585",
      "pedidoId": 49565585,
      "sucesso": true,
      "codigo": "ETAPA_ALTERADA",
      "mensagem": "Etapa alterada com sucesso."
    },
    {
      "numeroAtividade": "49565586",
      "pedidoId": null,
      "sucesso": false,
      "codigo": "FORMULARIO_VINCULADO",
      "mensagem": "Esta atividade possui formulário vinculado à etapa atual. Realize a movimentação pela tela do sistema."
    }
  ]
}
```

<table id="bkmrk-campos-retorno-alterar-etapa"><thead><tr class="header"><th>Campo</th><th>Descrição</th></tr></thead><tbody><tr class="odd"><td>`requestId`</td><td>Identificador da requisição para rastreamento no suporte.</td></tr><tr class="even"><td>`total`</td><td>Total de atividades recebidas.</td></tr><tr class="odd"><td>`sucessos`</td><td>Quantidade de atividades alteradas ou processadas sem erro.</td></tr><tr class="even"><td>`falhas`</td><td>Quantidade de atividades recusadas ou com erro.</td></tr><tr class="odd"><td>`numeroAtividade`</td><td>Número enviado no payload.</td></tr><tr class="even"><td>`pedidoId`</td><td>ID interno do pedido, quando localizado.</td></tr><tr class="odd"><td>`sucesso`</td><td>Indica se a atividade foi processada com sucesso.</td></tr><tr class="even"><td>`codigo`</td><td>Código estável do resultado, como `ETAPA_ALTERADA`, `SEM_ALTERACAO` ou `FORMULARIO_VINCULADO`.</td></tr><tr class="odd"><td>`mensagem`</td><td>Descrição do resultado.</td></tr></tbody></table>

## Limites e guard

A alteração de etapa reutiliza o `pedidoApiGuard` da API de pedidos. Os limites são aplicados antes da autenticação e durante o processamento.

<table id="bkmrk-limites-alterar-etapa"><thead><tr class="header"><th>Regra</th><th style="text-align: right;">Limite padrão</th></tr></thead><tbody><tr class="odd"><td>Execuções simultâneas globais</td><td style="text-align: right;">2</td></tr><tr class="even"><td>Execuções simultâneas por estrutura</td><td style="text-align: right;">1</td></tr><tr class="odd"><td>Intervalo mínimo após execução</td><td style="text-align: right;">120 segundos</td></tr><tr class="even"><td>Execuções por estrutura</td><td style="text-align: right;">3 a cada 10 minutos</td></tr><tr class="odd"><td>Tentativas por token</td><td style="text-align: right;">20 a cada 60 segundos</td></tr><tr class="even"><td>Tentativas globais</td><td style="text-align: right;">600 a cada 60 segundos</td></tr><tr class="odd"><td>Autenticações simultâneas</td><td style="text-align: right;">8</td></tr><tr class="even"><td>Tamanho máximo do payload</td><td style="text-align: right;">16 KiB</td></tr><tr class="odd"><td>Atividades por requisição</td><td style="text-align: right;">50</td></tr></tbody></table>

Quando um limite for atingido, a API retorna `429` e informa o tempo de espera no header `Retry-After`. O guard em memória é controlado por instância da aplicação; a idempotência é garantida pelo banco de dados.

## Principais erros

<table id="bkmrk-erros-alterar-etapa-tabela"><thead><tr class="header"><th style="text-align: right;">HTTP</th><th>Código</th><th>Situação</th></tr></thead><tbody><tr class="odd"><td style="text-align: right;">`400`</td><td>`PAYLOAD_INVALIDO` ou `CHAVE_INVALIDA`</td><td>Payload inválido ou ausência de uma chave de idempotência válida.</td></tr><tr class="even"><td style="text-align: right;">`401`</td><td>`TOKEN_INVALIDO`</td><td>Token inexistente ou inválido.</td></tr><tr class="odd"><td style="text-align: right;">`403`</td><td>`ACESSO_NEGADO` ou `SEM_PERMISSAO`</td><td>Usuário, vínculo, estrutura ou permissão indisponível.</td></tr><tr class="even"><td style="text-align: right;">`404`</td><td>`PEDIDO_NAO_ENCONTRADO`</td><td>Atividade não encontrada na estrutura e no tipo informados.</td></tr><tr class="odd"><td style="text-align: right;">`409`</td><td>`IDEMPOTENCIA_CONFLITO` ou `NUMERO_AMBIGUO`</td><td>Chave reutilizada com outro payload ou número não exclusivo.</td></tr><tr class="even"><td style="text-align: right;">`413`</td><td>`PAYLOAD_GRANDE`</td><td>Payload acima de 16 KiB.</td></tr><tr class="odd"><td style="text-align: right;">`422`</td><td>`ETAPA_INVALIDA` ou `FORMULARIO_VINCULADO`</td><td>Etapa inexistente, ambígua, inativa ou bloqueada por formulário.</td></tr><tr class="even"><td style="text-align: right;">`429`</td><td>`LIMITE_API`</td><td>Guard ocupado, cooldown ou excesso de tentativas.</td></tr></tbody></table>

Falhas específicas de uma atividade são retornadas dentro de `resultados`, com HTTP `200` para o lote. Isso inclui `ETAPA_ATUAL_FORA_KANBAN`, `ETAPA_DESTINO_FORA_KANBAN`, `SEM_PERMISSAO`, `FORMULARIO_VINCULADO` e demais recusas da atividade. Os números HTTP da tabela representam as categorias de erro; não substituem a análise de cada resultado.

## Boas práticas

- Envie números de atividade como texto para preservar compatibilidade com números antigos.
- Use uma chave de idempotência única para cada operação nova.
- Em caso de timeout, repita a requisição com a mesma chave e o mesmo payload.
- Analise o resultado de cada atividade, mesmo quando o HTTP for `200`.
- Respeite o header `Retry-After` nas respostas `429`.
- Não registre o token completo nos logs.