@voyantjs/availability 0.50.8 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generate-slots.d.ts +8 -0
- package/dist/generate-slots.d.ts.map +1 -1
- package/dist/generate-slots.js +17 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/routes-allocation.d.ts +1 -0
- package/dist/routes-allocation.d.ts.map +1 -1
- package/dist/schema.d.ts +17 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +8 -0
- package/dist/service-allocation-automation.d.ts +31 -0
- package/dist/service-allocation-automation.d.ts.map +1 -1
- package/dist/service-allocation-automation.js +74 -1
- package/dist/service-allocation.d.ts +56 -0
- package/dist/service-allocation.d.ts.map +1 -1
- package/dist/service-allocation.js +153 -0
- package/dist/validation.d.ts +1 -0
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +1 -0
- package/package.json +5 -5
package/dist/generate-slots.d.ts
CHANGED
|
@@ -10,11 +10,19 @@ export type GenerateAvailabilitySlotsOptions = {
|
|
|
10
10
|
perRuleLimit?: number;
|
|
11
11
|
/** Override "now" for deterministic generation. Defaults to new Date(). */
|
|
12
12
|
now?: Date;
|
|
13
|
+
/**
|
|
14
|
+
* Auto-seed `allocation_resources` for each freshly-created slot from
|
|
15
|
+
* its option's `product_option_resource_templates.default_count`.
|
|
16
|
+
* Templates without `default_count` are still skipped — those need
|
|
17
|
+
* pax-aware materialisation via the admin route. Defaults to true.
|
|
18
|
+
*/
|
|
19
|
+
materializeResources?: boolean;
|
|
13
20
|
};
|
|
14
21
|
export type GenerateAvailabilitySlotsResult = {
|
|
15
22
|
rulesProcessed: number;
|
|
16
23
|
slotsCreated: number;
|
|
17
24
|
slotsSkipped: number;
|
|
25
|
+
resourcesMaterialized: number;
|
|
18
26
|
};
|
|
19
27
|
/**
|
|
20
28
|
* Materialize availability slots from active availability rules.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-slots.d.ts","sourceRoot":"","sources":["../src/generate-slots.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"generate-slots.d.ts","sourceRoot":"","sources":["../src/generate-slots.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAMjE,MAAM,MAAM,gCAAgC,GAAG;IAC7C,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,IAAI,CAAA;IACV;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,kBAAkB,EACtB,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,+BAA+B,CAAC,CA2F1C"}
|
package/dist/generate-slots.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { and, eq, inArray } from "drizzle-orm";
|
|
2
2
|
import { expandRRule } from "./rrule.js";
|
|
3
3
|
import { availabilityRules, availabilitySlots } from "./schema.js";
|
|
4
|
+
import { materializeSlotResourcesFromTemplateDefaults } from "./service-allocation-automation.js";
|
|
4
5
|
/**
|
|
5
6
|
* Materialize availability slots from active availability rules.
|
|
6
7
|
*
|
|
@@ -13,6 +14,7 @@ export async function generateAvailabilitySlots(db, options = {}) {
|
|
|
13
14
|
const defaultStartTime = options.defaultStartTime ?? "09:00";
|
|
14
15
|
const perRuleLimit = options.perRuleLimit ?? 1000;
|
|
15
16
|
const now = options.now ?? new Date();
|
|
17
|
+
const shouldMaterializeResources = options.materializeResources !== false;
|
|
16
18
|
const from = new Date(now);
|
|
17
19
|
from.setUTCHours(0, 0, 0, 0);
|
|
18
20
|
const to = new Date(from);
|
|
@@ -26,6 +28,7 @@ export async function generateAvailabilitySlots(db, options = {}) {
|
|
|
26
28
|
.where(and(...ruleFilters));
|
|
27
29
|
let slotsCreated = 0;
|
|
28
30
|
let slotsSkipped = 0;
|
|
31
|
+
let resourcesMaterialized = 0;
|
|
29
32
|
for (const rule of rules) {
|
|
30
33
|
const dates = expandRRule(rule.recurrenceRule, from, to, perRuleLimit);
|
|
31
34
|
if (dates.length === 0)
|
|
@@ -60,12 +63,24 @@ export async function generateAvailabilitySlots(db, options = {}) {
|
|
|
60
63
|
remainingPax: rule.maxCapacity,
|
|
61
64
|
};
|
|
62
65
|
});
|
|
63
|
-
await db
|
|
64
|
-
|
|
66
|
+
const inserted = await db
|
|
67
|
+
.insert(availabilitySlots)
|
|
68
|
+
.values(rows)
|
|
69
|
+
.returning({ id: availabilitySlots.id, optionId: availabilitySlots.optionId });
|
|
70
|
+
slotsCreated += inserted.length;
|
|
71
|
+
if (shouldMaterializeResources && rule.optionId) {
|
|
72
|
+
for (const created of inserted) {
|
|
73
|
+
if (!created.optionId)
|
|
74
|
+
continue;
|
|
75
|
+
const result = await materializeSlotResourcesFromTemplateDefaults(db, created.id);
|
|
76
|
+
resourcesMaterialized += result.created;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
65
79
|
}
|
|
66
80
|
return {
|
|
67
81
|
rulesProcessed: rules.length,
|
|
68
82
|
slotsCreated,
|
|
69
83
|
slotsSkipped,
|
|
84
|
+
resourcesMaterialized,
|
|
70
85
|
};
|
|
71
86
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export { AVAILABILITY_SLOT_CHANGED_EVENT, type AvailabilitySlotChangedEvent, typ
|
|
|
8
8
|
export { type GenerateAvailabilitySlotsOptions, type GenerateAvailabilitySlotsResult, generateAvailabilitySlots, } from "./generate-slots.js";
|
|
9
9
|
export type { AllocationAuditLog, AllocationResource, AvailabilityCloseout, AvailabilityPickupPoint, AvailabilityRule, AvailabilitySlot, AvailabilitySlotPickup, AvailabilityStartTime, CustomPickupArea, LocationPickupTime, NewAllocationResource, NewAvailabilityCloseout, NewAvailabilityPickupPoint, NewAvailabilityRule, NewAvailabilitySlot, NewAvailabilitySlotPickup, NewAvailabilityStartTime, NewCustomPickupArea, NewLocationPickupTime, NewPickupGroup, NewPickupLocation, NewProductMeetingConfig, NewProductOptionResourceTemplate, PickupGroup, PickupLocation, ProductMeetingConfig, ProductOptionResourceTemplate, SharingGroupLabel, } from "./schema.js";
|
|
10
10
|
export { allocationAuditLog, allocationResources, availabilityCloseouts, availabilityPickupPoints, availabilityRules, availabilitySlotPickups, availabilitySlots, availabilityStartTimes, customPickupAreas, locationPickupTimes, pickupGroups, pickupLocations, productMeetingConfigs, productOptionResourceTemplates, sharingGroupLabels, } from "./schema.js";
|
|
11
|
+
export { getSlotResourceAvailability, getSlotsResourceAvailability, type PlannedAllocation, type ResourceCapacityViolation, type SlotResourceAvailability, validateSlotAllocationCapacity, } from "./service-allocation.js";
|
|
12
|
+
export { type MaterializeSlotResourcesFromTemplatesOptions, materializeSlotResourcesFromTemplateDefaults, } from "./service-allocation-automation.js";
|
|
11
13
|
export { allocationExportFilename, buildAllocationPassengersCsv, buildAllocationRoomingCsv, } from "./service-allocation-exports.js";
|
|
12
14
|
export { allocationAuditLogQuerySchema, allocationAutomationSchema, assignTravelerAllocationSchema, availabilityCloseoutListQuerySchema, availabilityPickupPointListQuerySchema, availabilityRuleListQuerySchema, availabilitySlotListQuerySchema, availabilitySlotPickupListQuerySchema, availabilityStartTimeListQuerySchema, customPickupAreaListQuerySchema, insertAllocationResourceSchema, insertAvailabilityCloseoutSchema, insertAvailabilityPickupPointSchema, insertAvailabilityRuleSchema, insertAvailabilitySlotPickupSchema, insertAvailabilitySlotSchema, insertAvailabilityStartTimeSchema, insertCustomPickupAreaSchema, insertLocationPickupTimeSchema, insertPickupGroupSchema, insertPickupLocationSchema, insertProductMeetingConfigSchema, locationPickupTimeListQuerySchema, pairSharingGroupSchema, pickupGroupListQuerySchema, pickupLocationListQuerySchema, productMeetingConfigListQuerySchema, updateAllocationResourceSchema, updateAvailabilityCloseoutSchema, updateAvailabilityPickupPointSchema, updateAvailabilityRuleSchema, updateAvailabilitySlotPickupSchema, updateAvailabilitySlotSchema, updateAvailabilityStartTimeSchema, updateCustomPickupAreaSchema, updateLocationPickupTimeSchema, updatePickupGroupSchema, updatePickupLocationSchema, updateProductMeetingConfigSchema, updateSharingGroupLabelSchema, updateTravelerSharingGroupSchema, upsertResourceTemplateSchema, } from "./validation.js";
|
|
13
15
|
export { availabilityService };
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE9E,eAAO,MAAM,kBAAkB,EAAE,MAEhC,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,UAIpC,CAAA;AAED,OAAO,EACL,+BAA+B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,GAClC,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,yBAAyB,GAC1B,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,gCAAgC,EAChC,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,8BAA8B,EAC9B,kBAAkB,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,8BAA8B,EAC9B,mCAAmC,EACnC,sCAAsC,EACtC,+BAA+B,EAC/B,+BAA+B,EAC/B,qCAAqC,EACrC,oCAAoC,EACpC,+BAA+B,EAC/B,8BAA8B,EAC9B,gCAAgC,EAChC,mCAAmC,EACnC,4BAA4B,EAC5B,kCAAkC,EAClC,4BAA4B,EAC5B,iCAAiC,EACjC,4BAA4B,EAC5B,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAC1B,gCAAgC,EAChC,iCAAiC,EACjC,sBAAsB,EACtB,0BAA0B,EAC1B,6BAA6B,EAC7B,mCAAmC,EACnC,8BAA8B,EAC9B,gCAAgC,EAChC,mCAAmC,EACnC,4BAA4B,EAC5B,kCAAkC,EAClC,4BAA4B,EAC5B,iCAAiC,EACjC,4BAA4B,EAC5B,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAC1B,gCAAgC,EAChC,6BAA6B,EAC7B,gCAAgC,EAChC,4BAA4B,GAC7B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,mBAAmB,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE9E,eAAO,MAAM,kBAAkB,EAAE,MAEhC,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,UAIpC,CAAA;AAED,OAAO,EACL,+BAA+B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,GAClC,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,yBAAyB,GAC1B,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,gCAAgC,EAChC,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,8BAA8B,EAC9B,kBAAkB,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,8BAA8B,GAC/B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,4CAA4C,EACjD,4CAA4C,GAC7C,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,8BAA8B,EAC9B,mCAAmC,EACnC,sCAAsC,EACtC,+BAA+B,EAC/B,+BAA+B,EAC/B,qCAAqC,EACrC,oCAAoC,EACpC,+BAA+B,EAC/B,8BAA8B,EAC9B,gCAAgC,EAChC,mCAAmC,EACnC,4BAA4B,EAC5B,kCAAkC,EAClC,4BAA4B,EAC5B,iCAAiC,EACjC,4BAA4B,EAC5B,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAC1B,gCAAgC,EAChC,iCAAiC,EACjC,sBAAsB,EACtB,0BAA0B,EAC1B,6BAA6B,EAC7B,mCAAmC,EACnC,8BAA8B,EAC9B,gCAAgC,EAChC,mCAAmC,EACnC,4BAA4B,EAC5B,kCAAkC,EAClC,4BAA4B,EAC5B,iCAAiC,EACjC,4BAA4B,EAC5B,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAC1B,gCAAgC,EAChC,6BAA6B,EAC7B,gCAAgC,EAChC,4BAA4B,GAC7B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,mBAAmB,EAAE,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,8 @@ export const availabilityHonoModule = {
|
|
|
11
11
|
export { AVAILABILITY_SLOT_CHANGED_EVENT, } from "./events.js";
|
|
12
12
|
export { generateAvailabilitySlots, } from "./generate-slots.js";
|
|
13
13
|
export { allocationAuditLog, allocationResources, availabilityCloseouts, availabilityPickupPoints, availabilityRules, availabilitySlotPickups, availabilitySlots, availabilityStartTimes, customPickupAreas, locationPickupTimes, pickupGroups, pickupLocations, productMeetingConfigs, productOptionResourceTemplates, sharingGroupLabels, } from "./schema.js";
|
|
14
|
+
export { getSlotResourceAvailability, getSlotsResourceAvailability, validateSlotAllocationCapacity, } from "./service-allocation.js";
|
|
15
|
+
export { materializeSlotResourcesFromTemplateDefaults, } from "./service-allocation-automation.js";
|
|
14
16
|
export { allocationExportFilename, buildAllocationPassengersCsv, buildAllocationRoomingCsv, } from "./service-allocation-exports.js";
|
|
15
17
|
export { allocationAuditLogQuerySchema, allocationAutomationSchema, assignTravelerAllocationSchema, availabilityCloseoutListQuerySchema, availabilityPickupPointListQuerySchema, availabilityRuleListQuerySchema, availabilitySlotListQuerySchema, availabilitySlotPickupListQuerySchema, availabilityStartTimeListQuerySchema, customPickupAreaListQuerySchema, insertAllocationResourceSchema, insertAvailabilityCloseoutSchema, insertAvailabilityPickupPointSchema, insertAvailabilityRuleSchema, insertAvailabilitySlotPickupSchema, insertAvailabilitySlotSchema, insertAvailabilityStartTimeSchema, insertCustomPickupAreaSchema, insertLocationPickupTimeSchema, insertPickupGroupSchema, insertPickupLocationSchema, insertProductMeetingConfigSchema, locationPickupTimeListQuerySchema, pairSharingGroupSchema, pickupGroupListQuerySchema, pickupLocationListQuerySchema, productMeetingConfigListQuerySchema, updateAllocationResourceSchema, updateAvailabilityCloseoutSchema, updateAvailabilityPickupPointSchema, updateAvailabilityRuleSchema, updateAvailabilitySlotPickupSchema, updateAvailabilitySlotSchema, updateAvailabilityStartTimeSchema, updateCustomPickupAreaSchema, updateLocationPickupTimeSchema, updatePickupGroupSchema, updatePickupLocationSchema, updateProductMeetingConfigSchema, updateSharingGroupLabelSchema, updateTravelerSharingGroupSchema, upsertResourceTemplateSchema, } from "./validation.js";
|
|
16
18
|
export { availabilityService };
|
|
@@ -253,6 +253,7 @@ export declare const availabilityAllocationRoutes: import("hono/hono-base").Hono
|
|
|
253
253
|
capacity: number;
|
|
254
254
|
namePattern: string;
|
|
255
255
|
layout: string | null;
|
|
256
|
+
defaultCount: number | null;
|
|
256
257
|
flags: {
|
|
257
258
|
[x: string]: import("hono/utils/types").JSONValue;
|
|
258
259
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-allocation.d.ts","sourceRoot":"","sources":["../src/routes-allocation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAsC7C,eAAO,MAAM,4BAA4B
|
|
1
|
+
{"version":3,"file":"routes-allocation.d.ts","sourceRoot":"","sources":["../src/routes-allocation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAsC7C,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDA2LrC,CAAA"}
|
package/dist/schema.d.ts
CHANGED
|
@@ -1591,6 +1591,23 @@ export declare const productOptionResourceTemplates: import("drizzle-orm/pg-core
|
|
|
1591
1591
|
identity: undefined;
|
|
1592
1592
|
generated: undefined;
|
|
1593
1593
|
}, {}, {}>;
|
|
1594
|
+
defaultCount: import("drizzle-orm/pg-core").PgColumn<{
|
|
1595
|
+
name: "default_count";
|
|
1596
|
+
tableName: "product_option_resource_templates";
|
|
1597
|
+
dataType: "number";
|
|
1598
|
+
columnType: "PgInteger";
|
|
1599
|
+
data: number;
|
|
1600
|
+
driverParam: string | number;
|
|
1601
|
+
notNull: false;
|
|
1602
|
+
hasDefault: false;
|
|
1603
|
+
isPrimaryKey: false;
|
|
1604
|
+
isAutoincrement: false;
|
|
1605
|
+
hasRuntimeDefault: false;
|
|
1606
|
+
enumValues: undefined;
|
|
1607
|
+
baseColumn: never;
|
|
1608
|
+
identity: undefined;
|
|
1609
|
+
generated: undefined;
|
|
1610
|
+
}, {}, {}>;
|
|
1594
1611
|
flags: import("drizzle-orm/pg-core").PgColumn<{
|
|
1595
1612
|
name: "flags";
|
|
1596
1613
|
tableName: "product_option_resource_templates";
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,0BAA0B,mFAKrC,CAAA;AAEF,eAAO,MAAM,eAAe,yFAI1B,CAAA;AAEF,eAAO,MAAM,mBAAmB,wEAAgE,CAAA;AAEhG,eAAO,MAAM,oBAAoB,2EAG/B,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyB7B,CAAA;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqClC,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2C7B,CAAA;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBjC,CAAA;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuB/B,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK7B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmB9B,CAAA;AAED,eAAO,MAAM,8BAA8B
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
CHANGED
|
@@ -161,6 +161,14 @@ export const productOptionResourceTemplates = pgTable("product_option_resource_t
|
|
|
161
161
|
capacity: integer("capacity").notNull(),
|
|
162
162
|
namePattern: text("name_pattern").notNull(),
|
|
163
163
|
layout: text("layout"),
|
|
164
|
+
/**
|
|
165
|
+
* How many resources to instantiate per slot when auto-materialising
|
|
166
|
+
* from this template (e.g. "5 SGL, 20 DBL"). Null skips the
|
|
167
|
+
* template during slot-publish auto-seed — admins must seed those
|
|
168
|
+
* resources manually or via `autoMaterializeAllocationResources`
|
|
169
|
+
* once bookings exist.
|
|
170
|
+
*/
|
|
171
|
+
defaultCount: integer("default_count"),
|
|
164
172
|
flags: jsonb("flags").$type().notNull().default({}),
|
|
165
173
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
166
174
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
|
@@ -14,6 +14,7 @@ export interface ResourceTemplate {
|
|
|
14
14
|
capacity: number;
|
|
15
15
|
namePattern: string;
|
|
16
16
|
layout: string | null;
|
|
17
|
+
defaultCount: number | null;
|
|
17
18
|
flags: Record<string, unknown>;
|
|
18
19
|
createdAt: string;
|
|
19
20
|
updatedAt: string;
|
|
@@ -43,4 +44,34 @@ export declare function deleteProductOptionResourceTemplate(db: PostgresJsDataba
|
|
|
43
44
|
} | null>;
|
|
44
45
|
export declare function autoMaterializeAllocationResources(db: PostgresJsDatabase, slotId: string, input: AllocationAutomationInput, options?: AllocationMutationOptions): Promise<AllocationAutomationResult>;
|
|
45
46
|
export declare function autoAllocateSlotResources(db: PostgresJsDatabase, slotId: string, input: AllocationAutomationInput, options?: AllocationMutationOptions): Promise<AllocationAutomationResult>;
|
|
47
|
+
export interface MaterializeSlotResourcesFromTemplatesOptions {
|
|
48
|
+
/**
|
|
49
|
+
* Restrict materialisation to a single template kind. When omitted,
|
|
50
|
+
* all templates with a non-null `defaultCount` for the slot's option
|
|
51
|
+
* are seeded.
|
|
52
|
+
*/
|
|
53
|
+
kind?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Skip templates whose `kind` already has resources for the slot.
|
|
56
|
+
* Defaults to true so the helper is safe to call repeatedly during
|
|
57
|
+
* slot generation.
|
|
58
|
+
*/
|
|
59
|
+
skipExisting?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Auto-seed `allocation_resources` for a freshly-published slot from
|
|
63
|
+
* its option's `product_option_resource_templates` rows that declare a
|
|
64
|
+
* `default_count`. Distinct from `autoMaterializeAllocationResources`,
|
|
65
|
+
* which derives counts from existing bookings. Templates without
|
|
66
|
+
* `default_count` are skipped — operators handle those via the admin
|
|
67
|
+
* materialise route once pax is known.
|
|
68
|
+
*
|
|
69
|
+
* Vehicle-seat layouts are out of scope here; use the existing
|
|
70
|
+
* `autoMaterializeAllocationResources` path for those once the slot
|
|
71
|
+
* has bookings (it knows pax-per-option).
|
|
72
|
+
*/
|
|
73
|
+
export declare function materializeSlotResourcesFromTemplateDefaults(db: PostgresJsDatabase, slotId: string, opts?: MaterializeSlotResourcesFromTemplatesOptions): Promise<{
|
|
74
|
+
created: number;
|
|
75
|
+
resources: AllocationResource[];
|
|
76
|
+
}>;
|
|
46
77
|
//# sourceMappingURL=service-allocation-automation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-allocation-automation.d.ts","sourceRoot":"","sources":["../src/service-allocation-automation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQ5B,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,KAAK,yBAAyB,EAK/B,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAA;AAE/F,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAA;AACtF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAMlF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,gBAAgB,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAA;CACjC;AAED,wBAAsB,kCAAkC,CACtD,EAAE,EAAE,kBAAkB,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAyC3C;AAED,wBAAsB,mCAAmC,CACvD,EAAE,EAAE,kBAAkB,EACtB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"service-allocation-automation.d.ts","sourceRoot":"","sources":["../src/service-allocation-automation.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export async function listProductOptionResourceTemplates(db, productId) {
|
|
|
13
13
|
return [];
|
|
14
14
|
const optionIds = optionRows.map((row) => row.id);
|
|
15
15
|
const templateRows = await executeRows(db, sql `
|
|
16
|
-
SELECT id, product_option_id, kind, ref_type, ref_id, capacity, name_pattern, layout, flags, created_at, updated_at
|
|
16
|
+
SELECT id, product_option_id, kind, ref_type, ref_id, capacity, name_pattern, layout, default_count, flags, created_at, updated_at
|
|
17
17
|
FROM product_option_resource_templates
|
|
18
18
|
WHERE product_option_id = ANY(${optionIds}::text[])
|
|
19
19
|
ORDER BY kind, created_at
|
|
@@ -47,6 +47,7 @@ export async function upsertProductOptionResourceTemplate(db, productId, product
|
|
|
47
47
|
capacity: input.capacity,
|
|
48
48
|
namePattern: input.namePattern,
|
|
49
49
|
layout: input.layout ?? null,
|
|
50
|
+
defaultCount: input.defaultCount ?? null,
|
|
50
51
|
flags: input.flags ?? {},
|
|
51
52
|
})
|
|
52
53
|
.onConflictDoUpdate({
|
|
@@ -57,6 +58,7 @@ export async function upsertProductOptionResourceTemplate(db, productId, product
|
|
|
57
58
|
capacity: input.capacity,
|
|
58
59
|
namePattern: input.namePattern,
|
|
59
60
|
layout: input.layout ?? null,
|
|
61
|
+
defaultCount: input.defaultCount ?? null,
|
|
60
62
|
flags: input.flags ?? {},
|
|
61
63
|
updatedAt: new Date(),
|
|
62
64
|
},
|
|
@@ -73,6 +75,7 @@ export async function upsertProductOptionResourceTemplate(db, productId, product
|
|
|
73
75
|
capacity: row.capacity,
|
|
74
76
|
namePattern: row.namePattern,
|
|
75
77
|
layout: row.layout,
|
|
78
|
+
defaultCount: row.defaultCount,
|
|
76
79
|
flags: row.flags,
|
|
77
80
|
createdAt: row.createdAt.toISOString(),
|
|
78
81
|
updatedAt: row.updatedAt.toISOString(),
|
|
@@ -245,6 +248,75 @@ export async function autoAllocateSlotResources(db, slotId, input, options = {})
|
|
|
245
248
|
});
|
|
246
249
|
return { kind, assigned: plan.assignments.length, skipped: plan.skipped };
|
|
247
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* Auto-seed `allocation_resources` for a freshly-published slot from
|
|
253
|
+
* its option's `product_option_resource_templates` rows that declare a
|
|
254
|
+
* `default_count`. Distinct from `autoMaterializeAllocationResources`,
|
|
255
|
+
* which derives counts from existing bookings. Templates without
|
|
256
|
+
* `default_count` are skipped — operators handle those via the admin
|
|
257
|
+
* materialise route once pax is known.
|
|
258
|
+
*
|
|
259
|
+
* Vehicle-seat layouts are out of scope here; use the existing
|
|
260
|
+
* `autoMaterializeAllocationResources` path for those once the slot
|
|
261
|
+
* has bookings (it knows pax-per-option).
|
|
262
|
+
*/
|
|
263
|
+
export async function materializeSlotResourcesFromTemplateDefaults(db, slotId, opts = {}) {
|
|
264
|
+
const [slot] = await db
|
|
265
|
+
.select({ id: availabilitySlots.id, optionId: availabilitySlots.optionId })
|
|
266
|
+
.from(availabilitySlots)
|
|
267
|
+
.where(eq(availabilitySlots.id, slotId))
|
|
268
|
+
.limit(1);
|
|
269
|
+
if (!slot?.optionId)
|
|
270
|
+
return { created: 0, resources: [] };
|
|
271
|
+
const templateConditions = [eq(productOptionResourceTemplates.productOptionId, slot.optionId)];
|
|
272
|
+
if (opts.kind) {
|
|
273
|
+
templateConditions.push(eq(productOptionResourceTemplates.kind, opts.kind));
|
|
274
|
+
}
|
|
275
|
+
const templates = await db
|
|
276
|
+
.select()
|
|
277
|
+
.from(productOptionResourceTemplates)
|
|
278
|
+
.where(and(...templateConditions))
|
|
279
|
+
.orderBy(productOptionResourceTemplates.kind, productOptionResourceTemplates.createdAt);
|
|
280
|
+
if (templates.length === 0)
|
|
281
|
+
return { created: 0, resources: [] };
|
|
282
|
+
const skipExisting = opts.skipExisting !== false;
|
|
283
|
+
const existing = skipExisting
|
|
284
|
+
? await executeRows(db, sql `SELECT DISTINCT kind FROM allocation_resources WHERE slot_id = ${slotId}`)
|
|
285
|
+
: [];
|
|
286
|
+
const existingKinds = new Set(existing.map((row) => row.kind));
|
|
287
|
+
const resources = [];
|
|
288
|
+
let sequence = 0;
|
|
289
|
+
for (const template of templates) {
|
|
290
|
+
if (template.defaultCount == null || template.defaultCount <= 0)
|
|
291
|
+
continue;
|
|
292
|
+
if (template.kind === "vehicle_seat")
|
|
293
|
+
continue;
|
|
294
|
+
if (skipExisting && existingKinds.has(template.kind))
|
|
295
|
+
continue;
|
|
296
|
+
for (let index = 0; index < template.defaultCount; index++) {
|
|
297
|
+
sequence += 1;
|
|
298
|
+
const [row] = await db
|
|
299
|
+
.insert(allocationResources)
|
|
300
|
+
.values({
|
|
301
|
+
slotId,
|
|
302
|
+
kind: template.kind,
|
|
303
|
+
refType: template.refType,
|
|
304
|
+
refId: template.refId,
|
|
305
|
+
label: renderNamePattern(template.namePattern, {
|
|
306
|
+
sequence: String(sequence),
|
|
307
|
+
index: String(index + 1),
|
|
308
|
+
}),
|
|
309
|
+
capacity: template.capacity,
|
|
310
|
+
flags: { ...(template.flags ?? {}), templateOptionId: template.productOptionId },
|
|
311
|
+
sortOrder: sequence,
|
|
312
|
+
})
|
|
313
|
+
.returning();
|
|
314
|
+
if (row)
|
|
315
|
+
resources.push(row);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return { created: resources.length, resources };
|
|
319
|
+
}
|
|
248
320
|
async function materializeVehicleSeatGroup(db, slotId, group, startingSequence) {
|
|
249
321
|
const layout = group.layout ?? "2-2";
|
|
250
322
|
const seatsPerRow = parseLayoutSeatsPerRow(layout);
|
|
@@ -324,6 +396,7 @@ function toResourceTemplate(row) {
|
|
|
324
396
|
capacity: row.capacity,
|
|
325
397
|
namePattern: row.name_pattern,
|
|
326
398
|
layout: row.layout,
|
|
399
|
+
defaultCount: row.default_count ?? null,
|
|
327
400
|
flags: row.flags ?? {},
|
|
328
401
|
createdAt: new Date(row.created_at).toISOString(),
|
|
329
402
|
updatedAt: new Date(row.updated_at).toISOString(),
|
|
@@ -85,6 +85,62 @@ export declare function listAllocationResources(db: PostgresJsDatabase, slotId:
|
|
|
85
85
|
createdAt: Date;
|
|
86
86
|
updatedAt: Date;
|
|
87
87
|
}[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Per-resource availability summary for a single slot: capacity, how
|
|
90
|
+
* many travelers are currently assigned to that resource (across all
|
|
91
|
+
* live bookings on the slot), and the resulting remaining headroom.
|
|
92
|
+
* The summary is consumer-facing — `assigned` is the same DISTINCT-
|
|
93
|
+
* traveler count `countResourceOccupants` uses internally, so the
|
|
94
|
+
* read-side and the per-traveler assignment guardrail agree.
|
|
95
|
+
*
|
|
96
|
+
* Returned in (kind, sortOrder, createdAt) order so consumers can
|
|
97
|
+
* render rooming grids without resorting.
|
|
98
|
+
*/
|
|
99
|
+
export interface SlotResourceAvailability {
|
|
100
|
+
id: string;
|
|
101
|
+
slotId: string;
|
|
102
|
+
kind: string;
|
|
103
|
+
label: string | null;
|
|
104
|
+
refType: string | null;
|
|
105
|
+
refId: string | null;
|
|
106
|
+
parentId: string | null;
|
|
107
|
+
capacity: number;
|
|
108
|
+
assigned: number;
|
|
109
|
+
available: number;
|
|
110
|
+
flags: Record<string, unknown>;
|
|
111
|
+
sortOrder: number;
|
|
112
|
+
}
|
|
113
|
+
export declare function getSlotResourceAvailability(db: PostgresJsDatabase, slotId: string): Promise<SlotResourceAvailability[]>;
|
|
114
|
+
export declare function getSlotsResourceAvailability(db: PostgresJsDatabase, slotIds: string[]): Promise<Map<string, SlotResourceAvailability[]>>;
|
|
115
|
+
export interface PlannedAllocation {
|
|
116
|
+
/** Traveler id whose allocation is being planned. */
|
|
117
|
+
travelerId: string;
|
|
118
|
+
/** Resource kind, e.g. "room" or "vehicle_seat". */
|
|
119
|
+
kind: string;
|
|
120
|
+
/** Resource id the traveler is being assigned to. */
|
|
121
|
+
resourceId: string;
|
|
122
|
+
}
|
|
123
|
+
export interface ResourceCapacityViolation {
|
|
124
|
+
slotId: string;
|
|
125
|
+
resourceId: string;
|
|
126
|
+
kind: string;
|
|
127
|
+
capacity: number;
|
|
128
|
+
existingAssigned: number;
|
|
129
|
+
requested: number;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Validate that a batch of planned traveler→resource assignments fits
|
|
133
|
+
* inside the per-resource capacity of the given slot. Read-only —
|
|
134
|
+
* callers run this before persisting so they can surface
|
|
135
|
+
* `resource_capacity_exhausted` with the offending resource cited.
|
|
136
|
+
*
|
|
137
|
+
* Travelers in `planned` are deduped per (kind, resourceId) so the
|
|
138
|
+
* caller can pass the full booking payload (one row per traveler)
|
|
139
|
+
* without inflating the count. Existing usage already credited to a
|
|
140
|
+
* traveler being re-planned is excluded so re-saving the same payload
|
|
141
|
+
* is idempotent.
|
|
142
|
+
*/
|
|
143
|
+
export declare function validateSlotAllocationCapacity(db: PostgresJsDatabase, slotId: string, planned: PlannedAllocation[]): Promise<ResourceCapacityViolation[]>;
|
|
88
144
|
export declare function createAllocationResource(db: PostgresJsDatabase, slotId: string, input: CreateAllocationResourceInput, options?: AllocationMutationOptions): Promise<{
|
|
89
145
|
id: string;
|
|
90
146
|
createdAt: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-allocation.d.ts","sourceRoot":"","sources":["../src/service-allocation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service-allocation.d.ts","sourceRoot":"","sources":["../src/service-allocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -110,6 +110,159 @@ export async function listAllocationResources(db, slotId) {
|
|
|
110
110
|
.where(eq(allocationResources.slotId, slotId))
|
|
111
111
|
.orderBy(asc(allocationResources.kind), asc(allocationResources.sortOrder), asc(allocationResources.createdAt));
|
|
112
112
|
}
|
|
113
|
+
export async function getSlotResourceAvailability(db, slotId) {
|
|
114
|
+
const map = await getSlotsResourceAvailability(db, [slotId]);
|
|
115
|
+
return map.get(slotId) ?? [];
|
|
116
|
+
}
|
|
117
|
+
export async function getSlotsResourceAvailability(db, slotIds) {
|
|
118
|
+
const uniqueIds = [...new Set(slotIds)].filter(Boolean);
|
|
119
|
+
if (uniqueIds.length === 0)
|
|
120
|
+
return new Map();
|
|
121
|
+
const rows = await executeRows(db, sql `
|
|
122
|
+
SELECT
|
|
123
|
+
ar.id,
|
|
124
|
+
ar.slot_id,
|
|
125
|
+
ar.kind,
|
|
126
|
+
ar.label,
|
|
127
|
+
ar.ref_type,
|
|
128
|
+
ar.ref_id,
|
|
129
|
+
ar.parent_id,
|
|
130
|
+
ar.capacity,
|
|
131
|
+
COALESCE(usage.assigned, 0)::int AS assigned,
|
|
132
|
+
ar.flags,
|
|
133
|
+
ar.sort_order
|
|
134
|
+
FROM allocation_resources ar
|
|
135
|
+
LEFT JOIN LATERAL (
|
|
136
|
+
SELECT COUNT(DISTINCT btd.traveler_id)::int AS assigned
|
|
137
|
+
FROM booking_traveler_travel_details btd
|
|
138
|
+
JOIN booking_travelers bt ON bt.id = btd.traveler_id
|
|
139
|
+
JOIN booking_allocations ba ON ba.booking_id = bt.booking_id
|
|
140
|
+
JOIN bookings b ON b.id = bt.booking_id
|
|
141
|
+
WHERE btd.allocations ->> ar.kind = ar.id
|
|
142
|
+
AND ba.availability_slot_id = ar.slot_id
|
|
143
|
+
AND b.status IN ('draft', 'on_hold', 'confirmed', 'in_progress', 'completed')
|
|
144
|
+
AND ba.status IN ('held', 'confirmed', 'fulfilled')
|
|
145
|
+
) usage ON true
|
|
146
|
+
WHERE ar.slot_id = ANY(${uniqueIds}::text[])
|
|
147
|
+
ORDER BY ar.slot_id, ar.kind, ar.sort_order, ar.created_at
|
|
148
|
+
`);
|
|
149
|
+
const out = new Map();
|
|
150
|
+
for (const row of rows) {
|
|
151
|
+
const capacity = row.capacity;
|
|
152
|
+
const assigned = row.assigned ?? 0;
|
|
153
|
+
const list = out.get(row.slot_id) ?? [];
|
|
154
|
+
list.push({
|
|
155
|
+
id: row.id,
|
|
156
|
+
slotId: row.slot_id,
|
|
157
|
+
kind: row.kind,
|
|
158
|
+
label: row.label,
|
|
159
|
+
refType: row.ref_type,
|
|
160
|
+
refId: row.ref_id,
|
|
161
|
+
parentId: row.parent_id,
|
|
162
|
+
capacity,
|
|
163
|
+
assigned,
|
|
164
|
+
available: Math.max(0, capacity - assigned),
|
|
165
|
+
flags: row.flags ?? {},
|
|
166
|
+
sortOrder: row.sort_order,
|
|
167
|
+
});
|
|
168
|
+
out.set(row.slot_id, list);
|
|
169
|
+
}
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Validate that a batch of planned traveler→resource assignments fits
|
|
174
|
+
* inside the per-resource capacity of the given slot. Read-only —
|
|
175
|
+
* callers run this before persisting so they can surface
|
|
176
|
+
* `resource_capacity_exhausted` with the offending resource cited.
|
|
177
|
+
*
|
|
178
|
+
* Travelers in `planned` are deduped per (kind, resourceId) so the
|
|
179
|
+
* caller can pass the full booking payload (one row per traveler)
|
|
180
|
+
* without inflating the count. Existing usage already credited to a
|
|
181
|
+
* traveler being re-planned is excluded so re-saving the same payload
|
|
182
|
+
* is idempotent.
|
|
183
|
+
*/
|
|
184
|
+
export async function validateSlotAllocationCapacity(db, slotId, planned) {
|
|
185
|
+
if (planned.length === 0)
|
|
186
|
+
return [];
|
|
187
|
+
const byResource = new Map();
|
|
188
|
+
for (const entry of planned) {
|
|
189
|
+
if (!entry.resourceId || !entry.kind)
|
|
190
|
+
continue;
|
|
191
|
+
const bucket = byResource.get(entry.resourceId) ?? {
|
|
192
|
+
kind: entry.kind,
|
|
193
|
+
travelerIds: new Set(),
|
|
194
|
+
};
|
|
195
|
+
bucket.travelerIds.add(entry.travelerId);
|
|
196
|
+
byResource.set(entry.resourceId, bucket);
|
|
197
|
+
}
|
|
198
|
+
if (byResource.size === 0)
|
|
199
|
+
return [];
|
|
200
|
+
const resourceIds = [...byResource.keys()];
|
|
201
|
+
// Lock the targeted rows so a concurrent caller cannot pass the
|
|
202
|
+
// same check before this one persists. Callers must run inside a
|
|
203
|
+
// transaction for the lock to span until commit; outside one this
|
|
204
|
+
// is the same race as before, but the helper at least documents
|
|
205
|
+
// the contract.
|
|
206
|
+
const resources = await executeRows(db, sql `
|
|
207
|
+
SELECT id, kind, capacity, slot_id
|
|
208
|
+
FROM allocation_resources
|
|
209
|
+
WHERE slot_id = ${slotId} AND id = ANY(${resourceIds}::text[])
|
|
210
|
+
FOR UPDATE
|
|
211
|
+
`);
|
|
212
|
+
const resourceById = new Map(resources.map((r) => [r.id, r]));
|
|
213
|
+
const violations = [];
|
|
214
|
+
for (const [resourceId, plan] of byResource) {
|
|
215
|
+
const resource = resourceById.get(resourceId);
|
|
216
|
+
if (!resource) {
|
|
217
|
+
violations.push({
|
|
218
|
+
slotId,
|
|
219
|
+
resourceId,
|
|
220
|
+
kind: plan.kind,
|
|
221
|
+
capacity: 0,
|
|
222
|
+
existingAssigned: 0,
|
|
223
|
+
requested: plan.travelerIds.size,
|
|
224
|
+
});
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (resource.kind !== plan.kind) {
|
|
228
|
+
violations.push({
|
|
229
|
+
slotId,
|
|
230
|
+
resourceId,
|
|
231
|
+
kind: plan.kind,
|
|
232
|
+
capacity: resource.capacity,
|
|
233
|
+
existingAssigned: 0,
|
|
234
|
+
requested: plan.travelerIds.size,
|
|
235
|
+
});
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
const travelerIdsArr = [...plan.travelerIds];
|
|
239
|
+
const existingRows = await executeRows(db, sql `
|
|
240
|
+
SELECT COUNT(DISTINCT btd.traveler_id)::int AS count
|
|
241
|
+
FROM booking_traveler_travel_details btd
|
|
242
|
+
JOIN booking_travelers bt ON bt.id = btd.traveler_id
|
|
243
|
+
JOIN booking_allocations ba ON ba.booking_id = bt.booking_id
|
|
244
|
+
JOIN bookings b ON b.id = bt.booking_id
|
|
245
|
+
WHERE btd.allocations ->> ${plan.kind} = ${resourceId}
|
|
246
|
+
AND ba.availability_slot_id = ${slotId}
|
|
247
|
+
AND b.status IN ('draft', 'on_hold', 'confirmed', 'in_progress', 'completed')
|
|
248
|
+
AND ba.status IN ('held', 'confirmed', 'fulfilled')
|
|
249
|
+
AND btd.traveler_id <> ALL(${travelerIdsArr}::text[])
|
|
250
|
+
`);
|
|
251
|
+
const existingAssigned = existingRows[0]?.count ?? 0;
|
|
252
|
+
const total = existingAssigned + plan.travelerIds.size;
|
|
253
|
+
if (total > resource.capacity) {
|
|
254
|
+
violations.push({
|
|
255
|
+
slotId,
|
|
256
|
+
resourceId,
|
|
257
|
+
kind: plan.kind,
|
|
258
|
+
capacity: resource.capacity,
|
|
259
|
+
existingAssigned,
|
|
260
|
+
requested: plan.travelerIds.size,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return violations;
|
|
265
|
+
}
|
|
113
266
|
export async function createAllocationResource(db, slotId, input, options = {}) {
|
|
114
267
|
const [slot] = await db
|
|
115
268
|
.select({ id: availabilitySlots.id })
|
package/dist/validation.d.ts
CHANGED
|
@@ -303,6 +303,7 @@ export declare const upsertResourceTemplateSchema: z.ZodObject<{
|
|
|
303
303
|
refType: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
304
304
|
refId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
305
305
|
layout: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
306
|
+
defaultCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
306
307
|
flags: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
307
308
|
}, z.core.$strip>;
|
|
308
309
|
export declare const allocationAutomationSchema: z.ZodObject<{
|
package/dist/validation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAOvB,eAAO,MAAM,4BAA4B;;;;;EAAsD,CAAA;AAC/F,eAAO,MAAM,iBAAiB;;;;EAA4D,CAAA;AAC1F,eAAO,MAAM,qBAAqB;;;;EAA2C,CAAA;AAC7E,eAAO,MAAM,sBAAsB;;;EAA8C,CAAA;AACjF,eAAO,MAAM,4BAA4B,aAAmC,CAAA;AAC5E,eAAO,MAAM,6BAA6B,wCAAoC,CAAA;AAC9E,eAAO,MAAM,2BAA2B,uCAAmC,CAAA;AAK3E,eAAO,MAAM,0BAA0B;;;;;;;;;;;;iBAYrC,CAAA;AAEF,eAAO,MAAM,4BAA4B;;;;;;;;;;;;iBAA6B,CAAA;AACtE,eAAO,MAAM,4BAA4B;;;;;;;;;;;;iBAAuC,CAAA;AAChF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;iBAK1C,CAAA;AAEF,eAAO,MAAM,+BAA+B;;;;;;;;;iBAS1C,CAAA;AAEF,eAAO,MAAM,iCAAiC;;;;;;;;;iBAAkC,CAAA;AAChF,eAAO,MAAM,iCAAiC;;;;;;;;;iBAA4C,CAAA;AAC1F,eAAO,MAAM,oCAAoC;;;;;;;;;;;;iBAK/C,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuBrC,CAAA;AAEF,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA6B,CAAA;AACtE,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAuC,CAAA;AAChF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;iBAU1C,CAAA;AAEF,eAAO,MAAM,iCAAiC;;;iBAG5C,CAAA;AAEF,eAAO,MAAM,8BAA8B;;;;;;iBAMzC,CAAA;AAEF,eAAO,MAAM,gCAAgC;;;;;;iBAAiC,CAAA;AAC9E,eAAO,MAAM,gCAAgC;;;;;;iBAA2C,CAAA;AACxF,eAAO,MAAM,mCAAmC;;;;;;iBAI9C,CAAA;AAEF,eAAO,MAAM,4BAA4B;;;;;;;;;iBASvC,CAAA;AAEF,eAAO,MAAM,8BAA8B;;;;;;;;;iBAA+B,CAAA;AAC1E,eAAO,MAAM,8BAA8B;;;;;;;;kBAMvC,CAAA;AAEJ,eAAO,MAAM,8BAA8B;;;iBAGzC,CAAA;AAEF,eAAO,MAAM,gCAAgC;;iBAE3C,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAA;AAEF,eAAO,MAAM,6BAA6B;;iBAExC,CAAA;AAEF,eAAO,MAAM,4BAA4B
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/validation.js
CHANGED
|
@@ -145,6 +145,7 @@ export const upsertResourceTemplateSchema = z.object({
|
|
|
145
145
|
refType: z.string().trim().min(1).nullable().optional(),
|
|
146
146
|
refId: z.string().trim().min(1).nullable().optional(),
|
|
147
147
|
layout: z.string().trim().min(1).nullable().optional(),
|
|
148
|
+
defaultCount: z.number().int().min(0).nullable().optional(),
|
|
148
149
|
flags: allocationResourceFlagsSchema.default({}),
|
|
149
150
|
});
|
|
150
151
|
export const allocationAutomationSchema = z.object({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/availability",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.51.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -44,13 +44,13 @@
|
|
|
44
44
|
"drizzle-orm": "^0.45.2",
|
|
45
45
|
"hono": "^4.12.10",
|
|
46
46
|
"zod": "^4.3.6",
|
|
47
|
-
"@voyantjs/core": "0.
|
|
48
|
-
"@voyantjs/db": "0.
|
|
49
|
-
"@voyantjs/hono": "0.
|
|
47
|
+
"@voyantjs/core": "0.51.0",
|
|
48
|
+
"@voyantjs/db": "0.51.0",
|
|
49
|
+
"@voyantjs/hono": "0.51.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"typescript": "^6.0.2",
|
|
53
|
-
"@voyantjs/products": "0.
|
|
53
|
+
"@voyantjs/products": "0.51.0",
|
|
54
54
|
"@voyantjs/voyant-typescript-config": "0.1.0"
|
|
55
55
|
},
|
|
56
56
|
"files": [
|