import {z} from 'zod' export type ParameterDateOnly = string; export type GetApiV1CampaignsCampaignIdSummaryArgs = {start_date?: ParameterDateOnly | undefined, end_date?: ParameterDateOnly | undefined}; export type GetApiV1CampaignsCampaignIdSummaryOptions = {baseUrl?: string | undefined, XAppId?: string | undefined, XAppToken?: string | undefined, fetch?: typeof fetch | undefined}; export const discountAmountVouchersEffectTypes = z.enum(["APPLY_TO_ORDER", "APPLY_TO_ITEMS", "APPLY_TO_ITEMS_PROPORTIONALLY", "APPLY_TO_ITEMS_PROPORTIONALLY_BY_QUANTITY", "APPLY_TO_ITEMS_BY_QUANTITY"]); export const discountUnitVouchersEffectTypes = z.enum(["ADD_MISSING_ITEMS", "ADD_NEW_ITEMS", "ADD_MANY_ITEMS", "ADD_SAME_ITEMS"]); export const simpleProductDiscountUnit = z.object({id: z.string(), source_id: z.string().optional(), name: z.string()}); export const simpleSkuDiscountUnit = z.object({id: z.string(), source_id: z.string().optional(), name: z.string()}); export const discountUnitMultipleOneUnit = z.object({unit_off: z.number().optional(), unit_off_formula: z.string().optional(), effect: z.enum(["ADD_NEW_ITEMS", "ADD_MISSING_ITEMS"]), unit_type: z.string(), product: simpleProductDiscountUnit.optional(), sku: simpleSkuDiscountUnit.optional()}); export const discountPercentVouchersEffectTypes = z.enum(["APPLY_TO_ORDER", "APPLY_TO_ITEMS"]); export const discountFixedVouchersEffectTypes = z.enum(["APPLY_TO_ORDER", "APPLY_TO_ITEMS"]); export const discount = z.union([z.object({type: z.literal("AMOUNT"), amount_off: z.number(), amount_off_formula: z.string().optional(), aggregated_amount_limit: z.number().int().optional(), effect: discountAmountVouchersEffectTypes.optional(), is_dynamic: z.boolean().optional()}), z.object({type: z.literal("UNIT"), unit_off: z.number().int().optional(), unit_off_formula: z.string().optional(), effect: discountUnitVouchersEffectTypes.optional(), unit_type: z.string(), product: simpleProductDiscountUnit.optional(), sku: simpleSkuDiscountUnit.optional(), is_dynamic: z.boolean().optional()}), z.object({type: z.literal("UNIT"), effect: z.literal("ADD_MANY_ITEMS").optional(), units: z.array(discountUnitMultipleOneUnit)}), z.object({type: z.literal("PERCENT"), percent_off: z.number(), percent_off_formula: z.string().optional(), amount_limit: z.number().optional(), aggregated_amount_limit: z.number().int().optional(), effect: discountPercentVouchersEffectTypes.optional(), is_dynamic: z.boolean().optional()}), z.object({type: z.literal("FIXED"), fixed_amount: z.number(), fixed_amount_formula: z.string().optional(), effect: discountFixedVouchersEffectTypes.optional(), is_dynamic: z.boolean().optional()})]); export const gift = z.object({amount: z.number(), subtracted_amount: z.number().int().optional(), balance: z.number(), effect: z.enum(["APPLY_TO_ORDER", "APPLY_TO_ITEMS"]).optional()}); export const campaignLoyaltyCard = z.object({points: z.number().int(), expiration_rules: z.object({period_type: z.enum(["FIXED_DAY_OF_YEAR", "MONTH"]), period_value: z.number().int().optional(), rounding_type: z.enum(["END_OF_MONTH", "END_OF_QUARTER", "END_OF_HALF_YEAR", "END_OF_YEAR", "PARTICULAR_MONTH"]).optional(), rounding_value: z.number().int().optional(), fixed_month: z.number().int().gte(1).lte(12).optional(), fixed_day: z.number().int().gte(1).lte(31).optional()}).optional()}); export const codeConfig = z.object({length: z.number().optional(), charset: z.string().optional(), prefix: z.string().optional(), postfix: z.string().optional(), pattern: z.string().optional(), initial_count: z.number().int().optional()}); export const validityTimeframe = z.object({duration: z.string().optional(), interval: z.string().optional()}); export const validityDayOfWeek = z.array(z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(6)])); export const validityHours = z.object({daily: z.array(z.object({start_time: z.string().optional(), days_of_week: z.array(z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(6)])).optional(), expiration_time: z.string().optional()})).optional()}); export const campaignVoucher = z.object({type: z.string(), discount: discount.optional(), gift: gift.optional(), loyalty_card: campaignLoyaltyCard.optional(), redemption: z.object({quantity: z.number().int().nullable()}), code_config: codeConfig, is_referral_code: z.boolean(), start_date: z.string().optional(), expiration_date: z.string().optional(), validity_timeframe: validityTimeframe.optional(), validity_day_of_week: validityDayOfWeek.optional(), validity_hours: validityHours.optional()}); export const category = z.object({id: z.string(), name: z.string(), hierarchy: z.number().int().gte(0), object: z.literal("category"), created_at: z.string(), updated_at: z.string().optional()}); export const referralProgram = z.object({conversion_event_type: z.enum(["redemption", "custom_event"]).optional(), custom_event: z.object({id: z.string().optional(), name: z.string().optional()}).optional(), referee_reward: z.object({related_object_parent: z.object({id: z.string().optional(), name: z.string().optional(), object: z.literal("CAMPAIGN").optional()}).optional(), type: z.enum(["LOYALTY_CARD", "GIFT_VOUCHER"]).optional(), amount: z.number().int().optional()}).optional()}); export const loyaltyTiersExpirationAll = z.object({qualification_type: z.enum(["BALANCE", "POINTS_IN_PERIOD"]), qualification_period: z.enum(["MONTH", "QUARTER", "HALF_YEAR", "YEAR"]).optional(), start_date: z.object({type: z.enum(["IMMEDIATE", "NEXT_PERIOD"])}), expiration_date: z.object({type: z.enum(["END_OF_PERIOD", "END_OF_NEXT_PERIOD", "BALANCE_DROP", "CUSTOM"]), extend: z.string(), rounding: z.object({type: z.enum(["MONTH", "QUARTER", "HALF_YEAR", "YEAR", "CUSTOM"]).optional(), strategy: z.enum(["START", "END"]).optional(), unit: z.literal("MONTH").optional(), value: z.number().int().optional()}).optional()})}); export const areaStoreCampaignAssignment = z.object({id: z.string(), area_id: z.string(), all_stores: z.boolean().optional(), area_store_id: z.string().optional(), created_at: z.string(), object: z.literal("area_store_campaign_assignment")}); export const accessSettingsCampaignAssignmentsList = z.object({object: z.literal("list"), data_ref: z.literal("data"), data: z.array(areaStoreCampaignAssignment), total: z.number().int().gte(0)}); export const campaignBase = z.object({id: z.string(), name: z.string(), description: z.string().optional(), campaign_type: z.enum(["LOYALTY_PROGRAM", "GIFT_VOUCHERS", "DISCOUNT_COUPONS", "PROMOTION", "REFERRAL_PROGRAM"]), type: z.enum(["AUTO_UPDATE", "STATIC", "STANDALONE"]), voucher: campaignVoucher.optional(), auto_join: z.boolean(), join_once: z.boolean(), use_voucher_metadata_schema: z.boolean(), validity_timeframe: validityTimeframe.optional(), validity_day_of_week: validityDayOfWeek.optional(), validity_hours: validityHours.optional(), activity_duration_after_publishing: z.string().optional(), vouchers_count: z.number().int().optional(), start_date: z.string().optional(), expiration_date: z.string().optional(), active: z.boolean().optional(), metadata: z.object({}).optional(), created_at: z.string(), updated_at: z.string().optional(), category: z.string().optional(), creation_status: z.enum(["DONE", "IN_PROGRESS", "FAILED", "DRAFT", "MODIFYING"]), vouchers_generation_status: z.enum(["DONE", "IN_PROGRESS", "FAILED", "DRAFT", "MODIFYING"]), readonly: z.boolean().optional(), protected: z.boolean(), category_id: z.string().nullable(), categories: z.array(category), object: z.string(), referral_program: referralProgram.optional(), loyalty_tiers_expiration: loyaltyTiersExpirationAll.optional(), access_settings_assignments: accessSettingsCampaignAssignmentsList.optional()}); export const campaignsSummaryGetResponseBody = z.union([z.object({object: z.literal("campaign_summary"), campaign: campaignBase, redemptions: z.number().int(), redemptions_succeeded: z.number().int(), redemptions_failed: z.number().int(), rollbacks: z.number().int(), rollbacks_succeeded: z.number().int(), rollbacks_failed: z.number().int(), validations: z.number().int(), validations_succeeded: z.number().int(), validations_failed: z.number().int(), orders_amount: z.number().int(), orders_rolledback_amount: z.number().int(), vouchers_created: z.number().int(), vouchers_deleted: z.number().int(), publications: z.number().int(), publications_succeeded: z.number().int(), publications_failed: z.number().int(), discounted_amount: z.number().int(), rolledback_discounted_amount: z.number().int()}), z.object({object: z.literal("campaign_summary"), campaign: campaignBase, redemptions: z.number().int(), redemptions_succeeded: z.number().int(), redemptions_failed: z.number().int(), rollbacks: z.number().int(), rollbacks_succeeded: z.number().int(), rollbacks_failed: z.number().int(), validations: z.number().int(), validations_succeeded: z.number().int(), validations_failed: z.number().int(), orders_amount: z.number().int(), orders_rolledback_amount: z.number().int(), discounted_amount: z.number().int(), rolledback_discounted_amount: z.number().int()}), z.object({object: z.literal("campaign_summary"), campaign: campaignBase, redemptions: z.number().int(), redemptions_succeeded: z.number().int(), redemptions_failed: z.number().int(), rollbacks: z.number().int(), rollbacks_succeeded: z.number().int(), rollbacks_failed: z.number().int(), validations: z.number().int(), validations_succeeded: z.number().int(), validations_failed: z.number().int(), orders_amount: z.number().int(), orders_rolledback_amount: z.number().int(), vouchers_created: z.number().int(), vouchers_deleted: z.number().int(), publications: z.number().int(), publications_succeeded: z.number().int(), publications_failed: z.number().int(), created_vouchers_amount: z.number().int(), amount_added: z.number().int(), amount_deleted: z.number().int(), amount_redeemed: z.number().int(), amount_rolledback: z.number().int(), amount_subtracted: z.number().int()}), z.object({object: z.literal("campaign_summary"), campaign: campaignBase, redemptions: z.number().int(), redemptions_succeeded: z.number().int(), redemptions_failed: z.number().int(), rollbacks: z.number().int(), rollbacks_succeeded: z.number().int(), rollbacks_failed: z.number().int(), validations: z.number().int(), validations_succeeded: z.number().int(), validations_failed: z.number().int(), orders_amount: z.number().int(), orders_rolledback_amount: z.number().int(), vouchers_created: z.number().int(), vouchers_deleted: z.number().int(), publications: z.number().int(), publications_succeeded: z.number().int(), publications_failed: z.number().int(), created_vouchers_points: z.number().int(), points_deleted: z.number().int(), points_subtracted: z.number().int(), points_added: z.number().int(), points_rewarded: z.number().int(), points_redeemed: z.number().int(), points_rolledback: z.number().int(), points_expired: z.number().int(), points_transferred_out: z.number().int(), points_transferred_in: z.number().int(), pending_points_added: z.number().int(), pending_points_subtracted: z.number().int(), pending_points_activated: z.number().int(), pending_points_canceled: z.number().int()}), z.object({object: z.literal("campaign_summary"), campaign: campaignBase, redemptions: z.number().int(), redemptions_succeeded: z.number().int(), redemptions_failed: z.number().int(), rollbacks: z.number().int(), rollbacks_succeeded: z.number().int(), rollbacks_failed: z.number().int(), validations: z.number().int(), validations_succeeded: z.number().int(), validations_failed: z.number().int(), orders_amount: z.number().int(), orders_rolledback_amount: z.number().int(), vouchers_created: z.number().int(), vouchers_deleted: z.number().int(), publications: z.number().int(), publications_succeeded: z.number().int(), publications_failed: z.number().int(), referred_customers: z.number().int()})]); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get Campaign Summary * * GET /v1/campaigns/{campaignId}/summary * * Also accepts auth: X-Voucherify-OAuth */ export const getApiV1CampaignsCampaignIdSummary = async (args: GetApiV1CampaignsCampaignIdSummaryArgs, options?: GetApiV1CampaignsCampaignIdSummaryOptions) => { const {baseUrl = "https://api.voucherify.io", fetch: fetchFn = fetch, XAppId, XAppToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.start_date != null) query.append("start_date", String(args.start_date)) if (args.end_date != null) query.append("end_date", String(args.end_date)) if (XAppId !== undefined) headers.set("X-App-Id", XAppId) if (XAppToken !== undefined) headers.set("X-App-Token", XAppToken) const url = `${baseUrl.replace(/\/+$/, '')}/v1/campaigns/${encodeURIComponent(String(args.campaignId))}/summary${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(campaignsSummaryGetResponseBody, await res.json()) };