- Shipped
- August 27, 2026 at 8:22 PM UTC
- Author
- kamo
- Commit
- 9cbd4a6
The extensions tab showed only the organization-wide figure, so an empty KamoPBX server displayed "21 billable extensions — $63.00 / month". The 21 were on a FreePBX server elsewhere in the same organization: true of the org, false of the server on screen, and impossible to tell apart from there. The panel now leads with the open server's own line — its billable count, its monthly total, the rule that applies to it, and its free extensions — and keeps the organization total underneath, which was worth having and is now labelled as what it is. The two provider kinds read differently on purpose, because they bill differently: a hosted server charges every active extension whether anyone is assigned or not, so its free count is always zero; a third-party server charges only assigned ones and reports queues, IVRs and spares as free. selectServerBilling prefers the SERVER's class over the organization's counts for exactly this reason — a new KamoPBX server is hosted from the moment it exists, and explaining its zero with the third-party rule would be precisely wrong. The helper lives in app/lib/voip rather than beside the component because vitest's `include` is an allowlist that does not cover app/settings/**, so a test placed next to the component would have silently never run. Needs BillingService e6d5c5c for the `instances` field; falls back to the old organization-only display without it.