Creates or deletes one or more repeating invoice templates

Script xero Verified

by hugo697 ยท 12/20/2024

The script

Submitted by hugo697 Bun
Verified 515 days ago
1
//native
2
type Xero = {
3
	token: string
4
}
5
/**
6
 * Creates or deletes one or more repeating invoice templates
7
 *
8
 */
9
export async function main(
10
	auth: Xero,
11
	summarizeErrors: string | undefined,
12
	xero_tenant_id: string,
13
	Idempotency_Key: string,
14
	body: {
15
		RepeatingInvoices?: {
16
			Type?: 'ACCPAY' | 'ACCREC'
17
			Contact?: {
18
				ContactID?: string
19
				MergedToContactID?: string
20
				ContactNumber?: string
21
				AccountNumber?: string
22
				ContactStatus?: 'ACTIVE' | 'ARCHIVED' | 'GDPRREQUEST'
23
				Name?: string
24
				FirstName?: string
25
				LastName?: string
26
				CompanyNumber?: string
27
				EmailAddress?: string
28
				ContactPersons?: {
29
					FirstName?: string
30
					LastName?: string
31
					EmailAddress?: string
32
					IncludeInEmails?: false | true
33
				}[]
34
				BankAccountDetails?: string
35
				TaxNumber?: string
36
				AccountsReceivableTaxType?: string
37
				AccountsPayableTaxType?: string
38
				Addresses?: {
39
					AddressType?: 'POBOX' | 'STREET'
40
					AddressLine1?: string
41
					AddressLine2?: string
42
					AddressLine3?: string
43
					AddressLine4?: string
44
					City?: string
45
					Region?: string
46
					PostalCode?: string
47
					Country?: string
48
					AttentionTo?: string
49
				}[]
50
				Phones?: {
51
					PhoneType?: 'DEFAULT' | 'DDI' | 'MOBILE' | 'FAX' | 'OFFICE'
52
					PhoneNumber?: string
53
					PhoneAreaCode?: string
54
					PhoneCountryCode?: string
55
				}[]
56
				IsSupplier?: false | true
57
				IsCustomer?: false | true
58
				SalesDefaultLineAmountType?: 'INCLUSIVE' | 'EXCLUSIVE' | 'NONE'
59
				PurchasesDefaultLineAmountType?: 'INCLUSIVE' | 'EXCLUSIVE' | 'NONE'
60
				DefaultCurrency?:
61
					| 'AED'
62
					| 'AFN'
63
					| 'ALL'
64
					| 'AMD'
65
					| 'ANG'
66
					| 'AOA'
67
					| 'ARS'
68
					| 'AUD'
69
					| 'AWG'
70
					| 'AZN'
71
					| 'BAM'
72
					| 'BBD'
73
					| 'BDT'
74
					| 'BGN'
75
					| 'BHD'
76
					| 'BIF'
77
					| 'BMD'
78
					| 'BND'
79
					| 'BOB'
80
					| 'BRL'
81
					| 'BSD'
82
					| 'BTN'
83
					| 'BWP'
84
					| 'BYN'
85
					| 'BYR'
86
					| 'BZD'
87
					| 'CAD'
88
					| 'CDF'
89
					| 'CHF'
90
					| 'CLF'
91
					| 'CLP'
92
					| 'CNY'
93
					| 'COP'
94
					| 'CRC'
95
					| 'CUC'
96
					| 'CUP'
97
					| 'CVE'
98
					| 'CZK'
99
					| 'DJF'
100
					| 'DKK'
101
					| 'DOP'
102
					| 'DZD'
103
					| 'EEK'
104
					| 'EGP'
105
					| 'ERN'
106
					| 'ETB'
107
					| 'EUR'
108
					| 'FJD'
109
					| 'FKP'
110
					| 'GBP'
111
					| 'GEL'
112
					| 'GHS'
113
					| 'GIP'
114
					| 'GMD'
115
					| 'GNF'
116
					| 'GTQ'
117
					| 'GYD'
118
					| 'HKD'
119
					| 'HNL'
120
					| 'HRK'
121
					| 'HTG'
122
					| 'HUF'
123
					| 'IDR'
124
					| 'ILS'
125
					| 'INR'
126
					| 'IQD'
127
					| 'IRR'
128
					| 'ISK'
129
					| 'JMD'
130
					| 'JOD'
131
					| 'JPY'
132
					| 'KES'
133
					| 'KGS'
134
					| 'KHR'
135
					| 'KMF'
136
					| 'KPW'
137
					| 'KRW'
138
					| 'KWD'
139
					| 'KYD'
140
					| 'KZT'
141
					| 'LAK'
142
					| 'LBP'
143
					| 'LKR'
144
					| 'LRD'
145
					| 'LSL'
146
					| 'LTL'
147
					| 'LVL'
148
					| 'LYD'
149
					| 'MAD'
150
					| 'MDL'
151
					| 'MGA'
152
					| 'MKD'
153
					| 'MMK'
154
					| 'MNT'
155
					| 'MOP'
156
					| 'MRO'
157
					| 'MRU'
158
					| 'MUR'
159
					| 'MVR'
160
					| 'MWK'
161
					| 'MXN'
162
					| 'MXV'
163
					| 'MYR'
164
					| 'MZN'
165
					| 'NAD'
166
					| 'NGN'
167
					| 'NIO'
168
					| 'NOK'
169
					| 'NPR'
170
					| 'NZD'
171
					| 'OMR'
172
					| 'PAB'
173
					| 'PEN'
174
					| 'PGK'
175
					| 'PHP'
176
					| 'PKR'
177
					| 'PLN'
178
					| 'PYG'
179
					| 'QAR'
180
					| 'RON'
181
					| 'RSD'
182
					| 'RUB'
183
					| 'RWF'
184
					| 'SAR'
185
					| 'SBD'
186
					| 'SCR'
187
					| 'SDG'
188
					| 'SEK'
189
					| 'SGD'
190
					| 'SHP'
191
					| 'SKK'
192
					| 'SLE'
193
					| 'SLL'
194
					| 'SOS'
195
					| 'SRD'
196
					| 'STD'
197
					| 'STN'
198
					| 'SVC'
199
					| 'SYP'
200
					| 'SZL'
201
					| 'THB'
202
					| 'TJS'
203
					| 'TMT'
204
					| 'TND'
205
					| 'TOP'
206
					| 'TRY'
207
					| 'TTD'
208
					| 'TWD'
209
					| 'TZS'
210
					| 'UAH'
211
					| 'UGX'
212
					| 'USD'
213
					| 'UYU'
214
					| 'UZS'
215
					| 'VEF'
216
					| 'VES'
217
					| 'VND'
218
					| 'VUV'
219
					| 'WST'
220
					| 'XAF'
221
					| 'XCD'
222
					| 'XOF'
223
					| 'XPF'
224
					| 'YER'
225
					| 'ZAR'
226
					| 'ZMW'
227
					| 'ZMK'
228
					| 'ZWD'
229
				XeroNetworkKey?: string
230
				SalesDefaultAccountCode?: string
231
				PurchasesDefaultAccountCode?: string
232
				SalesTrackingCategories?: {
233
					TrackingCategoryName?: string
234
					TrackingOptionName?: string
235
				}[]
236
				PurchasesTrackingCategories?: {
237
					TrackingCategoryName?: string
238
					TrackingOptionName?: string
239
				}[]
240
				TrackingCategoryName?: string
241
				TrackingCategoryOption?: string
242
				PaymentTerms?: {
243
					Bills?: {
244
						Day?: number
245
						Type?:
246
							| 'DAYSAFTERBILLDATE'
247
							| 'DAYSAFTERBILLMONTH'
248
							| 'OFCURRENTMONTH'
249
							| 'OFFOLLOWINGMONTH'
250
					}
251
					Sales?: {
252
						Day?: number
253
						Type?:
254
							| 'DAYSAFTERBILLDATE'
255
							| 'DAYSAFTERBILLMONTH'
256
							| 'OFCURRENTMONTH'
257
							| 'OFFOLLOWINGMONTH'
258
					}
259
				}
260
				UpdatedDateUTC?: string
261
				ContactGroups?: {
262
					Name?: string
263
					Status?: 'ACTIVE' | 'DELETED'
264
					ContactGroupID?: string
265
					Contacts?: {}[]
266
				}[]
267
				Website?: string
268
				BrandingTheme?: {
269
					BrandingThemeID?: string
270
					Name?: string
271
					LogoUrl?: string
272
					Type?: 'INVOICE'
273
					SortOrder?: number
274
					CreatedDateUTC?: string
275
				}
276
				BatchPayments?: {
277
					BankAccountNumber?: string
278
					BankAccountName?: string
279
					Details?: string
280
					Code?: string
281
					Reference?: string
282
				}
283
				Discount?: number
284
				Balances?: {
285
					AccountsReceivable?: { Outstanding?: number; Overdue?: number }
286
					AccountsPayable?: { Outstanding?: number; Overdue?: number }
287
				}
288
				Attachments?: {
289
					AttachmentID?: string
290
					FileName?: string
291
					Url?: string
292
					MimeType?: string
293
					ContentLength?: number
294
					IncludeOnline?: false | true
295
				}[]
296
				HasAttachments?: never
297
				ValidationErrors?: { Message?: string }[]
298
				HasValidationErrors?: never
299
				StatusAttributeString?: string
300
			}
301
			Schedule?: {
302
				Period?: number
303
				Unit?: 'WEEKLY' | 'MONTHLY'
304
				DueDate?: number
305
				DueDateType?:
306
					| 'DAYSAFTERBILLDATE'
307
					| 'DAYSAFTERBILLMONTH'
308
					| 'OFCURRENTMONTH'
309
					| 'OFFOLLOWINGMONTH'
310
					| 'DAYSAFTERINVOICEDATE'
311
					| 'DAYSAFTERINVOICEMONTH'
312
				StartDate?: string
313
				NextScheduledDate?: string
314
				EndDate?: string
315
			}
316
			LineItems?: {
317
				LineItemID?: string
318
				Description?: string
319
				Quantity?: number
320
				UnitAmount?: number
321
				ItemCode?: string
322
				AccountCode?: string
323
				AccountID?: string
324
				TaxType?: string
325
				TaxAmount?: number
326
				Item?: { Code?: string; Name?: string; ItemID?: string }
327
				LineAmount?: number
328
				Tracking?: {
329
					TrackingCategoryID?: string
330
					TrackingOptionID?: string
331
					Name?: string
332
					Option?: string
333
				}[]
334
				DiscountRate?: number
335
				DiscountAmount?: number
336
				RepeatingInvoiceID?: string
337
				Taxability?: 'TAXABLE' | 'NON_TAXABLE' | 'EXEMPT' | 'PART_TAXABLE' | 'NOT_APPLICABLE'
338
				SalesTaxCodeId?: number
339
				TaxBreakdown?: {
340
					TaxComponentId?: string
341
					Type?:
342
						| 'SYSGST/USCOUNTRY'
343
						| 'SYSGST/USSTATE'
344
						| 'SYSGST/USCOUNTY'
345
						| 'SYSGST/USCITY'
346
						| 'SYSGST/USSPECIAL'
347
					Name?: string
348
					TaxPercentage?: number
349
					TaxAmount?: number
350
					TaxableAmount?: number
351
					NonTaxableAmount?: number
352
					ExemptAmount?: number
353
					StateAssignedNo?: string
354
					JurisdictionRegion?: string
355
				}[]
356
			}[]
357
			LineAmountTypes?: 'Exclusive' | 'Inclusive' | 'NoTax'
358
			Reference?: string
359
			BrandingThemeID?: string
360
			CurrencyCode?:
361
				| 'AED'
362
				| 'AFN'
363
				| 'ALL'
364
				| 'AMD'
365
				| 'ANG'
366
				| 'AOA'
367
				| 'ARS'
368
				| 'AUD'
369
				| 'AWG'
370
				| 'AZN'
371
				| 'BAM'
372
				| 'BBD'
373
				| 'BDT'
374
				| 'BGN'
375
				| 'BHD'
376
				| 'BIF'
377
				| 'BMD'
378
				| 'BND'
379
				| 'BOB'
380
				| 'BRL'
381
				| 'BSD'
382
				| 'BTN'
383
				| 'BWP'
384
				| 'BYN'
385
				| 'BYR'
386
				| 'BZD'
387
				| 'CAD'
388
				| 'CDF'
389
				| 'CHF'
390
				| 'CLF'
391
				| 'CLP'
392
				| 'CNY'
393
				| 'COP'
394
				| 'CRC'
395
				| 'CUC'
396
				| 'CUP'
397
				| 'CVE'
398
				| 'CZK'
399
				| 'DJF'
400
				| 'DKK'
401
				| 'DOP'
402
				| 'DZD'
403
				| 'EEK'
404
				| 'EGP'
405
				| 'ERN'
406
				| 'ETB'
407
				| 'EUR'
408
				| 'FJD'
409
				| 'FKP'
410
				| 'GBP'
411
				| 'GEL'
412
				| 'GHS'
413
				| 'GIP'
414
				| 'GMD'
415
				| 'GNF'
416
				| 'GTQ'
417
				| 'GYD'
418
				| 'HKD'
419
				| 'HNL'
420
				| 'HRK'
421
				| 'HTG'
422
				| 'HUF'
423
				| 'IDR'
424
				| 'ILS'
425
				| 'INR'
426
				| 'IQD'
427
				| 'IRR'
428
				| 'ISK'
429
				| 'JMD'
430
				| 'JOD'
431
				| 'JPY'
432
				| 'KES'
433
				| 'KGS'
434
				| 'KHR'
435
				| 'KMF'
436
				| 'KPW'
437
				| 'KRW'
438
				| 'KWD'
439
				| 'KYD'
440
				| 'KZT'
441
				| 'LAK'
442
				| 'LBP'
443
				| 'LKR'
444
				| 'LRD'
445
				| 'LSL'
446
				| 'LTL'
447
				| 'LVL'
448
				| 'LYD'
449
				| 'MAD'
450
				| 'MDL'
451
				| 'MGA'
452
				| 'MKD'
453
				| 'MMK'
454
				| 'MNT'
455
				| 'MOP'
456
				| 'MRO'
457
				| 'MRU'
458
				| 'MUR'
459
				| 'MVR'
460
				| 'MWK'
461
				| 'MXN'
462
				| 'MXV'
463
				| 'MYR'
464
				| 'MZN'
465
				| 'NAD'
466
				| 'NGN'
467
				| 'NIO'
468
				| 'NOK'
469
				| 'NPR'
470
				| 'NZD'
471
				| 'OMR'
472
				| 'PAB'
473
				| 'PEN'
474
				| 'PGK'
475
				| 'PHP'
476
				| 'PKR'
477
				| 'PLN'
478
				| 'PYG'
479
				| 'QAR'
480
				| 'RON'
481
				| 'RSD'
482
				| 'RUB'
483
				| 'RWF'
484
				| 'SAR'
485
				| 'SBD'
486
				| 'SCR'
487
				| 'SDG'
488
				| 'SEK'
489
				| 'SGD'
490
				| 'SHP'
491
				| 'SKK'
492
				| 'SLE'
493
				| 'SLL'
494
				| 'SOS'
495
				| 'SRD'
496
				| 'STD'
497
				| 'STN'
498
				| 'SVC'
499
				| 'SYP'
500
				| 'SZL'
501
				| 'THB'
502
				| 'TJS'
503
				| 'TMT'
504
				| 'TND'
505
				| 'TOP'
506
				| 'TRY'
507
				| 'TTD'
508
				| 'TWD'
509
				| 'TZS'
510
				| 'UAH'
511
				| 'UGX'
512
				| 'USD'
513
				| 'UYU'
514
				| 'UZS'
515
				| 'VEF'
516
				| 'VES'
517
				| 'VND'
518
				| 'VUV'
519
				| 'WST'
520
				| 'XAF'
521
				| 'XCD'
522
				| 'XOF'
523
				| 'XPF'
524
				| 'YER'
525
				| 'ZAR'
526
				| 'ZMW'
527
				| 'ZMK'
528
				| 'ZWD'
529
			Status?: 'DELETED' | 'DRAFT' | 'AUTHORISED'
530
			SubTotal?: number
531
			TotalTax?: number
532
			Total?: number
533
			RepeatingInvoiceID?: string
534
			ID?: string
535
			HasAttachments?: never
536
			Attachments?: {
537
				AttachmentID?: string
538
				FileName?: string
539
				Url?: string
540
				MimeType?: string
541
				ContentLength?: number
542
				IncludeOnline?: false | true
543
			}[]
544
			ApprovedForSending?: never
545
			SendCopy?: never
546
			MarkAsSent?: never
547
			IncludePDF?: never
548
		}[]
549
	}
550
) {
551
	const url = new URL(`https://api.xero.com/api.xro/2.0/RepeatingInvoices`)
552
	for (const [k, v] of [['summarizeErrors', summarizeErrors]]) {
553
		if (v !== undefined && v !== '' && k !== undefined) {
554
			url.searchParams.append(k, v)
555
		}
556
	}
557
	const response = await fetch(url, {
558
		method: 'POST',
559
		headers: {
560
      Accept: 'application/json',
561
			'xero-tenant-id': xero_tenant_id,
562
			'Idempotency-Key': Idempotency_Key,
563
			'Content-Type': 'application/json',
564
			Authorization: 'Bearer ' + auth.token
565
		},
566
		body: JSON.stringify(body)
567
	})
568
	if (!response.ok) {
569
		const text = await response.text()
570
		throw new Error(`${response.status} ${text}`)
571
	}
572
	return await response.json()
573
}
574