/** * Availability "core" admin routes — the dashboard read-models (aggregates + * overview) and CRUD/batch surfaces for the four core availability resources: * recurrence rules, start times, departure slots, and closeouts. Mounted on the * legacy `/v1/operations/availability/*` surface (operator React clients hit * those paths) AND, for the published OpenAPI admin contract, on the staff * surface at `/v1/admin/operations/availability/*` (see * `availability/routes.ts`). * * Migrated to `@hono/zod-openapi` for the OpenAPI admin backfill (voyant#2114 / * voyant#2208 — operations sub-batch 10A). Request schemas reuse the exported * `validation.ts` insert/update/list-query schemas the handlers already parse; * response row schemas are authored here from the Drizzle `$inferSelect` shapes * (§17 dates → strings, plus the service-joined `productName` and the slot's * computed `endDateLocal`). Each resource is its own small `OpenAPIHono` * sub-chain composed onto `availabilityCoreRoutes` via `.route("/")` so the * `.openapi()` operations propagate up through the parent registries while * keeping type-inference cost bounded (one flat chain has O(n²) inference cost). * * agent-quality: file-size exception — intentional: a mechanically-repetitive * CRUD + batch bundle over five availability resources (31 legs), each with a * `createRoute` def + co-located handler per the established admin route pattern * (mirrors finance's `routes-invoice-core.ts`). Splitting per resource would * fragment the single mounted instance without aiding review. See voyant#2114 / * voyant#2208 (operations sub-batch 10A). */ import { OpenAPIHono } from "@hono/zod-openapi"; import { type Env } from "./routes-shared.js"; /** * Compose the per-resource sub-chains onto a single `OpenAPIHono` so the * `.openapi()` operations propagate up through the parent availability * registries (`OpenAPIHono.route` copies the sub-app's registered routes). */ export declare const availabilityCoreRoutes: OpenAPIHono & import("hono/types").MergeSchemaPath<{ "/slots": { $get: { input: { query: { limit?: unknown; offset?: unknown; productId?: string | undefined; itineraryId?: string | undefined; optionId?: string | undefined; facilityId?: string | undefined; availabilityRuleId?: string | undefined; startTimeId?: string | undefined; dateLocal?: string | undefined; startsAtFrom?: string | undefined; startsAtUntil?: string | undefined; status?: "open" | "closed" | "sold_out" | "cancelled" | undefined; }; }; output: { data: { id: string; productId: string; itineraryId: string | null; optionId: string | null; facilityId: string | null; availabilityRuleId: string | null; startTimeId: string | null; dateLocal: string; startsAt: string; endsAt: string | null; timezone: string; status: "open" | "closed" | "sold_out" | "cancelled"; unlimited: boolean; initialPax: number | null; remainingPax: number | null; initialPickups: number | null; remainingPickups: number | null; remainingResources: number | null; pastCutoff: boolean; tooEarly: boolean; nights: number | null; days: number | null; notes: string | null; createdAt: string; updatedAt: string; endDateLocal: string | null; productName?: string | null | undefined; }[]; total: number; limit: number; offset: number; }; outputFormat: "json"; status: 200; }; }; } & { "/slots": { $post: { input: { json: { productId: string; dateLocal: string; startsAt: string; timezone: string; itineraryId?: string | null | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; availabilityRuleId?: string | null | undefined; startTimeId?: string | null | undefined; endsAt?: string | null | undefined; status?: "open" | "closed" | "sold_out" | "cancelled" | undefined; unlimited?: boolean | undefined; initialPax?: number | null | undefined; remainingPax?: number | null | undefined; initialPickups?: number | null | undefined; remainingPickups?: number | null | undefined; remainingResources?: number | null | undefined; pastCutoff?: boolean | undefined; tooEarly?: boolean | undefined; nights?: number | null | undefined; days?: number | null | undefined; notes?: string | null | undefined; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { json: { productId: string; dateLocal: string; startsAt: string; timezone: string; itineraryId?: string | null | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; availabilityRuleId?: string | null | undefined; startTimeId?: string | null | undefined; endsAt?: string | null | undefined; status?: "open" | "closed" | "sold_out" | "cancelled" | undefined; unlimited?: boolean | undefined; initialPax?: number | null | undefined; remainingPax?: number | null | undefined; initialPickups?: number | null | undefined; remainingPickups?: number | null | undefined; remainingResources?: number | null | undefined; pastCutoff?: boolean | undefined; tooEarly?: boolean | undefined; nights?: number | null | undefined; days?: number | null | undefined; notes?: string | null | undefined; }; }; output: { data: { id: string; productId: string; itineraryId: string | null; optionId: string | null; facilityId: string | null; availabilityRuleId: string | null; startTimeId: string | null; dateLocal: string; startsAt: string; endsAt: string | null; timezone: string; status: "open" | "closed" | "sold_out" | "cancelled"; unlimited: boolean; initialPax: number | null; remainingPax: number | null; initialPickups: number | null; remainingPickups: number | null; remainingResources: number | null; pastCutoff: boolean; tooEarly: boolean; nights: number | null; days: number | null; notes: string | null; createdAt: string; updatedAt: string; endDateLocal: string | null; }; }; outputFormat: "json"; status: 201; }; }; } & { "/slots/batch-update": { $post: { input: { json: { ids: string[]; patch: { productId?: string | undefined; itineraryId?: string | null | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; availabilityRuleId?: string | null | undefined; startTimeId?: string | null | undefined; dateLocal?: string | undefined; startsAt?: string | undefined; endsAt?: string | null | undefined; timezone?: string | undefined; status?: "open" | "closed" | "sold_out" | "cancelled" | undefined; unlimited?: boolean | undefined; initialPax?: number | null | undefined; remainingPax?: number | null | undefined; initialPickups?: number | null | undefined; remainingPickups?: number | null | undefined; remainingResources?: number | null | undefined; pastCutoff?: boolean | undefined; tooEarly?: boolean | undefined; nights?: number | null | undefined; days?: number | null | undefined; notes?: string | null | undefined; }; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { json: { ids: string[]; patch: { productId?: string | undefined; itineraryId?: string | null | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; availabilityRuleId?: string | null | undefined; startTimeId?: string | null | undefined; dateLocal?: string | undefined; startsAt?: string | undefined; endsAt?: string | null | undefined; timezone?: string | undefined; status?: "open" | "closed" | "sold_out" | "cancelled" | undefined; unlimited?: boolean | undefined; initialPax?: number | null | undefined; remainingPax?: number | null | undefined; initialPickups?: number | null | undefined; remainingPickups?: number | null | undefined; remainingResources?: number | null | undefined; pastCutoff?: boolean | undefined; tooEarly?: boolean | undefined; nights?: number | null | undefined; days?: number | null | undefined; notes?: string | null | undefined; }; }; }; output: { data: { id: string; productId: string; itineraryId: string | null; optionId: string | null; facilityId: string | null; availabilityRuleId: string | null; startTimeId: string | null; dateLocal: string; startsAt: string; endsAt: string | null; timezone: string; status: "open" | "closed" | "sold_out" | "cancelled"; unlimited: boolean; initialPax: number | null; remainingPax: number | null; initialPickups: number | null; remainingPickups: number | null; remainingResources: number | null; pastCutoff: boolean; tooEarly: boolean; nights: number | null; days: number | null; notes: string | null; createdAt: string; updatedAt: string; endDateLocal: string | null; }[]; total: number; succeeded: number; failed: { id: string; error: string; }[]; }; outputFormat: "json"; status: 200; }; }; } & { "/slots/batch-delete": { $post: { input: { json: { ids: string[]; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { json: { ids: string[]; }; }; output: { deletedIds: string[]; total: number; succeeded: number; failed: { id: string; error: string; }[]; }; outputFormat: "json"; status: 200; }; }; } & { "/slots/:id": { $get: { input: { param: { id: string; }; }; output: { error: string; }; outputFormat: "json"; status: 404; } | { input: { param: { id: string; }; }; output: { data: { id: string; productId: string; itineraryId: string | null; optionId: string | null; facilityId: string | null; availabilityRuleId: string | null; startTimeId: string | null; dateLocal: string; startsAt: string; endsAt: string | null; timezone: string; status: "open" | "closed" | "sold_out" | "cancelled"; unlimited: boolean; initialPax: number | null; remainingPax: number | null; initialPickups: number | null; remainingPickups: number | null; remainingResources: number | null; pastCutoff: boolean; tooEarly: boolean; nights: number | null; days: number | null; notes: string | null; createdAt: string; updatedAt: string; endDateLocal: string | null; }; }; outputFormat: "json"; status: 200; }; }; } & { "/slots/:id/unit-availability": { $get: { input: { param: { id: string; }; }; output: { error: string; }; outputFormat: "json"; status: 404; } | { input: { param: { id: string; }; }; output: { data: { optionUnitId: string; unitName: string; occupancyMax: number | null; initial: number | null; reserved: number; remaining: number | null; }[]; }; outputFormat: "json"; status: 200; }; }; } & { "/slots/:id": { $patch: { input: { param: { id: string; }; } & { json: { productId?: string | undefined; itineraryId?: string | null | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; availabilityRuleId?: string | null | undefined; startTimeId?: string | null | undefined; dateLocal?: string | undefined; startsAt?: string | undefined; endsAt?: string | null | undefined; timezone?: string | undefined; status?: "open" | "closed" | "sold_out" | "cancelled" | undefined; unlimited?: boolean | undefined; initialPax?: number | null | undefined; remainingPax?: number | null | undefined; initialPickups?: number | null | undefined; remainingPickups?: number | null | undefined; remainingResources?: number | null | undefined; pastCutoff?: boolean | undefined; tooEarly?: boolean | undefined; nights?: number | null | undefined; days?: number | null | undefined; notes?: string | null | undefined; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { param: { id: string; }; } & { json: { productId?: string | undefined; itineraryId?: string | null | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; availabilityRuleId?: string | null | undefined; startTimeId?: string | null | undefined; dateLocal?: string | undefined; startsAt?: string | undefined; endsAt?: string | null | undefined; timezone?: string | undefined; status?: "open" | "closed" | "sold_out" | "cancelled" | undefined; unlimited?: boolean | undefined; initialPax?: number | null | undefined; remainingPax?: number | null | undefined; initialPickups?: number | null | undefined; remainingPickups?: number | null | undefined; remainingResources?: number | null | undefined; pastCutoff?: boolean | undefined; tooEarly?: boolean | undefined; nights?: number | null | undefined; days?: number | null | undefined; notes?: string | null | undefined; }; }; output: { error: string; }; outputFormat: "json"; status: 404; } | { input: { param: { id: string; }; } & { json: { productId?: string | undefined; itineraryId?: string | null | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; availabilityRuleId?: string | null | undefined; startTimeId?: string | null | undefined; dateLocal?: string | undefined; startsAt?: string | undefined; endsAt?: string | null | undefined; timezone?: string | undefined; status?: "open" | "closed" | "sold_out" | "cancelled" | undefined; unlimited?: boolean | undefined; initialPax?: number | null | undefined; remainingPax?: number | null | undefined; initialPickups?: number | null | undefined; remainingPickups?: number | null | undefined; remainingResources?: number | null | undefined; pastCutoff?: boolean | undefined; tooEarly?: boolean | undefined; nights?: number | null | undefined; days?: number | null | undefined; notes?: string | null | undefined; }; }; output: { data: { id: string; productId: string; itineraryId: string | null; optionId: string | null; facilityId: string | null; availabilityRuleId: string | null; startTimeId: string | null; dateLocal: string; startsAt: string; endsAt: string | null; timezone: string; status: "open" | "closed" | "sold_out" | "cancelled"; unlimited: boolean; initialPax: number | null; remainingPax: number | null; initialPickups: number | null; remainingPickups: number | null; remainingResources: number | null; pastCutoff: boolean; tooEarly: boolean; nights: number | null; days: number | null; notes: string | null; createdAt: string; updatedAt: string; endDateLocal: string | null; }; }; outputFormat: "json"; status: 200; }; }; } & { "/slots/:id": { $delete: { input: { param: { id: string; }; }; output: { error: string; }; outputFormat: "json"; status: 404; } | { input: { param: { id: string; }; }; output: { success: true; }; outputFormat: "json"; status: 200; }; }; }, "/"> & import("hono/types").MergeSchemaPath<{ "/start-times": { $get: { input: { query: { limit?: unknown; offset?: unknown; productId?: string | undefined; optionId?: string | undefined; facilityId?: string | undefined; active?: "0" | "1" | "true" | "false" | undefined; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; label: string | null; startTimeLocal: string; durationMinutes: number | null; sortOrder: number; active: boolean; createdAt: string; updatedAt: string; productName?: string | null | undefined; }[]; total: number; limit: number; offset: number; }; outputFormat: "json"; status: 200; }; }; } & { "/start-times": { $post: { input: { json: { productId: string; startTimeLocal: string; optionId?: string | null | undefined; facilityId?: string | null | undefined; label?: string | null | undefined; durationMinutes?: number | null | undefined; sortOrder?: number | undefined; active?: boolean | undefined; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { json: { productId: string; startTimeLocal: string; optionId?: string | null | undefined; facilityId?: string | null | undefined; label?: string | null | undefined; durationMinutes?: number | null | undefined; sortOrder?: number | undefined; active?: boolean | undefined; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; label: string | null; startTimeLocal: string; durationMinutes: number | null; sortOrder: number; active: boolean; createdAt: string; updatedAt: string; }; }; outputFormat: "json"; status: 201; }; }; } & { "/start-times/batch-update": { $post: { input: { json: { ids: string[]; patch: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; label?: string | null | undefined; startTimeLocal?: string | undefined; durationMinutes?: number | null | undefined; sortOrder?: number | undefined; active?: boolean | undefined; }; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { json: { ids: string[]; patch: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; label?: string | null | undefined; startTimeLocal?: string | undefined; durationMinutes?: number | null | undefined; sortOrder?: number | undefined; active?: boolean | undefined; }; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; label: string | null; startTimeLocal: string; durationMinutes: number | null; sortOrder: number; active: boolean; createdAt: string; updatedAt: string; }[]; total: number; succeeded: number; failed: { id: string; error: string; }[]; }; outputFormat: "json"; status: 200; }; }; } & { "/start-times/batch-delete": { $post: { input: { json: { ids: string[]; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { json: { ids: string[]; }; }; output: { deletedIds: string[]; total: number; succeeded: number; failed: { id: string; error: string; }[]; }; outputFormat: "json"; status: 200; }; }; } & { "/start-times/:id": { $get: { input: { param: { id: string; }; }; output: { error: string; }; outputFormat: "json"; status: 404; } | { input: { param: { id: string; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; label: string | null; startTimeLocal: string; durationMinutes: number | null; sortOrder: number; active: boolean; createdAt: string; updatedAt: string; }; }; outputFormat: "json"; status: 200; }; }; } & { "/start-times/:id": { $patch: { input: { param: { id: string; }; } & { json: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; label?: string | null | undefined; startTimeLocal?: string | undefined; durationMinutes?: number | null | undefined; sortOrder?: number | undefined; active?: boolean | undefined; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { param: { id: string; }; } & { json: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; label?: string | null | undefined; startTimeLocal?: string | undefined; durationMinutes?: number | null | undefined; sortOrder?: number | undefined; active?: boolean | undefined; }; }; output: { error: string; }; outputFormat: "json"; status: 404; } | { input: { param: { id: string; }; } & { json: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; label?: string | null | undefined; startTimeLocal?: string | undefined; durationMinutes?: number | null | undefined; sortOrder?: number | undefined; active?: boolean | undefined; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; label: string | null; startTimeLocal: string; durationMinutes: number | null; sortOrder: number; active: boolean; createdAt: string; updatedAt: string; }; }; outputFormat: "json"; status: 200; }; }; } & { "/start-times/:id": { $delete: { input: { param: { id: string; }; }; output: { error: string; }; outputFormat: "json"; status: 404; } | { input: { param: { id: string; }; }; output: { success: true; }; outputFormat: "json"; status: 200; }; }; }, "/"> & import("hono/types").MergeSchemaPath<{ "/rules": { $get: { input: { query: { limit?: unknown; offset?: unknown; productId?: string | undefined; optionId?: string | undefined; facilityId?: string | undefined; active?: "0" | "1" | "true" | "false" | undefined; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; timezone: string; recurrenceRule: string; maxCapacity: number; maxPickupCapacity: number | null; minTotalPax: number | null; cutoffMinutes: number | null; earlyBookingLimitMinutes: number | null; active: boolean; createdAt: string; updatedAt: string; productName?: string | null | undefined; }[]; total: number; limit: number; offset: number; }; outputFormat: "json"; status: 200; }; }; } & { "/rules": { $post: { input: { json: { productId: string; timezone: string; recurrenceRule: string; maxCapacity: number; optionId?: string | null | undefined; facilityId?: string | null | undefined; maxPickupCapacity?: number | null | undefined; minTotalPax?: number | null | undefined; cutoffMinutes?: number | null | undefined; earlyBookingLimitMinutes?: number | null | undefined; active?: boolean | undefined; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; timezone: string; recurrenceRule: string; maxCapacity: number; maxPickupCapacity: number | null; minTotalPax: number | null; cutoffMinutes: number | null; earlyBookingLimitMinutes: number | null; active: boolean; createdAt: string; updatedAt: string; }; }; outputFormat: "json"; status: 201; } | { input: { json: { productId: string; timezone: string; recurrenceRule: string; maxCapacity: number; optionId?: string | null | undefined; facilityId?: string | null | undefined; maxPickupCapacity?: number | null | undefined; minTotalPax?: number | null | undefined; cutoffMinutes?: number | null | undefined; earlyBookingLimitMinutes?: number | null | undefined; active?: boolean | undefined; }; }; output: { error: string; }; outputFormat: "json"; status: 400; }; }; } & { "/rules/batch-update": { $post: { input: { json: { ids: string[]; patch: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; timezone?: string | undefined; recurrenceRule?: string | undefined; maxCapacity?: number | undefined; maxPickupCapacity?: number | null | undefined; minTotalPax?: number | null | undefined; cutoffMinutes?: number | null | undefined; earlyBookingLimitMinutes?: number | null | undefined; active?: boolean | undefined; }; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { json: { ids: string[]; patch: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; timezone?: string | undefined; recurrenceRule?: string | undefined; maxCapacity?: number | undefined; maxPickupCapacity?: number | null | undefined; minTotalPax?: number | null | undefined; cutoffMinutes?: number | null | undefined; earlyBookingLimitMinutes?: number | null | undefined; active?: boolean | undefined; }; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; timezone: string; recurrenceRule: string; maxCapacity: number; maxPickupCapacity: number | null; minTotalPax: number | null; cutoffMinutes: number | null; earlyBookingLimitMinutes: number | null; active: boolean; createdAt: string; updatedAt: string; }[]; total: number; succeeded: number; failed: { id: string; error: string; }[]; }; outputFormat: "json"; status: 200; }; }; } & { "/rules/batch-delete": { $post: { input: { json: { ids: string[]; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { json: { ids: string[]; }; }; output: { deletedIds: string[]; total: number; succeeded: number; failed: { id: string; error: string; }[]; }; outputFormat: "json"; status: 200; }; }; } & { "/rules/:id": { $get: { input: { param: { id: string; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; timezone: string; recurrenceRule: string; maxCapacity: number; maxPickupCapacity: number | null; minTotalPax: number | null; cutoffMinutes: number | null; earlyBookingLimitMinutes: number | null; active: boolean; createdAt: string; updatedAt: string; }; }; outputFormat: "json"; status: 200; } | { input: { param: { id: string; }; }; output: { error: string; }; outputFormat: "json"; status: 404; }; }; } & { "/rules/:id": { $patch: { input: { param: { id: string; }; } & { json: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; timezone?: string | undefined; recurrenceRule?: string | undefined; maxCapacity?: number | undefined; maxPickupCapacity?: number | null | undefined; minTotalPax?: number | null | undefined; cutoffMinutes?: number | null | undefined; earlyBookingLimitMinutes?: number | null | undefined; active?: boolean | undefined; }; }; output: { error: string; }; outputFormat: "json"; status: 400; } | { input: { param: { id: string; }; } & { json: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; timezone?: string | undefined; recurrenceRule?: string | undefined; maxCapacity?: number | undefined; maxPickupCapacity?: number | null | undefined; minTotalPax?: number | null | undefined; cutoffMinutes?: number | null | undefined; earlyBookingLimitMinutes?: number | null | undefined; active?: boolean | undefined; }; }; output: { error: string; }; outputFormat: "json"; status: 404; } | { input: { param: { id: string; }; } & { json: { productId?: string | undefined; optionId?: string | null | undefined; facilityId?: string | null | undefined; timezone?: string | undefined; recurrenceRule?: string | undefined; maxCapacity?: number | undefined; maxPickupCapacity?: number | null | undefined; minTotalPax?: number | null | undefined; cutoffMinutes?: number | null | undefined; earlyBookingLimitMinutes?: number | null | undefined; active?: boolean | undefined; }; }; output: { data: { id: string; productId: string; optionId: string | null; facilityId: string | null; timezone: string; recurrenceRule: string; maxCapacity: number; maxPickupCapacity: number | null; minTotalPax: number | null; cutoffMinutes: number | null; earlyBookingLimitMinutes: number | null; active: boolean; createdAt: string; updatedAt: string; }; }; outputFormat: "json"; status: 200; }; }; } & { "/rules/:id": { $delete: { input: { param: { id: string; }; }; output: { error: string; }; outputFormat: "json"; status: 404; } | { input: { param: { id: string; }; }; output: { success: true; }; outputFormat: "json"; status: 200; }; }; }, "/"> & import("hono/types").MergeSchemaPath<{ "/aggregates": { $get: { input: { query: { from?: string | undefined; to?: string | undefined; }; }; output: { data: { total: number; countsByStatus: { status: "open" | "closed" | "sold_out" | "cancelled"; count: number; }[]; upcomingSlots: number; upcomingPax: number; monthlyDepartures: { yearMonth: string; count: number; }[]; }; }; outputFormat: "json"; status: 200; }; }; } & { "/overview": { $get: { input: { query: { productId?: string | undefined; attentionLimit?: unknown; }; }; output: { data: { openSlotsCount: number; constrainedSlotsCount: number; activeRulesCount: number; activePickupPointsCount: number; productsWithoutUpcomingDeparturesCount: number; productsWithoutUpcomingDepartures: { id: string; name: string; }[]; constrainedSlots: { id: string; productId: string; itineraryId: string | null; optionId: string | null; facilityId: string | null; availabilityRuleId: string | null; startTimeId: string | null; dateLocal: string; startsAt: string; endsAt: string | null; timezone: string; status: "open" | "closed" | "sold_out" | "cancelled"; unlimited: boolean; initialPax: number | null; remainingPax: number | null; initialPickups: number | null; remainingPickups: number | null; remainingResources: number | null; pastCutoff: boolean; tooEarly: boolean; nights: number | null; days: number | null; notes: string | null; createdAt: string; updatedAt: string; productName: string | null; }[]; }; }; outputFormat: "json"; status: 200; }; }; }, "/">, "/">;