@classytic/arc-reservation
v0.1.0
Published
Arc module for @classytic/reservation — interval bookings (hold→confirm→check_in→check_out with race-proof per-unit allocations), bookable resources with maintenance holds, and folio billing (post_line/settle/void with crash-convergent ledger idempotency)
Readme
@classytic/arc-reservation
Arc module for @classytic/reservation —
interval bookings composed into arc apps. Hotel, vacation rental, courts,
desks: one module, host-injected permissions and bridges.
import { createReservationModule } from '@classytic/arc-reservation';
createApp({
modules: [
createReservationModule({
connection,
permissions: { view, manage, operate, cancel, folio, maintain },
bridges: {
catalog: rateBridge, // e.g. catalog computeStayQuote → per-night Money[]
ledger: ledgerBridge, // folio settlement (idempotent per folio:<id>:settle)
},
defaultTimezone: 'Asia/Dhaka',
prefixes: { resources: '/rooms' }, // hotel vocabulary, same module
}),
],
});
// Cross-module seam — container-free:
orderConfig.bridges.booking = fastify.arc.modules.reservation.bookingBridge();Surfaces
| Resource | Prefix (default) | CRUD | Actions | Routes |
|---|---|---|---|---|
| reservations | /reservations | create = kernel hold() (zod-coerced), list/get, update (drafts), DELETE denied by default | confirm · check_in · check_out · no_show · cancel | GET /availability, GET /booked-slots |
| bookable resources | /bookable-resources | full CRUD (create = kernel verb) | block · unblock · set_condition | — |
| folios | /folios | locked — list/get only | post_line · settle · void | — |
- Single-party tenancy (
tenantField: 'organizationId') — each stay belongs to one property/branch. confirm/cancelare idempotent by state → safe order-event handlers.- System-managed fields (status, lines, folioId, numbers) are PATCH-proof.
- BYO-engine (
deps.engine) for strangler migrations — hotel/server §13.
Hotel specialization = configuration, not code
createReservationModule({
connection,
permissions: hotelGates, // front_desk / housekeeping roles
prefixes: { resources: '/rooms', reservations: '/reservations' },
extraRoutes: [tapeChartStatsRoute], // app policy
});
// housekeeping labels are just set_condition values: clean|dirty|inspected