@updraft-solutions/mcrit-sdk 0.4.0 → 0.6.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.
Files changed (47) hide show
  1. package/dist/chunk-EE4YY3AU.js +2620 -0
  2. package/dist/chunk-H4CJ2YEQ.cjs +2620 -0
  3. package/dist/courses/index.d.cts +2 -2
  4. package/dist/courses/index.d.ts +2 -2
  5. package/dist/index.cjs +201 -5
  6. package/dist/index.d.cts +3 -3
  7. package/dist/index.d.ts +3 -3
  8. package/dist/index.js +207 -11
  9. package/dist/schemas/index.cjs +198 -2
  10. package/dist/schemas/index.d.cts +3157 -128
  11. package/dist/schemas/index.d.ts +3157 -128
  12. package/dist/schemas/index.js +201 -5
  13. package/dist/training-C9rIBUeV.d.cts +101685 -0
  14. package/dist/training-C9rIBUeV.d.ts +101685 -0
  15. package/dist/types/index.cjs +1 -1
  16. package/dist/types/index.d.cts +278 -6
  17. package/dist/types/index.d.ts +278 -6
  18. package/dist/types/index.js +1 -1
  19. package/package.json +1 -1
  20. package/src/courses/index.ts +2 -2
  21. package/src/index.ts +42 -0
  22. package/src/schemas/common.ts +69 -5
  23. package/src/schemas/course-milestone.ts +78 -0
  24. package/src/schemas/equipment.ts +27 -0
  25. package/src/schemas/form-template.ts +416 -0
  26. package/src/schemas/index.ts +7 -1
  27. package/src/schemas/location-map.ts +175 -0
  28. package/src/schemas/models.ts +201 -100
  29. package/src/schemas/newsletter.ts +362 -0
  30. package/src/schemas/todo.ts +46 -0
  31. package/src/schemas/training.ts +500 -0
  32. package/src/types/ai.ts +85 -0
  33. package/src/types/aircraft-block.ts +23 -0
  34. package/src/types/api.ts +3 -1
  35. package/src/types/background-task.ts +28 -0
  36. package/src/types/compliance.ts +27 -3
  37. package/src/types/index.ts +5 -0
  38. package/src/types/landing-fee.ts +92 -0
  39. package/src/types/models.ts +46 -3
  40. package/src/types/roles.ts +26 -0
  41. package/dist/chunk-RC2BBT6H.cjs +0 -1384
  42. package/dist/chunk-WQLDSZNN.js +0 -1384
  43. package/dist/models-Bc5BKYuI.d.cts +0 -36898
  44. package/dist/models-Bc5BKYuI.d.ts +0 -36898
  45. package/src/schemas/fee.ts +0 -37
  46. /package/dist/{chunk-LXNCAKJZ.js → chunk-2WJHTRIE.js} +0 -0
  47. /package/dist/{chunk-MOOGM3DW.cjs → chunk-DCEOET63.cjs} +0 -0
@@ -0,0 +1,2620 @@
1
+ // src/schemas/common.ts
2
+ import { z } from "zod";
3
+ var zNullableBool = z.boolean().nullable().optional();
4
+ var zNetGross = z.enum(["net", "gross"]).optional();
5
+ var zContactDTO = z.object({
6
+ name: z.string().nullable().optional(),
7
+ email: z.string().nullable().optional(),
8
+ phone: z.string().nullable().optional(),
9
+ company: z.string().nullable().optional(),
10
+ fax: z.string().nullable().optional()
11
+ });
12
+ var zPhpMoneyObject = z.object({
13
+ amount: z.number(),
14
+ currency: z.string(),
15
+ formatted: z.string()
16
+ });
17
+ var contactAttributeSchema = z.object({
18
+ name: z.string().optional(),
19
+ email: z.string().optional(),
20
+ phone: z.string().optional(),
21
+ company: z.string().optional(),
22
+ fax: z.string().optional()
23
+ });
24
+ var BaseModel = z.object({
25
+ type: z.string(),
26
+ id: z.number(),
27
+ created_at: z.string(),
28
+ updated_at: z.string()
29
+ });
30
+ var mediaSchema = z.object({
31
+ type: z.literal("media"),
32
+ id: z.number(),
33
+ description: z.string().optional(),
34
+ collection_name: z.string().optional(),
35
+ conversions: z.record(z.string().url()).optional(),
36
+ created_at: z.string().optional(),
37
+ updated_at: z.string().optional(),
38
+ url: z.string().optional(),
39
+ mime_type: z.string().optional(),
40
+ file_name: z.string().optional(),
41
+ size: z.number().optional()
42
+ });
43
+ var mediaCollection = z.object({
44
+ avatar: mediaSchema.nullable().optional(),
45
+ header: mediaSchema.nullable().optional(),
46
+ images: z.array(mediaSchema).nullable().optional(),
47
+ documents: z.array(mediaSchema).nullable().optional()
48
+ }).nullable().optional();
49
+ var impersonationParticipantSchema = z.object({
50
+ id: z.number(),
51
+ name: z.string(),
52
+ email: z.string()
53
+ });
54
+ var impersonationStateSchema = z.object({
55
+ is_impersonating: z.boolean(),
56
+ impersonator: impersonationParticipantSchema.optional(),
57
+ impersonated: impersonationParticipantSchema.optional(),
58
+ started_at: z.string().optional(),
59
+ expires_at: z.string().optional()
60
+ });
61
+ var userSchema = z.object({
62
+ type: z.literal("user"),
63
+ id: z.number(),
64
+ name: z.string(),
65
+ firstname: z.string().nullable().optional(),
66
+ lastname: z.string().nullable().optional(),
67
+ // email/mobile are gate-guarded server-side (viewMail/viewMobile) and come
68
+ // back null when denied.
69
+ email: z.string().nullable().optional(),
70
+ mobile: z.string().nullable().optional(),
71
+ // UserResource media envelope (avatar/header, present when loaded).
72
+ media: z.object({
73
+ avatar: mediaSchema.nullable().optional(),
74
+ header: mediaSchema.nullable().optional()
75
+ }).optional(),
76
+ // Present only on the authenticated-user payload while an admin
77
+ // impersonation session is active.
78
+ impersonation: impersonationStateSchema.optional()
79
+ });
80
+ var companySchema = z.object({
81
+ type: z.literal("company"),
82
+ id: z.number(),
83
+ name: z.string(),
84
+ media: mediaCollection,
85
+ can: z.record(z.string(), z.boolean().nullable()).optional(),
86
+ permissions: z.array(z.string()).optional(),
87
+ // Company display timezone (companies.timezone, default Europe/Berlin
88
+ // server-side); booking/event surfaces render in this zone. Optional:
89
+ // slim company payloads may omit it.
90
+ timezone: z.string().optional(),
91
+ ai_landing_fee_invoices_enabled: z.boolean().optional(),
92
+ // Active AI-feature entitlement keys (per-company subscription gating,
93
+ // e.g. "ai.logbook_import"). Serialized by CompanyResource alongside
94
+ // `permissions[]`; slim payloads may omit it.
95
+ entitlements: z.array(z.string()).optional(),
96
+ // BaseCompanyResource extras: cached-minified home airport + the
97
+ // distance computed on radius-filtered public listings.
98
+ airport_id: z.number().nullable().optional(),
99
+ airport: z.object({
100
+ id: z.number(),
101
+ ident: z.string(),
102
+ name: z.string(),
103
+ municipality: z.string().nullable().optional(),
104
+ iso_country: z.string().nullable().optional(),
105
+ latitude_deg: z.number().nullable().optional(),
106
+ longitude_deg: z.number().nullable().optional()
107
+ }).nullable().optional(),
108
+ icao: z.string().nullable().optional(),
109
+ distance_in_km: z.number().optional()
110
+ });
111
+
112
+ // src/schemas/models.ts
113
+ import { z as z4 } from "zod";
114
+
115
+ // src/schemas/equipment.ts
116
+ import { z as z2 } from "zod";
117
+ var equipmentSchema = z2.object({
118
+ type: z2.literal("equipment").optional(),
119
+ id: z2.number(),
120
+ name: z2.string(),
121
+ description: z2.string().nullable().optional(),
122
+ manual_url: z2.string().nullable().optional()
123
+ });
124
+
125
+ // src/schemas/training.ts
126
+ import { z as z3 } from "zod";
127
+ var gradingScalePointSchema = z3.object({
128
+ key: z3.string(),
129
+ description: z3.string()
130
+ });
131
+ var gradingScaleSchema = z3.object({
132
+ id: z3.number(),
133
+ name: z3.string(),
134
+ points: z3.array(gradingScalePointSchema)
135
+ });
136
+ var GradingScaleFormSchema = z3.object({
137
+ name: z3.string().min(1).max(255),
138
+ points: z3.array(gradingScalePointSchema).min(2)
139
+ });
140
+ var TrainingElementKindEnum = z3.enum([
141
+ "flight_exercise",
142
+ "theory",
143
+ "briefing",
144
+ "check"
145
+ ]);
146
+ var trainingElementSchema = z3.object({
147
+ id: z3.number(),
148
+ code: z3.string(),
149
+ name: z3.string(),
150
+ description: z3.string().nullable().optional(),
151
+ kind: TrainingElementKindEnum,
152
+ grading_scale_id: z3.number().nullable().optional(),
153
+ grading_scale: gradingScaleSchema.nullable(),
154
+ is_active: z3.boolean(),
155
+ // Where-used count — how many of the company's syllabi carry this
156
+ // element (`TrainingElementController::index`'s `attached_syllabi_count`
157
+ // withCount alias). Absent on any payload that doesn't count it.
158
+ attached_syllabi_count: z3.number().optional(),
159
+ // Provenance stamp (which template element this row was seeded/adopted
160
+ // from) — not yet exposed by TrainingElementResource; optional/forward-
161
+ // compatible.
162
+ template_element_id: z3.number().nullable().optional()
163
+ });
164
+ var TrainingElementFormSchema = z3.object({
165
+ code: z3.string().min(1).max(32),
166
+ name: z3.string().min(1).max(255),
167
+ description: z3.string().nullable().optional(),
168
+ kind: TrainingElementKindEnum,
169
+ grading_scale_id: z3.number().nullable().optional(),
170
+ is_active: z3.boolean().optional()
171
+ });
172
+ var SyllabusKindEnum = z3.enum(["regular", "progress_check"]);
173
+ var syllabusElementSchema = z3.object({
174
+ id: z3.number(),
175
+ syllabus_id: z3.number(),
176
+ // Embedded so a row still renders once its element is deactivated;
177
+ // `.nullable().optional()` mirrors `trainingRecordEntrySchema`'s own
178
+ // embedded-element convention — the backend omits the key entirely on any
179
+ // response that didn't eager-load the relation.
180
+ training_element: trainingElementSchema.nullable().optional(),
181
+ // The sheet's section header (was `phase` pre-amendment). `null` = no
182
+ // group declared.
183
+ group: z3.string().nullable().optional(),
184
+ sort_order: z3.number(),
185
+ is_required_each_flight: z3.boolean()
186
+ });
187
+ var AttachSyllabusElementFormSchema = z3.object({
188
+ training_element_id: z3.number(),
189
+ group: z3.string().nullable().optional(),
190
+ sort_order: z3.number().int().min(0).optional(),
191
+ is_required_each_flight: z3.boolean().optional()
192
+ });
193
+ var UpdateSyllabusElementFormSchema = z3.object({
194
+ group: z3.string().nullable().optional(),
195
+ sort_order: z3.number().int().min(0).optional(),
196
+ is_required_each_flight: z3.boolean().optional()
197
+ });
198
+ var ReorderSyllabusElementItemSchema = z3.object({
199
+ id: z3.number(),
200
+ group: z3.string().nullable()
201
+ });
202
+ var usedByCourseSchema = z3.object({
203
+ id: z3.number(),
204
+ name: z3.string(),
205
+ as: z3.enum(["syllabus", "booking_form", "both", "check"])
206
+ });
207
+ var syllabusSchema = z3.object({
208
+ id: z3.number(),
209
+ company_id: z3.number(),
210
+ name: z3.string(),
211
+ description: z3.string().nullable().optional(),
212
+ // `regular` | `progress_check` — a CONTENT field like
213
+ // `has_flight_evaluation`: changing it on a published, in-use revision
214
+ // auto-spawns a draft.
215
+ kind: SyllabusKindEnum.default("regular"),
216
+ // Gates whether the per-flight record renders/validates section 2
217
+ // (Gesamtbewertung + the three "Anmerkungen des Fluglehrers" prompts).
218
+ has_flight_evaluation: z3.boolean(),
219
+ // Gates whether `ready-to-sign` issues a student countersignature
220
+ // alongside the instructor's — per-syllabus (Amendment 2, replaces the
221
+ // former company-wide toggle).
222
+ requires_student_signature: z3.boolean(),
223
+ // ── Versioning (Amendment 2) — always present, flat (no server-side
224
+ // lineage grouping; the frontend groups client-side from these fields). ──
225
+ version: z3.number(),
226
+ root_syllabus_id: z3.number().nullable(),
227
+ is_draft: z3.boolean(),
228
+ // Derived server-side from the same eager-loaded where-used collections as
229
+ // the two `courses_as_*_count` fields below — same availability (`index`
230
+ // AND `show`, absent on `store`/`update`).
231
+ is_in_use: z3.boolean().optional(),
232
+ // Transient, request-scoped: present (non-null) only on the response of a
233
+ // mutation that just auto-spawned THIS row as the new draft — never a
234
+ // persisted property. The frontend's signal to toast-explain and
235
+ // `router.replace` onto this syllabus's own page.
236
+ spawned_from_id: z3.number().nullable().optional(),
237
+ // Only present when the relation was loaded (`show`/`store`/`update` —
238
+ // never on the `index` list).
239
+ elements: z3.array(syllabusElementSchema).optional(),
240
+ // `withCount('elements')` — present on `index` AND `show`; absent on
241
+ // `store`/`update` responses (use `elements.length` there instead, since
242
+ // those always eager-load the full `elements` relation anyway).
243
+ elements_count: z3.number().optional(),
244
+ // Where-used — present on `index` AND `show` (both eager-load both
245
+ // `coursesAs*` relations); absent on `store`/`update`.
246
+ courses_as_syllabus_count: z3.number().optional(),
247
+ courses_as_booking_form_syllabus_count: z3.number().optional(),
248
+ // One deduped entry per distinct course referencing this syllabus via
249
+ // either pointer (`as: "both"` when a course uses it for both). Same
250
+ // availability as the two counts above.
251
+ used_by_courses: z3.array(usedByCourseSchema).optional(),
252
+ // Heavier metric, `show` only.
253
+ materialized_enrollment_count: z3.number().optional(),
254
+ // Server-evaluated per-instance policy decisions (`HasGatesOnRequest`) —
255
+ // present when the fetch sends `permissions[syllabus]=*`. Loose record on
256
+ // purpose, same rationale as `companySchema.can`.
257
+ can: z3.record(z3.string(), z3.boolean().nullable()).optional(),
258
+ created_at: z3.string().optional(),
259
+ updated_at: z3.string().optional()
260
+ });
261
+ var StoreSyllabusFormSchema = z3.object({
262
+ name: z3.string().min(1).max(255),
263
+ description: z3.string().nullable().optional(),
264
+ kind: SyllabusKindEnum.optional(),
265
+ has_flight_evaluation: z3.boolean().optional(),
266
+ requires_student_signature: z3.boolean().optional()
267
+ });
268
+ var UpdateSyllabusFormSchema = z3.object({
269
+ name: z3.string().min(1).max(255).optional(),
270
+ description: z3.string().nullable().optional(),
271
+ kind: SyllabusKindEnum.optional(),
272
+ has_flight_evaluation: z3.boolean().optional(),
273
+ requires_student_signature: z3.boolean().optional()
274
+ });
275
+ var courseCheckSyllabusSchema = z3.object({
276
+ id: z3.number(),
277
+ name: z3.string(),
278
+ version: z3.number(),
279
+ kind: SyllabusKindEnum.default("regular")
280
+ });
281
+ var syllabusElementMutationResultSchema = z3.object({
282
+ syllabus: syllabusSchema,
283
+ element: syllabusElementSchema.nullable(),
284
+ spawned_from_id: z3.number().nullable()
285
+ });
286
+ var syllabusRolloutResultItemSchema = z3.object({
287
+ course_id: z3.number(),
288
+ course_name: z3.string(),
289
+ pointer: z3.enum(["syllabus", "booking_form", "check"])
290
+ });
291
+ var syllabusRolloutSkippedItemSchema = syllabusRolloutResultItemSchema.extend({
292
+ reason: z3.enum(["kind_mismatch"])
293
+ });
294
+ var syllabusRolloutResultSchema = z3.object({
295
+ results: z3.array(syllabusRolloutResultItemSchema),
296
+ skipped: z3.array(syllabusRolloutSkippedItemSchema)
297
+ });
298
+ var EnrollmentTrainingStatusEnum = z3.enum([
299
+ "not_started",
300
+ "in_training",
301
+ "completed",
302
+ "removed_from_syllabus"
303
+ ]);
304
+ var gradeHistoryItemSchema = z3.object({
305
+ training_record_id: z3.number(),
306
+ booking_id: z3.number(),
307
+ date: z3.string().nullable().optional(),
308
+ grade_key: z3.string().nullable().optional(),
309
+ comment: z3.string().nullable().optional(),
310
+ instructor_name: z3.string().nullable().optional()
311
+ });
312
+ var enrollmentTrainingElementSchema = z3.object({
313
+ id: z3.number(),
314
+ course_enrollment_id: z3.number(),
315
+ status: EnrollmentTrainingStatusEnum,
316
+ // Denormalized from the course's (Übersicht-driving) syllabus row at
317
+ // materialization time — was `phase` pre-amendment.
318
+ group_label: z3.string().nullable().optional(),
319
+ sort_order: z3.number(),
320
+ signed_off_at: z3.string().nullable(),
321
+ signed_off_by: z3.object({
322
+ id: z3.number(),
323
+ name: z3.string().optional()
324
+ }).nullable(),
325
+ notes: z3.string().nullable().optional(),
326
+ training_element: trainingElementSchema,
327
+ grade_history: z3.array(gradeHistoryItemSchema),
328
+ latest_grade_key: z3.string().nullable().optional()
329
+ });
330
+ var SignOffTrainingElementFormSchema = z3.object({
331
+ notes: z3.string().nullable().optional(),
332
+ signed_off_by_membership_id: z3.number().nullable().optional()
333
+ });
334
+ var TrainingRecordStatusEnum = z3.enum([
335
+ "draft",
336
+ "awaiting_signatures",
337
+ "signed"
338
+ ]);
339
+ var TrainingRecordResultEnum = z3.enum(["passed", "failed"]);
340
+ var trainingRecordEntrySchema = z3.object({
341
+ id: z3.number(),
342
+ training_element_id: z3.number(),
343
+ // Embedded so a signed record (immutable evidence) still renders fully
344
+ // even if the element is later detached from the syllabus —
345
+ // callers must prefer this over resolving `training_element_id` against
346
+ // the (mutable, current) syllabus. `.nullable().optional()`: the backend
347
+ // omits the key entirely (via `whenLoaded`) on any response that didn't
348
+ // eager-load the relation, and could resolve it to `null` in a genuinely
349
+ // orphaned edge case — both degrade to "treat as unresolved", not a
350
+ // parse failure.
351
+ training_element: trainingElementSchema.nullable().optional(),
352
+ grade_key: z3.string().nullable().optional(),
353
+ comment: z3.string().nullable().optional()
354
+ });
355
+ var trainingRecordEntryInputSchema = z3.object({
356
+ training_element_id: z3.number(),
357
+ grade_key: z3.string().nullable().optional(),
358
+ comment: z3.string().nullable().optional()
359
+ });
360
+ var trainingSignatureSchema = z3.object({
361
+ type: z3.literal("signature").optional(),
362
+ id: z3.number(),
363
+ signable_type: z3.string().optional(),
364
+ signable_id: z3.number().optional(),
365
+ field_key: z3.string(),
366
+ status: z3.enum(["pending", "signed", "revoked"]),
367
+ required_signer_membership_id: z3.number().nullable(),
368
+ required_signer_name: z3.string().nullable().optional(),
369
+ required_signer_permission: z3.string().nullable().optional(),
370
+ signed_by_user_id: z3.number().nullable(),
371
+ signed_by_membership_id: z3.number().nullable(),
372
+ signed_by_name: z3.string().nullable().optional(),
373
+ is_current_user_designated: z3.boolean().optional().default(false),
374
+ signed_at: z3.string().nullable(),
375
+ image: z3.string().nullable(),
376
+ data_hash: z3.string().nullable(),
377
+ schema_version: z3.number().nullable(),
378
+ schema_hash: z3.string().nullable(),
379
+ consent_text_hash: z3.string().nullable(),
380
+ auth_method: z3.string().nullable(),
381
+ auth_verified_at: z3.string().nullable(),
382
+ ip_address: z3.string().nullable(),
383
+ user_agent: z3.string().nullable(),
384
+ geo_country: z3.string().nullable(),
385
+ signing_event_id: z3.string().nullable(),
386
+ created_at: z3.string().optional(),
387
+ updated_at: z3.string().optional()
388
+ });
389
+ var trainingRecordSchema = z3.object({
390
+ id: z3.number(),
391
+ booking_id: z3.number(),
392
+ course_enrollment_id: z3.number(),
393
+ instructor_membership_id: z3.number().nullable().optional(),
394
+ status: TrainingRecordStatusEnum,
395
+ // Whether section 2 (Gesamtbewertung + Anmerkungen) applies at all — read
396
+ // live off the course's booking-form syllabus by
397
+ // `TrainingRecordResource`, the single source of truth. `false` (never
398
+ // absent) when there's no booking-form syllabus at all.
399
+ has_flight_evaluation: z3.boolean().default(false),
400
+ // The exact booking-form syllabus revision stamped at CREATE time (never
401
+ // on a later update) — the audit-chain provenance ("Rev. n this session
402
+ // was graded against"). `syllabus` is `null` when the course had no
403
+ // booking-form syllabus assigned at creation time.
404
+ syllabus_id: z3.number().nullable().optional(),
405
+ // `kind` is the frontend's signal to render the check-only "Ergebnis"
406
+ // section for this record.
407
+ syllabus: z3.object({
408
+ id: z3.number(),
409
+ name: z3.string(),
410
+ version: z3.number(),
411
+ kind: SyllabusKindEnum.default("regular")
412
+ }).nullable().optional(),
413
+ // Non-null only on check-kind records (see TrainingRecordResultEnum).
414
+ result: TrainingRecordResultEnum.nullable().optional(),
415
+ // The J3-mirroring fields — the Gesamtbewertung (a point key from the
416
+ // booking-form syllabus's element grading scales) plus the three
417
+ // "Anmerkungen des Fluglehrers" comment sections from the paper form.
418
+ overall_grade_key: z3.string().nullable().optional(),
419
+ what_went_well: z3.string().nullable().optional(),
420
+ needs_improvement: z3.string().nullable().optional(),
421
+ repeat_next_flight: z3.string().nullable().optional(),
422
+ entries: z3.array(trainingRecordEntrySchema),
423
+ signatures: z3.array(trainingSignatureSchema),
424
+ created_at: z3.string().optional(),
425
+ updated_at: z3.string().optional()
426
+ });
427
+ var UpsertTrainingRecordFormSchema = z3.object({
428
+ // CREATE only — which sheet this record fills (the course's booking-form
429
+ // syllabus when omitted, or one of its attached check syllabi). The choice
430
+ // IS the stamp; PATCH prohibits this key entirely (the stamp never moves).
431
+ syllabus_id: z3.number().nullable().optional(),
432
+ // Check-kind sheets only — 422 on any other sheet.
433
+ result: TrainingRecordResultEnum.nullable().optional(),
434
+ overall_grade_key: z3.string().nullable().optional(),
435
+ what_went_well: z3.string().nullable().optional(),
436
+ needs_improvement: z3.string().nullable().optional(),
437
+ repeat_next_flight: z3.string().nullable().optional(),
438
+ instructor_membership_id: z3.number().nullable().optional(),
439
+ entries: z3.array(trainingRecordEntryInputSchema)
440
+ });
441
+ var trainingTemplatePackSchema = z3.object({
442
+ key: z3.string(),
443
+ name: z3.string(),
444
+ description: z3.string().nullable().optional(),
445
+ // Carried onto the syllabus the pack creates (regular vs. progress check).
446
+ kind: SyllabusKindEnum.default("regular"),
447
+ element_count: z3.number().optional()
448
+ });
449
+ var CreateSyllabusFromTemplateFormSchema = z3.object({
450
+ template_key: z3.string().min(1)
451
+ });
452
+ var createSyllabusFromTemplateResultSchema = z3.object({
453
+ catalog: z3.object({
454
+ created: z3.number(),
455
+ existing: z3.number(),
456
+ adopted: z3.number(),
457
+ mismatched: z3.array(
458
+ z3.object({
459
+ code: z3.string(),
460
+ company_name: z3.string(),
461
+ template_name: z3.string()
462
+ })
463
+ )
464
+ }),
465
+ elements: z3.object({
466
+ created: z3.number(),
467
+ existing: z3.number()
468
+ }),
469
+ syllabus: syllabusSchema
470
+ });
471
+
472
+ // src/schemas/models.ts
473
+ var baseMembershipSchema = z4.object({
474
+ type: z4.literal("membership"),
475
+ id: z4.number(),
476
+ user_id: z4.number(),
477
+ user: userSchema.optional(),
478
+ company_id: z4.number(),
479
+ company: companySchema.nullable().optional(),
480
+ name: z4.string(),
481
+ phone: z4.string().nullable().optional(),
482
+ status: z4.string(),
483
+ instructor: z4.boolean(),
484
+ admin: z4.boolean(),
485
+ accountant: z4.boolean(),
486
+ student: z4.boolean(),
487
+ content_creator: z4.boolean(),
488
+ charter_client: z4.boolean(),
489
+ roles: z4.array(
490
+ z4.object({
491
+ id: z4.number(),
492
+ name: z4.string()
493
+ }).passthrough()
494
+ ).optional(),
495
+ created_at: z4.string(),
496
+ updated_at: z4.string(),
497
+ can: z4.object({
498
+ update: zNullableBool,
499
+ deactivate: zNullableBool,
500
+ activate: zNullableBool,
501
+ delete: zNullableBool
502
+ }).optional()
503
+ });
504
+ var membershipSchema = baseMembershipSchema.extend({
505
+ remarks: z4.string().nullable().optional(),
506
+ confirmed_at: z4.string().nullable(),
507
+ created_at: z4.string(),
508
+ updated_at: z4.string()
509
+ });
510
+ var documentType = z4.object({
511
+ label: z4.string(),
512
+ description: z4.string(),
513
+ documentTypeClass: z4.string(),
514
+ requiresFile: z4.boolean().optional(),
515
+ fieldDefinitions: z4.object({
516
+ base: z4.record(z4.any()).optional(),
517
+ data: z4.record(z4.any()).optional()
518
+ }).optional(),
519
+ validationRules: z4.record(z4.any()).optional()
520
+ });
521
+ var priceSchema = z4.object({
522
+ id: z4.number(),
523
+ gross_total: zPhpMoneyObject,
524
+ net_total: zPhpMoneyObject,
525
+ tax_percentage: z4.number(),
526
+ valid_from: z4.string(),
527
+ created_at: z4.string(),
528
+ updated_at: z4.string(),
529
+ input_value: z4.number().optional(),
530
+ net_gross: zNetGross
531
+ });
532
+ var feeSchema = BaseModel.extend({
533
+ type: z4.literal("fee"),
534
+ id: z4.number(),
535
+ price: priceSchema.optional(),
536
+ prices: z4.array(priceSchema).optional(),
537
+ provider: z4.string().nullable().optional(),
538
+ company_id: z4.number().optional(),
539
+ company: companySchema.optional(),
540
+ ident: z4.string().optional(),
541
+ category: z4.string().optional(),
542
+ subcategory: z4.string().nullable().optional(),
543
+ title: z4.string().optional(),
544
+ internal_title: z4.string().nullable().optional(),
545
+ // internal_title falling back to title, resolved server-side.
546
+ display_title: z4.string().optional(),
547
+ // Course-derived fees (source course + which course fee spawned them).
548
+ source_course_id: z4.number().nullable().optional(),
549
+ source_key: z4.string().nullable().optional(),
550
+ is_derived: z4.boolean().optional(),
551
+ relation: z4.array(z4.enum(["booking", "flightLog", "invoice", "instructor"])).nullable().optional(),
552
+ payment_per: z4.string().nullable().optional(),
553
+ can: z4.record(z4.string(), z4.boolean().nullable()).optional(),
554
+ course_count: z4.number().optional(),
555
+ // feeables-pivot fields, present when the fee is serialized through an
556
+ // attachment (course/enrollment listings).
557
+ count: z4.number().optional(),
558
+ variant: z4.string().nullable().optional(),
559
+ is_optional: z4.boolean().optional(),
560
+ sort_order: z4.number().nullable().optional(),
561
+ is_initial_payment: z4.boolean().optional(),
562
+ feeables: z4.array(
563
+ z4.object({
564
+ feeable_id: z4.number(),
565
+ feeable_type: z4.string(),
566
+ count: z4.number().nullable(),
567
+ variant: z4.string().nullable(),
568
+ is_optional: z4.boolean().nullable(),
569
+ is_initial_payment: z4.boolean().nullable(),
570
+ sort_order: z4.number().nullable()
571
+ })
572
+ ).optional(),
573
+ input_value: z4.number().optional(),
574
+ net_gross: zNetGross,
575
+ tax_percentage: z4.string().optional(),
576
+ valid_from: z4.string()
577
+ });
578
+ var feeCategoryOptionsSchema = z4.object({
579
+ categories: z4.array(z4.string()),
580
+ subcategories: z4.record(z4.string(), z4.array(z4.string()))
581
+ });
582
+ var courseFeeSchema = feeSchema.extend({
583
+ count: z4.number().optional(),
584
+ variant: z4.string().optional(),
585
+ is_optional: z4.boolean().optional(),
586
+ is_initial_payment: z4.boolean().optional()
587
+ });
588
+ var airplaneSchema = BaseModel.extend({
589
+ type: z4.literal("airplane"),
590
+ id: z4.number(),
591
+ company_id: z4.number(),
592
+ registration: z4.string(),
593
+ model: z4.string(),
594
+ media: mediaCollection.optional(),
595
+ fee: feeSchema.optional(),
596
+ booking_fee: feeSchema.optional(),
597
+ hasFavorited: z4.boolean().optional(),
598
+ homebase_id: z4.number().nullable().optional(),
599
+ hangar_location_map_feature_id: z4.number().nullable().optional(),
600
+ parking_lng: z4.number().nullable().optional(),
601
+ parking_lat: z4.number().nullable().optional(),
602
+ hangar: z4.object({
603
+ id: z4.number(),
604
+ name: z4.string().nullable(),
605
+ kind: z4.string(),
606
+ location_map_id: z4.number()
607
+ }).nullable().optional(),
608
+ description: z4.string().optional(),
609
+ capacity: z4.number().optional(),
610
+ manufacturer: z4.string().optional(),
611
+ year_of_construction: z4.string().optional(),
612
+ span: z4.string().optional(),
613
+ height: z4.string().optional(),
614
+ length: z4.string().optional(),
615
+ ato: z4.boolean().optional(),
616
+ restricted_access: z4.boolean().optional(),
617
+ global_airplane_id: z4.number().nullable().optional(),
618
+ is_master: z4.boolean().optional(),
619
+ master_company_id: z4.number().nullable().optional(),
620
+ shared_companies: z4.array(z4.object({ id: z4.number(), name: z4.string() })).optional(),
621
+ is_simulator: z4.boolean().optional(),
622
+ category: z4.string().nullable().optional(),
623
+ averageFuelConsumption: z4.string().nullable().optional(),
624
+ weightUnitString: z4.string().optional(),
625
+ fuelUnitString: z4.string().optional(),
626
+ isoCountryCodeFromRegistration: z4.string().optional(),
627
+ registrationWithoutSpecialChars: z4.string().nullable().optional(),
628
+ equipmentCodes: z4.array(z4.string()).nullable().optional(),
629
+ compliance_required: z4.boolean().optional(),
630
+ show_on_website: z4.boolean().optional(),
631
+ is_public: z4.boolean().optional(),
632
+ company_timezone: z4.string().optional(),
633
+ defaultFlightType: z4.string().optional(),
634
+ defaultFlightRule: z4.string().optional(),
635
+ status: z4.string().optional(),
636
+ // Physical/capability facts — serialized by BaseAirplaneResource on EVERY
637
+ // airplane payload (not just the extended show shape).
638
+ minimumCrewCount: z4.number().optional(),
639
+ classRating: z4.string().nullable().optional(),
640
+ typeRating: z4.string().nullable().optional(),
641
+ VFR: z4.boolean().optional(),
642
+ VFRNight: z4.boolean().optional(),
643
+ IFR: z4.boolean().optional(),
644
+ IFRKnownIcing: z4.boolean().optional(),
645
+ power: z4.string().optional(),
646
+ fuel_type: z4.string().optional(),
647
+ oil_min: z4.string().optional(),
648
+ oil_max: z4.string().optional(),
649
+ oil_type_winter: z4.string().optional(),
650
+ oil_type_summer: z4.string().optional(),
651
+ empty_weight: z4.string().optional(),
652
+ max_takeoff_mass: z4.string().optional(),
653
+ max_speed: z4.string().optional(),
654
+ max_range: z4.string().optional(),
655
+ equipment: z4.array(equipmentSchema).optional(),
656
+ has_pre_paid_package: z4.boolean().optional(),
657
+ logging_required_from: z4.string().optional(),
658
+ fee_id: z4.number().nullable().optional(),
659
+ booking_fee_id: z4.number().nullable().optional(),
660
+ homebase: z4.object({
661
+ id: z4.number(),
662
+ ident: z4.string().optional(),
663
+ name: z4.string().optional()
664
+ }).nullable().optional(),
665
+ // Loose record on purpose: gates are policy-reflected server-side and
666
+ // grow over time — same convention as companySchema.
667
+ can: z4.record(z4.string(), z4.boolean().nullable()).optional()
668
+ });
669
+ var aircraftPositionSchema = z4.object({
670
+ lat: z4.number().nullable().optional(),
671
+ lon: z4.number().nullable().optional(),
672
+ timestamp: z4.union([z4.string(), z4.number()]).nullable().optional()
673
+ });
674
+ var airplaneShareInviteSchema = z4.object({
675
+ id: z4.number(),
676
+ status: z4.enum(["pending", "accepted", "declined", "withdrawn"]),
677
+ responded_at: z4.string().nullable().optional(),
678
+ created_at: z4.string().optional(),
679
+ global_airplane: z4.object({
680
+ id: z4.number(),
681
+ registration: z4.string(),
682
+ model: z4.string()
683
+ }),
684
+ master_company: z4.object({ id: z4.number(), name: z4.string() }),
685
+ invited_company: z4.object({ id: z4.number(), name: z4.string() })
686
+ });
687
+ var airplanePermissionSchema = z4.object({
688
+ type: z4.literal("airplane_permission"),
689
+ id: z4.number(),
690
+ airplane_id: z4.number(),
691
+ airplane: airplaneSchema.optional(),
692
+ membership_id: z4.number(),
693
+ membership: baseMembershipSchema.optional(),
694
+ notes: z4.string().nullable().optional(),
695
+ conditions: z4.string().nullable().optional(),
696
+ expires_at: z4.string().nullable().optional(),
697
+ is_active: z4.boolean(),
698
+ granted_by: userSchema.nullable().optional(),
699
+ granted_at: z4.string(),
700
+ created_at: z4.string(),
701
+ updated_at: z4.string(),
702
+ can: z4.object({
703
+ view: zNullableBool,
704
+ update: zNullableBool,
705
+ delete: zNullableBool
706
+ }).optional()
707
+ });
708
+ var landingFeeSchema = z4.object({
709
+ id: z4.number(),
710
+ airplane_id: z4.number(),
711
+ price: priceSchema.optional()
712
+ });
713
+ var aircraftRatingSchema = z4.object({
714
+ id: z4.number(),
715
+ manufacturer: z4.string(),
716
+ aircraft_model: z4.string(),
717
+ licence_endorsement: z4.string(),
718
+ is_complex: z4.boolean(),
719
+ is_single_pilot: z4.boolean(),
720
+ is_high_performance: z4.boolean(),
721
+ is_multi_pilot: z4.boolean(),
722
+ remarks: z4.string().optional()
723
+ });
724
+ var userAircraftRatingSchema = z4.object({
725
+ id: z4.number(),
726
+ user_id: z4.number(),
727
+ aircraft_rating_id: z4.number(),
728
+ aircraftRating: aircraftRatingSchema,
729
+ reminder_enabled: z4.boolean(),
730
+ reminder_days: z4.number(),
731
+ expires_at: z4.string(),
732
+ created_at: z4.string(),
733
+ updated_at: z4.string()
734
+ });
735
+ var userQualificationSchema = z4.object({
736
+ id: z4.number(),
737
+ user_id: z4.number(),
738
+ title: z4.string(),
739
+ reminder_enabled: z4.boolean(),
740
+ reminder_days: z4.number(),
741
+ expires_at: z4.string(),
742
+ created_at: z4.string(),
743
+ updated_at: z4.string()
744
+ });
745
+ var airportSchema = z4.object({
746
+ // Aligned with what AirportResource actually serializes: `type` and
747
+ // `country` are absent on minified payloads (e.g. booking waypoint
748
+ // airports); coordinates + municipality/iso_country ride along on the
749
+ // full shape.
750
+ type: z4.literal("airport").optional(),
751
+ id: z4.number(),
752
+ ident: z4.string(),
753
+ name: z4.string(),
754
+ country: z4.string().optional(),
755
+ municipality: z4.string().nullable().optional(),
756
+ iso_country: z4.string().nullable().optional(),
757
+ latitude_deg: z4.number().nullable().optional(),
758
+ longitude_deg: z4.number().nullable().optional()
759
+ });
760
+ var recurringFlightSchema = z4.object({
761
+ id: z4.number(),
762
+ departure_airport_id: z4.number(),
763
+ departure_airport: airportSchema.optional(),
764
+ destination_airport_id: z4.number(),
765
+ destination_airport: airportSchema.optional(),
766
+ dep_time: z4.string(),
767
+ arr_time: z4.string()
768
+ });
769
+ var maintenanceEventSchema = z4.object({
770
+ type: z4.literal("maintenanceEvent"),
771
+ id: z4.number(),
772
+ airplane_id: z4.number(),
773
+ company_id: z4.number(),
774
+ description: z4.string().nullable(),
775
+ remarks: z4.string().nullable(),
776
+ scheduled_at: z4.string().nullable(),
777
+ completed_at: z4.string().nullable(),
778
+ created_at: z4.string(),
779
+ updated_at: z4.string(),
780
+ elapsed_time: z4.number().nullable(),
781
+ remaining_time: z4.number().nullable(),
782
+ can: z4.object({
783
+ update: zNullableBool
784
+ }).optional()
785
+ });
786
+ var maintenanceEventEstimationSchema = z4.object({
787
+ estimated_at: z4.string().nullable().optional(),
788
+ actual_at: z4.string().nullable().optional()
789
+ });
790
+ var maintenanceStatusSchema = z4.object({
791
+ intervalSetting: z4.number().optional(),
792
+ lastMaintenanceEvent: maintenanceEventSchema.nullable().optional(),
793
+ nextMaintenanceEventEstimation: maintenanceEventEstimationSchema.nullable().optional()
794
+ });
795
+ var extendedAirplaneSchema = airplaneSchema.extend({
796
+ contact: contactAttributeSchema.optional(),
797
+ hints: z4.object({
798
+ booking: z4.object({
799
+ ifr: z4.string().optional()
800
+ }).optional()
801
+ }).optional(),
802
+ foreflight_profile_url: z4.string().optional(),
803
+ company: companySchema.optional(),
804
+ latestPosition: aircraftPositionSchema.nullable().optional(),
805
+ total_flight_time_minutes: z4.number().nullable().optional(),
806
+ elapsed_time: z4.number().nullable().optional(),
807
+ remaining_time: z4.number().nullable().optional(),
808
+ completed_at: z4.string().nullable().optional(),
809
+ flight_log_enabled: z4.boolean().optional(),
810
+ latest_maintenance_event: maintenanceEventSchema.nullable().optional(),
811
+ master_media: mediaCollection.optional()
812
+ });
813
+ var availSchema = z4.object({
814
+ type: z4.literal("avail"),
815
+ id: z4.number(),
816
+ airplane_id: z4.number(),
817
+ title: z4.string(),
818
+ etdZ: z4.string(),
819
+ etaZ: z4.string(),
820
+ can: z4.object({
821
+ update: zNullableBool
822
+ }).optional()
823
+ });
824
+ var bookingWaypointSchema = z4.object({
825
+ sequence: z4.number(),
826
+ airport_id: z4.number(),
827
+ airport: z4.object({
828
+ id: z4.number(),
829
+ ident: z4.string(),
830
+ name: z4.string(),
831
+ municipality: z4.string().nullable().optional(),
832
+ iso_country: z4.string().nullable().optional(),
833
+ latitude_deg: z4.number().nullable().optional(),
834
+ longitude_deg: z4.number().nullable().optional()
835
+ }).nullable().optional()
836
+ });
837
+ var activitySchema = z4.object({
838
+ id: z4.number(),
839
+ log_name: z4.string().nullable().optional(),
840
+ description: z4.string().optional(),
841
+ event: z4.string().nullable().optional(),
842
+ subject_type: z4.string().nullable().optional(),
843
+ subject_id: z4.number().nullable().optional(),
844
+ causer_type: z4.string().nullable().optional(),
845
+ causer_id: z4.number().nullable().optional(),
846
+ causer: userSchema.nullable().optional(),
847
+ properties: z4.record(z4.string(), z4.unknown()).optional(),
848
+ batch_uuid: z4.string().nullable().optional(),
849
+ created_at: z4.string().optional(),
850
+ updated_at: z4.string().optional()
851
+ });
852
+ var bookingSchema = BaseModel.extend({
853
+ type: z4.literal("booking"),
854
+ ifr: z4.boolean().default(false),
855
+ airplane_id: z4.number(),
856
+ author: userSchema.optional(),
857
+ company_id: z4.number(),
858
+ company_name: z4.string().nullable().optional(),
859
+ company: companySchema.optional(),
860
+ airplane: airplaneSchema.optional(),
861
+ etdZ: z4.string(),
862
+ etaZ: z4.string(),
863
+ duration_minutes: z4.number().optional(),
864
+ departure_airport_id: z4.number().optional(),
865
+ destination_airport_id: z4.number().optional(),
866
+ departure_airport: airportSchema.optional(),
867
+ destination_airport: airportSchema.optional(),
868
+ waypoints: z4.array(bookingWaypointSchema).optional(),
869
+ // Flat, always-present home timezone on BookingResource.
870
+ company_timezone: z4.string().nullable().optional(),
871
+ // Slim per-booking training-record status, present when the backend
872
+ // eager-loaded `trainingRecord` (enrollment bookings surfaces).
873
+ training_record_status: z4.enum(["draft", "awaiting_signatures", "signed"]).nullable().optional(),
874
+ next_booking_id: z4.number().nullable().optional(),
875
+ previous_booking_id: z4.number().nullable().optional(),
876
+ maintenance: z4.number().optional(),
877
+ is_solo: z4.boolean().optional().default(false),
878
+ course_enrollment_id: z4.number().nullable().optional(),
879
+ // Minimal linked enrollment, present on booking show/store/update payloads.
880
+ // Used by the form prefill registry to derive the J2 Flugauftrag course.
881
+ course_enrollment: z4.object({
882
+ id: z4.number(),
883
+ course_id: z4.number().nullable().optional()
884
+ }).nullable().optional(),
885
+ crew_assignments: z4.array(
886
+ z4.object({
887
+ id: z4.number().optional(),
888
+ membership_id: z4.number(),
889
+ role: z4.string(),
890
+ is_pic: z4.boolean().optional(),
891
+ membership: z4.any().optional()
892
+ })
893
+ ).optional(),
894
+ contact: zContactDTO.optional(),
895
+ remarks: z4.string().optional(),
896
+ ac_call: z4.string().nullable().optional(),
897
+ ac_type: z4.string().nullable().optional(),
898
+ // Audit trail (BookingResource `activities`, present when eager-loaded).
899
+ activities: z4.array(activitySchema).optional(),
900
+ // Present when eager-loaded (BookingResource conditional appends). Lazy:
901
+ // both schemas are declared later in this file; there is no true cycle.
902
+ flight_logs: z4.array(z4.lazy(() => flightLogSchema)).optional(),
903
+ expense_items: z4.array(z4.lazy(() => expenseItemSchema)).optional(),
904
+ // Loose record on purpose: gates are policy-reflected server-side and
905
+ // grow over time — same convention as companySchema.
906
+ can: z4.record(z4.string(), z4.boolean().nullable()).optional()
907
+ });
908
+ var alertSchema = z4.object({
909
+ id: z4.number(),
910
+ start_time: z4.string(),
911
+ finish_time: z4.string(),
912
+ can: z4.object({
913
+ update: zNullableBool
914
+ }).optional()
915
+ });
916
+ var documentSchema = z4.object({
917
+ type: z4.literal("document"),
918
+ id: z4.number(),
919
+ documentable_type: z4.string(),
920
+ documentable_id: z4.number(),
921
+ document_type_class: z4.string(),
922
+ document_type: documentType.optional(),
923
+ title: z4.string().nullable().optional(),
924
+ description: z4.string().nullable().optional(),
925
+ expires_at: z4.string().nullable().optional(),
926
+ is_notifiable: z4.boolean().default(true),
927
+ notification_days: z4.number().nullable().optional(),
928
+ data: z4.record(z4.any()).nullable().optional(),
929
+ created_by: z4.number().nullable().optional(),
930
+ updated_by: z4.number().nullable().optional(),
931
+ created_at: z4.string(),
932
+ updated_at: z4.string(),
933
+ media: z4.array(mediaSchema).optional(),
934
+ can: z4.object({
935
+ update: zNullableBool,
936
+ delete: zNullableBool,
937
+ share: zNullableBool
938
+ }).optional()
939
+ });
940
+ var documentRequirement = z4.object({
941
+ id: z4.number(),
942
+ form_requirement_group_id: z4.number(),
943
+ form_template_id: z4.number(),
944
+ form_template: z4.object({
945
+ id: z4.number(),
946
+ name: z4.string(),
947
+ slug: z4.string().nullable().optional()
948
+ }).optional(),
949
+ logical_group: z4.string().nullable().optional(),
950
+ group_operator: z4.enum(["AND", "OR"]).nullable().optional(),
951
+ metadata: z4.object({
952
+ min_validity_days: z4.number().optional(),
953
+ max_validity_days: z4.number().optional(),
954
+ required_fields: z4.array(z4.string()).optional()
955
+ }).nullable().optional(),
956
+ created_by: z4.number().nullable().optional(),
957
+ updated_by: z4.number().nullable().optional(),
958
+ created_at: z4.string(),
959
+ updated_at: z4.string()
960
+ });
961
+ var documentRequirementGroup = z4.object({
962
+ id: z4.number(),
963
+ name: z4.string(),
964
+ description: z4.string().nullable().optional(),
965
+ target_model_type: z4.string(),
966
+ company_id: z4.number().nullable().optional(),
967
+ is_default_template: z4.boolean().default(false),
968
+ is_active: z4.boolean().default(true),
969
+ requirements: z4.array(documentRequirement).optional(),
970
+ // Backend uses 'requirements'
971
+ documentRequirements: z4.array(documentRequirement).optional(),
972
+ // Frontend compatibility
973
+ group_operator: z4.enum(["AND", "OR"]).default("AND"),
974
+ documentRequirements_count: z4.number().optional(),
975
+ assignments_count: z4.number().optional(),
976
+ created_by: z4.number().nullable().optional(),
977
+ updated_by: z4.number().nullable().optional(),
978
+ created_at: z4.string(),
979
+ updated_at: z4.string(),
980
+ can: z4.object({
981
+ update: zNullableBool,
982
+ delete: zNullableBool,
983
+ assign: zNullableBool
984
+ }).optional()
985
+ });
986
+ var documentRequirementGroupAssignment = z4.object({
987
+ id: z4.number(),
988
+ assignable_type: z4.string(),
989
+ assignable_id: z4.number(),
990
+ requirement_group_id: z4.number(),
991
+ requirement_group: documentRequirementGroup.optional(),
992
+ requirementGroup: documentRequirementGroup.optional(),
993
+ // Frontend compatibility
994
+ created_at: z4.string(),
995
+ updated_at: z4.string()
996
+ });
997
+ var documentComplianceStatus = z4.object({
998
+ overall_compliant: z4.boolean(),
999
+ missing_documents: z4.array(
1000
+ z4.object({
1001
+ requirement_id: z4.number(),
1002
+ document_type_class: z4.string(),
1003
+ document_type: documentType.optional(),
1004
+ reason: z4.string()
1005
+ })
1006
+ ).optional(),
1007
+ expired_documents: z4.array(
1008
+ z4.object({
1009
+ document_id: z4.number(),
1010
+ document_type_class: z4.string(),
1011
+ document_type: documentType.optional(),
1012
+ expired_at: z4.string()
1013
+ })
1014
+ ).optional(),
1015
+ expiring_soon_documents: z4.array(
1016
+ z4.object({
1017
+ document_id: z4.number(),
1018
+ document_type_class: z4.string(),
1019
+ document_type: documentType.optional(),
1020
+ expires_at: z4.string(),
1021
+ days_until_expiry: z4.number()
1022
+ })
1023
+ ).optional(),
1024
+ group_compliance_status: z4.array(
1025
+ z4.object({
1026
+ group_id: z4.number(),
1027
+ group_name: z4.string(),
1028
+ is_compliant: z4.boolean(),
1029
+ missing_requirements: z4.array(z4.string()).optional()
1030
+ })
1031
+ ).optional()
1032
+ });
1033
+ var documentShareSchema = z4.object({
1034
+ id: z4.number(),
1035
+ document_id: z4.number(),
1036
+ document: documentSchema.optional(),
1037
+ shared_by: z4.number(),
1038
+ sharer: userSchema.optional(),
1039
+ shared_with_type: z4.string(),
1040
+ shared_with_id: z4.number(),
1041
+ can_download: z4.boolean().default(true),
1042
+ can_delete: z4.boolean().default(false),
1043
+ expires_at: z4.string().nullable().optional(),
1044
+ accessed_at: z4.string().nullable().optional(),
1045
+ access_count: z4.number().default(0),
1046
+ created_at: z4.string(),
1047
+ updated_at: z4.string()
1048
+ });
1049
+ var allowedDocumentTypeSchema = z4.object({
1050
+ label: z4.string(),
1051
+ description: z4.string(),
1052
+ documentTypeClass: z4.string(),
1053
+ requiresFile: z4.boolean(),
1054
+ category: z4.string().optional(),
1055
+ fieldDefinitions: z4.object({
1056
+ base: z4.record(
1057
+ z4.object({
1058
+ type: z4.string(),
1059
+ label: z4.string(),
1060
+ required: z4.boolean().optional(),
1061
+ rules: z4.array(z4.any()).optional(),
1062
+ options: z4.array(z4.any()).optional(),
1063
+ hint: z4.string().optional()
1064
+ })
1065
+ ).optional(),
1066
+ data: z4.record(
1067
+ z4.object({
1068
+ type: z4.string(),
1069
+ label: z4.string(),
1070
+ required: z4.boolean().optional(),
1071
+ rules: z4.array(z4.any()).optional(),
1072
+ options: z4.array(z4.any()).optional(),
1073
+ hint: z4.string().optional()
1074
+ })
1075
+ ).optional()
1076
+ }).optional()
1077
+ });
1078
+ var flightLogSchema = z4.object({
1079
+ type: z4.literal("flightLog"),
1080
+ id: z4.number(),
1081
+ airplane_id: z4.number(),
1082
+ airplane: airplaneSchema.optional(),
1083
+ // Present when eager-loaded (FlightLogResource, camelCase key). Lazy:
1084
+ // expenseItemSchema is declared later in this file; there is no true cycle.
1085
+ expenseItems: z4.array(z4.lazy(() => expenseItemSchema)).optional(),
1086
+ ac_type: z4.string().nullable().optional(),
1087
+ ac_reg: z4.string().nullable().optional(),
1088
+ ac_call: z4.string().nullable().optional(),
1089
+ booking_id: z4.number().nullable().optional(),
1090
+ membership_id: z4.number().nullable().optional(),
1091
+ membership: baseMembershipSchema.optional(),
1092
+ author_id: z4.number(),
1093
+ author: userSchema.optional(),
1094
+ invoice_id: z4.number().nullable().optional(),
1095
+ special_flight_id: z4.number().nullable().optional(),
1096
+ etdZ: z4.string(),
1097
+ etaZ: z4.string(),
1098
+ duration_minutes: z4.number(),
1099
+ crew_assignments: z4.array(
1100
+ z4.object({
1101
+ id: z4.number().optional(),
1102
+ membership_id: z4.number(),
1103
+ role: z4.string(),
1104
+ is_pic: z4.boolean().optional(),
1105
+ membership: z4.any().optional()
1106
+ })
1107
+ ).optional(),
1108
+ total_landings: z4.number().nullable().optional(),
1109
+ full_stop_landings: z4.number().nullable().optional(),
1110
+ touch_and_gos: z4.number().default(0),
1111
+ low_approaches: z4.number().default(0),
1112
+ flight_rule: z4.string().nullable().optional(),
1113
+ flight_time_type: z4.string().nullable().optional(),
1114
+ dep_airport_id: z4.number().nullable().optional(),
1115
+ dep_airport: airportSchema.optional(),
1116
+ arr_airport_id: z4.number().nullable().optional(),
1117
+ arr_airport: airportSchema.optional(),
1118
+ from: z4.string().nullable().optional(),
1119
+ to: z4.string().nullable().optional(),
1120
+ costs: zPhpMoneyObject.nullable().optional(),
1121
+ charge: zPhpMoneyObject.nullable().optional(),
1122
+ remarks: z4.string().nullable().optional(),
1123
+ created_at: z4.string(),
1124
+ updated_at: z4.string(),
1125
+ can: z4.object({
1126
+ update: zNullableBool,
1127
+ delete: zNullableBool
1128
+ }).optional()
1129
+ });
1130
+ var invoiceSchema = z4.object({
1131
+ type: z4.literal("invoice"),
1132
+ id: z4.number(),
1133
+ title: z4.string(),
1134
+ membership_id: z4.number(),
1135
+ membership: baseMembershipSchema.optional(),
1136
+ company_id: z4.number().optional(),
1137
+ company: companySchema.optional(),
1138
+ sequence_number: z4.string().nullable().optional(),
1139
+ order_number: z4.string().nullable().optional(),
1140
+ invoice_date: z4.string().nullable().optional(),
1141
+ due_date: z4.string().nullable().optional(),
1142
+ status: z4.string().nullable().optional(),
1143
+ paid_status: z4.string().nullable().optional(),
1144
+ total: zPhpMoneyObject.nullable().optional(),
1145
+ subtotal: zPhpMoneyObject.nullable().optional(),
1146
+ tax_amount: zPhpMoneyObject.nullable().optional(),
1147
+ discount_amount: zPhpMoneyObject.nullable().optional(),
1148
+ paid_at: z4.string().nullable().optional(),
1149
+ released_at: z4.string().nullable().optional(),
1150
+ sent: z4.number().default(0),
1151
+ viewed: z4.boolean().default(false),
1152
+ remarks: z4.string().nullable().optional(),
1153
+ notes: z4.string().nullable().optional(),
1154
+ recipient_company: z4.string().nullable().optional(),
1155
+ recipient_name: z4.string().nullable().optional(),
1156
+ recipient_address_street_1: z4.string().nullable().optional(),
1157
+ recipient_address_street_2: z4.string().nullable().optional(),
1158
+ recipient_city: z4.string().nullable().optional(),
1159
+ recipient_zip: z4.string().nullable().optional(),
1160
+ recipient_state: z4.string().nullable().optional(),
1161
+ recipient_country: z4.string().nullable().optional(),
1162
+ recipient_vat_id: z4.string().nullable().optional(),
1163
+ issuer_name: z4.string().nullable().optional(),
1164
+ issuer_address_street_1: z4.string().nullable().optional(),
1165
+ issuer_address_street_2: z4.string().nullable().optional(),
1166
+ issuer_city: z4.string().nullable().optional(),
1167
+ issuer_zip: z4.string().nullable().optional(),
1168
+ issuer_state: z4.string().nullable().optional(),
1169
+ issuer_bank_name: z4.string().nullable().optional(),
1170
+ issuer_bic: z4.string().nullable().optional(),
1171
+ issuer_iban: z4.string().nullable().optional(),
1172
+ issuer_email: z4.string().nullable().optional(),
1173
+ issuer_phone: z4.string().nullable().optional(),
1174
+ issuer_vat_id: z4.string().nullable().optional(),
1175
+ issuer_register_court: z4.string().nullable().optional(),
1176
+ issuer_register_number: z4.string().nullable().optional(),
1177
+ gross_total: zPhpMoneyObject.nullable().optional(),
1178
+ net_total: zPhpMoneyObject.nullable().optional(),
1179
+ // InvoiceResource media envelope: only the generated PDF.
1180
+ media: z4.object({
1181
+ pdf: mediaSchema.nullable().optional()
1182
+ }).optional(),
1183
+ pdf: z4.string().nullable().optional(),
1184
+ // Audit trail (InvoiceResource `activities`, present when eager-loaded).
1185
+ activities: z4.array(activitySchema).optional(),
1186
+ created_at: z4.string(),
1187
+ updated_at: z4.string(),
1188
+ // Loose record on purpose: gates are policy-reflected server-side and
1189
+ // grow over time — same convention as companySchema.
1190
+ can: z4.record(z4.string(), z4.boolean().nullable()).optional()
1191
+ });
1192
+ var scheduledFlightSchema = z4.object({
1193
+ type: z4.literal("scheduledFlight"),
1194
+ id: z4.number(),
1195
+ booking_id: z4.number(),
1196
+ departure_time: z4.string(),
1197
+ arrival_time: z4.string(),
1198
+ departure_airport_id: z4.number().nullable().optional(),
1199
+ departure_airport: airportSchema.optional(),
1200
+ arrival_airport_id: z4.number().nullable().optional(),
1201
+ arrival_airport: airportSchema.optional(),
1202
+ flight_number: z4.string().nullable().optional(),
1203
+ notes: z4.string().nullable().optional(),
1204
+ created_at: z4.string(),
1205
+ updated_at: z4.string()
1206
+ });
1207
+ var qualificationSchema = z4.object({
1208
+ type: z4.literal("qualification"),
1209
+ id: z4.number(),
1210
+ title: z4.string(),
1211
+ description: z4.string().nullable().optional(),
1212
+ category: z4.string().nullable().optional(),
1213
+ created_at: z4.string(),
1214
+ updated_at: z4.string()
1215
+ });
1216
+ var expenseSchema = z4.object({
1217
+ type: z4.literal("expense"),
1218
+ id: z4.number(),
1219
+ company_id: z4.number(),
1220
+ company: companySchema.optional(),
1221
+ membership_id: z4.number(),
1222
+ membership: baseMembershipSchema.optional(),
1223
+ title: z4.string(),
1224
+ description: z4.string().nullable().optional(),
1225
+ amount: zPhpMoneyObject,
1226
+ status: z4.string().nullable().optional(),
1227
+ expense_date: z4.string().nullable().optional(),
1228
+ invoice_id: z4.number().nullable().optional(),
1229
+ created_at: z4.string(),
1230
+ updated_at: z4.string(),
1231
+ can: z4.object({
1232
+ update: zNullableBool,
1233
+ delete: zNullableBool,
1234
+ approve: zNullableBool
1235
+ }).optional()
1236
+ });
1237
+ var tagSchema = z4.object({
1238
+ type: z4.literal("tag").optional(),
1239
+ id: z4.number(),
1240
+ name: z4.string(),
1241
+ color: z4.string().nullable().optional()
1242
+ });
1243
+ var courseSchema = z4.object({
1244
+ type: z4.literal("course"),
1245
+ id: z4.number(),
1246
+ company_id: z4.number(),
1247
+ company: companySchema.optional(),
1248
+ name: z4.string(),
1249
+ description: z4.string().nullable().optional(),
1250
+ start_date: z4.string().nullable().optional(),
1251
+ end_date: z4.string().nullable().optional(),
1252
+ max_participants: z4.number().nullable().optional(),
1253
+ price: zPhpMoneyObject.nullable().optional(),
1254
+ instructor_id: z4.number().nullable().optional(),
1255
+ instructor: userSchema.optional(),
1256
+ aircraft_required: z4.boolean().default(false),
1257
+ qualification_id: z4.number().nullable().optional(),
1258
+ qualification: qualificationSchema.optional(),
1259
+ is_archived: z4.boolean().optional(),
1260
+ archived_at: z4.string().nullable().optional(),
1261
+ category: z4.string().nullable().optional(),
1262
+ title: z4.string().nullable().optional(),
1263
+ subtitle: z4.string().nullable().optional(),
1264
+ content: z4.string().nullable().optional(),
1265
+ footer: z4.string().nullable().optional(),
1266
+ // Syllabus assignment pointers: `syllabus_id` drives the Übersicht,
1267
+ // `booking_form_syllabus_id` the per-flight Ausbildungsnachweis.
1268
+ syllabus_id: z4.number().nullable().optional(),
1269
+ booking_form_syllabus_id: z4.number().nullable().optional(),
1270
+ // Present only when the backend eager-loaded `checkSyllabi`.
1271
+ check_syllabi: z4.array(courseCheckSyllabusSchema).optional(),
1272
+ tags: z4.array(tagSchema).optional(),
1273
+ // Attached fees (feeables pivot) + fees derived from them, when loaded.
1274
+ fees: z4.array(courseFeeSchema).optional(),
1275
+ derived_fees: z4.array(feeSchema).optional(),
1276
+ fees_count: z4.number().optional(),
1277
+ is_public: z4.boolean().optional(),
1278
+ kind: z4.string().optional(),
1279
+ version: z4.number().optional(),
1280
+ media: mediaCollection,
1281
+ created_at: z4.string(),
1282
+ updated_at: z4.string(),
1283
+ // Loose record on purpose: gates are policy-reflected server-side and
1284
+ // grow over time (useAssistant, …) — same convention as companySchema.
1285
+ can: z4.record(z4.string(), z4.boolean().nullable()).optional()
1286
+ });
1287
+ var courseEnrollmentMetricsSchema = z4.object({
1288
+ last_flight_at: z4.string().nullable(),
1289
+ next_flight_at: z4.string().nullable(),
1290
+ total_flight_minutes: z4.number().default(0),
1291
+ flags: z4.record(z4.string(), z4.union([z4.boolean(), z4.number(), z4.string()])).default({}),
1292
+ calculated_at: z4.string().nullable()
1293
+ });
1294
+ var courseEnrollmentSchema = z4.object({
1295
+ type: z4.literal("course_enrollment").optional(),
1296
+ id: z4.number(),
1297
+ course_id: z4.number(),
1298
+ membership_id: z4.number(),
1299
+ company_id: z4.number(),
1300
+ mentor_id: z4.number().nullable().optional(),
1301
+ status: z4.enum(["enrolled", "completed", "cancelled", "suspended"]),
1302
+ enrollment_date: z4.string(),
1303
+ completion_date: z4.string().nullable().optional(),
1304
+ progress_percentage: z4.number().default(0),
1305
+ milestone_count: z4.number().optional(),
1306
+ comments: z4.string().nullable().optional(),
1307
+ initial_payment_generated: z4.boolean().optional(),
1308
+ initial_payment_removable: z4.boolean().optional(),
1309
+ // Element-driven training progress (see m-crit-api
1310
+ // docs/features/training-tracking.md).
1311
+ tracked_training_elements_count: z4.number().optional(),
1312
+ progress_source: z4.enum(["training_elements", "milestones"]).optional(),
1313
+ metrics: courseEnrollmentMetricsSchema.optional(),
1314
+ created_at: z4.string(),
1315
+ updated_at: z4.string(),
1316
+ course: courseSchema.optional(),
1317
+ membership: membershipSchema.optional(),
1318
+ mentor: userSchema.optional(),
1319
+ // Present when eager-loaded (BaseCourseEnrollmentResource). Lazy: both
1320
+ // schemas are declared later in this file; there is no true cycle.
1321
+ expense_items: z4.array(z4.lazy(() => expenseItemSchema)).optional(),
1322
+ bookings: z4.array(bookingSchema).optional(),
1323
+ // Loose record on purpose: gates are policy-reflected server-side and
1324
+ // grow over time (updateTraining, manageInitialPayment, …).
1325
+ can: z4.record(z4.string(), z4.boolean().nullable()).optional()
1326
+ });
1327
+ var membershipSignupSchema = z4.object({
1328
+ id: z4.number(),
1329
+ membership_id: z4.number(),
1330
+ created_at: z4.string().optional(),
1331
+ membership: z4.object({
1332
+ id: z4.number(),
1333
+ user_id: z4.number().nullable().optional(),
1334
+ name: z4.string(),
1335
+ user: z4.object({
1336
+ name: z4.string(),
1337
+ firstname: z4.string().nullable().optional(),
1338
+ lastname: z4.string().nullable().optional(),
1339
+ email: z4.string().nullable().optional()
1340
+ }).nullable().optional()
1341
+ }).nullable().optional()
1342
+ });
1343
+ var eventSchema = z4.object({
1344
+ type: z4.literal("event"),
1345
+ id: z4.number(),
1346
+ company_id: z4.number(),
1347
+ company: companySchema.optional(),
1348
+ title: z4.string(),
1349
+ description: z4.string().nullable().optional(),
1350
+ media: mediaCollection,
1351
+ signups: z4.array(membershipSignupSchema).optional(),
1352
+ signups_count: z4.number().optional(),
1353
+ is_public: z4.boolean(),
1354
+ contact: zContactDTO.nullable().optional(),
1355
+ start: z4.string(),
1356
+ end: z4.string().nullable().optional(),
1357
+ registrationDeadline: z4.string().nullable().optional(),
1358
+ registrationIsBinding: z4.boolean(),
1359
+ // Loose record on purpose: gates are policy-reflected server-side and
1360
+ // grow over time — same convention as companySchema.
1361
+ can: z4.record(z4.string(), z4.boolean().nullable()).optional()
1362
+ });
1363
+ var addressSchema = z4.object({
1364
+ type: z4.literal("address"),
1365
+ id: z4.number(),
1366
+ company_id: z4.number().nullable().optional(),
1367
+ addressable_type: z4.string(),
1368
+ addressable_id: z4.number(),
1369
+ street: z4.string().nullable().optional(),
1370
+ house_number: z4.string().nullable().optional(),
1371
+ postal_code: z4.string().nullable().optional(),
1372
+ city: z4.string().nullable().optional(),
1373
+ state: z4.string().nullable().optional(),
1374
+ country: z4.string().nullable().optional(),
1375
+ additional_info: z4.string().nullable().optional(),
1376
+ vat_id: z4.string().nullable().optional(),
1377
+ created_at: z4.string(),
1378
+ updated_at: z4.string()
1379
+ });
1380
+ var roleSchema = z4.object({
1381
+ type: z4.literal("role"),
1382
+ id: z4.number(),
1383
+ company_id: z4.number(),
1384
+ name: z4.string(),
1385
+ description: z4.string().nullable().optional(),
1386
+ permissions: z4.array(z4.string()).optional(),
1387
+ created_at: z4.string(),
1388
+ updated_at: z4.string()
1389
+ });
1390
+ var landingSchema = z4.object({
1391
+ type: z4.literal("landing"),
1392
+ id: z4.number(),
1393
+ flight_log_id: z4.number(),
1394
+ approach_type_id: z4.number().nullable().optional(),
1395
+ airport_id: z4.number().nullable().optional(),
1396
+ airport: airportSchema.optional(),
1397
+ landing_fee_id: z4.number().nullable().optional(),
1398
+ landing_time: z4.string(),
1399
+ price: zPhpMoneyObject.nullable().optional(),
1400
+ created_at: z4.string(),
1401
+ updated_at: z4.string()
1402
+ });
1403
+ var ticketSchema = z4.object({
1404
+ type: z4.literal("ticket"),
1405
+ id: z4.number(),
1406
+ company_id: z4.number().nullable().optional(),
1407
+ company: companySchema.optional(),
1408
+ user_id: z4.number(),
1409
+ user: userSchema.optional(),
1410
+ assigned_to: z4.number().nullable().optional(),
1411
+ assignee: userSchema.optional(),
1412
+ title: z4.string(),
1413
+ description: z4.string(),
1414
+ status: z4.string(),
1415
+ priority: z4.string().nullable().optional(),
1416
+ category: z4.string().nullable().optional(),
1417
+ resolved_at: z4.string().nullable().optional(),
1418
+ created_at: z4.string(),
1419
+ updated_at: z4.string(),
1420
+ can: z4.object({
1421
+ update: zNullableBool,
1422
+ delete: zNullableBool,
1423
+ resolve: zNullableBool
1424
+ }).optional()
1425
+ });
1426
+ var runwaySchema = z4.object({
1427
+ type: z4.literal("runway"),
1428
+ id: z4.number(),
1429
+ airport_id: z4.number(),
1430
+ airport: airportSchema.optional(),
1431
+ name: z4.string(),
1432
+ length_m: z4.number().nullable().optional(),
1433
+ width_m: z4.number().nullable().optional(),
1434
+ surface: z4.string().nullable().optional(),
1435
+ heading: z4.number().nullable().optional(),
1436
+ elevation_m: z4.number().nullable().optional(),
1437
+ active: z4.boolean().default(true),
1438
+ created_at: z4.string(),
1439
+ updated_at: z4.string()
1440
+ });
1441
+ var settingSchema = z4.object({
1442
+ type: z4.literal("setting"),
1443
+ id: z4.number(),
1444
+ model_type: z4.string(),
1445
+ model_id: z4.number(),
1446
+ key: z4.string(),
1447
+ value: z4.any(),
1448
+ created_at: z4.string(),
1449
+ updated_at: z4.string()
1450
+ });
1451
+ var postSchema = z4.object({
1452
+ type: z4.literal("post"),
1453
+ id: z4.number(),
1454
+ company_id: z4.number(),
1455
+ postable_type: z4.string().nullable().optional(),
1456
+ postable_id: z4.number().nullable().optional(),
1457
+ author_id: z4.number(),
1458
+ author: userSchema.optional(),
1459
+ title: z4.string().nullable().optional(),
1460
+ content: z4.string(),
1461
+ sticky: z4.boolean().default(false),
1462
+ public: z4.boolean().default(false),
1463
+ media: mediaCollection.optional(),
1464
+ created_at: z4.string(),
1465
+ updated_at: z4.string(),
1466
+ can: z4.object({
1467
+ view: zNullableBool,
1468
+ update: zNullableBool,
1469
+ delete: zNullableBool,
1470
+ setFlags: zNullableBool,
1471
+ restore: zNullableBool,
1472
+ forceDelete: zNullableBool
1473
+ }).optional()
1474
+ });
1475
+ var commentSchema = z4.object({
1476
+ type: z4.literal("comment"),
1477
+ id: z4.number(),
1478
+ commentable_type: z4.string().optional(),
1479
+ commentable_id: z4.number().optional(),
1480
+ parent_id: z4.number().optional().nullable(),
1481
+ title: z4.string().optional().nullable(),
1482
+ body: z4.string(),
1483
+ author_id: z4.number().optional(),
1484
+ author: userSchema.optional(),
1485
+ created_at: z4.string(),
1486
+ updated_at: z4.string().optional(),
1487
+ children: z4.lazy(() => commentSchema.array()).optional(),
1488
+ can: z4.object({
1489
+ view: z4.boolean().optional(),
1490
+ update: z4.boolean().optional().nullable(),
1491
+ delete: z4.boolean().optional().nullable(),
1492
+ reply: z4.boolean().optional(),
1493
+ viewComments: z4.boolean().optional(),
1494
+ createComments: z4.boolean().optional()
1495
+ }).optional()
1496
+ });
1497
+ var airplaneIssueSeverityEnum = z4.enum([
1498
+ "minor",
1499
+ "major",
1500
+ "grounding"
1501
+ ]);
1502
+ var airplaneIssueStatusEnum = z4.enum(["open", "deferred", "resolved"]);
1503
+ var airplaneIssueSchema = z4.object({
1504
+ type: z4.literal("airplaneIssue"),
1505
+ id: z4.number(),
1506
+ airplane_id: z4.number(),
1507
+ title: z4.string().nullable().optional(),
1508
+ body: z4.string(),
1509
+ severity: airplaneIssueSeverityEnum,
1510
+ ata_chapter: z4.string().nullable().optional(),
1511
+ status: airplaneIssueStatusEnum,
1512
+ reporter: userSchema.optional(),
1513
+ resolver: userSchema.optional(),
1514
+ deferred_at: z4.string().nullable().optional(),
1515
+ deferred_until: z4.string().nullable().optional(),
1516
+ deferral_notes: z4.string().nullable().optional(),
1517
+ resolved_at: z4.string().nullable().optional(),
1518
+ resolution_notes: z4.string().nullable().optional(),
1519
+ attachments: z4.array(mediaSchema).optional(),
1520
+ created_at: z4.string(),
1521
+ updated_at: z4.string().optional(),
1522
+ can: z4.object({
1523
+ view: z4.boolean().nullable().optional(),
1524
+ update: z4.boolean().nullable().optional(),
1525
+ resolve: z4.boolean().nullable().optional(),
1526
+ defer: z4.boolean().nullable().optional(),
1527
+ reopen: z4.boolean().nullable().optional(),
1528
+ delete: z4.boolean().nullable().optional()
1529
+ }).optional()
1530
+ });
1531
+ var specialFlightSchema = z4.object({
1532
+ type: z4.literal("specialFlight"),
1533
+ id: z4.number(),
1534
+ company_id: z4.number(),
1535
+ company: companySchema.optional(),
1536
+ name: z4.string(),
1537
+ description: z4.string().nullable().optional(),
1538
+ fee_id: z4.number().nullable().optional(),
1539
+ fee: feeSchema.optional(),
1540
+ active: z4.boolean().default(true),
1541
+ created_at: z4.string(),
1542
+ updated_at: z4.string()
1543
+ });
1544
+ var prePaidPackageSchema = z4.object({
1545
+ type: z4.literal("prePaidPackage"),
1546
+ id: z4.number(),
1547
+ company_id: z4.number(),
1548
+ company: companySchema.optional(),
1549
+ name: z4.string(),
1550
+ description: z4.string().nullable().optional(),
1551
+ balance: zPhpMoneyObject,
1552
+ initial_amount: zPhpMoneyObject,
1553
+ discount_percentage: z4.number().nullable().optional(),
1554
+ valid_until: z4.string().nullable().optional(),
1555
+ created_at: z4.string(),
1556
+ updated_at: z4.string(),
1557
+ can: z4.object({
1558
+ update: zNullableBool,
1559
+ delete: zNullableBool,
1560
+ assign: zNullableBool
1561
+ }).optional()
1562
+ });
1563
+ var expenseItemSchema = z4.object({
1564
+ type: z4.literal("expenseItem"),
1565
+ id: z4.number(),
1566
+ company_id: z4.number(),
1567
+ company: companySchema.optional(),
1568
+ name: z4.string(),
1569
+ description: z4.string().nullable().optional(),
1570
+ category: z4.string().nullable().optional(),
1571
+ active: z4.boolean().default(true),
1572
+ created_at: z4.string(),
1573
+ updated_at: z4.string()
1574
+ });
1575
+ var waypointSchema = z4.object({
1576
+ type: z4.literal("waypoint"),
1577
+ id: z4.number(),
1578
+ identifier: z4.string(),
1579
+ name: z4.string(),
1580
+ latitude: z4.number(),
1581
+ longitude: z4.number(),
1582
+ elevation_m: z4.number().nullable().optional(),
1583
+ country: z4.string().nullable().optional(),
1584
+ created_at: z4.string(),
1585
+ updated_at: z4.string()
1586
+ });
1587
+ var approachTypeSchema = z4.object({
1588
+ type: z4.literal("approachType"),
1589
+ id: z4.number(),
1590
+ name: z4.string(),
1591
+ abbreviation: z4.string(),
1592
+ description: z4.string().nullable().optional(),
1593
+ created_at: z4.string(),
1594
+ updated_at: z4.string()
1595
+ });
1596
+
1597
+ // src/schemas/faq.ts
1598
+ import { z as z5 } from "zod";
1599
+ var FaqStatus = /* @__PURE__ */ ((FaqStatus2) => {
1600
+ FaqStatus2["PENDING"] = "pending";
1601
+ FaqStatus2["APPROVED"] = "approved";
1602
+ FaqStatus2["REJECTED"] = "rejected";
1603
+ return FaqStatus2;
1604
+ })(FaqStatus || {});
1605
+ var UserBasicSchema = z5.object({
1606
+ id: z5.number(),
1607
+ name: z5.string(),
1608
+ email: z5.string().email()
1609
+ }).nullable();
1610
+ var FaqSchema = z5.object({
1611
+ type: z5.literal("faq"),
1612
+ id: z5.number(),
1613
+ company_id: z5.number().nullable(),
1614
+ faqable_type: z5.string().nullable(),
1615
+ faqable_id: z5.number().nullable(),
1616
+ category: z5.string(),
1617
+ subcategory: z5.string().nullable(),
1618
+ question: z5.string(),
1619
+ answer: z5.string().nullable(),
1620
+ order: z5.number(),
1621
+ is_active: z5.boolean(),
1622
+ status: z5.enum(["pending", "approved", "rejected"]),
1623
+ submitted_by: z5.number().nullable(),
1624
+ reviewed_by: z5.number().nullable(),
1625
+ reviewed_at: z5.string().nullable(),
1626
+ created_at: z5.string(),
1627
+ updated_at: z5.string(),
1628
+ submitter: UserBasicSchema.optional(),
1629
+ reviewer: UserBasicSchema.optional(),
1630
+ is_pending: z5.boolean().optional(),
1631
+ is_user_submitted: z5.boolean().optional(),
1632
+ can: z5.object({
1633
+ view: z5.boolean().optional(),
1634
+ update: z5.boolean().optional(),
1635
+ delete: z5.boolean().optional(),
1636
+ review: z5.boolean().optional(),
1637
+ submit: z5.boolean().optional()
1638
+ }).optional()
1639
+ });
1640
+ var SubmitFaqQuestionSchema = z5.object({
1641
+ category: z5.string().min(1, "Category is required"),
1642
+ subcategory: z5.string().nullable().optional(),
1643
+ question: z5.string().min(10, "Question must be at least 10 characters")
1644
+ });
1645
+ var ReviewFaqSchema = z5.object({
1646
+ status: z5.enum(["pending", "approved", "rejected"]),
1647
+ answer: z5.string().optional(),
1648
+ category: z5.string().optional(),
1649
+ subcategory: z5.string().nullable().optional(),
1650
+ order: z5.number().optional(),
1651
+ is_active: z5.boolean().optional()
1652
+ });
1653
+
1654
+ // src/schemas/safety-report.ts
1655
+ import { z as z6 } from "zod";
1656
+ var SafetyReportStatusEnum = z6.enum([
1657
+ "new",
1658
+ "under_review",
1659
+ "action_taken",
1660
+ "closed"
1661
+ ]);
1662
+ var SafetyReportCategorySchema = z6.object({
1663
+ id: z6.number(),
1664
+ name: z6.string(),
1665
+ description: z6.string().nullable(),
1666
+ color: z6.string(),
1667
+ sort_order: z6.number(),
1668
+ is_active: z6.boolean(),
1669
+ is_global: z6.boolean().optional(),
1670
+ created_at: z6.string().optional(),
1671
+ updated_at: z6.string().optional()
1672
+ });
1673
+ var SafetyReportCategoryFormSchema = z6.object({
1674
+ name: z6.string().min(1, "Name is required").max(100, "Name must be at most 100 characters"),
1675
+ description: z6.string().max(500).nullable().optional(),
1676
+ color: z6.string().regex(/^#[0-9A-Fa-f]{6}$/, "Invalid hex color").nullable().optional(),
1677
+ sort_order: z6.number().int().min(0).optional(),
1678
+ is_active: z6.boolean().optional()
1679
+ });
1680
+ var SafetyReportMediaSchema = z6.object({
1681
+ id: z6.number(),
1682
+ file_name: z6.string(),
1683
+ mime_type: z6.string(),
1684
+ size: z6.number(),
1685
+ url: z6.string().nullable()
1686
+ });
1687
+ var SafetyReportSchema = z6.object({
1688
+ id: z6.number(),
1689
+ incident_date: z6.string(),
1690
+ location: z6.string().nullable(),
1691
+ description: z6.string(),
1692
+ status: SafetyReportStatusEnum,
1693
+ is_archived: z6.boolean(),
1694
+ category: SafetyReportCategorySchema.nullable().optional(),
1695
+ attachments: z6.array(SafetyReportMediaSchema).optional(),
1696
+ attachments_count: z6.number().optional(),
1697
+ created_at: z6.string(),
1698
+ updated_at: z6.string(),
1699
+ can: z6.record(z6.string(), z6.boolean()).optional()
1700
+ });
1701
+ var SafetyReportListResponseSchema = z6.object({
1702
+ data: z6.array(SafetyReportSchema),
1703
+ links: z6.object({
1704
+ first: z6.string().nullable().optional(),
1705
+ last: z6.string().nullable().optional(),
1706
+ prev: z6.string().nullable().optional(),
1707
+ next: z6.string().nullable().optional()
1708
+ }).optional(),
1709
+ meta: z6.object({
1710
+ current_page: z6.number(),
1711
+ from: z6.number().nullable(),
1712
+ last_page: z6.number(),
1713
+ per_page: z6.number(),
1714
+ to: z6.number().nullable(),
1715
+ total: z6.number()
1716
+ }).optional()
1717
+ });
1718
+ var SafetyReportFormSchema = z6.object({
1719
+ incident_date: z6.string().min(1, "Incident date is required"),
1720
+ location: z6.string().max(255).nullable().optional(),
1721
+ description: z6.string().min(10, "Description must be at least 10 characters").max(1e4, "Description must be at most 10000 characters")
1722
+ });
1723
+ var SafetyReportUpdateSchema = z6.object({
1724
+ status: SafetyReportStatusEnum.optional(),
1725
+ category_id: z6.number().nullable().optional()
1726
+ });
1727
+ var SafetyReportFilterSchema = z6.object({
1728
+ status: SafetyReportStatusEnum.optional(),
1729
+ category_id: z6.number().optional(),
1730
+ date_from: z6.string().optional(),
1731
+ date_to: z6.string().optional(),
1732
+ include_archived: z6.boolean().optional(),
1733
+ search: z6.string().optional(),
1734
+ sort: z6.enum(["incident_date", "created_at", "status"]).optional(),
1735
+ direction: z6.enum(["asc", "desc"]).optional(),
1736
+ per_page: z6.number().optional(),
1737
+ page: z6.number().optional()
1738
+ });
1739
+ var SafetyReportSubmissionResponseSchema = z6.object({
1740
+ message: z6.string(),
1741
+ submitted: z6.boolean()
1742
+ });
1743
+ var SAFETY_REPORT_STATUS_LABELS = {
1744
+ new: "New",
1745
+ under_review: "Under Review",
1746
+ action_taken: "Action Taken",
1747
+ closed: "Closed"
1748
+ };
1749
+ var SAFETY_REPORT_STATUS_COLORS = {
1750
+ new: "info",
1751
+ under_review: "warning",
1752
+ action_taken: "primary",
1753
+ closed: "success"
1754
+ };
1755
+
1756
+ // src/schemas/form-template.ts
1757
+ import { z as z7 } from "zod";
1758
+ var FormFieldType = /* @__PURE__ */ ((FormFieldType2) => {
1759
+ FormFieldType2["Text"] = "text";
1760
+ FormFieldType2["Textarea"] = "textarea";
1761
+ FormFieldType2["Number"] = "number";
1762
+ FormFieldType2["Date"] = "date";
1763
+ FormFieldType2["Time"] = "time";
1764
+ FormFieldType2["Duration"] = "duration";
1765
+ FormFieldType2["Select"] = "select";
1766
+ FormFieldType2["MultiSelect"] = "multi_select";
1767
+ FormFieldType2["Checkbox"] = "checkbox";
1768
+ FormFieldType2["Radio"] = "radio";
1769
+ FormFieldType2["RatingScale"] = "rating_scale";
1770
+ FormFieldType2["Signature"] = "signature";
1771
+ FormFieldType2["PassFail"] = "pass_fail";
1772
+ FormFieldType2["MembershipSelect"] = "membership_select";
1773
+ FormFieldType2["InstructorSelect"] = "instructor_select";
1774
+ FormFieldType2["AirplaneSelect"] = "airplane_select";
1775
+ FormFieldType2["CourseSelect"] = "course_select";
1776
+ FormFieldType2["MembershipSignature"] = "membership_signature";
1777
+ FormFieldType2["FileUpload"] = "file_upload";
1778
+ FormFieldType2["MassUnitSelect"] = "mass_unit_select";
1779
+ FormFieldType2["StaticText"] = "static_text";
1780
+ return FormFieldType2;
1781
+ })(FormFieldType || {});
1782
+ var FormSubmissionStatus = /* @__PURE__ */ ((FormSubmissionStatus2) => {
1783
+ FormSubmissionStatus2["Draft"] = "draft";
1784
+ FormSubmissionStatus2["AwaitingSignatures"] = "awaiting_signatures";
1785
+ FormSubmissionStatus2["Submitted"] = "submitted";
1786
+ FormSubmissionStatus2["Approved"] = "approved";
1787
+ FormSubmissionStatus2["Rejected"] = "rejected";
1788
+ return FormSubmissionStatus2;
1789
+ })(FormSubmissionStatus || {});
1790
+ var FormSubmissionSource = /* @__PURE__ */ ((FormSubmissionSource2) => {
1791
+ FormSubmissionSource2["Voluntary"] = "voluntary";
1792
+ FormSubmissionSource2["Onboarding"] = "onboarding";
1793
+ FormSubmissionSource2["AdHocRequest"] = "ad_hoc_request";
1794
+ return FormSubmissionSource2;
1795
+ })(FormSubmissionSource || {});
1796
+ var FieldLabelSchema = z7.object({
1797
+ de: z7.string().optional(),
1798
+ en: z7.string(),
1799
+ no: z7.string().optional()
1800
+ });
1801
+ var ShowWhenSchema = z7.object({
1802
+ field: z7.string(),
1803
+ operator: z7.enum(["eq", "neq", "in", "not_in", "gt", "lt", "gte", "lte"]),
1804
+ value: z7.union([z7.string(), z7.number(), z7.boolean(), z7.array(z7.string())])
1805
+ });
1806
+ var SchemaFieldSchema = z7.object({
1807
+ key: z7.string(),
1808
+ type: z7.nativeEnum(FormFieldType),
1809
+ // Optional because static_text fields use `content` instead of `label`.
1810
+ label: FieldLabelSchema.optional(),
1811
+ // Display-only text for static_text fields (i18n), rendered with line breaks.
1812
+ content: FieldLabelSchema.optional(),
1813
+ required: z7.boolean().optional().default(false),
1814
+ validation: z7.record(z7.any()).optional(),
1815
+ options: z7.record(z7.any()).optional(),
1816
+ col_span: z7.number().min(1).max(12).optional(),
1817
+ order: z7.number(),
1818
+ show_when: ShowWhenSchema.optional(),
1819
+ // Signature fields only: auto-binds the designated signer to the membership_id stored in the
1820
+ // referenced field (no manual designation needed).
1821
+ signer_membership_field: z7.string().optional(),
1822
+ // Signature fields only: group designation — any member holding this permission at the
1823
+ // template's company may sign (e.g. "formSubmission.signAsCompany" for the company signature).
1824
+ signer_permission: z7.string().optional(),
1825
+ // Signature fields only: bind the signer to the membership the form is attached to
1826
+ // ("submittable") — the person the form is about signs, with no picker.
1827
+ signer_source: z7.string().optional(),
1828
+ // Text fields only: server-side party prefill (company.name|address,
1829
+ // member.name|address). Resolved & frozen into data at issuance — render
1830
+ // read-only; the backend rejects edits to these keys.
1831
+ prefill_source: z7.string().optional()
1832
+ });
1833
+ var SchemaSectionSchema = z7.object({
1834
+ key: z7.string(),
1835
+ title: z7.string(),
1836
+ order: z7.number(),
1837
+ fields: z7.array(SchemaFieldSchema)
1838
+ });
1839
+ var TemplateSchemaSchema = z7.object({
1840
+ sections: z7.array(SchemaSectionSchema)
1841
+ });
1842
+ var UserBasicSchema2 = z7.object({
1843
+ id: z7.number(),
1844
+ name: z7.string(),
1845
+ email: z7.string().optional()
1846
+ }).nullable();
1847
+ var FormTemplateSchema = z7.object({
1848
+ type: z7.literal("form_template"),
1849
+ id: z7.number(),
1850
+ company_id: z7.number().nullable(),
1851
+ name: z7.string(),
1852
+ slug: z7.string(),
1853
+ description: z7.string().nullable(),
1854
+ schema: TemplateSchemaSchema,
1855
+ schema_version: z7.number(),
1856
+ pdf_view: z7.string().nullable(),
1857
+ requires_review: z7.boolean(),
1858
+ is_active: z7.boolean(),
1859
+ is_singleton: z7.boolean().optional().default(false),
1860
+ // Sign-only: submissions skip the draft phase (issued straight into
1861
+ // awaiting_signatures) and auto-submit once all signatures are collected.
1862
+ is_sign_only: z7.boolean().optional().default(false),
1863
+ // Requirable: this company template may be referenced by requirement groups
1864
+ // (a compliance document), vs a workflow form. System templates are always
1865
+ // requirable. Defaults false.
1866
+ is_requirable: z7.boolean().optional().default(false),
1867
+ is_onboarding: z7.boolean().optional().default(false),
1868
+ // Array of system role keys this onboarding template applies to.
1869
+ // null/missing = applies to every member at the company.
1870
+ onboarding_role_keys: z7.array(z7.string()).nullable().optional(),
1871
+ // System templates: platform-provided, super-admin maintained, no owning
1872
+ // company. Cannot be assigned/filled until merge Phase 2.
1873
+ is_system: z7.boolean().optional().default(false),
1874
+ // Scope of a system template: null/"user" = a personal qualification;
1875
+ // "aircraft" = an aircraft document (e.g. weight report) excluded from the
1876
+ // user qualification picker.
1877
+ applies_to: z7.string().nullable().optional(),
1878
+ // When true, submissions carry an expires_at (content validity, e.g. a
1879
+ // medical's expiry). Distinct from due_date (deadline to fill).
1880
+ has_expiry: z7.boolean().optional().default(false),
1881
+ default_notification_days: z7.number().nullable().optional(),
1882
+ created_by: z7.number().nullable(),
1883
+ creator: UserBasicSchema2.optional(),
1884
+ assignments: z7.array(z7.any()).optional(),
1885
+ created_at: z7.string(),
1886
+ updated_at: z7.string()
1887
+ });
1888
+ var FormTemplateAssignmentSchema = z7.object({
1889
+ type: z7.literal("form_template_assignment"),
1890
+ id: z7.number(),
1891
+ form_template_id: z7.number(),
1892
+ assignable_type: z7.string(),
1893
+ assignable_id: z7.number(),
1894
+ target_type: z7.string(),
1895
+ // `trigger` is soft-deprecated — column kept as a future escape hatch but no
1896
+ // handler reads it and the UI no longer surfaces it. See docs/features/forms.md.
1897
+ trigger: z7.string().nullable(),
1898
+ sort_order: z7.number(),
1899
+ form_template: FormTemplateSchema.optional(),
1900
+ created_at: z7.string(),
1901
+ updated_at: z7.string()
1902
+ });
1903
+ var SignatureSchema = z7.object({
1904
+ type: z7.literal("signature").optional(),
1905
+ id: z7.number(),
1906
+ signable_type: z7.string().optional(),
1907
+ signable_id: z7.number().optional(),
1908
+ field_key: z7.string(),
1909
+ status: z7.enum(["pending", "signed", "revoked"]),
1910
+ required_signer_membership_id: z7.number().nullable(),
1911
+ required_signer_name: z7.string().nullable().optional(),
1912
+ // Group designation: any member holding this permission at the template's
1913
+ // company may sign (e.g. "formSubmission.signAsCompany").
1914
+ required_signer_permission: z7.string().nullable().optional(),
1915
+ signed_by_user_id: z7.number().nullable(),
1916
+ signed_by_membership_id: z7.number().nullable(),
1917
+ signed_by_name: z7.string().nullable().optional(),
1918
+ is_current_user_designated: z7.boolean().optional().default(false),
1919
+ signed_at: z7.string().nullable(),
1920
+ image: z7.string().nullable(),
1921
+ data_hash: z7.string().nullable(),
1922
+ schema_version: z7.number().nullable(),
1923
+ schema_hash: z7.string().nullable(),
1924
+ consent_text_hash: z7.string().nullable(),
1925
+ auth_method: z7.string().nullable(),
1926
+ auth_verified_at: z7.string().nullable(),
1927
+ ip_address: z7.string().nullable(),
1928
+ user_agent: z7.string().nullable(),
1929
+ geo_country: z7.string().nullable(),
1930
+ signing_event_id: z7.string().nullable(),
1931
+ created_at: z7.string().optional(),
1932
+ updated_at: z7.string().optional()
1933
+ });
1934
+ var SubmissionFileSchema = z7.object({
1935
+ id: z7.number(),
1936
+ file_name: z7.string(),
1937
+ size: z7.number(),
1938
+ mime_type: z7.string().nullable().optional(),
1939
+ url: z7.string().nullable().optional(),
1940
+ conversions: z7.record(z7.string(), z7.string().nullable()).optional()
1941
+ });
1942
+ var FormSubmissionShareBaseSchema = z7.object({
1943
+ type: z7.literal("form_submission_share").optional(),
1944
+ id: z7.number(),
1945
+ form_submission_id: z7.number(),
1946
+ company_id: z7.number(),
1947
+ shared_by: z7.number(),
1948
+ company: z7.object({
1949
+ id: z7.number(),
1950
+ name: z7.string()
1951
+ }).optional(),
1952
+ created_at: z7.string()
1953
+ });
1954
+ var FormSubmissionSchema = z7.object({
1955
+ type: z7.literal("form_submission"),
1956
+ id: z7.number(),
1957
+ form_template_id: z7.number(),
1958
+ schema_version: z7.number(),
1959
+ schema_snapshot: TemplateSchemaSchema,
1960
+ submittable_type: z7.string(),
1961
+ submittable_id: z7.number(),
1962
+ // Who/what the submission is about — shown in the dialog header. Present
1963
+ // when the backend loaded the submittable relation.
1964
+ submittable_summary: z7.object({
1965
+ type: z7.string(),
1966
+ id: z7.number(),
1967
+ name: z7.string().nullable(),
1968
+ email: z7.string().nullable()
1969
+ }).nullable().optional(),
1970
+ submitted_by: z7.number(),
1971
+ data: z7.record(z7.any()),
1972
+ data_resolved_names: z7.record(z7.string(), z7.string()).optional().default({}),
1973
+ required_signers: z7.record(z7.string(), z7.number()).nullable().optional(),
1974
+ signatures: z7.array(SignatureSchema).optional(),
1975
+ status: z7.nativeEnum(FormSubmissionStatus),
1976
+ submitted_at: z7.string().nullable(),
1977
+ reviewed_by: z7.number().nullable(),
1978
+ reviewed_at: z7.string().nullable(),
1979
+ review_comment: z7.string().nullable(),
1980
+ is_final: z7.boolean().optional().default(false),
1981
+ is_mutable: z7.boolean().optional().default(false),
1982
+ is_signable: z7.boolean().optional().default(false),
1983
+ has_signature_fields: z7.boolean().optional().default(false),
1984
+ all_signatures_collected: z7.boolean().optional().default(true),
1985
+ // Server-evaluated policy decisions per gate (delete, revertToDraft, update, …),
1986
+ // read via hasModelPermission(submission, '<gate>'). Null when the fetch didn't
1987
+ // request permissions; populated when it passes permissions[form_submission].
1988
+ can: z7.record(z7.boolean().nullable()).optional().default({}),
1989
+ // Request envelope for pre-issued drafts (onboarding / ad-hoc admin request).
1990
+ // Voluntary submissions leave note/due_date/requester null.
1991
+ source: z7.nativeEnum(FormSubmissionSource).optional().default("voluntary" /* Voluntary */),
1992
+ due_date: z7.string().nullable().optional(),
1993
+ note: z7.string().nullable().optional(),
1994
+ requested_by_user_id: z7.number().nullable().optional(),
1995
+ is_overdue: z7.boolean().optional().default(false),
1996
+ days_until_due: z7.number().nullable().optional(),
1997
+ // Content validity (has_expiry templates only). ISO datetime.
1998
+ expires_at: z7.string().nullable().optional(),
1999
+ notification_days_before: z7.number().nullable().optional(),
2000
+ notifications_enabled: z7.boolean().optional().default(true),
2001
+ is_expired: z7.boolean().optional().default(false),
2002
+ // { field_key: media | null } for every file_upload field in the snapshot.
2003
+ files: z7.record(z7.string(), SubmissionFileSchema.nullable()).optional(),
2004
+ form_template: FormTemplateSchema.optional(),
2005
+ submitter: UserBasicSchema2.optional(),
2006
+ reviewer: UserBasicSchema2.optional(),
2007
+ requester: UserBasicSchema2.optional(),
2008
+ // Shares of this (user-owned) submission. Present on listings that
2009
+ // eager-load them — the owner sees all, recipient staff only their own
2010
+ // companies' rows (viewer-scoped in the backend resource).
2011
+ shares: z7.array(FormSubmissionShareBaseSchema).optional(),
2012
+ created_at: z7.string(),
2013
+ updated_at: z7.string()
2014
+ });
2015
+ var FormSubmissionShareSchema = FormSubmissionShareBaseSchema.extend({
2016
+ form_submission: FormSubmissionSchema.optional()
2017
+ });
2018
+ var RequiredFormViaCrewSchema = z7.object({
2019
+ name: z7.string().nullable(),
2020
+ role: z7.string(),
2021
+ is_pic: z7.boolean()
2022
+ });
2023
+ var RequiredFormViaSchema = z7.object({
2024
+ type: z7.literal("booking"),
2025
+ booking_id: z7.number(),
2026
+ etdZ: z7.string().nullable(),
2027
+ route_display: z7.string().nullable(),
2028
+ airplane_registration: z7.string().nullable(),
2029
+ crew: z7.array(RequiredFormViaCrewSchema).optional().default([])
2030
+ });
2031
+ var RequiredFormSchema = z7.object({
2032
+ template: FormTemplateSchema,
2033
+ assignment: FormTemplateAssignmentSchema,
2034
+ // Latest submission (back-compat for callers that haven't migrated to the array).
2035
+ submission: FormSubmissionSchema.nullable(),
2036
+ // All submissions for this (template, submittable), newest first. For singleton templates
2037
+ // length is 0 or 1; non-singleton templates can grow over time.
2038
+ submissions: z7.array(FormSubmissionSchema).optional().default([]),
2039
+ is_complete: z7.boolean(),
2040
+ via: RequiredFormViaSchema.nullable().optional()
2041
+ });
2042
+
2043
+ // src/schemas/course-milestone.ts
2044
+ import { z as z8 } from "zod";
2045
+ var CourseMilestoneKindEnum = z8.enum([
2046
+ "progress",
2047
+ "solo",
2048
+ "cross_country",
2049
+ "theory",
2050
+ "practical",
2051
+ "prerequisite",
2052
+ "custom"
2053
+ ]);
2054
+ var courseMilestoneSchema = z8.object({
2055
+ type: z8.literal("courseMilestone").optional(),
2056
+ id: z8.number(),
2057
+ course_id: z8.number(),
2058
+ name: z8.string(),
2059
+ description: z8.string().nullable().optional(),
2060
+ kind: z8.string(),
2061
+ is_prerequisite: z8.boolean(),
2062
+ requires_form_template_id: z8.number().nullable().optional(),
2063
+ required_form_template: z8.object({ id: z8.number(), name: z8.string().optional() }).nullable().optional(),
2064
+ completion_rule: z8.record(z8.string(), z8.unknown()).nullable().optional(),
2065
+ sort_order: z8.number(),
2066
+ created_at: z8.string().optional(),
2067
+ updated_at: z8.string().optional(),
2068
+ can: z8.object({
2069
+ update: z8.boolean().nullable().optional(),
2070
+ delete: z8.boolean().nullable().optional()
2071
+ }).optional()
2072
+ });
2073
+ var CourseMilestoneFormSchema = z8.object({
2074
+ name: z8.string().min(2).max(191),
2075
+ description: z8.string().nullable().optional(),
2076
+ kind: z8.string().max(64).default("progress"),
2077
+ is_prerequisite: z8.boolean().default(false),
2078
+ requires_form_template_id: z8.number().nullable().optional(),
2079
+ completion_rule: z8.record(z8.string(), z8.unknown()).nullable().optional(),
2080
+ sort_order: z8.number().int().min(0).optional()
2081
+ });
2082
+ var courseEnrollmentMilestoneSchema = z8.object({
2083
+ type: z8.literal("courseEnrollmentMilestone").optional(),
2084
+ id: z8.number(),
2085
+ course_enrollment_id: z8.number(),
2086
+ course_milestone_id: z8.number(),
2087
+ milestone: courseMilestoneSchema.optional(),
2088
+ achieved_at: z8.string().nullable().optional(),
2089
+ achieved_by_membership_id: z8.number().nullable().optional(),
2090
+ achieved_by: z8.object({
2091
+ id: z8.number(),
2092
+ user: z8.object({ name: z8.string().optional() }).optional()
2093
+ }).nullable().optional(),
2094
+ notes: z8.string().nullable().optional(),
2095
+ is_achieved: z8.boolean(),
2096
+ can_be_achieved: z8.boolean(),
2097
+ can: z8.object({
2098
+ achieve: z8.boolean().nullable().optional(),
2099
+ revoke: z8.boolean().nullable().optional()
2100
+ }).optional()
2101
+ });
2102
+
2103
+ // src/schemas/newsletter.ts
2104
+ import { z as z9 } from "zod";
2105
+ var NewsletterBlockType = /* @__PURE__ */ ((NewsletterBlockType2) => {
2106
+ NewsletterBlockType2["Heading"] = "heading";
2107
+ NewsletterBlockType2["Paragraph"] = "paragraph";
2108
+ NewsletterBlockType2["Button"] = "button";
2109
+ NewsletterBlockType2["Divider"] = "divider";
2110
+ return NewsletterBlockType2;
2111
+ })(NewsletterBlockType || {});
2112
+ var TipTapNodeSchema = z9.lazy(
2113
+ () => z9.object({
2114
+ type: z9.string(),
2115
+ attrs: z9.record(z9.any()).optional(),
2116
+ content: z9.array(TipTapNodeSchema).optional(),
2117
+ marks: z9.array(z9.record(z9.any())).optional(),
2118
+ text: z9.string().optional()
2119
+ })
2120
+ );
2121
+ var Align = z9.enum(["left", "center", "right"]).optional();
2122
+ var HeadingBlockSchema = z9.object({
2123
+ key: z9.string(),
2124
+ type: z9.literal("heading" /* Heading */),
2125
+ level: z9.number().int().min(1).max(3).default(1),
2126
+ text: z9.string(),
2127
+ align: Align
2128
+ });
2129
+ var ParagraphBlockSchema = z9.object({
2130
+ key: z9.string(),
2131
+ type: z9.literal("paragraph" /* Paragraph */),
2132
+ doc: TipTapNodeSchema,
2133
+ align: Align
2134
+ });
2135
+ var ButtonBlockSchema = z9.object({
2136
+ key: z9.string(),
2137
+ type: z9.literal("button" /* Button */),
2138
+ label: z9.string(),
2139
+ url: z9.string(),
2140
+ align: Align,
2141
+ color: z9.string().optional()
2142
+ });
2143
+ var DividerBlockSchema = z9.object({
2144
+ key: z9.string(),
2145
+ type: z9.literal("divider" /* Divider */),
2146
+ thickness: z9.number().int().min(1).max(10).optional(),
2147
+ color: z9.string().optional()
2148
+ });
2149
+ var NewsletterBlockSchema = z9.discriminatedUnion("type", [
2150
+ HeadingBlockSchema,
2151
+ ParagraphBlockSchema,
2152
+ ButtonBlockSchema,
2153
+ DividerBlockSchema
2154
+ ]);
2155
+ var NewsletterCategorySchema = z9.object({
2156
+ type: z9.literal("newsletter_category").optional(),
2157
+ id: z9.number(),
2158
+ key: z9.string(),
2159
+ name: z9.string(),
2160
+ description: z9.string().nullable().optional(),
2161
+ is_mandatory: z9.boolean(),
2162
+ is_active: z9.boolean(),
2163
+ sort_order: z9.number().int(),
2164
+ created_at: z9.string().optional(),
2165
+ updated_at: z9.string().optional()
2166
+ });
2167
+ var UserBasicSchema3 = z9.object({
2168
+ id: z9.number(),
2169
+ name: z9.string(),
2170
+ email: z9.string().optional()
2171
+ }).nullable();
2172
+ var NewsletterTemplateSchemaSchema = z9.object({
2173
+ blocks: z9.array(NewsletterBlockSchema),
2174
+ variables_used: z9.array(z9.string()).optional()
2175
+ });
2176
+ var NewsletterTemplateSchema = z9.object({
2177
+ type: z9.literal("newsletter_template").optional(),
2178
+ id: z9.number(),
2179
+ company_id: z9.number().nullable(),
2180
+ is_system: z9.boolean().optional(),
2181
+ newsletter_category_id: z9.number(),
2182
+ category: NewsletterCategorySchema.nullish(),
2183
+ name: z9.string(),
2184
+ slug: z9.string(),
2185
+ description: z9.string().nullable().optional(),
2186
+ subject: z9.string(),
2187
+ preheader: z9.string().nullable().optional(),
2188
+ schema: NewsletterTemplateSchemaSchema,
2189
+ schema_version: z9.number().int(),
2190
+ is_active: z9.boolean(),
2191
+ created_by: z9.number().nullable().optional(),
2192
+ creator: UserBasicSchema3.optional(),
2193
+ created_at: z9.string().optional(),
2194
+ updated_at: z9.string().optional()
2195
+ });
2196
+ var CreateNewsletterTemplateInputSchema = z9.object({
2197
+ newsletter_category_id: z9.number(),
2198
+ name: z9.string().min(1),
2199
+ slug: z9.string().optional(),
2200
+ description: z9.string().nullable().optional(),
2201
+ subject: z9.string().min(1),
2202
+ preheader: z9.string().nullable().optional(),
2203
+ schema: NewsletterTemplateSchemaSchema,
2204
+ is_active: z9.boolean().optional()
2205
+ });
2206
+ var AudienceBucketType = /* @__PURE__ */ ((AudienceBucketType2) => {
2207
+ AudienceBucketType2["AllUsers"] = "all_users";
2208
+ AudienceBucketType2["CompanyUsers"] = "company_users";
2209
+ AudienceBucketType2["RoleMembers"] = "role_members";
2210
+ return AudienceBucketType2;
2211
+ })(AudienceBucketType || {});
2212
+ var AllUsersBucketSchema = z9.object({ type: z9.literal("all_users" /* AllUsers */) });
2213
+ var CompanyUsersBucketSchema = z9.object({
2214
+ type: z9.literal("company_users" /* CompanyUsers */),
2215
+ company_ids: z9.array(z9.number()).min(1)
2216
+ });
2217
+ var RoleMembersBucketSchema = z9.object({
2218
+ type: z9.literal("role_members" /* RoleMembers */),
2219
+ role_ids: z9.array(z9.number()).min(1)
2220
+ });
2221
+ var AudienceBucketSchema = z9.discriminatedUnion("type", [
2222
+ AllUsersBucketSchema,
2223
+ CompanyUsersBucketSchema,
2224
+ RoleMembersBucketSchema
2225
+ ]);
2226
+ var NewsletterAudienceSchema = z9.object({
2227
+ version: z9.literal(1),
2228
+ include: z9.array(AudienceBucketSchema).min(1),
2229
+ exclude: z9.object({
2230
+ emails: z9.array(z9.string().email()).optional(),
2231
+ user_ids: z9.array(z9.number()).optional()
2232
+ }).optional()
2233
+ });
2234
+ function companyAudienceInclude(companyId, roleIds) {
2235
+ return roleIds.length > 0 ? [{ type: "role_members" /* RoleMembers */, role_ids: roleIds }] : [{ type: "company_users" /* CompanyUsers */, company_ids: [companyId] }];
2236
+ }
2237
+ var NewsletterCampaignStatus = /* @__PURE__ */ ((NewsletterCampaignStatus2) => {
2238
+ NewsletterCampaignStatus2["Draft"] = "draft";
2239
+ NewsletterCampaignStatus2["Scheduled"] = "scheduled";
2240
+ NewsletterCampaignStatus2["Sending"] = "sending";
2241
+ NewsletterCampaignStatus2["Sent"] = "sent";
2242
+ NewsletterCampaignStatus2["Failed"] = "failed";
2243
+ NewsletterCampaignStatus2["Cancelled"] = "cancelled";
2244
+ return NewsletterCampaignStatus2;
2245
+ })(NewsletterCampaignStatus || {});
2246
+ var NewsletterCampaignSchema = z9.object({
2247
+ type: z9.literal("newsletter_campaign").optional(),
2248
+ id: z9.number(),
2249
+ company_id: z9.number().nullable(),
2250
+ is_system: z9.boolean().optional(),
2251
+ newsletter_template_id: z9.number().nullable(),
2252
+ template: NewsletterTemplateSchema.partial().nullish(),
2253
+ newsletter_category_id: z9.number(),
2254
+ category: NewsletterCategorySchema.nullish(),
2255
+ name: z9.string(),
2256
+ subject: z9.string(),
2257
+ preheader: z9.string().nullable().optional(),
2258
+ schema_snapshot: NewsletterTemplateSchemaSchema,
2259
+ variables: z9.record(z9.string()).nullable().optional(),
2260
+ audience_definition: NewsletterAudienceSchema,
2261
+ status: z9.nativeEnum(NewsletterCampaignStatus),
2262
+ scheduled_at: z9.string().nullable().optional(),
2263
+ started_at: z9.string().nullable().optional(),
2264
+ finished_at: z9.string().nullable().optional(),
2265
+ cancelled_at: z9.string().nullable().optional(),
2266
+ counts: z9.object({
2267
+ queued: z9.number().nullable(),
2268
+ sent: z9.number(),
2269
+ failed: z9.number(),
2270
+ bounced: z9.number(),
2271
+ complained: z9.number()
2272
+ }),
2273
+ sent_by_user_id: z9.number().nullable().optional(),
2274
+ sent_by: UserBasicSchema3.optional(),
2275
+ can: z9.object({
2276
+ update: z9.boolean(),
2277
+ schedule: z9.boolean(),
2278
+ send: z9.boolean(),
2279
+ cancel: z9.boolean(),
2280
+ test_send: z9.boolean(),
2281
+ delete: z9.boolean()
2282
+ }).partial().optional(),
2283
+ created_at: z9.string().optional(),
2284
+ updated_at: z9.string().optional()
2285
+ });
2286
+ var CreateNewsletterCampaignInputSchema = z9.object({
2287
+ newsletter_template_id: z9.number().nullable().optional(),
2288
+ newsletter_category_id: z9.number().optional(),
2289
+ name: z9.string().min(1),
2290
+ subject: z9.string().optional(),
2291
+ preheader: z9.string().nullable().optional(),
2292
+ schema_snapshot: NewsletterTemplateSchemaSchema.optional(),
2293
+ variables: z9.record(z9.string()).optional(),
2294
+ audience_definition: NewsletterAudienceSchema
2295
+ });
2296
+ var NewsletterRecipientStatus = /* @__PURE__ */ ((NewsletterRecipientStatus2) => {
2297
+ NewsletterRecipientStatus2["Queued"] = "queued";
2298
+ NewsletterRecipientStatus2["Sent"] = "sent";
2299
+ NewsletterRecipientStatus2["Failed"] = "failed";
2300
+ NewsletterRecipientStatus2["Bounced"] = "bounced";
2301
+ NewsletterRecipientStatus2["Complained"] = "complained";
2302
+ NewsletterRecipientStatus2["Suppressed"] = "suppressed";
2303
+ NewsletterRecipientStatus2["OptedOut"] = "opted_out";
2304
+ return NewsletterRecipientStatus2;
2305
+ })(NewsletterRecipientStatus || {});
2306
+ var NewsletterCampaignRecipientSchema = z9.object({
2307
+ type: z9.literal("newsletter_campaign_recipient").optional(),
2308
+ id: z9.number(),
2309
+ newsletter_campaign_id: z9.number(),
2310
+ user_id: z9.number().nullable(),
2311
+ user: UserBasicSchema3.optional(),
2312
+ email: z9.string(),
2313
+ status: z9.nativeEnum(NewsletterRecipientStatus),
2314
+ error: z9.string().nullable().optional(),
2315
+ message_id: z9.string().nullable().optional(),
2316
+ queued_at: z9.string().nullable().optional(),
2317
+ sent_at: z9.string().nullable().optional(),
2318
+ bounced_at: z9.string().nullable().optional(),
2319
+ complained_at: z9.string().nullable().optional()
2320
+ });
2321
+ var NewsletterPreferenceRowSchema = z9.object({
2322
+ category_id: z9.number(),
2323
+ category_key: z9.string(),
2324
+ name: z9.string(),
2325
+ description: z9.string().nullable().optional(),
2326
+ is_mandatory: z9.boolean(),
2327
+ opted_in: z9.boolean()
2328
+ });
2329
+ var ALLOWED_NEWSLETTER_VARIABLES = [
2330
+ "user.name",
2331
+ "user.first_name",
2332
+ "user.email",
2333
+ "company.name",
2334
+ "unsubscribe_url"
2335
+ ];
2336
+
2337
+ // src/schemas/location-map.ts
2338
+ import { z as z10 } from "zod";
2339
+ var LocationMapKind = /* @__PURE__ */ ((LocationMapKind2) => {
2340
+ LocationMapKind2["Facility"] = "facility";
2341
+ LocationMapKind2["TrainingArea"] = "training_area";
2342
+ LocationMapKind2["Parking"] = "parking";
2343
+ LocationMapKind2["Procedural"] = "procedural";
2344
+ return LocationMapKind2;
2345
+ })(LocationMapKind || {});
2346
+ var LocationFeatureVisibility = /* @__PURE__ */ ((LocationFeatureVisibility2) => {
2347
+ LocationFeatureVisibility2["Public"] = "public";
2348
+ LocationFeatureVisibility2["Members"] = "members";
2349
+ return LocationFeatureVisibility2;
2350
+ })(LocationFeatureVisibility || {});
2351
+ var ALLOWED_GEOMETRY_TYPES = [
2352
+ "Point",
2353
+ "MultiPoint",
2354
+ "LineString",
2355
+ "MultiLineString",
2356
+ "Polygon",
2357
+ "MultiPolygon"
2358
+ ];
2359
+ var ViewportSchema = z10.object({
2360
+ center_lng: z10.number().min(-180).max(180),
2361
+ center_lat: z10.number().min(-90).max(90),
2362
+ zoom: z10.number().min(0).max(24),
2363
+ pitch: z10.number().min(0).max(85).optional(),
2364
+ bearing: z10.number().min(-360).max(360).optional()
2365
+ });
2366
+ var GeometrySchema = z10.object({
2367
+ type: z10.enum(ALLOWED_GEOMETRY_TYPES),
2368
+ coordinates: z10.array(z10.unknown())
2369
+ });
2370
+ var CreateLocationMapSchema = z10.object({
2371
+ name: z10.string().min(1).max(255),
2372
+ slug: z10.string().min(1).max(255).optional(),
2373
+ kind: z10.string().max(64).optional(),
2374
+ description: z10.string().nullable().optional(),
2375
+ default_viewport: ViewportSchema.nullable().optional(),
2376
+ is_active: z10.boolean().optional()
2377
+ });
2378
+ var UpdateLocationMapSchema = CreateLocationMapSchema.partial();
2379
+ var CreateLocationMapFeatureSchema = z10.object({
2380
+ name: z10.string().max(255).nullable().optional(),
2381
+ kind: z10.string().min(1).max(64),
2382
+ visibility: z10.nativeEnum(LocationFeatureVisibility).optional(),
2383
+ geometry: GeometrySchema,
2384
+ properties: z10.record(z10.string(), z10.unknown()).nullable().optional(),
2385
+ display_order: z10.number().int().min(0).optional()
2386
+ });
2387
+ var UpdateLocationMapFeatureSchema = CreateLocationMapFeatureSchema.partial().extend({
2388
+ geometry: GeometrySchema.optional()
2389
+ });
2390
+ var ImportFeaturesSchema = z10.object({
2391
+ type: z10.literal("FeatureCollection"),
2392
+ features: z10.array(
2393
+ z10.object({
2394
+ type: z10.literal("Feature"),
2395
+ geometry: GeometrySchema,
2396
+ properties: z10.record(z10.string(), z10.unknown()).nullable().optional()
2397
+ })
2398
+ ).min(1).max(500),
2399
+ defaults: z10.object({
2400
+ kind: z10.string().max(64).optional(),
2401
+ visibility: z10.nativeEnum(LocationFeatureVisibility).optional()
2402
+ }).optional()
2403
+ });
2404
+
2405
+ // src/schemas/todo.ts
2406
+ import { z as z11 } from "zod";
2407
+ var TodoActionSchema = z11.object({
2408
+ type: z11.enum(["open_dialog", "navigate"]),
2409
+ target: z11.string(),
2410
+ params: z11.record(z11.any()).optional()
2411
+ });
2412
+ var TodoKey = z11.enum([
2413
+ "fill_form",
2414
+ "sign_form",
2415
+ "review_form",
2416
+ "log_booking",
2417
+ "add_address",
2418
+ "add_required_documents",
2419
+ "fill_training_record",
2420
+ "sign_training_record"
2421
+ ]);
2422
+ var TodoSchema = z11.object({
2423
+ key: TodoKey,
2424
+ ref_type: z11.string(),
2425
+ ref_id: z11.number(),
2426
+ title: z11.string(),
2427
+ subtitle: z11.string().nullable().optional(),
2428
+ due_date: z11.string().nullable().optional(),
2429
+ is_overdue: z11.boolean().default(false),
2430
+ priority: z11.enum(["low", "normal", "high"]).default("normal"),
2431
+ company_id: z11.number().nullable().optional(),
2432
+ action: TodoActionSchema,
2433
+ meta: z11.record(z11.any()).optional()
2434
+ });
2435
+
2436
+ export {
2437
+ zNullableBool,
2438
+ zNetGross,
2439
+ zContactDTO,
2440
+ zPhpMoneyObject,
2441
+ contactAttributeSchema,
2442
+ BaseModel,
2443
+ mediaSchema,
2444
+ mediaCollection,
2445
+ impersonationParticipantSchema,
2446
+ impersonationStateSchema,
2447
+ userSchema,
2448
+ companySchema,
2449
+ equipmentSchema,
2450
+ gradingScalePointSchema,
2451
+ gradingScaleSchema,
2452
+ GradingScaleFormSchema,
2453
+ TrainingElementKindEnum,
2454
+ trainingElementSchema,
2455
+ TrainingElementFormSchema,
2456
+ SyllabusKindEnum,
2457
+ syllabusElementSchema,
2458
+ AttachSyllabusElementFormSchema,
2459
+ UpdateSyllabusElementFormSchema,
2460
+ ReorderSyllabusElementItemSchema,
2461
+ usedByCourseSchema,
2462
+ syllabusSchema,
2463
+ StoreSyllabusFormSchema,
2464
+ UpdateSyllabusFormSchema,
2465
+ courseCheckSyllabusSchema,
2466
+ syllabusElementMutationResultSchema,
2467
+ syllabusRolloutResultItemSchema,
2468
+ syllabusRolloutSkippedItemSchema,
2469
+ syllabusRolloutResultSchema,
2470
+ EnrollmentTrainingStatusEnum,
2471
+ gradeHistoryItemSchema,
2472
+ enrollmentTrainingElementSchema,
2473
+ SignOffTrainingElementFormSchema,
2474
+ TrainingRecordStatusEnum,
2475
+ TrainingRecordResultEnum,
2476
+ trainingRecordEntrySchema,
2477
+ trainingRecordEntryInputSchema,
2478
+ trainingSignatureSchema,
2479
+ trainingRecordSchema,
2480
+ UpsertTrainingRecordFormSchema,
2481
+ trainingTemplatePackSchema,
2482
+ CreateSyllabusFromTemplateFormSchema,
2483
+ createSyllabusFromTemplateResultSchema,
2484
+ baseMembershipSchema,
2485
+ membershipSchema,
2486
+ documentType,
2487
+ priceSchema,
2488
+ feeSchema,
2489
+ feeCategoryOptionsSchema,
2490
+ courseFeeSchema,
2491
+ airplaneSchema,
2492
+ aircraftPositionSchema,
2493
+ airplaneShareInviteSchema,
2494
+ airplanePermissionSchema,
2495
+ landingFeeSchema,
2496
+ aircraftRatingSchema,
2497
+ userAircraftRatingSchema,
2498
+ userQualificationSchema,
2499
+ airportSchema,
2500
+ recurringFlightSchema,
2501
+ maintenanceEventSchema,
2502
+ maintenanceEventEstimationSchema,
2503
+ maintenanceStatusSchema,
2504
+ extendedAirplaneSchema,
2505
+ availSchema,
2506
+ bookingWaypointSchema,
2507
+ activitySchema,
2508
+ bookingSchema,
2509
+ alertSchema,
2510
+ documentSchema,
2511
+ documentRequirement,
2512
+ documentRequirementGroup,
2513
+ documentRequirementGroupAssignment,
2514
+ documentComplianceStatus,
2515
+ documentShareSchema,
2516
+ allowedDocumentTypeSchema,
2517
+ flightLogSchema,
2518
+ invoiceSchema,
2519
+ scheduledFlightSchema,
2520
+ qualificationSchema,
2521
+ expenseSchema,
2522
+ tagSchema,
2523
+ courseSchema,
2524
+ courseEnrollmentMetricsSchema,
2525
+ courseEnrollmentSchema,
2526
+ membershipSignupSchema,
2527
+ eventSchema,
2528
+ addressSchema,
2529
+ roleSchema,
2530
+ landingSchema,
2531
+ ticketSchema,
2532
+ runwaySchema,
2533
+ settingSchema,
2534
+ postSchema,
2535
+ commentSchema,
2536
+ airplaneIssueSeverityEnum,
2537
+ airplaneIssueStatusEnum,
2538
+ airplaneIssueSchema,
2539
+ specialFlightSchema,
2540
+ prePaidPackageSchema,
2541
+ expenseItemSchema,
2542
+ waypointSchema,
2543
+ approachTypeSchema,
2544
+ FaqStatus,
2545
+ FaqSchema,
2546
+ SubmitFaqQuestionSchema,
2547
+ ReviewFaqSchema,
2548
+ SafetyReportStatusEnum,
2549
+ SafetyReportCategorySchema,
2550
+ SafetyReportCategoryFormSchema,
2551
+ SafetyReportMediaSchema,
2552
+ SafetyReportSchema,
2553
+ SafetyReportListResponseSchema,
2554
+ SafetyReportFormSchema,
2555
+ SafetyReportUpdateSchema,
2556
+ SafetyReportFilterSchema,
2557
+ SafetyReportSubmissionResponseSchema,
2558
+ SAFETY_REPORT_STATUS_LABELS,
2559
+ SAFETY_REPORT_STATUS_COLORS,
2560
+ FormFieldType,
2561
+ FormSubmissionStatus,
2562
+ FormSubmissionSource,
2563
+ FieldLabelSchema,
2564
+ ShowWhenSchema,
2565
+ SchemaFieldSchema,
2566
+ SchemaSectionSchema,
2567
+ TemplateSchemaSchema,
2568
+ FormTemplateSchema,
2569
+ FormTemplateAssignmentSchema,
2570
+ SignatureSchema,
2571
+ SubmissionFileSchema,
2572
+ FormSubmissionShareBaseSchema,
2573
+ FormSubmissionSchema,
2574
+ FormSubmissionShareSchema,
2575
+ RequiredFormViaCrewSchema,
2576
+ RequiredFormViaSchema,
2577
+ RequiredFormSchema,
2578
+ CourseMilestoneKindEnum,
2579
+ courseMilestoneSchema,
2580
+ CourseMilestoneFormSchema,
2581
+ courseEnrollmentMilestoneSchema,
2582
+ NewsletterBlockType,
2583
+ TipTapNodeSchema,
2584
+ HeadingBlockSchema,
2585
+ ParagraphBlockSchema,
2586
+ ButtonBlockSchema,
2587
+ DividerBlockSchema,
2588
+ NewsletterBlockSchema,
2589
+ NewsletterCategorySchema,
2590
+ NewsletterTemplateSchemaSchema,
2591
+ NewsletterTemplateSchema,
2592
+ CreateNewsletterTemplateInputSchema,
2593
+ AudienceBucketType,
2594
+ AllUsersBucketSchema,
2595
+ CompanyUsersBucketSchema,
2596
+ RoleMembersBucketSchema,
2597
+ AudienceBucketSchema,
2598
+ NewsletterAudienceSchema,
2599
+ companyAudienceInclude,
2600
+ NewsletterCampaignStatus,
2601
+ NewsletterCampaignSchema,
2602
+ CreateNewsletterCampaignInputSchema,
2603
+ NewsletterRecipientStatus,
2604
+ NewsletterCampaignRecipientSchema,
2605
+ NewsletterPreferenceRowSchema,
2606
+ ALLOWED_NEWSLETTER_VARIABLES,
2607
+ LocationMapKind,
2608
+ LocationFeatureVisibility,
2609
+ ALLOWED_GEOMETRY_TYPES,
2610
+ ViewportSchema,
2611
+ GeometrySchema,
2612
+ CreateLocationMapSchema,
2613
+ UpdateLocationMapSchema,
2614
+ CreateLocationMapFeatureSchema,
2615
+ UpdateLocationMapFeatureSchema,
2616
+ ImportFeaturesSchema,
2617
+ TodoActionSchema,
2618
+ TodoKey,
2619
+ TodoSchema
2620
+ };