- Shipped
- August 27, 2026 at 7:57 PM UTC
- Author
- Kamo
- Commit
- a5b131d
An org running a busy FreePBX server beside a new, empty KamoPBX server saw "21 billable extensions — $63.00 / month" while looking at the KamoPBX one. Both numbers were true of the organization and neither was true of the server on screen, and there was no way for a screen to tell the difference: the breakdown carried instanceId per billable extension but collapsed the free ones into a single organization-wide int. unassignedThirdPartyByInstance replaces that int. unassignedThirdPartyCount() is kept as a derived sum rather than carried alongside, so the total and the parts cannot drift apart, and every existing caller and assertion is unaffected. Adds billableCountFor(instance), countFor(instance, class) and **************** — enough for a per-server line that respects the class rules, which differ in exactly the way that matters here: a hosted extension is billable whether anyone is assigned or not, a third-party one only when somebody is. So an empty KamoPBX server is $0 and a KamoPBX server with five unassigned extensions is not. Version deliberately unchanged at 1.6.0. Built and tested in an isolated worktree off origin/main — another session has seven unrelated files open here, and installing from this tree would have published their work in progress. 2305 tests pass.