Attribute free extensions to the server they are on

Featurekamo-shared-library
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.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing