-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathbilling.ts
More file actions
346 lines (289 loc) · 5.31 KB
/
billing.ts
File metadata and controls
346 lines (289 loc) · 5.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
import { gql } from 'apollo-server-express';
export default gql`
"""
Languages supported by the Tinkoff
"""
enum SupportedBillingLanguages {
EN
RU
}
"""
Payment link structure
"""
type BillingSession {
"""
Total payment amount in kopecs
"""
amount: Long! @renameFrom(name: "Amount")
"""
Payment status
"""
status: String! @renameFrom(name: "Status")
"""
If the payment is successfull
"""
success: Boolean! @renameFrom(name: "Success")
"""
URL to the payment page
"""
paymentURL: String! @renameFrom(name: "PaymentURL")
}
"""
Minimal plan info used in composePayment response
"""
type ComposePaymentPlanInfo {
"""
Plan id in MongoDB
"""
id: ID!
"""
Plan name
"""
name: String!
"""
Monthly charge for plan
"""
monthlyCharge: Int!
}
"""
User bank card
"""
type BankCard {
"""
Bank card id
"""
id: ID!
"""
Last four numbers of card PAN
"""
lastFour: Int!
}
"""
Types of business operations
"""
enum BusinessOperationType {
"""
Workspace plan purchase by payment worker
"""
WORKSPACE_PLAN_PURCHASE
"""
Workspace deposit balance by user
"""
DEPOSIT_BY_USER
"""
Charge minimal amount of money to link a card for further recurrent payments
"""
CARD_LINK_CHARGE
"""
Refund the money that were charged to link a card
"""
CARD_LINK_REFUND
}
"""
Business operations statuses
"""
enum BusinessOperationStatus {
"""
Business operation is pending
"""
PENDING
"""
Business operation is confirmed
"""
CONFIRMED
"""
Business operation is rejected
"""
REJECTED
}
"""
Business operation payload type for 'DepositByUser' operation type
"""
type PayloadOfDepositByUser {
"""
Workspace to which the payment is credited
"""
workspace: Workspace!
"""
Amount of payment in US cents
"""
amount: Long!
"""
User who made the payment
"""
user: User!
"""
PAN of card which user made the payment
"""
cardPan: String
}
"""
Business operation payload type for 'WorkspacePlanPurchase' operation type
"""
type PayloadOfWorkspacePlanPurchase {
"""
Workspace to which the payment is debited
"""
workspace: Workspace!
"""
1/100 of the final amount. (US cents for USD, kopecks for RUB)
"""
amount: Long!
"""
Currency of payment
"""
currency: String!
}
"""
All available payload types for different types of operations
"""
union BusinessOperationPayload = PayloadOfDepositByUser | PayloadOfWorkspacePlanPurchase
"""
Business operation object
"""
type BusinessOperation {
"""
Id of operation
"""
id: String! @renameFrom(name: "_id")
"""
Business operation type
"""
type: BusinessOperationType!
"""
Indicates current state of the operation
"""
status: BusinessOperationStatus!
"""
Metadata related to the operation type
"""
payload: BusinessOperationPayload!
"""
When the operation was registered
"""
dtCreated: DateTime!
}
"""
Input for single payment
"""
input PayOnceInput {
"""
Total payment amount in kopecs
"""
amount: Long!
"""
Workspace id for which the payment will be made
"""
workspaceId: ID!
"""
Payment form language
"""
language: SupportedBillingLanguages = RU
}
"""
Input for composePayment query
"""
input ComposePaymentInput {
"""
Workspace id for which the payment will be made
"""
workspaceId: ID!
"""
Tariff plan id user is going to pay for
"""
tariffPlanId: ID!
"""
Whether card should be saved for future recurrent payments
"""
shouldSaveCard: Boolean
}
"""
Response of composePayment query
"""
type ComposePaymentResponse {
"""
Human-readable invoice identifier
"""
invoiceId: String!
"""
Selected plan info
"""
plan: ComposePaymentPlanInfo!
"""
True if only card linking validation payment is expected
"""
isCardLinkOperation: Boolean!
"""
Currency code
"""
currency: String!
"""
Checksum for subsequent payment verification
"""
checksum: String!
"""
Next payment date (recurrent start)
"""
nextPaymentDate: DateTime!
"""
CloudPayments public id (merchant identifier for payment widget)
"""
cloudPaymentsPublicId: String!
}
extend type Query {
"""
Get workspace billing history
"""
businessOperations("Workspaces IDs" ids: [ID!] = []): [BusinessOperation!]! @requireAdmin
"""
Prepare payment data before charge (GraphQL version of composePayment)
"""
composePayment(input: ComposePaymentInput!): ComposePaymentResponse!
}
"""
Data for processing payment with saved card
"""
input PayWithCardInput {
"""
Checksum for data validation
"""
checksum: String!
"""
Card id for payment
"""
cardId: String!
"""
Is payment recurrent or not. If payment is recurrent, then the money will be debited every month
"""
isRecurrent: Boolean
}
"""
Response of mutation for processing payment with saved card
"""
type PayWithCardResponse {
"""
Id of the created business operation
"""
recordId: ID!
"""
Created business operation
"""
record: BusinessOperation!
}
extend type Mutation {
"""
Remove card
"""
removeCard(cardNumber: String!): Boolean!
"""
Mutation for processing payment with saved card
"""
payWithCard(
input: PayWithCardInput!
): PayWithCardResponse!
"""
Returns JSON data with payment link and initiate card attach procedure
"""
attachCard(language: String): BillingSession!
}
`;