@voyantjs/availability 0.70.0 → 0.73.1

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/index.d.ts CHANGED
@@ -11,6 +11,6 @@ export { allocationAuditLog, allocationResources, availabilityCloseouts, availab
11
11
  export { getSlotResourceAvailability, getSlotsResourceAvailability, type PlannedAllocation, type ResourceCapacityViolation, type SlotResourceAvailability, validateSlotAllocationCapacity, } from "./service-allocation.js";
12
12
  export { type MaterializeSlotResourcesFromTemplatesOptions, materializeSlotResourcesFromTemplateDefaults, } from "./service-allocation-automation.js";
13
13
  export { allocationExportFilename, buildAllocationPassengersCsv, buildAllocationRoomingCsv, } from "./service-allocation-exports.js";
14
- export { allocationAuditLogQuerySchema, allocationAutomationSchema, assignTravelerAllocationSchema, availabilityCloseoutListQuerySchema, availabilityOverviewQuerySchema, 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";
14
+ export { allocationAuditLogQuerySchema, allocationAutomationSchema, assignTravelerAllocationSchema, availabilityCloseoutListQuerySchema, availabilityOverviewQuerySchema, availabilityPickupPointListQuerySchema, availabilityRuleListQuerySchema, availabilitySlotListQuerySchema, availabilitySlotPickupListQuerySchema, availabilityStartTimeListQuerySchema, customPickupAreaListQuerySchema, insertAllocationResourceSchema, insertAvailabilityCloseoutSchema, insertAvailabilityPickupPointSchema, insertAvailabilityRuleSchema, insertAvailabilitySlotPickupSchema, insertAvailabilitySlotSchema, insertAvailabilityStartTimeSchema, insertCustomPickupAreaSchema, insertLocationPickupTimeSchema, insertPickupGroupSchema, insertPickupLocationSchema, insertProductMeetingConfigSchema, locationPickupTimeListQuerySchema, pairSharingGroupSchema, pickupGroupListQuerySchema, pickupLocationListQuerySchema, productMeetingConfigListQuerySchema, type SeatLayoutCell, type SeatLayoutSpec, seatLayoutCellSchema, seatLayoutSpecSchema, updateAllocationResourceSchema, updateAvailabilityCloseoutSchema, updateAvailabilityPickupPointSchema, updateAvailabilityRuleSchema, updateAvailabilitySlotPickupSchema, updateAvailabilitySlotSchema, updateAvailabilityStartTimeSchema, updateCustomPickupAreaSchema, updateLocationPickupTimeSchema, updatePickupGroupSchema, updatePickupLocationSchema, updateProductMeetingConfigSchema, updateSharingGroupLabelSchema, updateTravelerSharingGroupSchema, upsertResourceTemplateSchema, } from "./validation.js";
15
15
  export { availabilityService };
16
16
  //# sourceMappingURL=index.d.ts.map
@@ -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,MAGhC,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,+BAA+B,EAC/B,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,MAGhC,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,+BAA+B,EAC/B,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,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,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
@@ -15,5 +15,5 @@ export { allocationAuditLog, allocationResources, availabilityCloseouts, availab
15
15
  export { getSlotResourceAvailability, getSlotsResourceAvailability, validateSlotAllocationCapacity, } from "./service-allocation.js";
16
16
  export { materializeSlotResourcesFromTemplateDefaults, } from "./service-allocation-automation.js";
17
17
  export { allocationExportFilename, buildAllocationPassengersCsv, buildAllocationRoomingCsv, } from "./service-allocation-exports.js";
18
- export { allocationAuditLogQuerySchema, allocationAutomationSchema, assignTravelerAllocationSchema, availabilityCloseoutListQuerySchema, availabilityOverviewQuerySchema, 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";
18
+ export { allocationAuditLogQuerySchema, allocationAutomationSchema, assignTravelerAllocationSchema, availabilityCloseoutListQuerySchema, availabilityOverviewQuerySchema, availabilityPickupPointListQuerySchema, availabilityRuleListQuerySchema, availabilitySlotListQuerySchema, availabilitySlotPickupListQuerySchema, availabilityStartTimeListQuerySchema, customPickupAreaListQuerySchema, insertAllocationResourceSchema, insertAvailabilityCloseoutSchema, insertAvailabilityPickupPointSchema, insertAvailabilityRuleSchema, insertAvailabilitySlotPickupSchema, insertAvailabilitySlotSchema, insertAvailabilityStartTimeSchema, insertCustomPickupAreaSchema, insertLocationPickupTimeSchema, insertPickupGroupSchema, insertPickupLocationSchema, insertProductMeetingConfigSchema, locationPickupTimeListQuerySchema, pairSharingGroupSchema, pickupGroupListQuerySchema, pickupLocationListQuerySchema, productMeetingConfigListQuerySchema, seatLayoutCellSchema, seatLayoutSpecSchema, updateAllocationResourceSchema, updateAvailabilityCloseoutSchema, updateAvailabilityPickupPointSchema, updateAvailabilityRuleSchema, updateAvailabilitySlotPickupSchema, updateAvailabilitySlotSchema, updateAvailabilityStartTimeSchema, updateCustomPickupAreaSchema, updateLocationPickupTimeSchema, updatePickupGroupSchema, updatePickupLocationSchema, updateProductMeetingConfigSchema, updateSharingGroupLabelSchema, updateTravelerSharingGroupSchema, upsertResourceTemplateSchema, } from "./validation.js";
19
19
  export { availabilityService };
@@ -2,7 +2,7 @@ import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
2
2
  import type { z } from "zod";
3
3
  import { type AllocationResource } from "./schema.js";
4
4
  import { type AllocationMutationOptions } from "./service-allocation.js";
5
- import type { allocationAutomationSchema, upsertResourceTemplateSchema } from "./validation.js";
5
+ import { type allocationAutomationSchema, type SeatLayoutCell, type SeatLayoutSpec, type upsertResourceTemplateSchema } from "./validation.js";
6
6
  export type UpsertResourceTemplateInput = z.infer<typeof upsertResourceTemplateSchema>;
7
7
  export type AllocationAutomationInput = z.infer<typeof allocationAutomationSchema>;
8
8
  export interface ResourceTemplate {
@@ -74,4 +74,16 @@ export declare function materializeSlotResourcesFromTemplateDefaults(db: Postgre
74
74
  created: number;
75
75
  resources: AllocationResource[];
76
76
  }>;
77
+ export declare function parseLayoutSpecFromFlags(flags: Record<string, unknown> | null): SeatLayoutSpec | null;
78
+ /**
79
+ * Derive window/aisle/middle from a seat's neighbours in the same row.
80
+ *
81
+ * - Touching an aisle or door cell → "aisle" (the seat is on the aisle side)
82
+ * - Touching the row boundary or a void cell → "window"
83
+ * - Surrounded by other seats → "middle"
84
+ *
85
+ * Aisle takes precedence so the "window" tag is reserved for actual outer
86
+ * seats; a 2-1 row's lone middle seat ends up "aisle" on both sides.
87
+ */
88
+ export declare function positionFromCells(cells: ReadonlyArray<SeatLayoutCell>, index: number): "window" | "aisle" | "middle";
77
89
  //# 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":"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"}
1
+ {"version":3,"file":"service-allocation-automation.d.ts","sourceRoot":"","sources":["../src/service-allocation-automation.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { and, eq, sql } from "drizzle-orm";
2
2
  import { planRoomAllocation, planVehicleSeatAllocation, } from "./auto-allocator.js";
3
3
  import { allocationResources, availabilitySlots, productOptionResourceTemplates, } from "./schema.js";
4
4
  import { AllocationServiceError, getSlotAllocationManifest, recordAllocationAudit, } from "./service-allocation.js";
5
+ import { seatLayoutSpecSchema, } from "./validation.js";
5
6
  /**
6
7
  * Emit `ARRAY[$1, $2, …]::text[]` so Postgres doesn't try to cast a
7
8
  * tuple to `text[]`. See `sqlTextArray` in service-allocation.ts and
@@ -334,6 +335,10 @@ export async function materializeSlotResourcesFromTemplateDefaults(db, slotId, o
334
335
  return { created: resources.length, resources };
335
336
  }
336
337
  async function materializeVehicleSeatGroup(db, slotId, group, startingSequence) {
338
+ const layoutSpec = parseLayoutSpecFromFlags(group.flags);
339
+ if (layoutSpec) {
340
+ return materializeVehicleSeatGroupFromSpec(db, slotId, group, startingSequence, layoutSpec);
341
+ }
337
342
  const layout = group.layout ?? "2-2";
338
343
  const seatsPerRow = parseLayoutSeatsPerRow(layout);
339
344
  const vehiclesNeeded = Math.max(1, Math.ceil(group.pax_count / Math.max(1, group.capacity)));
@@ -402,6 +407,114 @@ async function materializeVehicleSeatGroup(db, slotId, group, startingSequence)
402
407
  }
403
408
  return { resources, vehicleCount: vehiclesNeeded };
404
409
  }
410
+ /**
411
+ * Materialize using an explicit 2D layoutSpec. Each row's seat cells become
412
+ * a vehicle_seat (skipping aisle/door/void). Window/aisle/middle is computed
413
+ * from neighbouring cells, so a coach door in the middle row collapses to a
414
+ * gap on the visual map (renderer side) without affecting seat numbering.
415
+ */
416
+ async function materializeVehicleSeatGroupFromSpec(db, slotId, group, startingSequence, layoutSpec) {
417
+ const seatsPerVehicle = layoutSpec.rows.reduce((sum, row) => sum + row.cells.filter((cell) => cell === "seat").length, 0);
418
+ if (seatsPerVehicle === 0)
419
+ return { resources: [], vehicleCount: 0 };
420
+ const vehiclesNeeded = Math.max(1, Math.ceil(group.pax_count / seatsPerVehicle));
421
+ const resources = [];
422
+ let sequence = startingSequence;
423
+ for (let vehicleIndex = 0; vehicleIndex < vehiclesNeeded; vehicleIndex++) {
424
+ sequence += 1;
425
+ const [parent] = await db
426
+ .insert(allocationResources)
427
+ .values({
428
+ slotId,
429
+ kind: "vehicle",
430
+ refType: group.ref_type,
431
+ refId: group.ref_id,
432
+ label: renderNamePattern(group.name_pattern || "Vehicle {sequence}", {
433
+ sequence: String(sequence),
434
+ option: group.option_name ?? "",
435
+ index: String(vehicleIndex + 1),
436
+ }),
437
+ capacity: seatsPerVehicle,
438
+ flags: {
439
+ ...(group.flags ?? {}),
440
+ layoutSpec,
441
+ templateOptionId: group.option_id,
442
+ },
443
+ sortOrder: sequence,
444
+ })
445
+ .returning();
446
+ if (!parent)
447
+ continue;
448
+ resources.push(parent);
449
+ let seatIndex = 0;
450
+ for (let rowIndex = 0; rowIndex < layoutSpec.rows.length; rowIndex++) {
451
+ const rowCells = layoutSpec.rows[rowIndex]?.cells ?? [];
452
+ const rowNumber = rowIndex + 1;
453
+ let column = 0;
454
+ for (let cellIndex = 0; cellIndex < rowCells.length; cellIndex++) {
455
+ const cell = rowCells[cellIndex];
456
+ if (cell !== "seat")
457
+ continue;
458
+ column += 1;
459
+ const columnName = columnLetter(column);
460
+ const position = positionFromCells(rowCells, cellIndex);
461
+ const [seat] = await db
462
+ .insert(allocationResources)
463
+ .values({
464
+ slotId,
465
+ kind: "vehicle_seat",
466
+ refType: group.ref_type,
467
+ refId: group.ref_id,
468
+ label: renderNamePattern("Seat {row}{column}", {
469
+ sequence: String(seatIndex + 1),
470
+ row: String(rowNumber),
471
+ column: columnName,
472
+ seat: `${rowNumber}${columnName}`,
473
+ }),
474
+ capacity: 1,
475
+ flags: { row: rowNumber, column: columnName, position },
476
+ parentId: parent.id,
477
+ sortOrder: seatIndex,
478
+ })
479
+ .returning();
480
+ if (seat)
481
+ resources.push(seat);
482
+ seatIndex += 1;
483
+ }
484
+ }
485
+ }
486
+ return { resources, vehicleCount: vehiclesNeeded };
487
+ }
488
+ export function parseLayoutSpecFromFlags(flags) {
489
+ const raw = flags?.layoutSpec;
490
+ if (!raw)
491
+ return null;
492
+ const parsed = seatLayoutSpecSchema.safeParse(raw);
493
+ return parsed.success ? parsed.data : null;
494
+ }
495
+ /**
496
+ * Derive window/aisle/middle from a seat's neighbours in the same row.
497
+ *
498
+ * - Touching an aisle or door cell → "aisle" (the seat is on the aisle side)
499
+ * - Touching the row boundary or a void cell → "window"
500
+ * - Surrounded by other seats → "middle"
501
+ *
502
+ * Aisle takes precedence so the "window" tag is reserved for actual outer
503
+ * seats; a 2-1 row's lone middle seat ends up "aisle" on both sides.
504
+ */
505
+ export function positionFromCells(cells, index) {
506
+ const prev = index > 0 ? cells[index - 1] : undefined;
507
+ const next = index < cells.length - 1 ? cells[index + 1] : undefined;
508
+ if (prev === "aisle" || prev === "door")
509
+ return "aisle";
510
+ if (next === "aisle" || next === "door")
511
+ return "aisle";
512
+ if (prev === undefined || prev === "void")
513
+ return "window";
514
+ if (next === undefined || next === "void")
515
+ return "window";
516
+ return "middle";
517
+ }
405
518
  function toResourceTemplate(row) {
406
519
  return {
407
520
  id: row.id,
@@ -1 +1 @@
1
- {"version":3,"file":"service-core.d.ts","sourceRoot":"","sources":["../src/service-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-core.d.ts","sourceRoot":"","sources":["../src/service-core.ts"],"names":[],"mappings":"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"}
@@ -170,12 +170,44 @@ export async function createSlot(db, data, runtime = {}) {
170
170
  return row;
171
171
  }
172
172
  export async function updateSlot(db, id, data, runtime = {}) {
173
+ const { remainingPax: _ignoredRemainingPax, ...rest } = data;
173
174
  const patch = {
174
- ...data,
175
+ ...rest,
175
176
  startsAt: data.startsAt === undefined ? undefined : new Date(data.startsAt),
176
177
  endsAt: data.endsAt === undefined ? undefined : toDateOrNull(data.endsAt),
177
178
  updatedAt: new Date(),
178
179
  };
180
+ // `remaining_pax` is a derived value the service owns — concurrent flows
181
+ // (holds, bookings, refunds) update it atomically while a form is open,
182
+ // so we never trust a client-supplied snapshot (#1087, Codex review on
183
+ // #1088). Recompute here using the row's *current* state inside the same
184
+ // UPDATE statement so the capacity-change rebalance is race-free.
185
+ //
186
+ // - Switching to unlimited → NULL (no cap).
187
+ // - Changing initialPax with a finite cap → preserve the consumed
188
+ // delta: `new_initial - (old_initial - old_remaining)`, clamped to
189
+ // [0, new_initial]. If consumed > new_initial (capacity dropped
190
+ // below what's already booked) the slot lands at 0; the operator
191
+ // can release allocations to recover headroom.
192
+ // - Leaving capacity alone → don't touch remaining_pax.
193
+ if (data.unlimited === true) {
194
+ patch.remainingPax = null;
195
+ }
196
+ else if (data.initialPax !== undefined && data.initialPax !== null) {
197
+ const newInitial = data.initialPax;
198
+ patch.remainingPax = sql `GREATEST(
199
+ 0,
200
+ LEAST(
201
+ ${newInitial}::int,
202
+ ${newInitial}::int
203
+ - GREATEST(
204
+ 0,
205
+ COALESCE(${availabilitySlots.initialPax}, ${newInitial}::int)
206
+ - COALESCE(${availabilitySlots.remainingPax}, ${newInitial}::int)
207
+ )
208
+ )
209
+ )::int`;
210
+ }
179
211
  const [row] = await db
180
212
  .update(availabilitySlots)
181
213
  .set(patch)
@@ -22,6 +22,38 @@ export declare const pickupTimingModeSchema: z.ZodEnum<{
22
22
  export declare const allocationResourceKindSchema: z.ZodString;
23
23
  export declare const allocationResourceFlagsSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
24
24
  export declare const travelerAllocationMapSchema: z.ZodRecord<z.ZodString, z.ZodString>;
25
+ /**
26
+ * Explicit 2D seat layout for vehicle_seat templates. Each row is a list of
27
+ * cells the materializer walks:
28
+ *
29
+ * - `seat` → creates one vehicle_seat resource
30
+ * - `aisle` → renders as a horizontal gap between seat blocks
31
+ * - `door` → renders as a wider gap (mid-coach door is common)
32
+ * - `void` → empty cell (wheelchair spot, toilet, kitchen, wheel well)
33
+ *
34
+ * Stored on the template's `flags.layoutSpec`. When present, the materializer
35
+ * ignores the legacy `layout` string + `capacity` (capacity is derived from
36
+ * the number of "seat" cells). The renderer in @voyantjs/allocation-ui mirrors
37
+ * the same grid so the visual seat map matches what the operator drew.
38
+ */
39
+ export declare const seatLayoutCellSchema: z.ZodEnum<{
40
+ aisle: "aisle";
41
+ void: "void";
42
+ seat: "seat";
43
+ door: "door";
44
+ }>;
45
+ export type SeatLayoutCell = z.infer<typeof seatLayoutCellSchema>;
46
+ export declare const seatLayoutSpecSchema: z.ZodObject<{
47
+ rows: z.ZodArray<z.ZodObject<{
48
+ cells: z.ZodArray<z.ZodEnum<{
49
+ aisle: "aisle";
50
+ void: "void";
51
+ seat: "seat";
52
+ door: "door";
53
+ }>>;
54
+ }, z.core.$strip>>;
55
+ }, z.core.$strip>;
56
+ export type SeatLayoutSpec = z.infer<typeof seatLayoutSpecSchema>;
25
57
  export declare const availabilityRuleCoreSchema: z.ZodObject<{
26
58
  productId: z.ZodString;
27
59
  optionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,29 @@ export const pickupTimingModeSchema = z.enum(["fixed_time", "offset_from_start"]
11
11
  export const allocationResourceKindSchema = z.string().trim().min(1).max(80);
12
12
  export const allocationResourceFlagsSchema = z.record(z.string(), z.unknown());
13
13
  export const travelerAllocationMapSchema = z.record(z.string(), z.string());
14
+ /**
15
+ * Explicit 2D seat layout for vehicle_seat templates. Each row is a list of
16
+ * cells the materializer walks:
17
+ *
18
+ * - `seat` → creates one vehicle_seat resource
19
+ * - `aisle` → renders as a horizontal gap between seat blocks
20
+ * - `door` → renders as a wider gap (mid-coach door is common)
21
+ * - `void` → empty cell (wheelchair spot, toilet, kitchen, wheel well)
22
+ *
23
+ * Stored on the template's `flags.layoutSpec`. When present, the materializer
24
+ * ignores the legacy `layout` string + `capacity` (capacity is derived from
25
+ * the number of "seat" cells). The renderer in @voyantjs/allocation-ui mirrors
26
+ * the same grid so the visual seat map matches what the operator drew.
27
+ */
28
+ export const seatLayoutCellSchema = z.enum(["seat", "aisle", "door", "void"]);
29
+ export const seatLayoutSpecSchema = z.object({
30
+ rows: z
31
+ .array(z.object({
32
+ cells: z.array(seatLayoutCellSchema).min(1).max(20),
33
+ }))
34
+ .min(1)
35
+ .max(40),
36
+ });
14
37
  const isoDateSchema = z.string().date();
15
38
  const isoDateTimeSchema = z.string().datetime();
16
39
  export const availabilityRuleCoreSchema = z.object({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/availability",
3
- "version": "0.70.0",
3
+ "version": "0.73.1",
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.70.0",
48
- "@voyantjs/db": "0.70.0",
49
- "@voyantjs/hono": "0.70.0"
47
+ "@voyantjs/core": "0.73.1",
48
+ "@voyantjs/db": "0.73.1",
49
+ "@voyantjs/hono": "0.73.1"
50
50
  },
51
51
  "devDependencies": {
52
52
  "typescript": "^6.0.2",
53
- "@voyantjs/products": "0.70.0",
53
+ "@voyantjs/products": "0.73.1",
54
54
  "@voyantjs/voyant-typescript-config": "0.1.0"
55
55
  },
56
56
  "files": [