Skip to content

Commit 0a1d4a8

Browse files
feat: added subscriptions invoices endpoints (#7)
BREAKING CHANGE:
1 parent ff12711 commit 0a1d4a8

File tree

5 files changed

+279
-56
lines changed

5 files changed

+279
-56
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import RequestFactory from '../factories/request'
2+
import { buildURL } from '../utils/helpers'
3+
4+
class SubscriptionInvoicesEndpoint {
5+
constructor(endpoint) {
6+
const config = { ...endpoint }
7+
this.request = new RequestFactory(config)
8+
9+
this.endpoint = 'subscriptions/invoices'
10+
}
11+
12+
All() {
13+
const { filter, limit, offset } = this
14+
15+
return this.request.send(
16+
buildURL(this.endpoint, {
17+
filter,
18+
limit,
19+
offset
20+
}),
21+
'GET'
22+
)
23+
}
24+
25+
Get(id) {
26+
return this.request.send(`${this.endpoint}/${id}`, 'GET')
27+
}
28+
29+
GetPayments(invoiceId) {
30+
return this.request.send(`${this.endpoint}/${invoiceId}/payments`, 'GET')
31+
}
32+
33+
GetPayment(invoiceId, paymentId) {
34+
return this.request.send(
35+
`${this.endpoint}/${invoiceId}/payments/${paymentId}`,
36+
'GET'
37+
)
38+
}
39+
40+
Filter(filter) {
41+
this.filter = filter
42+
43+
return this
44+
}
45+
46+
Limit(value) {
47+
this.limit = value
48+
49+
return this
50+
}
51+
52+
Offset(value) {
53+
this.offset = value
54+
55+
return this
56+
}
57+
}
58+
59+
export default SubscriptionInvoicesEndpoint

src/index.d.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ import { SubscriptionSchedulesEndpoint } from './types/subscription-schedules'
6767
import { CustomApisEndpoint } from './types/custom-apis'
6868
import { SubscriptionDunningRulesEndpoint } from './types/subscription-dunning-rules'
6969
import { SubscriptionProrationPoliciesEndpoint } from './types/subscription-proration-policies'
70+
import { SubscriptionInvoicesEndpoint } from './types/subscription-invoices'
7071

7172
export * from './types/config'
7273
export * from './types/storage'
@@ -144,6 +145,7 @@ export * from './types/subscription-schedules'
144145
export * from './types/custom-apis'
145146
export * from './types/subscription-dunning-rules'
146147
export * from './types/subscription-proration-policies'
148+
export * from './types/subscription-invoices'
147149

148150
// UMD
149151
export as namespace elasticpath
@@ -205,13 +207,14 @@ export class ElasticPath {
205207
SubscriptionOfferings: SubscriptionOfferingsEndpoint
206208
OneTimePasswordTokenRequest: OneTimePasswordTokenRequestEndpoint
207209
Subscriptions: SubscriptionsEndpoint
208-
RulePromotions : RulePromotionsEndpoint
209-
SubscriptionSubscribers : SubscriptionSubscribersEndpoint
210-
SubscriptionJobs : SubscriptionJobsEndpoint
210+
RulePromotions: RulePromotionsEndpoint
211+
SubscriptionSubscribers: SubscriptionSubscribersEndpoint
212+
SubscriptionJobs: SubscriptionJobsEndpoint
211213
SubscriptionSchedules: SubscriptionSchedulesEndpoint
212214
CustomApis: CustomApisEndpoint
213215
SubscriptionDunningRules: SubscriptionDunningRulesEndpoint
214216
SubscriptionProrationPolicies: SubscriptionProrationPoliciesEndpoint
217+
SubscriptionInvoices: SubscriptionInvoicesEndpoint
215218

216219
Cart(id?: string): CartEndpoint // This optional cart id is super worrying when using the SDK in a node server :/
217220
constructor(config: Config)

src/index.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ import SubscriptionOfferingsEndpoint from './endpoints/subscription-offerings'
5454
import SubscriptionsEndpoint from './endpoints/subscriptions'
5555
import RulePromotionsEndpoint from './endpoints/rule-promotions'
5656
import SubscriptionSubscribersEndpoint from './endpoints/subscription-subscribers'
57-
import SubscriptionJobsEndpoint from './endpoints/subscription-jobs'
57+
import SubscriptionJobsEndpoint from './endpoints/subscription-jobs'
5858
import SubscriptionSchedulesEndpoint from './endpoints/subscription-schedules'
5959
import SubscriptionDunningRulesEndpoint from './endpoints/subscription-dunning-rules'
6060
import SubscriptionProrationPoliciesEndpoint from './endpoints/subscription-proration-policies'
61+
import SubscriptionInvoicesEndpoint from './endpoints/subscription-invoices'
6162

6263
import {
6364
cartIdentifier,
@@ -144,7 +145,9 @@ export default class ElasticPath {
144145
this.SubscriptionSchedules = new SubscriptionSchedulesEndpoint(config)
145146
this.CustomApis = new CustomApisEndpoint(config)
146147
this.SubscriptionDunningRules = new SubscriptionDunningRulesEndpoint(config)
147-
this.SubscriptionProrationPolicies = new SubscriptionProrationPoliciesEndpoint(config)
148+
this.SubscriptionProrationPolicies =
149+
new SubscriptionProrationPoliciesEndpoint(config)
150+
this.SubscriptionInvoices = new SubscriptionInvoicesEndpoint(config)
148151
}
149152

150153
// Expose `Cart` class on ElasticPath class
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/**
2+
* Subscription Invoices
3+
* Description: Invoices represent the amount a customer owes for a subscription.
4+
* Elastic Path Subscriptions generates an invoice for every period in a subscription billing cycle.
5+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/invoices
6+
*/
7+
import {
8+
Identifiable,
9+
CrudQueryableResource,
10+
Resource,
11+
ResourceList,
12+
ResourcePage
13+
} from './core'
14+
import { ItemTaxObject } from './cart'
15+
import { Price } from './price'
16+
17+
interface SubscriptionInvoiceItemPrice extends Omit<Price, 'includes_tax'> {
18+
includes_tax?: boolean
19+
}
20+
21+
interface SubscriptionInvoiceItem {
22+
description: string
23+
price: SubscriptionInvoiceItemPrice
24+
product_id?: string
25+
from_time_period?: string
26+
until_time_period?: string
27+
}
28+
29+
/**
30+
* Core Subscription Invoice Base Interface
31+
* For custom flows, extend this interface
32+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/get-invoice#responses
33+
*/
34+
35+
export interface SubscriptionInvoiceBase {
36+
type: 'subscription_invoice'
37+
attributes: {
38+
billing_period: {
39+
start: string
40+
end: string
41+
}
42+
invoice_items: SubscriptionInvoiceItem[]
43+
tax_items?: ItemTaxObject[]
44+
outstanding: boolean
45+
number?: number
46+
tax_required: boolean
47+
payment_retries_limit_reached: boolean
48+
updated_at?: string
49+
created_at?: string
50+
}
51+
}
52+
53+
interface ProrationEvent {
54+
proration_policy_id: string
55+
billing_cost_before_proration: number
56+
refunded_amount_for_unused_plan: number
57+
new_plan_cost: number
58+
prorated_at: string
59+
}
60+
61+
export interface SubscriptionInvoice
62+
extends Identifiable,
63+
SubscriptionInvoiceBase {
64+
meta: {
65+
owner: 'store' | 'organization'
66+
subscription_id?: string
67+
subscriber_id?: string
68+
price?: SubscriptionInvoiceItemPrice
69+
timestamps: {
70+
updated_at: string
71+
created_at: string
72+
taxes_added_at?: string
73+
}
74+
prorated_at: ProrationEvent[]
75+
}
76+
}
77+
78+
/**
79+
* Core Subscription Invoice Payments Base Interface
80+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/get-invoice-payment#responses
81+
*/
82+
83+
export interface SubscriptionInvoicePaymentBase {
84+
type: 'subscription_invoice_payment'
85+
attributes: {
86+
success: boolean
87+
gateway: string
88+
external_payment_id?: string
89+
failure_detail?: {
90+
reason?: string
91+
}
92+
amount: SubscriptionInvoiceItemPrice
93+
}
94+
}
95+
96+
export interface SubscriptionInvoicePayment
97+
extends Identifiable,
98+
SubscriptionInvoicePaymentBase {
99+
meta: {
100+
owner: 'store' | 'organization'
101+
subscription_id: string
102+
invoice_id: string
103+
job_id: string
104+
timestamps: {
105+
updated_at: string
106+
created_at: string
107+
payment_taken_at?: string
108+
}
109+
}
110+
}
111+
112+
/**
113+
* Subscription Invoice Filtering
114+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/list-invoices#filtering
115+
*/
116+
export interface SubscriptionInvoiceFilter {
117+
eq?: {
118+
subscriber_id?: string
119+
subscription_id?: string
120+
outstanding?: string
121+
tax_required?: string
122+
}
123+
}
124+
125+
/**
126+
* Subscription Invoice Endpoints
127+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/list-invoices
128+
*/
129+
export interface SubscriptionInvoicesEndpoint {
130+
endpoint: 'invoices'
131+
132+
/**
133+
* List Invoices
134+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/list-invoices
135+
* @constructor
136+
*/
137+
All(): Promise<ResourcePage<SubscriptionInvoice>>
138+
139+
/**
140+
* Get Invoice
141+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/get-invoice
142+
* @param id - The ID of the invoice.
143+
* @constructor
144+
*/
145+
Get(id: string): Promise<Resource<SubscriptionInvoice>>
146+
147+
/**
148+
* List Invoice Payments
149+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/list-invoice-payments
150+
* @param invoiceId - The ID of the invoice to get the payments for.
151+
* @constructor
152+
*/
153+
GetPayments(
154+
invoiceId: string
155+
): Promise<ResourceList<SubscriptionInvoicePayment>>
156+
157+
/**
158+
* Get Invoice Payment
159+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/get-invoice-payment
160+
* @param invoiceId - The ID of the invoice to get the payment for.
161+
* @param paymentId - The ID of the payment.
162+
* @constructor
163+
*/
164+
GetPayment(
165+
invoiceId: string,
166+
paymentId: string
167+
): Promise<Resource<SubscriptionInvoicePayment>>
168+
169+
/**
170+
* Subscription Invoice Filtering
171+
* DOCS: https://elasticpath.dev/docs/api/subscriptions/list-invoices#filtering
172+
*/
173+
Filter(filter: SubscriptionInvoiceFilter): SubscriptionInvoicesEndpoint
174+
175+
Limit(value: number): SubscriptionInvoicesEndpoint
176+
177+
Offset(value: number): SubscriptionInvoicesEndpoint
178+
}

0 commit comments

Comments
 (0)