"Is this person free?" is answered by three separate mechanisms in xMatix, and they do not share one engine. Resource Availability records hold a person's dated attendance and are what the dispatch console reads. Branch Time Slots and their per-date bookings are what the web and mobile booking wizards offer and consume. The newer appointment-scheduling engine models bookable resources, capacity claims and expiring holds, but no shipped screen calls it yet. This page describes each as it actually behaves, so an administrator knows which record to inspect when an availability outcome looks wrong.
Dated attendance: Resource Availability
A Resource Availability record is one attendance day for one resource: the Resource, the Date, an Availability Type, the branch it belongs to, the check-in and check-out times and branches where they happened, an optional link to the Leave Request that caused it, and Penalty Hours. The attendance hours and duration on the record are calculated from the punches. Records are created by the mobile check-in flow and by leave processing, and can also be maintained by hand from the list (reached from the Field Sales app under More).
The shipped Availability Type values are Present, Leave, Weekend, Holiday, Absent and Half Day.
How the dispatch console reads it
For the selected day the dispatch console loads every Resource Availability row for that date and every Leave Request overlapping it, then classifies each resource:
- The availability type is matched by substring: anything containing "leave" is leave, "half" is half day, "holiday" is holiday, "week" is week off (which is how Weekend is shown as Week off). Any other value — including Absent and any custom value — is treated as present.
- A Leave Request overlapping the day overrides the attendance row and marks the resource on leave unless its status contains "reject" or "cancel". There is no check for an Approved status: a pending leave request already counts as leave.
- A resource with no row is inferred Absent only when at least one other resource has data that day; on a day with no attendance data at all the console shows no marker rather than painting everyone absent.
Optimize day and Get candidates skip lanes classified leave, holiday or week off. They do not skip half day or absent lanes, so review those before accepting an optimized result. Penalty hours are stored on the record but no allocation path reads them.
For a dispatch exception, inspect the exact resource, local date, stored availability type and any overlapping leave request's status, then compare with what the Board or Gantt shows.
Branch time slots: the booking path in use today
The Booking Wizard widget in the web app and the mobile app books product demos and opportunities into Branch Time Slots. A slot belongs to a branch and carries a Transaction Type (Delivery, Product Demo At Site or Service Appointment), a start and end time, a Maximum Capacity, one capacity per weekday (Monday through Sunday), an Active flag, and optional narrowing by item, item group, service type and service job type. A Branch Time Slot Booking is the per-date consumption row for one slot: Booking Date, Capacity and Capacity Utilized.
How it behaves:
- The server returns the slots that match the branch, transaction type, item scope and service type, and are Active. A slot whose Active flag was never ticked is stored as empty rather than false and is refused with "The selected time slot is inactive." — tick Active explicitly when creating slots.
- Remaining capacity is calculated in the client. The wizard takes the weekday capacity (falling back to the maximum capacity when the weekday value is empty) and subtracts the booking row's utilized count. The server does not publish a per-date availability figure.
- Confirming a demo or opportunity increments the booking row's Capacity Utilized; cancelling or moving it decrements. The server does not refuse a booking that exceeds capacity — the number is advisory, and two simultaneous bookings for the last place both succeed. Where a hard limit matters, enforce it operationally and monitor Capacity Utilized against Capacity.
- The reservation runs only when the demo or opportunity is confirmed and not cancelled; an unconfirmed booking holds nothing.
Before publishing a slot, verify its branch, transaction type, times, weekday capacities and that Active is ticked. After a booking, verify the Branch Time Slot Booking row for that date exists and its utilized count moved.
The appointment-scheduling engine
A newer scheduling model exists in the platform: Appointment Types (duration, buffers, resource requirements, lead time, advance window, cancellation cutoff, reschedule limit, overbook percentage), Appointment Slot Templates released into dated Appointment Slots, Bookable Resources (a person, asset or facility with a branch, an effective window and a concurrent capacity), Resource Bookings (the capacity claims) and Appointment Holds. Its records appear in the CRM settings app where the module has been enabled, and its availability and hold endpoints are live in the API.
What it enforces when it is called:
- Candidates for a requirement are bookable resources that are active, of the required kind, inside their effective window, and either organization-wide or in the slot's branch. A person requirement narrowed by skill needs an active Resource Skill whose catalog Skill name matches — proficiency, skill validity dates and working hours are not applied, and the bookable resource's business-hours reference is stored but read by nothing.
- Capacity counts overlapping Hard resource bookings against the resource's concurrent capacity; soft bookings are ignored. Candidates are offered least-loaded first. A claim spans the appointment plus the type's before and after buffers.
- Holds take one place on a slot atomically — a full slot refuses the hold — for a configurable lifetime (default 10 minutes), and a sweep expires overdue holds and returns their capacity.
What is not yet wired: no web, mobile or portal screen calls the availability or hold endpoints — the booking wizards above still use branch time slots — and the hold-to-booking conversion has no caller. So a configured hold duration does not protect any shipped booking flow today, and the engine's tighter checks do not apply to demo and opportunity bookings. When race-free last-slot booking is a requirement, test two simultaneous sessions against the exact flow you deploy.
Common questions
Why is a technician still shown on the Gantt when attendance says Absent?
Because the console's exclusions are leave, holiday and week off. Absent and Half Day are shown with their own marker but are not excluded, and an unrecognised availability value is classified present. Treat the marker as a warning and move the assignment by hand.
Why did a pending leave request take someone off the day?
Any Leave Request overlapping the day counts as leave unless its status contains "reject" or "cancel". Approval is not required for the console's classification.
Two people booked the last slot — why did neither get refused?
The branch-slot path increments Capacity Utilized without comparing it to Capacity; the remaining figure the wizard shows is computed in the client. Only the newer appointment engine refuses a full slot, and it is not behind the wizard yet.
Does every booking channel use holds?
No. Hold services exist and work when called, but no shipped booking surface calls them. Verify the channel you operate rather than relying on the presence of hold records.
