From 32347986e64c936b7a949e036767f0b1ce44d2f4 Mon Sep 17 00:00:00 2001 From: jkaliszuk Date: Sun, 24 Mar 2024 17:08:03 +0100 Subject: [PATCH 01/14] Added list redeemables endpoint. --- packages/sdk/README.md | 7 ++++++ packages/sdk/src/Customers.ts | 7 ++++++ packages/sdk/src/types/Customers.ts | 34 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/packages/sdk/README.md b/packages/sdk/README.md index 47c3914b2..51e58a431 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -654,6 +654,7 @@ Methods are provided within `client.customers.*` namespace. - [Update Customers in bulk](#update-customers-in-bulk) - [Update Customers' Metadata in bulk](#update-customers-metadata-in-bulk) - [Import and Update Customers using CSV](#import-and-update-customers-using-csv) +- [List Redeemables](#list-redeemables) #### [Create Customer](https://docs.voucherify.io/reference/create-customer) @@ -759,6 +760,12 @@ client.customers.updateInBulk(customers) client.customers.updateMetadataInBulk(sourceIdsAndMetadata) ``` +#### [List Redeemables](https://docs.voucherify.io/reference/list-customer-redeemables) + +```javascript +client.customers.listRedeemables(id, params) +``` + --- ### Consents diff --git a/packages/sdk/src/Customers.ts b/packages/sdk/src/Customers.ts index 9e603ce4c..1c8e91d88 100644 --- a/packages/sdk/src/Customers.ts +++ b/packages/sdk/src/Customers.ts @@ -131,6 +131,13 @@ class Customers { return this.client.post(`/customers/importCSV`, form, undefined, headers) } + + /** + * @see https://docs.voucherify.io/reference/list-customer-redeemables + */ + public listRedeemables(id: string, params?: T.CustomerRedeemablesListQueryParams) { + return this.client.get(`/redeemables/${encode(id)}/redeemables`, params) + } } export { Customers } diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index 3fe22d449..e2da3bda0 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -1,4 +1,6 @@ // Legacy code +import {VouchersResponse} from "./Vouchers"; + export interface SimpleCustomer { id: string name?: string @@ -121,6 +123,38 @@ export interface CustomerActivitiesListResponse { data: Record[] } +export interface CustomerRedeemablesListQueryParams { + limit?: number + order?: 'created_at' | '-created_at' + starting_after?: string +} + +export interface CustomerRedeemablesListResponse { + object: 'list' + total: number + data_ref: 'data' + data: Record[] +} + +export interface CustomerRedeemable { + id: string + created_at: string + redeemable_id: string + redeemable_object: string + customer_id: string + holder_role: 'OWNER' | 'REFERRER' | 'REFEREE' + campaign_id: string + campaign_type: 'LOYALTY_PROGRAM' | 'PROMOTION' | 'DISCOUNT_COUPONS' | 'GIFT_VOUCHERS' | 'REFERRAL_PROGRAM' + voucher_type: 'GIFT' | 'DISCOUNT' | 'LOYALTY_CARD' | 'LUCKY_DRAW' + redeemable: Redeemable +} + +export interface Redeemable { + type: string + voucher: VouchersResponse + status: string +} + export type CustomersCreateBody = CustomerRequest export type CustomersCreateResponse = CustomerObject | CustomerUnconfirmed From 1ec21c695561cb181312c52171c6bc103fd8d135 Mon Sep 17 00:00:00 2001 From: jkaliszuk Date: Sun, 24 Mar 2024 17:47:18 +0100 Subject: [PATCH 02/14] Added CustomerRedeemablesListQueryParams --- packages/sdk/src/types/Customers.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index e2da3bda0..e1ca6df2b 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -125,8 +125,10 @@ export interface CustomerActivitiesListResponse { export interface CustomerRedeemablesListQueryParams { limit?: number - order?: 'created_at' | '-created_at' - starting_after?: string + page?: number + order?: 'created_at' | '-created_at' | 'id' | '-id' + starting_after_id?: string, + filters?: Record } export interface CustomerRedeemablesListResponse { From 6804d0ad58b28736cd8f7f61e6130980b684c6a9 Mon Sep 17 00:00:00 2001 From: jkaliszuk Date: Mon, 25 Mar 2024 12:24:45 +0100 Subject: [PATCH 03/14] Fixed listRedeemables url --- packages/sdk/src/Customers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/src/Customers.ts b/packages/sdk/src/Customers.ts index 1c8e91d88..10532257e 100644 --- a/packages/sdk/src/Customers.ts +++ b/packages/sdk/src/Customers.ts @@ -136,7 +136,7 @@ class Customers { * @see https://docs.voucherify.io/reference/list-customer-redeemables */ public listRedeemables(id: string, params?: T.CustomerRedeemablesListQueryParams) { - return this.client.get(`/redeemables/${encode(id)}/redeemables`, params) + return this.client.get(`/customers/${encode(id)}/redeemables`, params) } } From b1951c2c70eaf30fc70835304bc5a82b48984dae Mon Sep 17 00:00:00 2001 From: jkaliszuk Date: Mon, 25 Mar 2024 15:48:42 +0100 Subject: [PATCH 04/14] Added Redeemable statuses. --- packages/sdk/src/types/Customers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index e1ca6df2b..d13a27de4 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -154,7 +154,7 @@ export interface CustomerRedeemable { export interface Redeemable { type: string voucher: VouchersResponse - status: string + status: 'ACTIVE' | 'USED' | 'DISABLED' | 'NOT_ACTIVE' | 'EXPIRED' | 'NO_BALANCE' } export type CustomersCreateBody = CustomerRequest From c7aaa6b4ff4e9162f915e23035aec45b739e9307 Mon Sep 17 00:00:00 2001 From: jkaliszuk Date: Tue, 2 Apr 2024 15:05:54 +0200 Subject: [PATCH 05/14] Added tests for customer redeemable. Fixed formatting. --- packages/sdk/src/types/Customers.ts | 4 ++-- packages/sdk/test/customers.spec.ts | 31 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index d13a27de4..086361f70 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -1,5 +1,5 @@ // Legacy code -import {VouchersResponse} from "./Vouchers"; +import { VouchersResponse } from './Vouchers' export interface SimpleCustomer { id: string @@ -127,7 +127,7 @@ export interface CustomerRedeemablesListQueryParams { limit?: number page?: number order?: 'created_at' | '-created_at' | 'id' | '-id' - starting_after_id?: string, + starting_after_id?: string filters?: Record } diff --git a/packages/sdk/test/customers.spec.ts b/packages/sdk/test/customers.spec.ts index 821cdfb68..e9bf94871 100644 --- a/packages/sdk/test/customers.spec.ts +++ b/packages/sdk/test/customers.spec.ts @@ -1,6 +1,7 @@ import { voucherifyClient as client } from './client' import { generateRandomString } from './utils/generateRandomString' import { generateCustomerCSV } from './utils/generateCustomerCSV' +import { CustomerRequest, DiscountVouchersTypesEnum, DistributionsPublicationsCreateParams } from '@voucherify/sdk' jest.setTimeout(15000) @@ -173,4 +174,34 @@ describe('Customers API', () => { } expect(updatedCustomerWithNoAddress.address).toEqual(removedAddress) }) + + it('Should return redeemable for customer', async () => { + const createdCustomer: CustomerRequest = await client.customers.create({ source_id: generateRandomString() }) + + const discountCampaign = await client.campaigns.create({ + campaign_type: 'DISCOUNT_COUPONS', + name: generateRandomString(), + type: 'AUTO_UPDATE', + voucher: { + code_config: { + length: 3, + }, + type: 'DISCOUNT_VOUCHER', + discount: { + amount_off: 0, + type: DiscountVouchersTypesEnum.AMOUNT, + }, + }, + }) + + const distributionsPublicationsCreateParams: DistributionsPublicationsCreateParams = { + customer: createdCustomer, + campaign: discountCampaign, + } + + await client.distributions.publications.create(distributionsPublicationsCreateParams) + + const redeemables = await client.customers.listRedeemables(createdCustomer.id as string) + expect(redeemables.data).toBeDefined() + }) }) From e28df11252605169226911ecf8fa235ec50dc3e6 Mon Sep 17 00:00:00 2001 From: jkaliszuk Date: Tue, 2 Apr 2024 15:08:10 +0200 Subject: [PATCH 06/14] Changeset for customer redeemable --- .changeset/hungry-roses-cross.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/hungry-roses-cross.md diff --git a/.changeset/hungry-roses-cross.md b/.changeset/hungry-roses-cross.md new file mode 100644 index 000000000..a0259d520 --- /dev/null +++ b/.changeset/hungry-roses-cross.md @@ -0,0 +1,5 @@ +--- +'@voucherify/sdk': patch +--- + +New endpoint support - `customer-redeemable` From e28c9d8b2d0aae1092bdeabfd0c72cd81d25528a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20G=C3=B3rak?= Date: Thu, 18 Apr 2024 16:11:45 +0200 Subject: [PATCH 07/14] fix - drop 'page' param from 'CustomerRedeemablesListQueryParams' interface as it is not available --- packages/sdk/src/types/Customers.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index 086361f70..882c56552 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -125,7 +125,6 @@ export interface CustomerActivitiesListResponse { export interface CustomerRedeemablesListQueryParams { limit?: number - page?: number order?: 'created_at' | '-created_at' | 'id' | '-id' starting_after_id?: string filters?: Record From 38800fd109ae64d2b64a40ddf9d7b61b6b875521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20G=C3=B3rak?= Date: Thu, 18 Apr 2024 16:15:18 +0200 Subject: [PATCH 08/14] fix - appropiate enum values for 'voucher_type' field in 'CustomerRedeemable' --- packages/sdk/src/types/Customers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index 882c56552..3c698c969 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -146,7 +146,7 @@ export interface CustomerRedeemable { holder_role: 'OWNER' | 'REFERRER' | 'REFEREE' campaign_id: string campaign_type: 'LOYALTY_PROGRAM' | 'PROMOTION' | 'DISCOUNT_COUPONS' | 'GIFT_VOUCHERS' | 'REFERRAL_PROGRAM' - voucher_type: 'GIFT' | 'DISCOUNT' | 'LOYALTY_CARD' | 'LUCKY_DRAW' + voucher_type: 'GIFT_VOUCHER' | 'DISCOUNT_VOUCHER' | 'LOYALTY_CARD' | 'LUCKY_DRAW_DRAW' redeemable: Redeemable } From 9dd03117c214c78f6b6fa8f115c56a2ea906e2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20G=C3=B3rak?= Date: Thu, 18 Apr 2024 16:28:06 +0200 Subject: [PATCH 09/14] fix - add explicit enum values for 'type' field in 'Redeemable' --- packages/sdk/src/types/Customers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index 3c698c969..7727b6384 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -151,7 +151,7 @@ export interface CustomerRedeemable { } export interface Redeemable { - type: string + type: 'voucher' voucher: VouchersResponse status: 'ACTIVE' | 'USED' | 'DISABLED' | 'NOT_ACTIVE' | 'EXPIRED' | 'NO_BALANCE' } From 73df1625c9b997f22ba91109601eeb4f47deb3aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20G=C3=B3rak?= Date: Thu, 18 Apr 2024 17:21:24 +0200 Subject: [PATCH 10/14] fix - add dedicated type for Voucher Redeemable in Customers's Redeemabel List since it is not the same as Voucher type --- packages/sdk/src/types/Customers.ts | 53 ++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index 7727b6384..ba48cc816 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -1,5 +1,5 @@ // Legacy code -import { VouchersResponse } from './Vouchers' +import { DiscountUnit, DiscountAmount, DiscountPercent, DiscountFixed } from './DiscountVoucher' export interface SimpleCustomer { id: string @@ -146,13 +146,56 @@ export interface CustomerRedeemable { holder_role: 'OWNER' | 'REFERRER' | 'REFEREE' campaign_id: string campaign_type: 'LOYALTY_PROGRAM' | 'PROMOTION' | 'DISCOUNT_COUPONS' | 'GIFT_VOUCHERS' | 'REFERRAL_PROGRAM' - voucher_type: 'GIFT_VOUCHER' | 'DISCOUNT_VOUCHER' | 'LOYALTY_CARD' | 'LUCKY_DRAW_DRAW' - redeemable: Redeemable + voucher_type: 'GIFT_VOUCHER' | 'DISCOUNT_VOUCHER' | 'LOYALTY_CARD' + redeemable: RedeemableContainer } -export interface Redeemable { +export interface RedeemableContainerVoucher { + id: string + code: string + campaign?: string + camapign_id?: string + category_id?: string + type: 'GIFT_VOUCHER' | 'DISCOUNT_VOUCHER' | 'LOYALTY_CARD' + discount?: DiscountAmount | DiscountPercent | DiscountUnit | DiscountFixed + gift?: { + amount: number + balance: number + } + loyalty_card?: { + points: number + balance: number + } + start_date?: string + expiration_date?: string + validity_timeframe?: { + interval: string + duration: string + } + validity_day_of_week?: number[] + active: boolean + additional_info?: string + metadata?: Record + assets: { + qr: { + id: string + url: string + } + barcode: { + id: string + url: string + } + } + is_referral_code: boolean + holder_id?: string + updated_at?: string + created_at: string + object: 'voucher' +} + +export interface RedeemableContainer { type: 'voucher' - voucher: VouchersResponse + voucher?: RedeemableContainerVoucher status: 'ACTIVE' | 'USED' | 'DISABLED' | 'NOT_ACTIVE' | 'EXPIRED' | 'NO_BALANCE' } From cc98947008cf3f839584f68bedc40982ceff5add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20G=C3=B3rak?= Date: Thu, 18 Apr 2024 17:43:43 +0200 Subject: [PATCH 11/14] fix - data field in 'CustomerRedeemablesListResponse' is plain array, not Record. Add more fields to 'RedeemableContainerVoucher' --- packages/sdk/src/types/Customers.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index ba48cc816..802eccf4a 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -134,7 +134,7 @@ export interface CustomerRedeemablesListResponse { object: 'list' total: number data_ref: 'data' - data: Record[] + data: CustomerRedeemable[] } export interface CustomerRedeemable { @@ -173,6 +173,17 @@ export interface RedeemableContainerVoucher { duration: string } validity_day_of_week?: number[] + publish?: { + object: 'list' + count: number + url: string + } + redemption?: { + object: 'list' + quantity?: number + redeemed_quantity: number + url: string + } active: boolean additional_info?: string metadata?: Record From e870816b521dd8d037715a2908d77cc8e42757ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20G=C3=B3rak?= Date: Thu, 18 Apr 2024 18:24:03 +0200 Subject: [PATCH 12/14] fix - add missing fields 'has_more' and 'more_starting_after' to 'CustomerRedeemablesListResponse' --- packages/sdk/src/types/Customers.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index 802eccf4a..ed19ec246 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -135,6 +135,8 @@ export interface CustomerRedeemablesListResponse { total: number data_ref: 'data' data: CustomerRedeemable[] + has_more: boolean + more_starting_after?: string } export interface CustomerRedeemable { From f87f6080ed5bcd034a17c7531a3ac46f2c28a5d1 Mon Sep 17 00:00:00 2001 From: Marcin Slezak Date: Fri, 19 Apr 2024 16:42:55 +0200 Subject: [PATCH 13/14] fixes for CustomerRedeemables endpoint: - types names following CONTRIBUTING.md - add missing voucher.gift.effect - adding missing voucher.loyalty_card.next_expiration_date and voucher.loyalty_card.next_expiration_points - adding missing voucher.redemption.redeemed_points - voucher.active as optional field --- packages/sdk/src/types/Customers.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index ed19ec246..aae235824 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -134,12 +134,12 @@ export interface CustomerRedeemablesListResponse { object: 'list' total: number data_ref: 'data' - data: CustomerRedeemable[] + data: CustomerRedeemablesListItemResponse[] has_more: boolean more_starting_after?: string } -export interface CustomerRedeemable { +export interface CustomerRedeemablesListItemResponse { id: string created_at: string redeemable_id: string @@ -149,10 +149,10 @@ export interface CustomerRedeemable { campaign_id: string campaign_type: 'LOYALTY_PROGRAM' | 'PROMOTION' | 'DISCOUNT_COUPONS' | 'GIFT_VOUCHERS' | 'REFERRAL_PROGRAM' voucher_type: 'GIFT_VOUCHER' | 'DISCOUNT_VOUCHER' | 'LOYALTY_CARD' - redeemable: RedeemableContainer + redeemable: CustomerRedeemablesListItemContainerResponse } -export interface RedeemableContainerVoucher { +export interface CustomerRedeemablesListItemContainerVoucherResponse { id: string code: string campaign?: string @@ -163,10 +163,13 @@ export interface RedeemableContainerVoucher { gift?: { amount: number balance: number + effect: string } loyalty_card?: { points: number balance: number + next_expiration_date?: string + next_expiration_points?: number } start_date?: string expiration_date?: string @@ -185,8 +188,9 @@ export interface RedeemableContainerVoucher { quantity?: number redeemed_quantity: number url: string + redeemed_points?: number } - active: boolean + active?: boolean additional_info?: string metadata?: Record assets: { @@ -206,9 +210,9 @@ export interface RedeemableContainerVoucher { object: 'voucher' } -export interface RedeemableContainer { +export interface CustomerRedeemablesListItemContainerResponse { type: 'voucher' - voucher?: RedeemableContainerVoucher + voucher?: CustomerRedeemablesListItemContainerVoucherResponse status: 'ACTIVE' | 'USED' | 'DISABLED' | 'NOT_ACTIVE' | 'EXPIRED' | 'NO_BALANCE' } From 3b992e9edbb92aa7308088e81a66082bbe0fd93b Mon Sep 17 00:00:00 2001 From: Marcin Slezak Date: Wed, 24 Apr 2024 13:58:01 +0200 Subject: [PATCH 14/14] Change NOT_ACTIVE validity status to NOT_ACTIVE_YET --- packages/sdk/src/types/Customers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index aae235824..d999de33e 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -213,7 +213,7 @@ export interface CustomerRedeemablesListItemContainerVoucherResponse { export interface CustomerRedeemablesListItemContainerResponse { type: 'voucher' voucher?: CustomerRedeemablesListItemContainerVoucherResponse - status: 'ACTIVE' | 'USED' | 'DISABLED' | 'NOT_ACTIVE' | 'EXPIRED' | 'NO_BALANCE' + status: 'ACTIVE' | 'USED' | 'DISABLED' | 'NOT_ACTIVE_YET' | 'EXPIRED' | 'NO_BALANCE' } export type CustomersCreateBody = CustomerRequest