From 2d1aa4b967599339e2e90cdb10954374c8ceb881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pablo=20Castro=20Leal?= Date: Tue, 23 Jun 2026 16:22:42 -0400 Subject: [PATCH 1/8] feat(invoicing): add v2 invoice add_lines endpoint --- src/lib/managers/v2/invoicesManager.ts | 9 ++++++++- src/spec/integration.spec.ts | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/lib/managers/v2/invoicesManager.ts b/src/lib/managers/v2/invoicesManager.ts index cf98225..ed85e11 100644 --- a/src/lib/managers/v2/invoicesManager.ts +++ b/src/lib/managers/v2/invoicesManager.ts @@ -1,7 +1,14 @@ +import { ResourceArguments } from '../../../types'; import { ManagerMixin } from '../../mixins'; import { Invoice } from '../../resources/v2/invoice'; export class InvoicesManager extends ManagerMixin { static resource = 'invoice'; - static methods = ['list', 'get']; + static methods = ['list', 'get', 'addLines']; + + addLines(invoiceId: string, args?: ResourceArguments): Promise { + const innerArgs = args || {}; + const path = `${this.buildPath()}/${invoiceId}/add_lines`; + return this._create({ path_: path, ...innerArgs }); + } } diff --git a/src/spec/integration.spec.ts b/src/spec/integration.spec.ts index 07a4d02..c4e035c 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -1293,6 +1293,22 @@ test('fintoc.v2.invoices.get()', async (t) => { t.is(invoice.url, `v2/invoices/${invoiceId}`); }); +test('fintoc.v2.invoices.addLines()', async (t) => { + const ctx: any = t.context; + const invoiceId = 'invoice_id'; + const lines = [{ + amount: 10000, + currency: 'CLP', + period_end: '2024-02-01', + period_start: '2024-01-01', + quantity: 1, + }]; + const invoice = await ctx.fintoc.v2.invoices.addLines(invoiceId, { lines }); + + t.is(invoice.method, 'post'); + t.is(invoice.url, `v2/invoices/${invoiceId}/add_lines`); +}); + test('fintoc.v2.paymentIntents.list()', async (t) => { const ctx: any = t.context; const paymentIntents = await ctx.fintoc.v2.paymentIntents.list(); From 9a3dde6b08f4c2b8d15cc2a0d34d9822b800adc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pablo=20Castro=20Leal?= Date: Tue, 23 Jun 2026 16:23:13 -0400 Subject: [PATCH 2/8] feat(invoicing): add v2 invoice remove_lines endpoint --- src/lib/managers/v2/invoicesManager.ts | 8 +++++++- src/spec/integration.spec.ts | 10 ++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/lib/managers/v2/invoicesManager.ts b/src/lib/managers/v2/invoicesManager.ts index ed85e11..f8a0f1e 100644 --- a/src/lib/managers/v2/invoicesManager.ts +++ b/src/lib/managers/v2/invoicesManager.ts @@ -4,11 +4,17 @@ import { Invoice } from '../../resources/v2/invoice'; export class InvoicesManager extends ManagerMixin { static resource = 'invoice'; - static methods = ['list', 'get', 'addLines']; + static methods = ['list', 'get', 'addLines', 'removeLines']; addLines(invoiceId: string, args?: ResourceArguments): Promise { const innerArgs = args || {}; const path = `${this.buildPath()}/${invoiceId}/add_lines`; return this._create({ path_: path, ...innerArgs }); } + + removeLines(invoiceId: string, args?: ResourceArguments): Promise { + const innerArgs = args || {}; + const path = `${this.buildPath()}/${invoiceId}/remove_lines`; + return this._create({ path_: path, ...innerArgs }); + } } diff --git a/src/spec/integration.spec.ts b/src/spec/integration.spec.ts index c4e035c..e74db6b 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -1309,6 +1309,16 @@ test('fintoc.v2.invoices.addLines()', async (t) => { t.is(invoice.url, `v2/invoices/${invoiceId}/add_lines`); }); +test('fintoc.v2.invoices.removeLines()', async (t) => { + const ctx: any = t.context; + const invoiceId = 'invoice_id'; + const lines = ['il_line_id']; + const invoice = await ctx.fintoc.v2.invoices.removeLines(invoiceId, { lines }); + + t.is(invoice.method, 'post'); + t.is(invoice.url, `v2/invoices/${invoiceId}/remove_lines`); +}); + test('fintoc.v2.paymentIntents.list()', async (t) => { const ctx: any = t.context; const paymentIntents = await ctx.fintoc.v2.paymentIntents.list(); From ea08e851f13d9cd0303e7f517a90cee0f7b9080c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pablo=20Castro=20Leal?= Date: Tue, 23 Jun 2026 16:24:08 -0400 Subject: [PATCH 3/8] feat(invoicing): add v2 invoice line update endpoint --- src/lib/managers/v2/index.ts | 1 + src/lib/managers/v2/invoicesManager.ts | 10 ++++++++++ src/lib/managers/v2/linesManager.ts | 7 +++++++ src/lib/resources/v2/index.ts | 1 + src/lib/resources/v2/line.ts | 4 ++++ src/spec/integration.spec.ts | 13 +++++++++++++ 6 files changed, 36 insertions(+) create mode 100644 src/lib/managers/v2/linesManager.ts create mode 100644 src/lib/resources/v2/line.ts diff --git a/src/lib/managers/v2/index.ts b/src/lib/managers/v2/index.ts index dccc84d..042aedd 100644 --- a/src/lib/managers/v2/index.ts +++ b/src/lib/managers/v2/index.ts @@ -5,6 +5,7 @@ export * from './simulateManager'; export * from './entitiesManager'; export * from './accountVerificationsManager'; export * from './invoicesManager'; +export * from './linesManager'; export * from './movementsManager'; export * from './customersManager'; export * from './checkoutSessionsManager'; diff --git a/src/lib/managers/v2/invoicesManager.ts b/src/lib/managers/v2/invoicesManager.ts index f8a0f1e..d2cdf7a 100644 --- a/src/lib/managers/v2/invoicesManager.ts +++ b/src/lib/managers/v2/invoicesManager.ts @@ -1,11 +1,21 @@ import { ResourceArguments } from '../../../types'; +import { Client } from '../../client'; import { ManagerMixin } from '../../mixins'; import { Invoice } from '../../resources/v2/invoice'; +import { LinesManager } from './linesManager'; + export class InvoicesManager extends ManagerMixin { static resource = 'invoice'; static methods = ['list', 'get', 'addLines', 'removeLines']; + lines: LinesManager; + + constructor(path: string, client: Client) { + super(path, client); + this.lines = new LinesManager('/v2/invoices/{invoice_id}/lines', client); + } + addLines(invoiceId: string, args?: ResourceArguments): Promise { const innerArgs = args || {}; const path = `${this.buildPath()}/${invoiceId}/add_lines`; diff --git a/src/lib/managers/v2/linesManager.ts b/src/lib/managers/v2/linesManager.ts new file mode 100644 index 0000000..cd8f3ed --- /dev/null +++ b/src/lib/managers/v2/linesManager.ts @@ -0,0 +1,7 @@ +import { ManagerMixin } from '../../mixins'; +import { Line } from '../../resources/v2/line'; + +export class LinesManager extends ManagerMixin { + static resource = 'line'; + static methods = ['update']; +} diff --git a/src/lib/resources/v2/index.ts b/src/lib/resources/v2/index.ts index 21b30ec..57befdc 100644 --- a/src/lib/resources/v2/index.ts +++ b/src/lib/resources/v2/index.ts @@ -5,6 +5,7 @@ export * from './entity'; export * from './accountVerification'; export * from './checkoutSession'; export * from './invoice'; +export * from './line'; export * from './movement'; export * from './customer'; export * from './paymentIntent'; diff --git a/src/lib/resources/v2/line.ts b/src/lib/resources/v2/line.ts new file mode 100644 index 0000000..d7d8cfd --- /dev/null +++ b/src/lib/resources/v2/line.ts @@ -0,0 +1,4 @@ +import { ResourceMixin } from '../../mixins/resourceMixin'; + +export class Line extends ResourceMixin { +} diff --git a/src/spec/integration.spec.ts b/src/spec/integration.spec.ts index e74db6b..0aff461 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -1319,6 +1319,19 @@ test('fintoc.v2.invoices.removeLines()', async (t) => { t.is(invoice.url, `v2/invoices/${invoiceId}/remove_lines`); }); +test('fintoc.v2.invoices.lines.update()', async (t) => { + const ctx: any = t.context; + const invoiceId = 'invoice_id'; + const lineId = 'il_line_id'; + const line = await ctx.fintoc.v2.invoices.lines.update(lineId, { + invoice_id: invoiceId, + quantity: 2, + }); + + t.is(line.method, 'patch'); + t.is(line.url, `v2/invoices/${invoiceId}/lines/${lineId}`); +}); + test('fintoc.v2.paymentIntents.list()', async (t) => { const ctx: any = t.context; const paymentIntents = await ctx.fintoc.v2.paymentIntents.list(); From e994c1be60ff5920581b89ba1d34d8f0e7905792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pablo=20Castro=20Leal?= Date: Tue, 23 Jun 2026 16:24:32 -0400 Subject: [PATCH 4/8] feat(invoicing): add v2 subscription create endpoint --- src/lib/managers/v2/subscriptionsManager.ts | 2 +- src/spec/integration.spec.ts | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/lib/managers/v2/subscriptionsManager.ts b/src/lib/managers/v2/subscriptionsManager.ts index 438f108..ac3bdad 100644 --- a/src/lib/managers/v2/subscriptionsManager.ts +++ b/src/lib/managers/v2/subscriptionsManager.ts @@ -4,7 +4,7 @@ import { Subscription } from '../../resources/v2/subscription'; export class SubscriptionsManager extends ManagerMixin { static resource = 'subscription'; - static methods = ['list', 'get', 'cancel']; + static methods = ['list', 'get', 'create', 'cancel']; cancel(subscriptionId: string, args?: ResourceArguments): Promise { const innerArgs = args || {}; diff --git a/src/spec/integration.spec.ts b/src/spec/integration.spec.ts index 0aff461..36ec975 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -1426,6 +1426,19 @@ test('fintoc.v2.subscriptions.cancel()', async (t) => { t.is(subscription.url, `v2/subscriptions/${subscriptionId}/cancel`); }); +test('fintoc.v2.subscriptions.create()', async (t) => { + const ctx: any = t.context; + const subscriptionData = { + customer: 'cus_id', + items: [{ price: 'price_id', quantity: 1 }], + }; + const subscription = await ctx.fintoc.v2.subscriptions.create(subscriptionData); + + t.is(subscription.method, 'post'); + t.is(subscription.url, 'v2/subscriptions'); + t.is(subscription.json.customer, subscriptionData.customer); +}); + test('fintoc.v2.products.list()', async (t) => { const ctx: any = t.context; const products = await ctx.fintoc.v2.products.list(); From 0a4dc234b7b94d5ea0ea9ebc8a19a9d27f61e44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pablo=20Castro=20Leal?= Date: Tue, 23 Jun 2026 16:24:53 -0400 Subject: [PATCH 5/8] feat(invoicing): add v2 subscription update endpoint --- src/lib/managers/v2/subscriptionsManager.ts | 2 +- src/spec/integration.spec.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/lib/managers/v2/subscriptionsManager.ts b/src/lib/managers/v2/subscriptionsManager.ts index ac3bdad..2477177 100644 --- a/src/lib/managers/v2/subscriptionsManager.ts +++ b/src/lib/managers/v2/subscriptionsManager.ts @@ -4,7 +4,7 @@ import { Subscription } from '../../resources/v2/subscription'; export class SubscriptionsManager extends ManagerMixin { static resource = 'subscription'; - static methods = ['list', 'get', 'create', 'cancel']; + static methods = ['list', 'get', 'create', 'update', 'cancel']; cancel(subscriptionId: string, args?: ResourceArguments): Promise { const innerArgs = args || {}; diff --git a/src/spec/integration.spec.ts b/src/spec/integration.spec.ts index 36ec975..d22657d 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -1439,6 +1439,18 @@ test('fintoc.v2.subscriptions.create()', async (t) => { t.is(subscription.json.customer, subscriptionData.customer); }); +test('fintoc.v2.subscriptions.update()', async (t) => { + const ctx: any = t.context; + const subscriptionId = 'subscription_id'; + const updateData = { + trial_end: '2024-12-31T00:00:00Z', + }; + const subscription = await ctx.fintoc.v2.subscriptions.update(subscriptionId, updateData); + + t.is(subscription.method, 'patch'); + t.is(subscription.url, `v2/subscriptions/${subscriptionId}`); +}); + test('fintoc.v2.products.list()', async (t) => { const ctx: any = t.context; const products = await ctx.fintoc.v2.products.list(); From 57f7c64487dc7b688b0b38999c8e3da3070ba226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pablo=20Castro=20Leal?= Date: Tue, 23 Jun 2026 16:26:46 -0400 Subject: [PATCH 6/8] feat(invoicing): add v2 subscription item create endpoint --- src/lib/managers/v2/index.ts | 1 + src/lib/managers/v2/subscriptionItemsManager.ts | 14 ++++++++++++++ src/lib/managers/v2/subscriptionsManager.ts | 10 ++++++++++ src/lib/resources/v2/index.ts | 1 + src/lib/resources/v2/subscriptionItem.ts | 4 ++++ src/spec/integration.spec.ts | 13 +++++++++++++ 6 files changed, 43 insertions(+) create mode 100644 src/lib/managers/v2/subscriptionItemsManager.ts create mode 100644 src/lib/resources/v2/subscriptionItem.ts diff --git a/src/lib/managers/v2/index.ts b/src/lib/managers/v2/index.ts index 042aedd..cc34e3b 100644 --- a/src/lib/managers/v2/index.ts +++ b/src/lib/managers/v2/index.ts @@ -13,5 +13,6 @@ export * from './paymentIntentsManager'; export * from './paymentMethodsManager'; export * from './productsManager'; export * from './subscriptionsManager'; +export * from './subscriptionItemsManager'; export * from './accountStatementsManager'; export * from './onboardingsManager'; diff --git a/src/lib/managers/v2/subscriptionItemsManager.ts b/src/lib/managers/v2/subscriptionItemsManager.ts new file mode 100644 index 0000000..36e0773 --- /dev/null +++ b/src/lib/managers/v2/subscriptionItemsManager.ts @@ -0,0 +1,14 @@ +import { ResourceArguments } from '../../../types'; +import { ManagerMixin } from '../../mixins'; +import { SubscriptionItem } from '../../resources/v2/subscriptionItem'; + +export class SubscriptionItemsManager extends ManagerMixin { + static resource = 'subscription_item'; + static methods = ['create']; + + create(args?: ResourceArguments): Promise { + const innerArgs = args || {}; + const path = this.buildPath(innerArgs); + return this._create({ path_: path, ...innerArgs }); + } +} diff --git a/src/lib/managers/v2/subscriptionsManager.ts b/src/lib/managers/v2/subscriptionsManager.ts index 2477177..94c4ca2 100644 --- a/src/lib/managers/v2/subscriptionsManager.ts +++ b/src/lib/managers/v2/subscriptionsManager.ts @@ -1,11 +1,21 @@ import { ResourceArguments } from '../../../types'; +import { Client } from '../../client'; import { ManagerMixin } from '../../mixins'; import { Subscription } from '../../resources/v2/subscription'; +import { SubscriptionItemsManager } from './subscriptionItemsManager'; + export class SubscriptionsManager extends ManagerMixin { static resource = 'subscription'; static methods = ['list', 'get', 'create', 'update', 'cancel']; + items: SubscriptionItemsManager; + + constructor(path: string, client: Client) { + super(path, client); + this.items = new SubscriptionItemsManager('/v2/subscriptions/{subscription_id}/items', client); + } + cancel(subscriptionId: string, args?: ResourceArguments): Promise { const innerArgs = args || {}; const path = `${this.buildPath()}/${subscriptionId}/cancel`; diff --git a/src/lib/resources/v2/index.ts b/src/lib/resources/v2/index.ts index 57befdc..2568a8a 100644 --- a/src/lib/resources/v2/index.ts +++ b/src/lib/resources/v2/index.ts @@ -12,6 +12,7 @@ export * from './paymentIntent'; export * from './paymentMethod'; export * from './product'; export * from './subscription'; +export * from './subscriptionItem'; export * from './accountStatement'; export * from './onboarding'; export * from './onboardingShareholder'; diff --git a/src/lib/resources/v2/subscriptionItem.ts b/src/lib/resources/v2/subscriptionItem.ts new file mode 100644 index 0000000..b96c940 --- /dev/null +++ b/src/lib/resources/v2/subscriptionItem.ts @@ -0,0 +1,4 @@ +import { ResourceMixin } from '../../mixins/resourceMixin'; + +export class SubscriptionItem extends ResourceMixin { +} diff --git a/src/spec/integration.spec.ts b/src/spec/integration.spec.ts index d22657d..f042547 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -1451,6 +1451,19 @@ test('fintoc.v2.subscriptions.update()', async (t) => { t.is(subscription.url, `v2/subscriptions/${subscriptionId}`); }); +test('fintoc.v2.subscriptions.items.create()', async (t) => { + const ctx: any = t.context; + const subscriptionId = 'subscription_id'; + const item = await ctx.fintoc.v2.subscriptions.items.create({ + subscription_id: subscriptionId, + price_data: { product: 'prod_id', amount: 10000, currency: 'CLP' }, + quantity: 1, + }); + + t.is(item.method, 'post'); + t.is(item.url, `v2/subscriptions/${subscriptionId}/items`); +}); + test('fintoc.v2.products.list()', async (t) => { const ctx: any = t.context; const products = await ctx.fintoc.v2.products.list(); From 194bb4a8567b402a2163eb31b8d63daf59d34fbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pablo=20Castro=20Leal?= Date: Tue, 23 Jun 2026 16:27:09 -0400 Subject: [PATCH 7/8] feat(invoicing): add v2 subscription item update endpoint --- src/lib/managers/v2/subscriptionItemsManager.ts | 2 +- src/spec/integration.spec.ts | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/lib/managers/v2/subscriptionItemsManager.ts b/src/lib/managers/v2/subscriptionItemsManager.ts index 36e0773..edd55dd 100644 --- a/src/lib/managers/v2/subscriptionItemsManager.ts +++ b/src/lib/managers/v2/subscriptionItemsManager.ts @@ -4,7 +4,7 @@ import { SubscriptionItem } from '../../resources/v2/subscriptionItem'; export class SubscriptionItemsManager extends ManagerMixin { static resource = 'subscription_item'; - static methods = ['create']; + static methods = ['create', 'update']; create(args?: ResourceArguments): Promise { const innerArgs = args || {}; diff --git a/src/spec/integration.spec.ts b/src/spec/integration.spec.ts index f042547..89ff857 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -1464,6 +1464,19 @@ test('fintoc.v2.subscriptions.items.create()', async (t) => { t.is(item.url, `v2/subscriptions/${subscriptionId}/items`); }); +test('fintoc.v2.subscriptions.items.update()', async (t) => { + const ctx: any = t.context; + const subscriptionId = 'subscription_id'; + const itemId = 'si_item_id'; + const item = await ctx.fintoc.v2.subscriptions.items.update(itemId, { + subscription_id: subscriptionId, + quantity: 3, + }); + + t.is(item.method, 'patch'); + t.is(item.url, `v2/subscriptions/${subscriptionId}/items/${itemId}`); +}); + test('fintoc.v2.products.list()', async (t) => { const ctx: any = t.context; const products = await ctx.fintoc.v2.products.list(); From 6addb3832ee3141bffcd27c568118a83ec68c62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pablo=20Castro=20Leal?= Date: Tue, 23 Jun 2026 16:27:39 -0400 Subject: [PATCH 8/8] feat(invoicing): add v2 subscription item delete endpoint --- src/lib/managers/v2/subscriptionItemsManager.ts | 2 +- src/spec/integration.spec.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/lib/managers/v2/subscriptionItemsManager.ts b/src/lib/managers/v2/subscriptionItemsManager.ts index edd55dd..a164985 100644 --- a/src/lib/managers/v2/subscriptionItemsManager.ts +++ b/src/lib/managers/v2/subscriptionItemsManager.ts @@ -4,7 +4,7 @@ import { SubscriptionItem } from '../../resources/v2/subscriptionItem'; export class SubscriptionItemsManager extends ManagerMixin { static resource = 'subscription_item'; - static methods = ['create', 'update']; + static methods = ['create', 'update', 'delete']; create(args?: ResourceArguments): Promise { const innerArgs = args || {}; diff --git a/src/spec/integration.spec.ts b/src/spec/integration.spec.ts index 89ff857..e7d2783 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -1477,6 +1477,17 @@ test('fintoc.v2.subscriptions.items.update()', async (t) => { t.is(item.url, `v2/subscriptions/${subscriptionId}/items/${itemId}`); }); +test('fintoc.v2.subscriptions.items.delete()', async (t) => { + const ctx: any = t.context; + const subscriptionId = 'subscription_id'; + const itemId = 'si_item_id'; + const deletedIdentifier = await ctx.fintoc.v2.subscriptions.items.delete(itemId, { + subscription_id: subscriptionId, + }); + + t.is(deletedIdentifier, itemId); +}); + test('fintoc.v2.products.list()', async (t) => { const ctx: any = t.context; const products = await ctx.fintoc.v2.products.list();