evo360-types 1.3.409 → 1.3.413

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.
@@ -0,0 +1,354 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.zCampaignAction = exports.zPrevalidationResult = exports.zCsvUploadMeta = exports.zBucketCreate = exports.zCampaignUpsert = exports.zTariffItemSchema = exports.zLeadCampaignHistoryEntrySchema = exports.zCampaignConversionSchema = exports.zCampaignRecipientSchema = exports.zCampaignBucketSchema = exports.zCampaignBucketSourceTypeSchema = exports.zCampaignSchema = exports.zCampaignScheduleSchema = exports.zCampaignFrequencySchema = exports.zCampaignNewLeadConfigSchema = exports.zCampaignAttributionSchema = exports.zCampaignChannelConfigSchema = exports.zCampaignMediaSchema = exports.zCampaignTicketPolicySchema = exports.zCampaignPacingSchema = exports.zCampaignCtaSchema = exports.zCampaignVariableMappingSchema = exports.zCampaignCodeNameSchema = exports.zRecipientInteractionStatusSchema = exports.zRecipientChannelStatusSchema = exports.zRecipientDispatchStateSchema = exports.zCampaignVariableSourceSchema = exports.zCampaignChannelSchema = exports.zCampaignTypeSchema = exports.zCampaignStatusSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const zod_schemas_1 = require("../shared/zod-schemas");
6
+ // ======================================================
7
+ // evo-campaigns (feat-081 — Hub Omni Campaigns) — zod schemas
8
+ //
9
+ // Doc schemas mirror the hand-written interfaces in
10
+ // types/evo-campaigns/index.ts. Request schemas validate the admin HTTP surface
11
+ // (evo_campaigns_admin). passthrough() everywhere additive fields may appear.
12
+ // ======================================================
13
+ // ----- Enums ----------------------------------------------------------------
14
+ exports.zCampaignStatusSchema = zod_1.z.enum([
15
+ "draft",
16
+ "scheduled",
17
+ "running",
18
+ "paused",
19
+ "finished",
20
+ "canceled",
21
+ "finished_error",
22
+ ]);
23
+ exports.zCampaignTypeSchema = zod_1.z.enum([
24
+ "conversion",
25
+ "informative",
26
+ "relationship",
27
+ "operational",
28
+ "promotional",
29
+ ]);
30
+ exports.zCampaignChannelSchema = zod_1.z.enum(["whatsapp", "email"]);
31
+ exports.zCampaignVariableSourceSchema = zod_1.z.enum([
32
+ "placeholder",
33
+ "fixed",
34
+ "csv_column",
35
+ "qr_link",
36
+ ]);
37
+ exports.zRecipientDispatchStateSchema = zod_1.z.enum([
38
+ "pending",
39
+ "dispatched",
40
+ "done",
41
+ "excluded",
42
+ ]);
43
+ exports.zRecipientChannelStatusSchema = zod_1.z.enum([
44
+ "pending",
45
+ "scheduled",
46
+ "sent",
47
+ "delivered",
48
+ "read",
49
+ "failed",
50
+ "clicked",
51
+ "replied",
52
+ ]);
53
+ exports.zRecipientInteractionStatusSchema = zod_1.z.enum([
54
+ "pendente",
55
+ "inelegivel",
56
+ "agendado",
57
+ "enviado",
58
+ "entregue",
59
+ "lido",
60
+ "clicou",
61
+ "respondeu",
62
+ "convertido",
63
+ "falhou",
64
+ "optout",
65
+ "cancelado",
66
+ ]);
67
+ // ----- Shared value objects -------------------------------------------------
68
+ exports.zCampaignCodeNameSchema = zod_1.z
69
+ .object({
70
+ code: zod_1.z.string(),
71
+ name: zod_1.z.string(),
72
+ })
73
+ .passthrough();
74
+ exports.zCampaignVariableMappingSchema = zod_1.z
75
+ .object({
76
+ variable: zod_1.z.string(),
77
+ source: exports.zCampaignVariableSourceSchema,
78
+ token: zod_1.z.string().optional(),
79
+ value: zod_1.z.string().optional(),
80
+ column: zod_1.z.string().optional(),
81
+ cta_id: zod_1.z.string().optional(),
82
+ })
83
+ .passthrough();
84
+ exports.zCampaignCtaSchema = zod_1.z
85
+ .object({
86
+ cta_id: zod_1.z.string(),
87
+ label: zod_1.z.string(),
88
+ button_index: zod_1.z.number().optional(),
89
+ target_url: zod_1.z.string().optional(),
90
+ })
91
+ .passthrough();
92
+ exports.zCampaignPacingSchema = zod_1.z
93
+ .object({
94
+ batch_size: zod_1.z.number(),
95
+ batch_interval_minutes: zod_1.z.number(),
96
+ daily_limit: zod_1.z.number(),
97
+ allowed_window: zod_1.z
98
+ .object({
99
+ start: zod_1.z.string(),
100
+ end: zod_1.z.string(),
101
+ })
102
+ .passthrough(),
103
+ })
104
+ .passthrough();
105
+ exports.zCampaignTicketPolicySchema = zod_1.z
106
+ .object({
107
+ mode: zod_1.z.enum(["close", "keep_open"]),
108
+ close_status: exports.zCampaignCodeNameSchema.optional(),
109
+ note: zod_1.z.string().optional(),
110
+ })
111
+ .passthrough();
112
+ exports.zCampaignMediaSchema = zod_1.z
113
+ .object({
114
+ type: zod_1.z.string(),
115
+ gcs_path: zod_1.z.string().optional(),
116
+ url: zod_1.z.string().optional(),
117
+ })
118
+ .passthrough();
119
+ exports.zCampaignChannelConfigSchema = zod_1.z
120
+ .object({
121
+ channel_id: zod_1.z.string(),
122
+ template_id: zod_1.z.string(),
123
+ template_language: zod_1.z.string().optional(),
124
+ template_category: zod_1.z.string().optional(),
125
+ variable_mappings: zod_1.z.array(exports.zCampaignVariableMappingSchema),
126
+ media: exports.zCampaignMediaSchema.optional(),
127
+ ctas: zod_1.z.array(exports.zCampaignCtaSchema),
128
+ department_id: zod_1.z.string().optional(),
129
+ ticket_policy: exports.zCampaignTicketPolicySchema,
130
+ pacing: exports.zCampaignPacingSchema,
131
+ subject_override: zod_1.z.string().optional(),
132
+ preheader: zod_1.z.string().optional(),
133
+ })
134
+ .passthrough();
135
+ exports.zCampaignAttributionSchema = zod_1.z
136
+ .object({
137
+ window_days: zod_1.z.number(),
138
+ conversion_event: zod_1.z.string(),
139
+ appointment_status_base_in: zod_1.z.array(zod_1.z.string()),
140
+ requires: zod_1.z.enum(["delivery", "click", "reply"]),
141
+ })
142
+ .passthrough();
143
+ exports.zCampaignNewLeadConfigSchema = zod_1.z
144
+ .object({
145
+ dist_channel: exports.zCampaignCodeNameSchema,
146
+ qualification: zod_1.z
147
+ .object({
148
+ code: zod_1.z.string(),
149
+ name: zod_1.z.string(),
150
+ funnelLevel: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]),
151
+ })
152
+ .passthrough()
153
+ .nullable()
154
+ .optional(),
155
+ tags: zod_1.z.array(zod_1.z.string()).optional(),
156
+ })
157
+ .passthrough();
158
+ exports.zCampaignFrequencySchema = zod_1.z
159
+ .object({
160
+ min_days: zod_1.z.number(),
161
+ override: zod_1.z.boolean(),
162
+ })
163
+ .passthrough();
164
+ exports.zCampaignScheduleSchema = zod_1.z
165
+ .object({
166
+ mode: zod_1.z.enum(["immediate", "scheduled"]),
167
+ scheduled_at: zod_1.z.coerce.date().nullable().optional(),
168
+ })
169
+ .passthrough();
170
+ // ----- Campaign doc ---------------------------------------------------------
171
+ exports.zCampaignSchema = zod_schemas_1.zFireDocSchema
172
+ .extend({
173
+ name: zod_1.z.string(),
174
+ description: zod_1.z.string().nullable().optional(),
175
+ purpose: exports.zCampaignCodeNameSchema,
176
+ objective: exports.zCampaignCodeNameSchema,
177
+ campaign_type: exports.zCampaignTypeSchema,
178
+ tags: zod_1.z.array(zod_1.z.string()).optional(),
179
+ status: exports.zCampaignStatusSchema,
180
+ attribution_open: zod_1.z.boolean(),
181
+ attribution_deadline: zod_1.z.coerce.date().nullable().optional(),
182
+ attribution: exports.zCampaignAttributionSchema,
183
+ channels: zod_1.z
184
+ .object({
185
+ whatsapp: exports.zCampaignChannelConfigSchema.optional(),
186
+ email: exports.zCampaignChannelConfigSchema.optional(),
187
+ })
188
+ .passthrough(),
189
+ new_lead_config: exports.zCampaignNewLeadConfigSchema.optional(),
190
+ frequency: exports.zCampaignFrequencySchema,
191
+ schedule: exports.zCampaignScheduleSchema,
192
+ dispatch_state: zod_1.z.record(zod_1.z.unknown()).optional(),
193
+ prevalidation: zod_1.z.record(zod_1.z.unknown()).optional(),
194
+ cost_estimate: zod_1.z.record(zod_1.z.unknown()).optional(),
195
+ counters: zod_1.z.record(zod_1.z.unknown()).optional(),
196
+ })
197
+ .passthrough();
198
+ // ----- Bucket doc -----------------------------------------------------------
199
+ exports.zCampaignBucketSourceTypeSchema = zod_1.z.enum([
200
+ "leads",
201
+ "patients",
202
+ "appointments",
203
+ "csv",
204
+ ]);
205
+ exports.zCampaignBucketSchema = zod_schemas_1.zFireDocSchema
206
+ .extend({
207
+ source_type: exports.zCampaignBucketSourceTypeSchema,
208
+ label: zod_1.z.string(),
209
+ filters: zod_1.z.record(zod_1.z.unknown()).optional(),
210
+ csv_file: zod_1.z.record(zod_1.z.unknown()).optional(),
211
+ counts: zod_1.z.record(zod_1.z.unknown()).optional(),
212
+ })
213
+ .passthrough();
214
+ // ----- Recipient doc --------------------------------------------------------
215
+ exports.zCampaignRecipientSchema = zod_schemas_1.zFireDocSchema
216
+ .extend({
217
+ lead_id: zod_1.z.string().optional(),
218
+ patient_id: zod_1.z.string().optional(),
219
+ is_new_lead: zod_1.z.boolean(),
220
+ contact: zod_1.z
221
+ .object({
222
+ display_name: zod_1.z.string().optional(),
223
+ mobile: zod_1.z.string().optional(),
224
+ email: zod_1.z.string().optional(),
225
+ external_id: zod_1.z.string().optional(),
226
+ })
227
+ .passthrough(),
228
+ bucket_ids: zod_1.z.array(zod_1.z.string()),
229
+ primary_bucket_id: zod_1.z.string(),
230
+ csv_variables: zod_1.z.record(zod_1.z.string()).optional(),
231
+ dispatch_state: exports.zRecipientDispatchStateSchema,
232
+ eligibility: zod_1.z.record(zod_1.z.unknown()),
233
+ channels: zod_1.z.record(zod_1.z.unknown()),
234
+ interaction_status: exports.zRecipientInteractionStatusSchema,
235
+ converted_at: zod_1.z.coerce.date().nullable().optional(),
236
+ conversion_id: zod_1.z.string().nullable().optional(),
237
+ })
238
+ .passthrough();
239
+ // ----- Conversion doc -------------------------------------------------------
240
+ exports.zCampaignConversionSchema = zod_schemas_1.zFireDocSchema
241
+ .extend({
242
+ lead_id: zod_1.z.string(),
243
+ recipient_id: zod_1.z.string(),
244
+ conversion_event: zod_1.z.string(),
245
+ source_entity_type: zod_1.z.enum(["appointment", "qr_action", "ticket", "message"]),
246
+ source_entity_id: zod_1.z.string(),
247
+ channel: exports.zCampaignChannelSchema.optional(),
248
+ cta_id: zod_1.z.string().optional(),
249
+ attributed_at: zod_1.z.coerce.date(),
250
+ attribution_model: zod_1.z.literal("last_campaign_in_window"),
251
+ window_days: zod_1.z.number(),
252
+ metadata: zod_1.z.record(zod_1.z.unknown()).optional(),
253
+ })
254
+ .passthrough();
255
+ // ----- Lead campaign-history entry ------------------------------------------
256
+ exports.zLeadCampaignHistoryEntrySchema = zod_schemas_1.zFireDocSchema
257
+ .extend({
258
+ campaign_id: zod_1.z.string(),
259
+ campaign_name: zod_1.z.string(),
260
+ classification_level: zod_1.z.string(),
261
+ channels_sent: zod_1.z.array(exports.zCampaignChannelSchema),
262
+ template_ids: zod_1.z.record(zod_1.z.string()).optional(),
263
+ bucket_ids: zod_1.z.array(zod_1.z.string()).optional(),
264
+ first_sent_at: zod_1.z.coerce.date().nullable().optional(),
265
+ last_sent_at: zod_1.z.coerce.date().nullable().optional(),
266
+ delivered_at: zod_1.z.coerce.date().nullable().optional(),
267
+ read_at: zod_1.z.coerce.date().nullable().optional(),
268
+ clicked_at: zod_1.z.coerce.date().nullable().optional(),
269
+ replied_at: zod_1.z.coerce.date().nullable().optional(),
270
+ converted_at: zod_1.z.coerce.date().nullable().optional(),
271
+ interaction_status: exports.zRecipientInteractionStatusSchema,
272
+ })
273
+ .passthrough();
274
+ // ----- Tariff dic item ------------------------------------------------------
275
+ exports.zTariffItemSchema = zod_1.z
276
+ .object({
277
+ code: zod_1.z.string(),
278
+ name: zod_1.z.string(),
279
+ description: zod_1.z.string().optional(),
280
+ context: zod_1.z.string(),
281
+ channel: zod_1.z.string().optional(),
282
+ provider: zod_1.z.string().optional(),
283
+ country: zod_1.z.string().optional(),
284
+ category: zod_1.z.string().optional(),
285
+ currency: zod_1.z.string(),
286
+ calc_type: zod_1.z.enum(["fixed", "percentage"]),
287
+ value: zod_1.z.number(),
288
+ percent_base: zod_1.z.string().optional(),
289
+ valid_from: zod_1.z.coerce.date(),
290
+ valid_to: zod_1.z.coerce.date().nullable().optional(),
291
+ active: zod_1.z.boolean(),
292
+ metadata: zod_1.z.record(zod_1.z.unknown()).optional(),
293
+ })
294
+ .passthrough();
295
+ // ======================================================
296
+ // Request schemas (admin HTTP surface)
297
+ // ======================================================
298
+ /** POST /campaigns, PATCH /campaigns/:id — draft create/edit. */
299
+ exports.zCampaignUpsert = zod_1.z
300
+ .object({
301
+ name: zod_1.z.string().min(1),
302
+ description: zod_1.z.string().nullable().optional(),
303
+ purpose: exports.zCampaignCodeNameSchema,
304
+ objective: exports.zCampaignCodeNameSchema,
305
+ campaign_type: exports.zCampaignTypeSchema,
306
+ tags: zod_1.z.array(zod_1.z.string()).optional(),
307
+ attribution: exports.zCampaignAttributionSchema.partial().optional(),
308
+ channels: zod_1.z
309
+ .object({
310
+ whatsapp: exports.zCampaignChannelConfigSchema.optional(),
311
+ email: exports.zCampaignChannelConfigSchema.optional(),
312
+ })
313
+ .passthrough()
314
+ .optional(),
315
+ new_lead_config: exports.zCampaignNewLeadConfigSchema.optional(),
316
+ frequency: exports.zCampaignFrequencySchema.partial().optional(),
317
+ schedule: exports.zCampaignScheduleSchema.optional(),
318
+ })
319
+ .passthrough();
320
+ /** POST /campaigns/:id/buckets — create a bucket with filters. */
321
+ exports.zBucketCreate = zod_1.z
322
+ .object({
323
+ source_type: exports.zCampaignBucketSourceTypeSchema,
324
+ label: zod_1.z.string().min(1),
325
+ filters: zod_1.z.record(zod_1.z.unknown()).optional(),
326
+ })
327
+ .passthrough();
328
+ /** POST /campaigns/:id/buckets/csv — upload metadata (file itself is base64 in body). */
329
+ exports.zCsvUploadMeta = zod_1.z
330
+ .object({
331
+ label: zod_1.z.string().min(1),
332
+ filename: zod_1.z.string().min(1),
333
+ file_base64: zod_1.z.string(),
334
+ /** CSV column -> semantic field mapping (name/mobile/email/variables). */
335
+ mapping: zod_1.z.record(zod_1.z.string()),
336
+ })
337
+ .passthrough();
338
+ /** Prevalidation snapshot returned by GET /campaigns/:id/prevalidation. */
339
+ exports.zPrevalidationResult = zod_1.z
340
+ .object({
341
+ status: zod_1.z.enum(["approved", "warnings", "blocked"]),
342
+ errors: zod_1.z.array(zod_1.z.string()),
343
+ warnings: zod_1.z.array(zod_1.z.string()),
344
+ ran_at: zod_1.z.coerce.date().optional(),
345
+ })
346
+ .passthrough();
347
+ /** POST /campaigns/:id/{schedule|start|pause|resume|cancel}. */
348
+ exports.zCampaignAction = zod_1.z
349
+ .object({
350
+ action: zod_1.z.enum(["schedule", "start", "pause", "resume", "cancel"]),
351
+ scheduled_at: zod_1.z.coerce.date().nullable().optional(),
352
+ reason: zod_1.z.string().optional(),
353
+ })
354
+ .passthrough();