import {z} from 'zod' export type GetApiAccountsAidReceiptsSearchArgs = {aid: unknown, receipt_id: string}; export type GetApiAccountsAidReceiptsSearchOptions = {baseUrl?: string | undefined, JWT?: string | undefined, fetch?: typeof fetch | undefined}; export const item = z.object({id: z.string().optional(), group_id: z.string().optional()}); export const limitation = z.object({dynamic_purchase_to_days: z.number().gte(1).optional(), discount_activation: z.array(z.object({type: z.literal("deactivate_if_discount_active"), value: z.string()})).optional(), discount_hours: z.object({timezone: z.string().optional(), hours: z.array(z.object({day: z.enum(["mon", "tue", "wed", "thu", "fri", "sat", "sun"]), start: z.string(), end: z.string()}))}).optional(), discount_reward_usage: z.number().int().optional(), discount_combination: z.union([z.literal(-1), z.literal(0)]).optional(), discount_eligible: z.enum(["item_eligible_for_discount", "item_eligible_for_discount_no_discount", "receipt_no_discount"]).optional(), discount_repeat_usage: z.number().int().optional(), stamp_expire_days: z.number().int().optional(), blacklist: z.array(item).optional()}); export const customerRequirement = z.object({addresses: z.array(z.object({country: z.array(z.string()).optional(), postal_code: z.array(z.string()).optional(), postal_place: z.array(z.string()).optional(), custom_type: z.array(z.string()).optional(), type: z.array(z.string()).optional()})).optional(), company: z.object({bussiness_name: z.array(z.string()).optional(), department: z.array(z.string()).optional(), industry: z.array(z.string()).optional(), number_of_employees: z.array(z.string()).optional(), organization_number: z.array(z.string()).optional(), website: z.array(z.string()).optional()}).optional(), date_of_birth: z.array(z.string()).optional(), enrolled_by: z.object({type: z.array(z.string()).optional(), value: z.array(z.string()).optional()}).optional(), favorite_store: z.array(z.string()).optional(), first_name: z.array(z.string()).optional(), gender: z.array(z.string()).optional(), last_name: z.array(z.string()).optional(), marketing_consent: z.object({email: z.object({consent: z.array(z.string()).optional()}).optional(), sms: z.object({consent: z.array(z.string()).optional()}).optional()}).optional(), status: z.array(z.string()).optional(), term: z.object({id: z.array(z.string()).optional()}).optional(), type: z.array(z.string()).optional(), attributes: z.record(z.string(), z.array(z.string())).optional()}); export const itemMixProperty = z.object({items: z.array(z.object({id: z.string().optional(), group_id: z.string().optional()})).optional(), quantity: z.number().gte(0), reward_eligible: z.boolean()}); export const storeRequirement = z.object({id: z.array(z.string()).optional(), name: z.array(z.string()).optional(), business_name: z.array(z.string()).optional(), address: z.object({country: z.array(z.string()).optional(), postal_code: z.array(z.string()).optional(), postal_place: z.array(z.string()).optional()}).optional(), chain: z.array(z.string()).optional(), email: z.array(z.string()).optional(), gln: z.array(z.string()).optional(), organization_number: z.array(z.string()).optional(), phone_number: z.array(z.string()).optional(), mcc: z.array(z.string()).optional(), mcc_ranges: z.array(z.object({start: z.string(), end: z.string()})).optional(), bax: z.array(z.string()).optional(), terminal_id: z.array(z.string()).optional()}); export const requirement = z.object({customer: customerRequirement.optional(), item: z.object({quantity: z.number().gte(0).optional(), mixes: z.array(itemMixProperty).optional(), items: z.array(item).optional()}).optional(), store_ids: z.array(z.string()).optional(), gross_amount: z.number().int().optional(), net_amount: z.number().int().optional(), currencies: z.array(z.union([z.object({"anything-but": z.array(z.string()).optional()}), z.string()])).optional(), stamp: z.number().int().optional(), discount_code: z.string().optional(), store: storeRequirement.optional(), purchase_from: z.string(), purchase_to: z.string()}); export const rewardBase = z.enum(["net", "gross"]); export const reward = z.object({type: z.enum(["discount_amount", "discount_percent", "discount_item_new_price", "discount_item_quantity", "discount_item_percent", "discount_mix_new_price", "discount_debit"]), value: z.union([z.number().int().gte(0), z.number().gte(0)]), values: z.array(z.object({items: z.array(z.object({id: z.string().optional(), group_id: z.string().optional()})), value: z.number()})).optional(), base: rewardBase.optional(), effect: z.enum(["discount", "bonus"]).optional()}); export const links = z.array(z.object({href: z.string(), rel: z.string().optional(), type: z.string().optional()})); export const discountRefs = z.object({id: z.string().optional(), created_at: z.string().optional(), created_by: z.string().optional(), updated_at: z.string().optional(), deleted_by: z.string().optional(), deleted_at: z.string().optional(), campaign_id: z.string().optional(), active: z.boolean().optional(), private: z.boolean().optional(), updated_by: z.string().optional(), type: z.enum(["item", "receipt"]).optional(), name: z.string().optional(), receipt_text: z.string().optional(), visible_from: z.string().optional(), description: z.string().optional(), limitation: limitation.optional(), requirement: requirement, reward: reward, metadata: z.object({}).optional(), links: links.optional(), refs: z.array(z.object({id: z.string().optional(), stamp: z.number().int().optional(), amount: z.number().int().optional(), bonus: z.number().int().optional(), statistics: z.object({amount: z.number().int().optional(), bonus: z.number().int().optional(), debit_balance: z.number().int().optional(), stamp: z.number().int().optional(), usage: z.number().int().optional()}).optional(), items: z.array(z.object({line_id: z.number().int().optional(), bonus: z.number().int().optional(), amount: z.number().int().optional()})).optional(), usage: z.number().int().optional()})).optional()}); export const address = z.object({address_line: z.string(), address_line_2: z.string().optional(), postal_code: z.string().optional(), postal_place: z.string(), country: z.string()}); export const store = z.object({id: z.string(), name: z.string().optional(), business_name: z.string().optional(), address: address.optional(), chain: z.string().optional(), email: z.string().optional(), gln: z.string().optional(), organization_number: z.string().optional(), phone_number: z.string().optional(), mcc: z.string().optional(), bax: z.string().optional(), terminal_id: z.string().optional(), payout_destination_id: z.string().max(40).optional()}); export const infoCodeItem = z.object({line_id: z.number().int().optional(), amount: z.number().int().optional(), amount_dwh: z.string().optional(), infocode_id: z.string().optional(), sub_infocode_id: z.string().optional(), information: z.string().optional(), input_type: z.number().int().optional(), withdrawal_from_stock: z.boolean().optional()}); export const taxItem = z.object({amount: z.number().int().optional(), amount_dwh: z.string().optional(), exempt: z.boolean().optional(), included_in_price: z.boolean().optional(), percentage: z.number().optional(), tax_basis: z.number().int().optional(), tax_basis_dwh: z.string().optional(), tax_code: z.string().optional(), tax_group: z.string().optional()}); export const dimension = z.object({color: z.string().optional(), size: z.string().optional(), style: z.string().optional(), config: z.string().optional(), variant: z.string().optional()}); export const discountType = z.enum(["customer", "periodic", "manual", "loyalty", "total", "employee", "external"]); export const discountItem = z.object({amount: z.number().int().optional(), percentage: z.number().optional(), discount_type: discountType.optional(), discount_id: z.string().optional(), description: z.string().optional(), line_id: z.number().int().optional()}); export const bonusItem = z.object({bonus: z.number().int().optional(), percentage: z.number().optional(), discount_type: discountType.optional(), discount_id: z.string().optional(), description: z.string().optional(), line_id: z.number().int().optional()}); export const extraInfo = z.object({key: z.string().optional(), value: z.string().optional(), value_type: z.enum(["string", "integer", "number", "boolean", "datetime"]).optional()}); export const receiptItem = z.object({id: z.string().optional(), groups: z.array(z.object({id: z.string(), name: z.string().optional()})).optional(), quantity: z.number().optional(), unit: z.string().optional(), description: z.string().optional(), description_alias: z.string().optional(), net_amount: z.number().int().optional(), net_amount_dwh: z.string().optional(), gross_amount: z.number().int().optional(), gross_amount_dwh: z.string().optional(), unit_gross_price: z.number().int().optional(), tax_percent: z.number().optional(), line_id: z.number().int().optional(), barcode: z.string().optional(), cost_price: z.number().int().optional(), voided: z.boolean().optional(), scale_item: z.boolean().optional(), eligible_for_discount: z.boolean().optional(), included_in_total_discount: z.boolean().optional(), price_has_been_keyedIn: z.boolean().optional(), discount_has_been_keyedIn: z.boolean().optional(), is_return_item: z.boolean().optional(), is_linked_item: z.boolean().optional(), is_virtual_product: z.boolean().optional(), is_changed: z.boolean().optional(), salesperson_id: z.string().optional(), salesperson_name: z.string().optional(), serial_id: z.string().optional(), comment: z.string().optional(), infocode_lines: z.array(infoCodeItem).optional(), tax_lines: z.array(taxItem).optional(), dimension: dimension.optional(), discount_lines: z.array(discountItem).optional(), bonus_lines: z.array(bonusItem).optional(), extra_info: z.array(extraInfo).optional()}); export const cardInfo = z.object({balance_amount: z.number().int().optional(), card_amount: z.number().int().optional(), issuer_id: z.number().int().optional(), issuer_name: z.string().optional(), session_id: z.string().optional(), terminal_id: z.string().optional(), card_number: z.string().optional(), card_type: z.string().optional(), receipt: z.string().optional()}); export const paymentItem = z.object({line_id: z.number().int().optional(), amount: z.number().int().optional(), type_id: z.string().optional(), token_id: z.string().optional(), token_type: z.string().optional(), description: z.string().optional(), voided: z.boolean().optional(), card_info: cardInfo.optional(), reference_id: z.string().optional(), infocode_lines: z.array(infoCodeItem).optional()}); export const receipt = z.object({id: z.string().optional(), created_at: z.string().optional(), created_by: z.string().optional(), updated_at: z.string().optional(), deleted_by: z.string().optional(), deleted_at: z.string().optional(), discounts: z.array(discountRefs).optional(), store: store, items: z.array(receiptItem).optional(), receipt_id: z.string(), delivery: z.object({first_name: z.string().optional(), last_name: z.string().optional(), email: z.string().optional(), phone_number: z.string().optional(), address: address.optional()}).optional(), customer_id: z.string().max(255).optional(), customer: z.object({gender: z.string().optional(), first_name: z.string().optional(), last_name: z.string().optional(), email: z.string().optional(), metadata: z.object({}).optional(), phone_number: z.string().optional(), addresses: z.array(z.object({address_line: z.string(), address_line_2: z.string().optional(), postal_code: z.string().optional(), postal_place: z.string(), country: z.string(), type: z.string().optional(), custom_type: z.string().optional()})).optional(), pays_tax: z.boolean().optional(), date_of_birth: z.string().nullable().optional(), enrolled_by: z.object({type: z.string().optional(), value: z.string().nullable()}).optional(), favorite_store: z.string().nullable().optional(), company: z.object({organization_number: z.string().optional(), bussiness_name: z.string(), department: z.string().optional(), industry: z.string().optional(), website: z.string().optional(), number_of_employees: z.string().optional()}).optional(), marketing_consent: z.object({sms: z.object({consent: z.boolean().optional(), updated_at: z.string().optional()}).optional(), email: z.object({consent: z.boolean().optional(), updated_at: z.string().optional()}).optional()}).optional(), status: z.string().optional(), term: z.object({id: z.string().optional()}).optional(), type: z.enum(["customer", "company", "contact", "employee", "other"]).optional(), token: z.object({token_id: z.string().optional(), value: z.string().optional(), type: z.string().optional()}).optional()}).optional(), gross_amount: z.number().int().optional(), gross_amount_dwh: z.string().optional(), net_amount: z.number().int().optional(), net_amount_dwh: z.string().optional(), round_off_to_coin: z.number().int().optional(), currency: z.string().optional(), purchase_at: z.string(), order_number: z.string().optional(), transaction_date: z.string().optional(), amount_due: z.number().int().optional(), amount_due_dwh: z.string().optional(), no_of_items: z.number().optional(), is_changed: z.boolean().optional(), transaction_id: z.string().optional(), total_discount: z.number().int().optional(), total_manual_discount_amount: z.number().int().optional(), total_manual_percentage_discount: z.number().int().optional(), operator_id: z.string().optional(), operator_name: z.string().optional(), salesperson_id: z.string().optional(), salesperson_name: z.string().optional(), entry_status: z.enum(["None", "Voided", "Posted", "Concluded", "Cancelled", "OnHold", "Training", "Reprinted"]).optional(), comment: z.string().optional(), tax_lines: z.array(taxItem).optional(), payments: z.array(paymentItem).optional(), infocode_items: z.array(infoCodeItem).optional(), receipt_text: z.string().optional(), discount_code: z.array(z.string()).optional(), extra_info: z.array(extraInfo).optional()}); export const getApiAccountsAidReceiptsSearchResponse = z.object({receipts: z.array(receipt).optional(), starting_after: z.string().optional()}); 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 }; /** * aid_receipts_rid_get * * GET /accounts/{aid}/receipts/search */ export const getApiAccountsAidReceiptsSearch = async (args: GetApiAccountsAidReceiptsSearchArgs, options?: GetApiAccountsAidReceiptsSearchOptions) => { const {baseUrl = "https://api.dintero.com/v1", fetch: fetchFn = fetch, JWT} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.receipt_id != null) query.append("receipt_id", String(args.receipt_id)) if (JWT !== undefined) headers.set('authorization', `Bearer ${JWT}`) const url = `${baseUrl.replace(/\/+$/, '')}/accounts/${encodeURIComponent(String(args.aid))}/receipts/search${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(getApiAccountsAidReceiptsSearchResponse, await res.json()) };