Updates or creates one or more contacts in a Xero organisation
One script reply has been approved by the moderators Verified
Created by hugo697 448 days ago
Submitted by hugo697 Bun
Verified 448 days ago
1
//native
2
type Xero = {
3
	token: string
4
}
5
/**
6
 * Updates or creates one or more contacts in a Xero organisation
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
		Contacts?: {
23
			ContactID?: string
24
			MergedToContactID?: string
25
			ContactNumber?: string
26
			AccountNumber?: string
27
			ContactStatus?: 'ACTIVE' | 'ARCHIVED' | 'GDPRREQUEST'
28
			Name?: string
29
			FirstName?: string
30
			LastName?: string
31
			CompanyNumber?: string
32
			EmailAddress?: string
33
			ContactPersons?: {
34
				FirstName?: string
35
				LastName?: string
36
				EmailAddress?: string
37
				IncludeInEmails?: false | true
38
			}[]
39
			BankAccountDetails?: string
40
			TaxNumber?: string
41
			AccountsReceivableTaxType?: string
42
			AccountsPayableTaxType?: string
43
			Addresses?: {
44
				AddressType?: 'POBOX' | 'STREET'
45
				AddressLine1?: string
46
				AddressLine2?: string
47
				AddressLine3?: string
48
				AddressLine4?: string
49
				City?: string
50
				Region?: string
51
				PostalCode?: string
52
				Country?: string
53
				AttentionTo?: string
54
			}[]
55
			Phones?: {
56
				PhoneType?: 'DEFAULT' | 'DDI' | 'MOBILE' | 'FAX' | 'OFFICE'
57
				PhoneNumber?: string
58
				PhoneAreaCode?: string
59
				PhoneCountryCode?: string
60
			}[]
61
			IsSupplier?: false | true
62
			IsCustomer?: false | true
63
			SalesDefaultLineAmountType?: 'INCLUSIVE' | 'EXCLUSIVE' | 'NONE'
64
			PurchasesDefaultLineAmountType?: 'INCLUSIVE' | 'EXCLUSIVE' | 'NONE'
65
			DefaultCurrency?:
66
				| 'AED'
67
				| 'AFN'
68
				| 'ALL'
69
				| 'AMD'
70
				| 'ANG'
71
				| 'AOA'
72
				| 'ARS'
73
				| 'AUD'
74
				| 'AWG'
75
				| 'AZN'
76
				| 'BAM'
77
				| 'BBD'
78
				| 'BDT'
79
				| 'BGN'
80
				| 'BHD'
81
				| 'BIF'
82
				| 'BMD'
83
				| 'BND'
84
				| 'BOB'
85
				| 'BRL'
86
				| 'BSD'
87
				| 'BTN'
88
				| 'BWP'
89
				| 'BYN'
90
				| 'BYR'
91
				| 'BZD'
92
				| 'CAD'
93
				| 'CDF'
94
				| 'CHF'
95
				| 'CLF'
96
				| 'CLP'
97
				| 'CNY'
98
				| 'COP'
99
				| 'CRC'
100
				| 'CUC'
101
				| 'CUP'
102
				| 'CVE'
103
				| 'CZK'
104
				| 'DJF'
105
				| 'DKK'
106
				| 'DOP'
107
				| 'DZD'
108
				| 'EEK'
109
				| 'EGP'
110
				| 'ERN'
111
				| 'ETB'
112
				| 'EUR'
113
				| 'FJD'
114
				| 'FKP'
115
				| 'GBP'
116
				| 'GEL'
117
				| 'GHS'
118
				| 'GIP'
119
				| 'GMD'
120
				| 'GNF'
121
				| 'GTQ'
122
				| 'GYD'
123
				| 'HKD'
124
				| 'HNL'
125
				| 'HRK'
126
				| 'HTG'
127
				| 'HUF'
128
				| 'IDR'
129
				| 'ILS'
130
				| 'INR'
131
				| 'IQD'
132
				| 'IRR'
133
				| 'ISK'
134
				| 'JMD'
135
				| 'JOD'
136
				| 'JPY'
137
				| 'KES'
138
				| 'KGS'
139
				| 'KHR'
140
				| 'KMF'
141
				| 'KPW'
142
				| 'KRW'
143
				| 'KWD'
144
				| 'KYD'
145
				| 'KZT'
146
				| 'LAK'
147
				| 'LBP'
148
				| 'LKR'
149
				| 'LRD'
150
				| 'LSL'
151
				| 'LTL'
152
				| 'LVL'
153
				| 'LYD'
154
				| 'MAD'
155
				| 'MDL'
156
				| 'MGA'
157
				| 'MKD'
158
				| 'MMK'
159
				| 'MNT'
160
				| 'MOP'
161
				| 'MRO'
162
				| 'MRU'
163
				| 'MUR'
164
				| 'MVR'
165
				| 'MWK'
166
				| 'MXN'
167
				| 'MXV'
168
				| 'MYR'
169
				| 'MZN'
170
				| 'NAD'
171
				| 'NGN'
172
				| 'NIO'
173
				| 'NOK'
174
				| 'NPR'
175
				| 'NZD'
176
				| 'OMR'
177
				| 'PAB'
178
				| 'PEN'
179
				| 'PGK'
180
				| 'PHP'
181
				| 'PKR'
182
				| 'PLN'
183
				| 'PYG'
184
				| 'QAR'
185
				| 'RON'
186
				| 'RSD'
187
				| 'RUB'
188
				| 'RWF'
189
				| 'SAR'
190
				| 'SBD'
191
				| 'SCR'
192
				| 'SDG'
193
				| 'SEK'
194
				| 'SGD'
195
				| 'SHP'
196
				| 'SKK'
197
				| 'SLE'
198
				| 'SLL'
199
				| 'SOS'
200
				| 'SRD'
201
				| 'STD'
202
				| 'STN'
203
				| 'SVC'
204
				| 'SYP'
205
				| 'SZL'
206
				| 'THB'
207
				| 'TJS'
208
				| 'TMT'
209
				| 'TND'
210
				| 'TOP'
211
				| 'TRY'
212
				| 'TTD'
213
				| 'TWD'
214
				| 'TZS'
215
				| 'UAH'
216
				| 'UGX'
217
				| 'USD'
218
				| 'UYU'
219
				| 'UZS'
220
				| 'VEF'
221
				| 'VES'
222
				| 'VND'
223
				| 'VUV'
224
				| 'WST'
225
				| 'XAF'
226
				| 'XCD'
227
				| 'XOF'
228
				| 'XPF'
229
				| 'YER'
230
				| 'ZAR'
231
				| 'ZMW'
232
				| 'ZMK'
233
				| 'ZWD'
234
			XeroNetworkKey?: string
235
			SalesDefaultAccountCode?: string
236
			PurchasesDefaultAccountCode?: string
237
			SalesTrackingCategories?: {
238
				TrackingCategoryName?: string
239
				TrackingOptionName?: string
240
			}[]
241
			PurchasesTrackingCategories?: {
242
				TrackingCategoryName?: string
243
				TrackingOptionName?: string
244
			}[]
245
			TrackingCategoryName?: string
246
			TrackingCategoryOption?: string
247
			PaymentTerms?: {
248
				Bills?: {
249
					Day?: number
250
					Type?: 'DAYSAFTERBILLDATE' | 'DAYSAFTERBILLMONTH' | 'OFCURRENTMONTH' | 'OFFOLLOWINGMONTH'
251
				}
252
				Sales?: {
253
					Day?: number
254
					Type?: 'DAYSAFTERBILLDATE' | 'DAYSAFTERBILLMONTH' | 'OFCURRENTMONTH' | 'OFFOLLOWINGMONTH'
255
				}
256
			}
257
			UpdatedDateUTC?: string
258
			ContactGroups?: {
259
				Name?: string
260
				Status?: 'ACTIVE' | 'DELETED'
261
				ContactGroupID?: string
262
				Contacts?: {}[]
263
			}[]
264
			Website?: string
265
			BrandingTheme?: {
266
				BrandingThemeID?: string
267
				Name?: string
268
				LogoUrl?: string
269
				Type?: 'INVOICE'
270
				SortOrder?: number
271
				CreatedDateUTC?: string
272
			}
273
			BatchPayments?: {
274
				BankAccountNumber?: string
275
				BankAccountName?: string
276
				Details?: string
277
				Code?: string
278
				Reference?: string
279
			}
280
			Discount?: number
281
			Balances?: {
282
				AccountsReceivable?: { Outstanding?: number; Overdue?: number }
283
				AccountsPayable?: { Outstanding?: number; Overdue?: number }
284
			}
285
			Attachments?: {
286
				AttachmentID?: string
287
				FileName?: string
288
				Url?: string
289
				MimeType?: string
290
				ContentLength?: number
291
				IncludeOnline?: false | true
292
			}[]
293
			HasAttachments?: never
294
			ValidationErrors?: { Message?: string }[]
295
			HasValidationErrors?: never
296
			StatusAttributeString?: string
297
		}[]
298
	}
299
) {
300
	const url = new URL(`https://api.xero.com/api.xro/2.0/Contacts`)
301
	for (const [k, v] of [['summarizeErrors', summarizeErrors]]) {
302
		if (v !== undefined && v !== '' && k !== undefined) {
303
			url.searchParams.append(k, v)
304
		}
305
	}
306
	const response = await fetch(url, {
307
		method: 'POST',
308
		headers: {
309
			Accept: 'application/json',
310
			'xero-tenant-id': xero_tenant_id,
311
			'Idempotency-Key': Idempotency_Key,
312
			'Content-Type': 'application/json',
313
			Authorization: 'Bearer ' + auth.token
314
		},
315
		body: JSON.stringify(body)
316
	})
317
	if (!response.ok) {
318
		const text = await response.text()
319
		throw new Error(`${response.status} ${text}`)
320
	}
321
	return await response.json()
322
}
323