@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.
- package/dist/chunk-EE4YY3AU.js +2620 -0
- package/dist/chunk-H4CJ2YEQ.cjs +2620 -0
- package/dist/courses/index.d.cts +2 -2
- package/dist/courses/index.d.ts +2 -2
- package/dist/index.cjs +201 -5
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +207 -11
- package/dist/schemas/index.cjs +198 -2
- package/dist/schemas/index.d.cts +3157 -128
- package/dist/schemas/index.d.ts +3157 -128
- package/dist/schemas/index.js +201 -5
- package/dist/training-C9rIBUeV.d.cts +101685 -0
- package/dist/training-C9rIBUeV.d.ts +101685 -0
- package/dist/types/index.cjs +1 -1
- package/dist/types/index.d.cts +278 -6
- package/dist/types/index.d.ts +278 -6
- package/dist/types/index.js +1 -1
- package/package.json +1 -1
- package/src/courses/index.ts +2 -2
- package/src/index.ts +42 -0
- package/src/schemas/common.ts +69 -5
- package/src/schemas/course-milestone.ts +78 -0
- package/src/schemas/equipment.ts +27 -0
- package/src/schemas/form-template.ts +416 -0
- package/src/schemas/index.ts +7 -1
- package/src/schemas/location-map.ts +175 -0
- package/src/schemas/models.ts +201 -100
- package/src/schemas/newsletter.ts +362 -0
- package/src/schemas/todo.ts +46 -0
- package/src/schemas/training.ts +500 -0
- package/src/types/ai.ts +85 -0
- package/src/types/aircraft-block.ts +23 -0
- package/src/types/api.ts +3 -1
- package/src/types/background-task.ts +28 -0
- package/src/types/compliance.ts +27 -3
- package/src/types/index.ts +5 -0
- package/src/types/landing-fee.ts +92 -0
- package/src/types/models.ts +46 -3
- package/src/types/roles.ts +26 -0
- package/dist/chunk-RC2BBT6H.cjs +0 -1384
- package/dist/chunk-WQLDSZNN.js +0 -1384
- package/dist/models-Bc5BKYuI.d.cts +0 -36898
- package/dist/models-Bc5BKYuI.d.ts +0 -36898
- package/src/schemas/fee.ts +0 -37
- /package/dist/{chunk-LXNCAKJZ.js → chunk-2WJHTRIE.js} +0 -0
- /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
|
+
};
|