diff --git a/src/lib/managers/v2/index.ts b/src/lib/managers/v2/index.ts index dccc84d..cc34e3b 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'; @@ -12,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/invoicesManager.ts b/src/lib/managers/v2/invoicesManager.ts index cf98225..d2cdf7a 100644 --- a/src/lib/managers/v2/invoicesManager.ts +++ b/src/lib/managers/v2/invoicesManager.ts @@ -1,7 +1,30 @@ +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']; + 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`; + 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/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/managers/v2/subscriptionItemsManager.ts b/src/lib/managers/v2/subscriptionItemsManager.ts new file mode 100644 index 0000000..a164985 --- /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', 'update', 'delete']; + + 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 438f108..94c4ca2 100644 --- a/src/lib/managers/v2/subscriptionsManager.ts +++ b/src/lib/managers/v2/subscriptionsManager.ts @@ -1,10 +1,20 @@ 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', 'cancel']; + 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 || {}; diff --git a/src/lib/resources/v2/index.ts b/src/lib/resources/v2/index.ts index 21b30ec..2568a8a 100644 --- a/src/lib/resources/v2/index.ts +++ b/src/lib/resources/v2/index.ts @@ -5,12 +5,14 @@ export * from './entity'; export * from './accountVerification'; export * from './checkoutSession'; export * from './invoice'; +export * from './line'; export * from './movement'; export * from './customer'; 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/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/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 07a4d02..e7d2783 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -1293,6 +1293,45 @@ 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.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.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(); @@ -1387,6 +1426,68 @@ 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.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.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.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.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();