Creates one or more purchase orders

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