# Filas (mod_callcenter) Agente.md secao 37 (mod_callcenter como ACD) e 50-51 (Filas/Estratégias). Primeira peça do Call Center — Agentes/Tiers/Pausas ficam pra próxima fase (dependem do fluxo de login do agente, seção 45-49, escopo maior). ## Descoberta real sobre `callcenter_config` Antes de escrever qualquer código, rodei `help callcenter_config` no FreeSWITCH real pra ver a sintaxe exata — e ela é bem diferente do que os Trunks fizeram supor: - **Filas**: só `queue load`/`unload`/`reload`/`list` — **não existe** `queue add` nem `queue set param`. Filas só podem vir de XML estático, carregado/recarregado por nome. - **Agentes**: `agent add`/`del`/`set status`/`set state`/... — 100% dinâmico via comando ESL, sem XML. - **Tiers**: `tier add`/`del`/`set state`/`set level`/`set position` — também 100% dinâmico. Ou seja, filas usam o mesmo padrão "arquivo + reload" dos Trunks; agentes e tiers (próxima fase) vão usar comandos ESL diretos, sem arquivo nenhum. ## Mecanismo Mesmo padrão dos gateways Sofia: um arquivo XML por fila (`autoload_configs/callcenter_queues.conf.d/.xml`, volume Docker compartilhado), incluído via `X-PRE-PROCESS` no nosso `callcenter.conf.xml` próprio (agente.md secao 15 — "carregar somente o necessário": zeramos os ``/`` estáticos da vanilla, já que essas partes vão ser 100% dinâmicas). **Sequência de comandos confirmada manualmente contra o FreeSWITCH real** (testei cada passo antes de escrever o código): 1. `queue load ` **falha** ("Invalid Queue not found!") se o arquivo foi adicionado depois do boot — a árvore XML em memória não sabe do arquivo novo ainda. 2. `reloadxml` primeiro repopula essa árvore a partir do disco. 3. Depois disso, **`queue reload ` sozinho** já serve tanto pra criar quanto atualizar — não precisa distinguir `load` de `reload`. 4. Fila removida: apagar o arquivo, `reloadxml`, `queue unload `. `b2bcall-fs-config` (`queue-sync.ts`) reescreve todos os arquivos de fila habilitada (todos os tenants) a cada sync, remove os obsoletos, roda `reloadxml` uma vez, depois `queue reload` por fila desejada e `queue unload` por fila removida. Disparado por Redis pub/sub (`b2bcall:queues:sync`, mesmo mecanismo dos Trunks) a cada create/delete via API, e uma vez no boot do serviço. ## Nome da fila no FreeSWITCH `@` — mesma convenção UUID dos gateways. Como o `telephonyDomain` hoje é compartilhado entre tenants (limitação já documentada em docs/EXTENSIONS.md), o unload de uma fila apagada usa o domain de "qualquer tenant ativo" como aproximação, já que o registro no banco já não existe mais nesse ponto pra sabermos o domain exato. ## Verificado ponta a ponta ``` POST /queues {"name":"Suporte","strategy":"ROUND_ROBIN","maxWaitTime":120,"discardAbandonedAfter":90} → fs-config sincroniza (desired:1) → reloadxml + queue reload callcenter_config queue list → @b2bcall.local|round-robin|...|90|false|120|... (parâmetros batem) DELETE /queues/:id → fs-config sincroniza (removed:1) → reloadxml + queue unload → callcenter_config queue list volta vazia ``` ## O que falta - Agentes, Tiers, Pausas (secao 45-49) — implementados na fase seguinte, ver docs/AGENTS.md. - Monitoramento em tempo real das filas (secao 54) — depende de WebSocket multi-tenant, que ainda não existe. - `tier-rule-wait-multiply-level` e `tier-rule-no-agent-no-wait` (vistos no `queue list` da config vanilla) não são expostos como campos próprios ainda — ficaram de fora do escopo desta fase. - ~~Quota de filas~~ — implementada na fase Plans/Entitlements (ver docs/ENTITLEMENTS.md), `assertQuota` chamado antes de criar.