Version 18.1 by Robin Huisman on 2024/04/05 16:21

Show last authors
1 {{toc/}}
2
3
4 = Digital Lab Exchange process =
5
6 The flow diagram gives a small overview of what the data flow of a lab assignment is. Every green block shows a step of the lab assignment process. From top to bottom these steps are:
7
8 1. Showing the laboratory and all the analyses that can be requested as an option to the user.
9 1. The user creating a lab assignment and sending it to the lab trough TerraIndex.
10 1. The lab delivering the analysis results back to the TerraIndex.
11
12 [[attach:Lab exchange.svg||rel="noopener noreferrer" target="_blank"]] [[attach:Lab exchange.txt||rel="noopener noreferrer" target="_blank"]]
13
14 [[image:1712326465681-980.png||height="315" width="630"]]
15
16 [[image:1712326492306-381.png||height="781" width="635"]]
17
18 [[image:1712326520488-924.png||height="312" width="632"]]
19
20 (% element-id="1884" %)
21 = (% element-id="1883" %)Firewall IP-Addresses of TerraIndex(%%) =
22
23 (% element-id="1882" %)
24 Our IP-addresses:
25
26 (% element-id="1881" %)
27 inbound [[Web.terraindex.com>>url:http://Web.terraindex.com||element-id="1880"]]
28 137.116.199.164
29
30 (% element-id="1878" %)
31 outbound [[Test.terraindex.com>>url:http://Test.terraindex.com||element-id="1877"]]
32 104.45.9.128
33
34 (% element-id="1875" %)
35 Production outbound
36 40.115.34.64
37
38 (% element-id="1873" %)
39 Test outbound
40 13.73.138.173
41
42 (% element-id="1871" %)
43 CD/CI outbound
44 40.114.238.16
45
46 (% element-id="1869" %)
47 Office outbound
48 213.124.115.132
49
50
51 (% element-id="1864" %)
52 = (% element-id="1863" %)Labdelivery (menu-card) files Exchange(%%) =
53
54 (% element-id="1862" %)
55 == (% element-id="1861" %)Solution/Design(%%) ==
56
57
58 (% class="table-hover" element-id="1858" %)
59 (% element-id="1856" %)|(% element-id="1855" %)(% element-id="1854" %)**Action**|(% element-id="1853" %)(% element-id="1852" %)**TerraIndex**|(% element-id="1851" %) |(% element-id="1849" %)(% element-id="1848" %)**Laboratorium**|(% element-id="1847" %)(% element-id="1846" %)**Parameters/Message**|(% element-id="1845" %)(% element-id="1844" %)**Remarks**|(% element-id="1843" %)(% element-id="1842" %)**ResultCodes**
60 (% element-id="1841" %)|(% element-id="1840" %)1|(% element-id="1839" %)Sends a request to the function: GetCustomers().|=(% element-id="1838" %)>|(% element-id="1837" %) |(% element-id="1835" %)(% element-id="1834" %)**WebserviceUsername (string), **(%%)
61 (% element-id="1832" %)**WebservicePassword (string),**(%%)
62 (% element-id="1830" %)**CustomerUsername (string)**|(% element-id="1829" %) |(% element-id="1827" %)
63 (% element-id="1825" %)|(% element-id="1824" %)2|(% element-id="1823" %) |(% element-id="1821" %) |(% element-id="1819" %)Receives the request and check the customers this username and searches the dateLastChanged for this Customer.|(% element-id="1818" %) |(% element-id="1816" %) |(% element-id="1814" %)
64 (% element-id="1812" %)|(% element-id="1811" %)3|(% element-id="1810" %) |(% element-id="1808" %)<=|(% element-id="1807" %)Sends back the list of customers with the lastChangedTimestamp|(% element-id="1806" %)ResultCode (),
65 ErrorMessage (string),
66 List<customer> , Customer:
67 CustomerCode (string),
68 CustomerName (string),
69 LabID (int),
70 LabName (string),
71 ChangedTimeStamp (DateTime)|(% element-id="1798" %)We receive the dateTimestamp instead of sending it, so we always get the full list and we are also able to delete customercodes.|(% element-id="1797" %)1 = Success,
72 2 = GeneralError,
73 3 = WrongSIKBVersion,
74 4 = InvalidCredentials,
75 5 = CustomerUsernameInvalid,
76 6 = CustomerUsernameNotValidForCustomerCode
77 7 = FileContentProblem,
78 8 = InvalidOrderId,
79 9 = OrderIdAlreadyApproved
80 10 = PDFNotAvailable
81 (% element-id="1787" %)|(% element-id="1786" %)4|(% element-id="1785" %)Receives the list of Customers, and will check for each customer it needs to request a new/changed labdelivery file based on the ChangedTimestamp.|(% element-id="1784" %) |(% element-id="1782" %) |(% element-id="1780" %) |(% element-id="1778" %)If a customer is not longer in this list, TerraIndex can remove this customercode from the customer database.|(% element-id="1777" %)
82 (% element-id="1775" %)|(% element-id="1774" %)5|(% element-id="1773" %)Sends a request to the function: GetProductList() if it has changed.|=(% element-id="1772" %)>|(% element-id="1771" %) |(% element-id="1769" %)(% element-id="1768" %)**WebserviceUsername (string), **(%%)
83 (% element-id="1766" %)**WebservicePassword (string),**(%%)
84 (% element-id="1764" %)**CustomerUsername (string),**(%%)
85 LabID (int),
86 CustomerCode (string),
87 LanguageCode (string, default 'nld' volgens ISO 639-3-codes),
88 SIKBVersion (string, default: '13.4.0'),
89 UseZipStream/UseZip (bool, default: 'false')|(% element-id="1758" %)(% element-id="1757" %)
90 (((
91 (% element-id="1756" %)
92 We start with dutch, then extend with multiple languages, TerraIndex is in the lead to request multiple languages.
93 TerraIndex uses: 'fra', 'nld', 'eng', 'spa', 'deu', 'ita', 'por', 'dan'
94
95
96 (% element-id="1752" %)
97 Besides SIKB 13.4.0, TerraIndex also supports 9.0.0/8.0.0 etc.
98 )))|(% element-id="1751" %)
99 (% element-id="1749" %)|(% element-id="1748" %)6|(% element-id="1747" %) |(% element-id="1745" %) |(% element-id="1743" %)Reveives a request to create a labdelivery file in a certain version of SIKB. It will generate the file.|(% element-id="1742" %) |(% element-id="1740" %) |(% element-id="1738" %)
100 (% element-id="1736" %)|(% element-id="1735" %)7|(% element-id="1734" %) |(% element-id="1732" %)<=|(% element-id="1731" %)Sends back the SIKB file, as a Base64 encoded string, with or without using a zipstream.|(% element-id="1730" %)ResultCode (),
101 ErrorMessage (string),
102 FileContent_Base64 (string),
103 UseZipStream/UseZip (bool, default: 'false')|(% element-id="1726" %) |(% element-id="1724" %)1 = Success,
104 2 = GeneralError,
105 3 = WrongSIKBVersion,
106 4 = InvalidCredentials,
107 5 = CustomerUsernameInvalid,
108 6 = CustomerUsernameNotValidForCustomerCode
109 7 = FileContentProblem,
110 8 = InvalidOrderId,
111 9 = OrderIdAlreadyApproved
112 10 = PDFNotAvailable
113 (% element-id="1714" %)|(% element-id="1713" %)8|(% element-id="1712" %)Receives the DeliveryFile and saves the file for import into customer database.|(% element-id="1711" %) |(% element-id="1709" %) |(% element-id="1707" %) |(% element-id="1705" %) |(% element-id="1703" %)
114 (% element-id="1701" %)|(% element-id="1700" %)9|(% element-id="1699" %)Go back to step 5, for every Customer code, every language.|(% element-id="1698" %) |(% element-id="1696" %) |(% element-id="1694" %) |(% element-id="1692" %) |(% element-id="1690" %)
115 (% element-id="1688" %)|(% element-id="1687" %)10|(% element-id="1686" %)Process the LabDeliveryFiles|(% element-id="1685" %) |(% element-id="1683" %) |(% element-id="1681" %) |(% element-id="1679" %) |(% element-id="1677" %)
116
117 (% element-id="1675" %)
118 == (% element-id="1674" %)Get Customers (POST)(%%) ==
119
120 (% element-id="1673" %)
121 === (% element-id="1672" %)Request example(%%) ===
122
123 (% element-id="1671" %)
124 (% element-id="1669" %)|(% element-id="1668" %)(% element-id="1667" %)
125 (((
126 {{code language="C#"}}
127 public GetCustomersCall.Response GetCustomers(string WebserviceUsername, string WebservicePassword, string CustomerUsername)
128         {
129             GetCustomersCall.Response set = new GetCustomersCall.Response();
130
131             try
132             {
133                 var content = new FormUrlEncodedContent(new[]
134                 {
135                     new KeyValuePair<string, string>("userName", WebserviceUsername),
136                     new KeyValuePair<string, string>("password", WebservicePassword),
137                     new KeyValuePair<string, string>("customerUsername", CustomerUsername),
138                 });
139
140                 HttpResponseMessage response = _HttpClient.PostAsync(_HttpClient.BaseAddress + "/GetCustomers", content).Result;
141                 response.EnsureSuccessStatusCode();
142                 string responseMessage = response.Content.ReadAsStringAsync().Result;
143
144                 if (string.IsNullOrEmpty(responseMessage))
145                 {
146                     throw new Exception("Empty response from: [" + _HttpClient.BaseAddress + " / GetCustomers" + "]");
147                 }
148                 using (var ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(responseMessage)))
149                 {
150                     XmlSerializer serializer = new XmlSerializer(typeof(GetCustomersCall.Response));
151                     set = (GetCustomersCall.Response)serializer.Deserialize(ms);                 
152                 }
153             }
154             catch (Exception ex)
155             {
156                 #region handle exception
157                 set.Status = new BusinessEntities.LabRestService.GetCustomersCall.ResponseStatus();
158                 set.Status.StatusCode = ((int)ResultCodes.GeneralError).ToString();               
159                 set.Status.ErrorMessage = "Exception occurred in GetCustomers (username: " + WebserviceUsername + ", password: " + WebservicePassword + ") with message: " + ex.Message;
160                 ex.Data.Add("WebserviceUsername", WebserviceUsername);
161                 ex.Data.Add("WebservicePassword", WebservicePassword);
162                 ex.Data.Add("CustomerUsername", CustomerUsername);
163                 ExceptionHandler.HandleException(ex);
164                 #endregion
165             }
166             return set;
167         }
168 {{/code}}
169
170 (% element-id="1566" %)
171
172 )))
173
174 (% element-id="1564" %)
175 (% element-id="1562" %)|(% element-id="1561" %)(% element-id="1560" %)
176 (((
177 (% element-id="1559" %)
178 POST https:~/~/<URL>/GetCustomers HTTP/1.1
179
180 (% element-id="1558" %)
181 Content-Type: application/x-www-form-urlencoded
182
183 (% element-id="1557" %)
184 Host: 81.175.89.24
185
186 (% element-id="1556" %)
187 Content-Length: 115
188
189 (% element-id="1555" %)
190 Expect: 100-continue
191
192
193 (% element-id="1552" %)
194 userName=<webservice_username>&password=<Webservice_password>&customerUsername=<customer_username or token>
195 )))
196
197 (% element-id="1551" %)
198 === (% element-id="1550" %)Response example(%%) ===
199
200 (% element-id="1549" %)
201 (% element-id="1547" %)|(% element-id="1546" %)(% element-id="1545" %)
202 (((
203 {{code language="XML"}}
204 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
205 <Response><Customers>
206   <Customer LabId="1" LabName="Example Laboratorium" CustomerId="300" CustomerName="Adviesbureau De bodemkoning - Rotterdam" LastModifiedOnClient="2019-05-08T11:05:14.17+02:00" ></Customer>
207   <Customer LabId="1" LabName="Example Laboratorium" CustomerId="656" CustomerName="Adviesbureau De bodemkoning - Delft" LastModifiedOnClient="2019-04-19T13:20:10.123+02:00" ></Customer>
208 </Customers>
209 <Status>
210     <StatusCode>1</StatusCode>
211     <StatusCodeDescription>OK</StatusCodeDescription>
212     <ErrorMessage></ErrorMessage>
213 </Status>
214 </Response>
215 {{/code}}
216
217 (% element-id="1492" %)
218
219 )))
220
221 (% element-id="1490" %)
222 == (% element-id="1489" %)Get Products (POST)(%%) ==
223
224 (% element-id="1488" %)
225 === (% element-id="1487" %)Request example(%%) ===
226
227 (% element-id="1486" %)
228 (% element-id="1484" %)|(% element-id="1483" %)(% element-id="1482" %)
229 (((
230 (% element-id="1481" %)
231 public GetProductsCall.Response GetProductList(string WebserviceUsername, string WebservicePassword, string CustomerUsername, string customerid, int labid, string sikbVersion, string languageCode)
232
233 (% element-id="1480" %)
234 {
235
236
237 (% element-id="1477" %)
238 GetProductsCall.Response set = new GetProductsCall.Response();
239
240
241 (% element-id="1474" %)
242 try
243
244 (% element-id="1473" %)
245 {
246
247 (% element-id="1472" %)
248 bool useZipstream = true;
249
250 (% element-id="1471" %)
251 var content = new FormUrlEncodedContent(new[]
252
253 (% element-id="1470" %)
254 {
255
256 (% element-id="1469" %)
257 new KeyValuePair<string, string>("userName", WebserviceUsername),
258
259 (% element-id="1468" %)
260 new KeyValuePair<string, string>("password", WebservicePassword),
261
262 (% element-id="1467" %)
263 new KeyValuePair<string, string>("customerUsername", CustomerUsername),
264
265 (% element-id="1466" %)
266 new KeyValuePair<string, string>("languageCode", languageCode),
267
268 (% element-id="1465" %)
269 new KeyValuePair<string, string>("clientId", customerid),
270
271 (% element-id="1464" %)
272 new KeyValuePair<string, string>("sikbVersion", sikbVersion),
273
274 (% element-id="1463" %)
275 new KeyValuePair<string, string>("useZip", useZipstream.ToString() ),
276
277 (% element-id="1462" %)
278 });
279
280
281 (% element-id="1459" %)
282 HttpResponseMessage response = _HttpClient.PostAsync(_HttpClient.BaseAddress + "/GetProducts", content).Result;
283
284 (% element-id="1458" %)
285 response.EnsureSuccessStatusCode();
286
287 (% element-id="1457" %)
288 string responseMessage = response.Content.ReadAsStringAsync().Result;
289
290
291 (% element-id="1454" %)
292 if (string.IsNullOrEmpty(responseMessage))
293
294 (% element-id="1453" %)
295 {
296
297 (% element-id="1452" %)
298 throw new Exception("Empty response from: [" + _HttpClient.BaseAddress + " /GetProducts" + "]");
299
300 (% element-id="1451" %)
301 }
302
303 (% element-id="1450" %)
304 using (var ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(responseMessage~)~)~)
305
306 (% element-id="1449" %)
307 {
308
309 (% element-id="1448" %)
310 XmlSerializer serializer = new XmlSerializer(typeof(GetProductsCall.Response));
311
312 (% element-id="1447" %)
313 set = (GetProductsCall.Response)serializer.Deserialize(ms);
314
315 (% element-id="1446" %)
316 }
317
318
319 (% element-id="1443" %)
320 if (useZipstream && !string.IsNullOrEmpty(set.FileContent))
321
322 (% element-id="1442" %)
323 {
324
325 (% element-id="1441" %)
326 ~/~/convert from base64 string back to normal
327
328 (% element-id="1440" %)
329 ~/~/first check for real Base64, by checking there is no 'xml'  in it
330
331 (% element-id="1439" %)
332 if (!set.FileContent.Contains("<labaanlevering"))
333
334 (% element-id="1438" %)
335 {
336
337 (% element-id="1437" %)
338 set.FileContent = ZipStreamHelper.DecompressBase64StringToString(set.FileContent);
339
340 (% element-id="1436" %)
341 }
342
343 (% element-id="1435" %)
344 }
345
346
347 (% element-id="1432" %)
348 }
349
350 (% element-id="1431" %)
351 catch (Exception ex)
352
353 (% element-id="1430" %)
354 {
355
356 (% element-id="1429" %)
357 #region handle exception
358
359
360 (% element-id="1426" %)
361 set.Status = new BusinessEntities.LabRestService.GetProductsCall.ResponseStatus();
362
363 (% element-id="1425" %)
364 set.Status.StatusCode = ((int)ResultCodes.GeneralError).ToString();
365
366 (% element-id="1424" %)
367 set.Status.ErrorMessage = "Exception occurred in GetProducts (username: " + WebserviceUsername + ", password: " + WebservicePassword + ") with message: " + ex.Message;
368
369
370 (% element-id="1421" %)
371 ex.Data.Add("WebserviceUsername", WebserviceUsername);
372
373 (% element-id="1420" %)
374 ex.Data.Add("WebservicePassword", WebservicePassword);
375
376 (% element-id="1419" %)
377 ex.Data.Add("CustomerUsername", CustomerUsername);
378
379 (% element-id="1418" %)
380 ex.Data.Add("sikbVersion", sikbVersion);
381
382 (% element-id="1417" %)
383 ex.Data.Add("customerid", customerid);
384
385 (% element-id="1416" %)
386 ex.Data.Add("languageCode", languageCode);
387
388
389 (% element-id="1413" %)
390 ExceptionHandler.HandleException(ex);
391
392 (% element-id="1412" %)
393 #endregion
394
395 (% element-id="1411" %)
396 }
397
398
399 (% element-id="1408" %)
400 return set;
401
402 (% element-id="1407" %)
403 }
404 )))
405
406 (% element-id="1406" %)
407 (% element-id="1404" %)|(% element-id="1403" %)(% element-id="1402" %)
408 (((
409 (% element-id="1401" %)
410 POST https:~/~/<URL>/GetProducts HTTP/1.1
411
412 (% element-id="1400" %)
413 Content-Type: application/x-www-form-urlencoded
414
415 (% element-id="1399" %)
416 Host: 81.175.89.24
417
418 (% element-id="1398" %)
419 Content-Length: 179
420
421 (% element-id="1397" %)
422 Expect: 100-continue
423
424
425 (% element-id="1394" %)
426 userName=<webservice_username>&password=<Webservice_password>&customerUsername=<customer_username or token>&languageCode=nld&clientId=300&sikbVersion=13.5.0&useZip=True
427 )))
428
429 (% element-id="1393" %)
430 === (% element-id="1392" %)Response example(%%) ===
431
432 (% element-id="1391" %)
433 (% element-id="1389" %)|(% element-id="1388" %)(% element-id="1387" %)
434 (((
435 (% element-id="1386" %)
436 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
437
438 (% element-id="1385" %)
439 <Response>
440
441 (% element-id="1384" %)
442 <FileContent> {SIKB FILE in ZIPSTREAM BASE64 format}</FileContent>
443
444 (% element-id="1383" %)
445 <Status>
446
447 (% element-id="1382" %)
448 <StatusCode>1</StatusCode>
449
450 (% element-id="1381" %)
451 <StatusCodeDescription>OK</StatusCodeDescription>
452
453 (% element-id="1380" %)
454 <ErrorMessage></ErrorMessage>
455
456 (% element-id="1379" %)
457 </Status></Response>
458 )))
459
460 (% element-id="1378" %)
461 = (% element-id="1377" %)Useraccount Checkup.(%%) =
462
463 (% element-id="1374" %)
464 == (% element-id="1373" %)Solution/Design(%%) ==
465
466 (% element-id="1372" %)
467 With every call we will no longer send customer usernames and customer passwords. We want to use a fixed Machine 2 Machine username and password for TerraIndex. So we need to be able to quickly check whether the Customer username we want to use exists, and is bound to our TerraIndex fixed Machine 2 machine account.
468
469 (% element-id="1371" %)
470 WebserviceUsername (string),
471 WebservicePassword (string),
472 CustomerUsername (string)
473
474
475 (% element-id="1366" %)
476 Therefor we call a Webserice for ValidCredentials Check:
477
478
479 (% class="table-hover" element-id="1363" %)
480 (% element-id="1361" %)|(% element-id="1360" %)(% element-id="1359" %)**Action**|(% element-id="1358" %)(% element-id="1357" %)**TerraIndex**|(% element-id="1356" %) |(% element-id="1354" %)(% element-id="1353" %)**Laboratorium**|(% element-id="1352" %)(% element-id="1351" %)**Parameters/Message**|(% element-id="1350" %)(% element-id="1349" %)**Remarks**|(% element-id="1348" %)(% element-id="1347" %)**ResultCodes**
481 (% element-id="1346" %)|(% element-id="1345" %)1|(% element-id="1344" %)Sends a request to the function: ValidCredentials().|=(% element-id="1343" %)>|(% element-id="1342" %) |(% element-id="1340" %)WebserviceUsername (string),
482 WebservicePassword (string),
483 CustomerUsername (string)|(% element-id="1337" %)We want to skip the Password of the customer, and we use the WebserviceUsername + WebservicePassword for real authentication.|(% element-id="1336" %)
484 (% element-id="1334" %)|(% element-id="1333" %)2|(% element-id="1332" %) |(% element-id="1330" %) |(% element-id="1328" %)Receives the request and checks the combination of WebserviceUsername and WebservicePassword is Ok. Then checks the CustomerUsername is valid.|(% element-id="1327" %) |(% element-id="1325" %) |(% element-id="1323" %)
485 (% element-id="1321" %)|(% element-id="1320" %)3|(% element-id="1319" %) |(% element-id="1317" %)<=|(% element-id="1316" %)Sends back a Success of InvalidCredentials|(% element-id="1315" %)ResultCode (),
486 ErrorMessage (string),|(% element-id="1313" %) |(% element-id="1311" %)1 = Success,
487 2 = GeneralError,
488 3 = WrongSIKBVersion,
489 4 = InvalidCredentials,
490 5 = CustomerUsernameInvalid,
491 6 = CustomerUsernameNotValidForCustomerCode
492 7 = FileContentProblem,
493 8 = InvalidOrderId,
494 9 = OrderIdAlreadyApproved
495 10 = PDFNotAvailable
496
497 (% element-id="1301" %)
498 == (% element-id="1300" %)Check ValidCredentials (POST)(%%) ==
499
500 (% element-id="1299" %)
501 === (% element-id="1298" %)Request example(%%) ===
502
503 (% element-id="1297" %)
504 (% element-id="1295" %)|(% element-id="1294" %)(% element-id="1293" %)
505 (((
506 (% element-id="1292" %)
507 public ValidCredentialsCall.Response ValidCredentials(string WebserviceUsername, string WebservicePassword, string CustomerUsername, string customerid)
508
509 (% element-id="1291" %)
510 {
511
512 (% element-id="1290" %)
513 ValidCredentialsCall.Response set = new ValidCredentialsCall.Response();
514
515
516 (% element-id="1287" %)
517 try
518
519 (% element-id="1286" %)
520 {
521
522
523 (% element-id="1283" %)
524 var content = new FormUrlEncodedContent(new[]
525
526 (% element-id="1282" %)
527 {
528
529 (% element-id="1281" %)
530 new KeyValuePair<string, string>("userName", WebserviceUsername),
531
532 (% element-id="1280" %)
533 new KeyValuePair<string, string>("password", WebservicePassword),
534
535 (% element-id="1279" %)
536 ~/~/new KeyValuePair<string, string>("clientId", customerid),   ~/~/ Optional
537
538 (% element-id="1278" %)
539 new KeyValuePair<string, string>("customerUsername", CustomerUsername),
540
541 (% element-id="1277" %)
542 });
543
544
545 (% element-id="1274" %)
546 HttpResponseMessage response = _HttpClient.PostAsync(_HttpClient.BaseAddress + "/ValidCredentials", content).Result;
547
548 (% element-id="1273" %)
549 response.EnsureSuccessStatusCode();
550
551 (% element-id="1272" %)
552 string responseMessage = response.Content.ReadAsStringAsync().Result;
553
554
555 (% element-id="1269" %)
556 if (string.IsNullOrEmpty(responseMessage))
557
558 (% element-id="1268" %)
559 {
560
561 (% element-id="1267" %)
562 throw new Exception("Empty response from: [" + _HttpClient.BaseAddress + " / ValidCredentials" + "]");
563
564 (% element-id="1266" %)
565 }
566
567 (% element-id="1265" %)
568 using (var ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(responseMessage~)~)~)
569
570 (% element-id="1264" %)
571 {
572
573 (% element-id="1263" %)
574 XmlSerializer serializer = new XmlSerializer(typeof(ValidCredentialsCall.Response));
575
576 (% element-id="1262" %)
577 set = (ValidCredentialsCall.Response)serializer.Deserialize(ms);
578
579
580 (% element-id="1259" %)
581 return set;
582
583 (% element-id="1258" %)
584 }
585
586
587 (% element-id="1255" %)
588 }
589
590 (% element-id="1254" %)
591 catch (Exception ex)
592
593 (% element-id="1253" %)
594 {
595
596 (% element-id="1252" %)
597 #region handle exception
598
599
600 (% element-id="1249" %)
601 set.Status = new BusinessEntities.LabRestService.ValidCredentialsCall.ResponseStatus();
602
603 (% element-id="1248" %)
604 set.Status.StatusCode = ((int)ResultCodes.GeneralError).ToString();
605
606 (% element-id="1247" %)
607 set.Status.ErrorMessage = "Exception occurred in GetValidCredentials (username: " + WebserviceUsername + ", with message: " + ex.Message;
608
609
610 (% element-id="1244" %)
611 ex.Data.Add("WebserviceUsername", WebserviceUsername);
612
613 (% element-id="1243" %)
614 ex.Data.Add("WebservicePassword", WebservicePassword);
615
616 (% element-id="1242" %)
617 ex.Data.Add("CustomerUsername", CustomerUsername);
618
619
620 (% element-id="1239" %)
621 ExceptionHandler.HandleException(ex);
622
623 (% element-id="1238" %)
624 #endregion
625
626 (% element-id="1237" %)
627 }
628
629
630 (% element-id="1234" %)
631 return set;
632
633 (% element-id="1233" %)
634 }
635 )))
636
637 (% element-id="1232" %)
638 (% element-id="1230" %)|(% element-id="1229" %)(% element-id="1228" %)
639 (((
640 (% element-id="1227" %)
641 POST https:~/~/<URL>/ValidCredentials HTTP/1.1
642
643 (% element-id="1226" %)
644 Content-Type: application/x-www-form-urlencoded
645
646 (% element-id="1225" %)
647 Host: 81.175.89.24
648
649 (% element-id="1224" %)
650 Content-Length: 125
651
652 (% element-id="1223" %)
653 Expect: 100-continue
654
655
656 (% element-id="1220" %)
657 userName=<webservice_username>&password=<Webservice_password>&clientId=<optional otherwise empty>&customerUsername=<customer_username or token>
658 )))
659
660 (% element-id="1219" %)
661 === (% element-id="1218" %)Response example(%%) ===
662
663 (% element-id="1217" %)
664 (% element-id="1215" %)|(% element-id="1214" %)(% element-id="1213" %)
665 (((
666 (% element-id="1212" %)
667 <?xml version="1.0" encoding="UTF-8" standalone="no"?><Response>
668
669 (% element-id="1211" %)
670 <Status>
671
672 (% element-id="1210" %)
673 <StatusCode>1</StatusCode>
674
675 (% element-id="1209" %)
676 <StatusCodeDescription>OK</StatusCodeDescription>
677
678 (% element-id="1208" %)
679 <ErrorMessage></ErrorMessage>
680
681 (% element-id="1207" %)
682 </Status>
683
684 (% element-id="1206" %)
685 </Response>
686 )))
687
688 (% element-id="1205" %)
689 = (% element-id="1204" %)Labassignment request delivery(POST)(%%) =
690
691 (% element-id="1203" %)
692 == (% element-id="1202" %)Solution/Design(%%) ==
693
694 (% element-id="1201" %)
695 For this we create a Webserice for CreateOrder to create the order in the lab system.
696 After the creation, we would like to show an order overview of the laboratory in the future in PDF. The user can see the prices and can confirm or cancel.
697 Depending on the user's choice at the laboratory, to support this or not, TerraIndex calls the ApproveOrder or the CancelOrder.
698
699 (% element-id="0" %)
700 For default we assume that we cannot do this yet, and TerraIndex sends needsApprovalIsSupported = false. If this becomes true in the future, the Lab can indicate whether or not it is necessary in the NeedsApprove field.
701
702
703 (% class="table-hover" element-id="1195" %)
704 (% element-id="1193" %)|(% element-id="1192" %)(% element-id="1191" %)**Action**|(% element-id="1190" %)(% element-id="1189" %)**TerraIndex**|(% element-id="1188" %) |(% element-id="1186" %)(% element-id="1185" %)**Laboratorium**|(% element-id="1184" %)(% element-id="1183" %)**Parameters/Message**|(% element-id="1182" %)(% element-id="1181" %)**Remarks**|(% element-id="1180" %)(% element-id="1179" %)**ResultCodes**
705 (% element-id="1178" %)|(% element-id="1177" %)1|(% element-id="1176" %)Sends a request to the function: CreateOrder().|=(% element-id="1175" %)>|(% element-id="1174" %) |(% element-id="1172" %)WebserviceUsername (string),
706 WebservicePassword (string),
707 CustomerUsername (string),
708 FileContent_Base64 (string),
709 UseZipStream/UseZip (bool, default: 'false'),
710 CustomerCode (string),
711 SIKBVersion (string, default: '13.4.0'),
712 needsApprovalIsSupported (bool)|(% element-id="1164" %)SIKB Version included, so labs can quickly check the version.
713 Besides SIKB 13.4.0, TerraIndex also supports 9.0.0.
714 \\Before sending the SIKB, validate to the XSD!
715 And to the XSLT?
716 \\needsApprovalIsSupported = false; means we dont get PDF with offerte. This will make is faster.
717 needsApprovalIsSupported = true; means lab will check the user setting to send a PDF Offerte back or not. (If the lab can support this.)|(% element-id="1156" %)
718 (% element-id="1154" %)|(% element-id="1153" %)2|(% element-id="1152" %) |(% element-id="1150" %) |(% element-id="1148" %)Receives the request and checks the credentials.|(% element-id="1147" %) |(% element-id="1145" %) |(% element-id="1143" %)
719 (% element-id="1141" %)|(% colspan="1" element-id="1140" %)3|(% colspan="1" element-id="1139" %) |(% colspan="1" element-id="1137" %) |(% colspan="1" element-id="1135" %)Credentials are valid, the Filecontent is checked on a valid Labassignment. When valid it will be processed and a OrderId is given.|(% colspan="1" element-id="1134" %) |(% colspan="1" element-id="1132" %)Laboratorium saves the Sample GUIDs if it's SIKB 13 or higher.
720 Otherwise we use the idanlmons unique ID.|(% colspan="1" element-id="1130" %)
721 (% element-id="1128" %)|(% colspan="1" element-id="1127" %) |(% colspan="1" element-id="1125" %) |(% colspan="1" element-id="1123" %) |(% colspan="1" element-id="1121" %)Based on what customer, the order will be approved or the approve needs to be done in laboratorium system.|(% colspan="1" element-id="1120" %) |(% colspan="1" element-id="1118" %) |(% colspan="1" element-id="1116" %)
722 (% element-id="1114" %)|(% element-id="1113" %)4|(% element-id="1112" %) |(% element-id="1110" %)<=|(% element-id="1109" %)Sends back a Success with the new OrderId|(% element-id="1108" %)ResultCode (),
723 ErrorMessage (string),
724 OrderId (string),
725 NeedsApprove (bool),
726 FileContent_Base64 (string),
727 UseZipStream/UseZip (bool, default: 'false'),|(% element-id="1102" %)In the future labs will send back the PDF with the prices and some checks. To approve or cancel. For the first version this is not required yet and the fileContent remains empty.|(% element-id="1101" %)1 = Success,
728 2 = GeneralError,
729 3 = WrongSIKBVersion,
730 4 = InvalidCredentials,
731 5 = CustomerUsernameInvalid,
732 6 = CustomerUsernameNotValidForCustomerCode
733 7 = FileContentProblem,
734 8 = InvalidOrderId,
735 9 = OrderIdAlreadyApproved
736 10 = PDFNotAvailable
737 (% element-id="1091" %)|(% colspan="1" element-id="1090" %)6|(% colspan="1" element-id="1089" %)Receives the OrderId, and saves it.
738 |(% colspan="1" element-id="1086" %) |(% colspan="1" element-id="1084" %) |(% colspan="1" element-id="1082" %) |(% colspan="1" element-id="1080" %)(% element-id="1079" %)
739 (((
740 (% element-id="1078" %)
741 Default for now laboratorium will send:
742 NeedsApprove = False,
743 PDF = Empty,
744 Zipstream = False,
745
746
747 (% element-id="1072" %)
748 In the future, do something with the PDF and show the PDF to users to Approve or Cancel.
749 This will be done by; NeedsApprove = true.
750 \\If NeedsApprove is False, the order is Processed and can't be changed in TI. Like it is now.
751
752 (% element-id="1068" %)
753
754 )))|(% colspan="1" element-id="1066" %)
755 (% element-id="1064" %)|(% colspan="1" element-id="1063" %) |(% colspan="1" element-id="1061" %) |(% colspan="1" element-id="1059" %) |(% colspan="1" element-id="1057" %) |(% colspan="1" element-id="1055" %) |(% colspan="1" element-id="1053" %) |(% colspan="1" element-id="1051" %)
756 (% element-id="1049" %)|(% colspan="1" element-id="1048" %) |(% colspan="1" element-id="1046" %) |(% colspan="1" element-id="1044" %) |(% colspan="1" element-id="1042" %) |(% colspan="1" element-id="1040" %) |(% colspan="1" element-id="1038" %) |(% colspan="1" element-id="1036" %)
757 (% element-id="1034" %)|(% colspan="1" element-id="1033" %) |(% colspan="1" element-id="1031" %)(% element-id="1030" %)**IN THE FUTURE: APPROVEORDER**|(% colspan="1" element-id="1029" %) |(% colspan="1" element-id="1027" %) |(% colspan="1" element-id="1025" %) |(% colspan="1" element-id="1023" %) |(% colspan="1" element-id="1021" %)
758 (% element-id="1019" %)|(% colspan="1" element-id="1018" %)7|(% colspan="1" element-id="1017" %)Sends a request to the function: ApproveOrder().|(% colspan="1" element-id="1016" %)=>|(% colspan="1" element-id="1015" %) |(% colspan="1" element-id="1013" %)WebserviceUsername (string),
759 WebservicePassword (string),
760 CustomerUsername (string),
761 OrderId (string)|(% colspan="1" element-id="1009" %) |(% colspan="1" element-id="1007" %)
762 (% element-id="1005" %)|(% colspan="1" element-id="1004" %)8|(% colspan="1" element-id="1003" %) |(% colspan="1" element-id="1001" %) |(% colspan="1" element-id="999" %)Receives the approve and checks the credentials and the OrderId.|(% colspan="1" element-id="998" %) |(% colspan="1" element-id="996" %) |(% colspan="1" element-id="994" %)
763 (% element-id="992" %)|(% colspan="1" element-id="991" %)9|(% colspan="1" element-id="990" %) |(% colspan="1" element-id="988" %)<=|(% colspan="1" element-id="987" %)Sends back a Success with the new CertificateNr|(% colspan="1" element-id="986" %)ResultCode (),
764 ErrorMessage (string),
765 CertificateNr (string)|(% colspan="1" element-id="983" %)This process takes too long at some labs. Maybe this won't be workable...so maybe the CertificateNr return won't be possible. In this case, leave the CertificateNr empty. TerraIndex will read it from GetOrderStatus calls.|(% colspan="1" element-id="982" %)1 = Success,
766 2 = GeneralError,
767 3 = WrongSIKBVersion,
768 4 = InvalidCredentials,
769 5 = CustomerUsernameInvalid,
770 6 = CustomerUsernameNotValidForCustomerCode
771 7 = FileContentProblem,
772 8 = InvalidOrderId,
773 9 = OrderIdAlreadyApproved
774 10 = PDFNotAvailable
775 (% element-id="972" %)|(% colspan="1" element-id="971" %)10|(% colspan="1" element-id="970" %)Receives the CerificateNr and saves it.|(% colspan="1" element-id="969" %) |(% colspan="1" element-id="967" %) |(% colspan="1" element-id="965" %) |(% colspan="1" element-id="963" %) |(% colspan="1" element-id="961" %)
776 (% element-id="959" %)|(% colspan="1" element-id="958" %) |(% colspan="1" element-id="956" %) |(% colspan="1" element-id="954" %) |(% colspan="1" element-id="952" %) |(% colspan="1" element-id="950" %) |(% colspan="1" element-id="948" %) |(% colspan="1" element-id="946" %)
777 (% element-id="944" %)|(% colspan="1" element-id="943" %) |(% colspan="1" element-id="941" %)(% element-id="940" %)**IN THE FUTURE: CANCELORDER**|(% colspan="1" element-id="939" %) |(% colspan="1" element-id="937" %) |(% colspan="1" element-id="935" %) |(% colspan="1" element-id="933" %) |(% colspan="1" element-id="931" %)
778 (% element-id="929" %)|(% element-id="928" %)7|(% element-id="927" %)Sends a request to the function: CancelOrder().|=(% element-id="926" %)>|(% element-id="925" %) |(% element-id="923" %)WebserviceUsername (string),
779 WebservicePassword (string),
780 CustomerUsername (string),
781 OrderId (string)|(% element-id="919" %) |(% element-id="917" %)
782 (% element-id="915" %)|(% element-id="914" %)8|(% element-id="913" %) |(% element-id="911" %) |(% element-id="909" %)Receives the cancel and checks the credentials and the OrderId.|(% element-id="908" %) |(% element-id="906" %) |(% element-id="904" %)
783 (% element-id="902" %)|(% element-id="901" %)9|(% element-id="900" %) |(% element-id="898" %)<=|(% element-id="897" %)Sends back a Success |(% element-id="896" %)ResultCode (),
784 ErrorMessage (string)|(% element-id="894" %) |(% element-id="892" %)1 = Success,
785 2 = GeneralError,
786 3 = WrongSIKBVersion,
787 4 = InvalidCredentials,
788 5 = CustomerUsernameInvalid,
789 6 = CustomerUsernameNotValidForCustomerCode
790 7 = FileContentProblem,
791 8 = InvalidOrderId,
792 9 = OrderIdAlreadyApproved
793 10 = PDFNotAvailable
794 (% element-id="882" %)|(% element-id="881" %)10|(% element-id="880" %)Removes the OrderId and the IsSend to False|(% element-id="879" %) |(% element-id="877" %) |(% element-id="875" %) |(% element-id="873" %)If OrderIsAleadyApproved, set the values to Approved and keep the OrderId and IsSend.|(% element-id="872" %)
795 (% element-id="870" %)|(% colspan="1" element-id="869" %) |(% colspan="1" element-id="867" %) |(% colspan="1" element-id="865" %) |(% colspan="1" element-id="863" %) |(% colspan="1" element-id="861" %) |(% colspan="1" element-id="859" %) |(% colspan="1" element-id="857" %)
796
797 (% element-id="855" %)
798 == (% element-id="854" %)Create Order(%%) ==
799
800 (% element-id="853" %)
801 === (% element-id="852" %)Request example(%%) ===
802
803 (% element-id="851" %)
804 (% element-id="849" %)|(% element-id="848" %)(% element-id="847" %)
805 (((
806 (% element-id="846" %)
807 public CreateOrderResponse.Response SendLabAssignment(string WebserviceUsername, string WebservicePassword, string CustomerUsername, string customerid, string sikbVersion, string assignmentXML, string languageCode, bool needsApprovalIsSupported = false)
808
809 (% element-id="845" %)
810 {
811
812 (% element-id="844" %)
813 CreateOrderResponse.Response set = new CreateOrderResponse.Response();
814
815
816 (% element-id="841" %)
817 try
818
819 (% element-id="840" %)
820 {
821
822 (% element-id="839" %)
823 bool useZipstream = true;
824
825
826 (% element-id="836" %)
827 MultipartFormDataContent content = new MultipartFormDataContent();
828
829
830 (% element-id="833" %)
831 ~/~/Add Formdata
832
833 (% element-id="832" %)
834 var formDataDictionary = new[]
835
836 (% element-id="831" %)
837 {
838
839 (% element-id="830" %)
840 new KeyValuePair<string, string>("userName", WebserviceUsername),
841
842 (% element-id="829" %)
843 new KeyValuePair<string, string>("password", WebservicePassword),
844
845 (% element-id="828" %)
846 new KeyValuePair<string, string>("customerUserName", CustomerUsername),
847
848 (% element-id="827" %)
849 new KeyValuePair<string, string>("clientId", customerid),
850
851 (% element-id="826" %)
852 new KeyValuePair<string, string>("sikbVersion", sikbVersion),
853
854 (% element-id="825" %)
855 new KeyValuePair<string, string>("languageCode", languageCode),
856
857 (% element-id="824" %)
858 new KeyValuePair<string, string>("useZip", useZipstream.ToString() ),
859
860 (% element-id="823" %)
861 new KeyValuePair<string, string>("needsApprovalIsSupported", needsApprovalIsSupported.ToString() ),
862
863 (% element-id="822" %)
864 ~/~/new KeyValuePair<string, string>("orderXml", ZipStreamHelper.CompressToBase64String(assignmentXML)),
865
866 (% element-id="821" %)
867 ~/~/new KeyValuePair<string, string>("orderXml", assignmentXML),
868
869 (% element-id="820" %)
870 };              
871
872 (% element-id="819" %)
873 foreach (var item in formDataDictionary)
874
875 (% element-id="818" %)
876 {
877
878 (% element-id="817" %)
879 content.Add(new StringContent(item.Value), $"\"{item.Key}\"");
880
881 (% element-id="816" %)
882 }
883
884
885 (% element-id="813" %)
886 string filexml = string.Empty;
887
888 (% element-id="812" %)
889 if (useZipstream)
890
891 (% element-id="811" %)
892 {
893
894 (% element-id="810" %)
895 filexml = ZipStreamHelper.CompressToBase64String(assignmentXML);
896
897 (% element-id="809" %)
898 }
899
900 (% element-id="808" %)
901 else
902
903 (% element-id="807" %)
904 {
905
906 (% element-id="806" %)
907 filexml = assignmentXML;
908
909 (% element-id="805" %)
910 }
911
912
913 (% element-id="802" %)
914 ~/~/Add filecontent
915
916 (% element-id="801" %)
917 var fileContent = new ByteArrayContent(ZipStreamHelper.stringToByteArray(filexml));
918
919 (% element-id="800" %)
920 fileContent.Headers.ContentDisposition =
921
922 (% element-id="799" %)
923 new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") ~/~/<- 'form-data' instead of 'attachment'
924
925 (% element-id="798" %)
926 {
927
928 (% element-id="797" %)
929 Name = "\"orderXml\"", ~/~/ \" is needed so the message contains the quotes, wihtout it will fail
930
931 (% element-id="796" %)
932 FileName = "\"VivaTerraIndexAssignment.xml\""
933
934 (% element-id="795" %)
935 };
936
937 (% element-id="794" %)
938 fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/xml");              
939
940 (% element-id="793" %)
941 content.Add(fileContent);
942
943
944 (% element-id="790" %)
945 ~/~/Start sending
946
947
948 (% element-id="787" %)
949 HttpResponseMessage response = _HttpClient.PostAsync(_HttpClient.BaseAddress + "/CreateOrder", content).Result;
950
951 (% element-id="786" %)
952 response.EnsureSuccessStatusCode();
953
954 (% element-id="785" %)
955 string responseMessage = response.Content.ReadAsStringAsync().Result;
956
957
958 (% element-id="782" %)
959 if (string.IsNullOrEmpty(responseMessage))
960
961 (% element-id="781" %)
962 {
963
964 (% element-id="780" %)
965 throw new Exception("Empty response from: [" + _HttpClient.BaseAddress + " /CreateOrder" + "]");
966
967 (% element-id="779" %)
968 }
969
970 (% element-id="778" %)
971 using (var ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(responseMessage~)~)~)
972
973 (% element-id="777" %)
974 {
975
976 (% element-id="776" %)
977 XmlSerializer serializer = new XmlSerializer(typeof(CreateOrderResponse.Response));
978
979 (% element-id="775" %)
980 set = (CreateOrderResponse.Response)serializer.Deserialize(ms);
981
982 (% element-id="774" %)
983 }
984
985
986 (% element-id="771" %)
987 ~/~/Can contain a PDf with price information
988
989 (% element-id="770" %)
990 if (set.UseZip && !string.IsNullOrEmpty(set.FileContent))
991
992 (% element-id="769" %)
993 {
994
995 (% element-id="768" %)
996 ~/~/convert from base64 string back to normal
997
998 (% element-id="767" %)
999 set.FileContent = ZipStreamHelper.DecompressBase64StringToString(set.FileContent);                  
1000
1001 (% element-id="766" %)
1002 }
1003
1004
1005 (% element-id="763" %)
1006 }
1007
1008 (% element-id="762" %)
1009 catch (Exception ex)
1010
1011 (% element-id="761" %)
1012 {
1013
1014 (% element-id="760" %)
1015 #region handle exception
1016
1017
1018 (% element-id="757" %)
1019 set.Status = new BusinessEntities.LabRestService.CreateOrderResponse.ResponseStatus();
1020
1021 (% element-id="756" %)
1022 set.Status.StatusCode = ((int)ResultCodes.GeneralError).ToString();
1023
1024 (% element-id="755" %)
1025 set.Status.ErrorMessage = "Exception occurred in CreateOrder (username: " + WebserviceUsername + ") with message: " + ex.Message;
1026
1027
1028 (% element-id="752" %)
1029 ex.Data.Add("WebserviceUsername", WebserviceUsername);
1030
1031 (% element-id="751" %)
1032 ex.Data.Add("WebservicePassword", WebservicePassword);
1033
1034 (% element-id="750" %)
1035 ex.Data.Add("CustomerUsername", CustomerUsername);
1036
1037 (% element-id="749" %)
1038 ex.Data.Add("sikbVersion", sikbVersion);
1039
1040 (% element-id="748" %)
1041 ex.Data.Add("customerid", customerid);
1042
1043
1044 (% element-id="745" %)
1045 ExceptionHandler.HandleException(ex);
1046
1047 (% element-id="744" %)
1048 #endregion
1049
1050 (% element-id="743" %)
1051 }
1052
1053
1054 (% element-id="740" %)
1055 return set;
1056
1057 (% element-id="739" %)
1058 }
1059 )))
1060
1061 (% element-id="738" %)
1062 (% element-id="736" %)|(% element-id="735" %)(% element-id="734" %)
1063 (((
1064 (% element-id="733" %)
1065 POST https:~/~/<URL>/CreateOrder HTTP/1.1
1066
1067 (% element-id="732" %)
1068 Content-Type: multipart/form-data; boundary="28a3e130-70c9-4a1a-b544-a802a1ade6ca"
1069
1070 (% element-id="731" %)
1071 Host: 81.175.89.24
1072
1073 (% element-id="730" %)
1074 Content-Length: 5010
1075
1076 (% element-id="729" %)
1077 Expect: 100-continue
1078
1079
1080 (% element-id="726" %)
1081 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca
1082
1083 (% element-id="725" %)
1084 Content-Type: text/plain; charset=utf-8
1085
1086 (% element-id="724" %)
1087 Content-Disposition: form-data; name="userName"
1088
1089
1090 (% element-id="721" %)
1091 <Webservice_Username>
1092
1093 (% element-id="720" %)
1094 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca
1095
1096 (% element-id="719" %)
1097 Content-Type: text/plain; charset=utf-8
1098
1099 (% element-id="718" %)
1100 Content-Disposition: form-data; name="password"
1101
1102
1103 (% element-id="715" %)
1104 <Webservice_Password>
1105
1106 (% element-id="714" %)
1107 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca
1108
1109 (% element-id="713" %)
1110 Content-Type: text/plain; charset=utf-8
1111
1112 (% element-id="712" %)
1113 Content-Disposition: form-data; name="customerUserName"
1114
1115
1116 (% element-id="709" %)
1117 <Customer_Username or token>
1118
1119 (% element-id="708" %)
1120 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca
1121
1122 (% element-id="707" %)
1123 Content-Type: text/plain; charset=utf-8
1124
1125 (% element-id="706" %)
1126 Content-Disposition: form-data; name="clientId"
1127
1128
1129 (% element-id="703" %)
1130 300
1131
1132 (% element-id="702" %)
1133 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca
1134
1135 (% element-id="701" %)
1136 Content-Type: text/plain; charset=utf-8
1137
1138 (% element-id="700" %)
1139 Content-Disposition: form-data; name="sikbVersion"
1140
1141
1142 (% element-id="697" %)
1143 13.4.0
1144
1145 (% element-id="696" %)
1146 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca
1147
1148 (% element-id="695" %)
1149 Content-Type: text/plain; charset=utf-8
1150
1151 (% element-id="694" %)
1152 Content-Disposition: form-data; name="languageCode"
1153
1154
1155 (% element-id="691" %)
1156 nld
1157
1158 (% element-id="690" %)
1159 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca
1160
1161 (% element-id="689" %)
1162 Content-Type: text/plain; charset=utf-8
1163
1164 (% element-id="688" %)
1165 Content-Disposition: form-data; name="useZip"
1166
1167
1168 (% element-id="685" %)
1169 True
1170
1171 (% element-id="684" %)
1172 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca
1173
1174 (% element-id="683" %)
1175 Content-Type: text/plain; charset=utf-8
1176
1177 (% element-id="682" %)
1178 Content-Disposition: form-data; name="needsApprovalIsSupported"
1179
1180
1181 (% element-id="679" %)
1182 False
1183
1184 (% element-id="678" %)
1185 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca
1186
1187 (% element-id="677" %)
1188 Content-Disposition: form-data; name="orderXml"; filename="VivaTerraIndexAssignment.xml"
1189
1190 (% element-id="676" %)
1191 Content-Type: application/xml
1192
1193
1194 (% element-id="673" %)
1195 <SIKB File in Zip stream Base64  encoding>
1196
1197 (% element-id="672" %)
1198 ~-~-28a3e130-70c9-4a1a-b544-a802a1ade6ca~-~-
1199 )))
1200
1201 (% element-id="671" %)
1202 === (% element-id="670" %)Response example(%%) ===
1203
1204 (% element-id="669" %)
1205 (% element-id="667" %)|(% element-id="666" %)(% element-id="665" %)
1206 (((
1207 (% element-id="664" %)
1208 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
1209
1210 (% element-id="663" %)
1211 <Response>
1212
1213 (% element-id="662" %)
1214 <OrderId>7113828</OrderId>
1215
1216 (% element-id="661" %)
1217 <NeedsApproval>True</NeedsApproval>
1218
1219 (% element-id="660" %)
1220 <FileContent></FileContent>
1221
1222 (% element-id="659" %)
1223 <Status>
1224
1225 (% element-id="658" %)
1226 <StatusCode>1</StatusCode>
1227
1228 (% element-id="657" %)
1229 <StatusCodeDescription>OK</StatusCodeDescription>
1230
1231 (% element-id="656" %)
1232 <ErrorMessage></ErrorMessage>
1233
1234 (% element-id="655" %)
1235 </Status></Response>
1236 )))
1237
1238 (% element-id="654" %)
1239 = (% element-id="653" %)Get Order status and Results(%%) =
1240
1241 (% element-id="652" %)
1242 == (% element-id="651" %)Soluion/Design(%%) ==
1243
1244 (% element-id="650" %)
1245 TerraIndex will request per license/customer which results are ready. These are queried if the latest changes are newer than the last check. This way we never download too much unnecessarily and it can always be requested again.
1246
1247 (% class="table-hover" element-id="647" %)
1248 (% element-id="645" %)|(% element-id="644" %)Action|(% element-id="643" %)TerraIndex|(% element-id="642" %) |(% element-id="640" %)Laboratorium|(% element-id="639" %)Parameters/Message|(% element-id="638" %)Remarks|(% element-id="637" %)ResultCodes
1249 (% element-id="636" %)|(% element-id="635" %)1|(% element-id="634" %)Sends a request to the function: GetCustomers().|=(% element-id="633" %)>|(% element-id="632" %) |(% element-id="630" %)WebserviceUsername (string), 
1250 WebservicePassword (string),
1251 CustomerUsername (string)|(% element-id="627" %)We want to skip the Password of the customer, and we introduce the WebserviceUsername + WebservicePassword.|(% element-id="626" %)
1252 (% element-id="624" %)|(% element-id="623" %)2|(% element-id="622" %) |(% element-id="620" %) |(% element-id="618" %)Receives the request and check the customers this username and searches the dateLastChanged for this Customer.|(% element-id="617" %) |(% element-id="615" %) |(% element-id="613" %)
1253 (% element-id="611" %)|(% element-id="610" %)3|(% element-id="609" %) |(% element-id="607" %)<=|(% element-id="606" %)Sends back the list of customers with the lastChangedTimestamp|(% element-id="605" %)ResultCode (),
1254 ErrorMessage (string),
1255 List<customer> , Customer:
1256 CustomerCode (string),
1257 CustomerName (string),
1258 LabID (int),
1259 LabName (string),
1260 ChangedTimeStamp (DateTime)|(% element-id="597" %)We receive the dateTimestamp instead of sending it, so we always get the full list and we are also able to delete customercodes.|(% element-id="596" %)1 = Success,
1261 2 = GeneralError,
1262 3 = WrongSIKBVersion,
1263 4 = InvalidCredentials,
1264 5 = CustomerUsernameInvalid,
1265 6 = CustomerUsernameNotValidForCustomerCode
1266 7 = FileContentProblem,
1267 8 = InvalidOrderId,
1268 9 = OrderIdAlreadyApproved
1269 10 = PDFNotAvailable
1270 (% element-id="586" %)|(% element-id="585" %)4|(% element-id="584" %)Receives the list of Customers. Read the Timestamp this Customer is last checked for Results/Statuses.|(% element-id="583" %) |(% element-id="581" %) |(% element-id="579" %) |(% element-id="577" %) |(% element-id="575" %)
1271 (% element-id="573" %)|(% element-id="572" %)5|(% element-id="571" %)Send for each Customer a  call to retreive all orders statuses changes since a certain timestamp.
1272 Function: GetOrderStatuses()|=(% element-id="569" %)>|(% element-id="568" %) |(% element-id="566" %)WebserviceUsername (string), 
1273 WebservicePassword (string),
1274 CustomerUsername (string),
1275 CustomerCode (string),
1276 LastCheckedTimestamp (DateTime)|(% element-id="561" %)TerraIndex keeps track of the last check timestamp for each license.|(% element-id="560" %)
1277 (% element-id="558" %)|(% element-id="557" %)6|(% element-id="556" %) |(% element-id="554" %) |(% element-id="552" %)Receives the request and check the orders that are changed since the timestamp for this Customer.|(% element-id="551" %) |(% element-id="549" %) |(% element-id="547" %)
1278 (% element-id="545" %)|(% element-id="544" %)7|(% element-id="543" %) |(% element-id="541" %)<=|(% element-id="540" %)Sends back the list of orders with the status and lastChangedTimestamp|(% element-id="539" %)ResultCode (),
1279 ErrorMessage (string),
1280 OrderID (string),
1281 LabassignmentGUID (GUID),
1282 CertificateNumber (string)
1283 OrderStatusSIKB (int),
1284 Delayed (boolean),
1285 ExpectedTimeStamp (DateTime),|(% element-id="531" %)OrderStatusSIKB is the SIKB Labassignment status.
1286 \\Delayed is a boolean to tell the customer a order will be later ready then expected. The ExpectedTimestamp.
1287 If Delayed for the firsttime, TerraIndex can send a notification to the users and show a different layout.
1288 \\LabassignmentGUID is filled to support also Labassignments that are not from TerraIndex Ordered.|(% element-id="525" %)1 = Success,
1289 2 = GeneralError,
1290 3 = WrongSIKBVersion,
1291 4 = InvalidCredentials,
1292 5 = CustomerUsernameInvalid,
1293 6 = CustomerUsernameNotValidForCustomerCode
1294 7 = FileContentProblem,
1295 8 = InvalidOrderId,
1296 9 = OrderIdAlreadyApproved
1297 10 = PDFNotAvailable
1298 (% element-id="515" %)|(% element-id="514" %)8|(% element-id="513" %)Receives the list of Orders with status.
1299 Update the CertificateNr if this is not already present in the labassignment. |(% element-id="511" %) |(% element-id="509" %) |(% element-id="507" %) |(% element-id="505" %)CertifcateNumber could be new here, if the lab wasn't able to fill it directly at the ApproveOrder.|(% element-id="504" %)
1300 (% element-id="502" %)|(% element-id="501" %)9|(% element-id="500" %)Send for each Order a call to retreive all results.
1301 Function: GetOrderResults()|=(% element-id="498" %)>|(% element-id="497" %) |(% element-id="495" %)WebserviceUsername (string), 
1302 WebservicePassword (string),
1303 CustomerUsername (string),
1304 CustomerCode (string),
1305 OrderID (string),
1306 SIKBVersion (string, default: '13.4.0')|(% element-id="489" %)Besides SIKB 13.4.0, TerraIndex also supports 9.0.0/8.0.0 etc.|(% element-id="488" %)
1307 (% element-id="486" %)|(% element-id="485" %)10|(% element-id="484" %) |(% element-id="482" %) |(% element-id="480" %)Receives the request and creates a SIKB results file based on the version that is requested.|(% element-id="479" %) |(% element-id="477" %) |(% element-id="475" %)
1308 (% element-id="473" %)|(% element-id="472" %)11|(% element-id="471" %) |(% element-id="469" %)<=|(% element-id="468" %)Sends back the results of the orders.|(% element-id="467" %)ResultCode (),
1309 ErrorMessage (string),
1310 OrderId (string),
1311 LabassignmentGUID (GUID),
1312 FileContent_Base64 (string),
1313 UseZipStream/UseZip (bool, default: 'false'),|(% element-id="461" %) |(% element-id="459" %)1 = Success,
1314 2 = GeneralError,
1315 3 = WrongSIKBVersion,
1316 4 = InvalidCredentials,
1317 5 = CustomerUsernameInvalid,
1318 6 = CustomerUsernameNotValidForCustomerCode
1319 7 = FileContentProblem,
1320 8 = InvalidOrderId,
1321 9 = OrderIdAlreadyApproved
1322 10 = PDFNotAvailable
1323 (% element-id="449" %)|(% element-id="448" %)12|(% element-id="447" %)Receives the results and imports all results.|(% element-id="446" %) |(% element-id="444" %) |(% element-id="442" %) |(% element-id="440" %)(% element-id="439" %)
1324 (((
1325 (% element-id="438" %)
1326 Import will be done to corresponding samples based on:
1327
1328 (% element-id="437" %)
1329 * Find Project by ProjectGUID (as provided in the labassignment)
1330 * Find Project by ProjectCode (as provided in the Labassignment)
1331 * Find Project and Labassignment by LabassignmentGUID (as provided in the Labassignment)
1332 * Find Project (only if Project is not found yet) and Samples based on SampleGUID (as provided in the Labassignment) .
1333 Sample GUIDs that are send to the lab in the labassignment version SIKB 13 or higher are required in the results for labassignment.
1334 For lower version Labassignments the lab should return the 'old' idanlmons as SampleGUID in the XML.
1335 * Find Samples (only if Project is already found ) by SampleName
1336
1337 (% element-id="429" %)
1338 What is imported?
1339
1340 (% element-id="428" %)
1341 * If Sample is found, the results in the XML are always all updated and/or inserted.
1342 * If Project is found, but the sample is not; The Sample and the results are inserted as new Sample. (If watersample; fake filtertube and fake measurementpoints are created)
1343 )))|(% element-id="425" %)
1344 (% element-id="423" %)|(% element-id="422" %)13|(% element-id="421" %)If OrderStatus is 'Completed/Reported' (SIKBID: 5)
1345 Request the PDF certificate.
1346 Function: GetOrderPDF()|=(% element-id="418" %)>|(% element-id="417" %) |(% element-id="415" %)WebserviceUsername (string), 
1347 WebservicePassword (string),
1348 CustomerUsername (string),
1349 CustomerCode (string),
1350 OrderID (string),|(% element-id="410" %) |(% element-id="408" %)
1351 (% element-id="406" %)|(% element-id="405" %)14|(% element-id="404" %) |(% element-id="402" %) |(% element-id="400" %)Receives the request and creates the PDF for the Order.|(% element-id="399" %) |(% element-id="397" %) |(% element-id="395" %)
1352 (% element-id="393" %)|(% element-id="392" %)15|(% element-id="391" %) |(% element-id="389" %)<=|(% element-id="388" %)Sends back the PDF of the order.|(% element-id="387" %)ResultCode (),
1353 ErrorMessage (string),
1354 OrderId (string),
1355 LabassignmentGUID (GUID),
1356 FileContent_Base64 (string),
1357 UseZipStream/UseZip (bool, default: 'false'),|(% element-id="381" %)If the PDF is not available yet, please give the resultcode: PDFNotAvailable.|(% element-id="380" %)1 = Success,
1358 2 = GeneralError,
1359 3 = WrongSIKBVersion,
1360 4 = InvalidCredentials,
1361 5 = CustomerUsernameInvalid,
1362 6 = CustomerUsernameNotValidForCustomerCode
1363 7 = FileContentProblem,
1364 8 = InvalidOrderId,
1365 9 = OrderIdAlreadyApproved
1366 10 = PDFNotAvailable
1367 (% element-id="370" %)|(% element-id="369" %)12|(% element-id="368" %)Receives the PDF and stores it for reporting and downloading.|(% element-id="367" %) |(% element-id="365" %) |(% element-id="363" %) |(% element-id="361" %) |(% element-id="359" %)
1368
1369 (% element-id="357" %)
1370 = (% element-id="356" %)Customer wants to see real time information about the status in the interface(%%) =
1371
1372 (% element-id="354" %)
1373 == (% element-id="353" %)Solution/Design(%%) ==
1374
1375 (% element-id="352" %)
1376 To always show up-to-date information in the TerraIndex interface when a user opens a lab assignment to see the status, we reuse part of the GetOrderStatus, but with a specific OrderID.
1377
1378 (% element-id="351" %)
1379 ..NOT SUPPORTED YET...
1380
1381 (% class="table-hover" element-id="350" %)
1382 (% element-id="348" %)|(% colspan="1" element-id="347" %)Action|(% colspan="1" element-id="346" %)TerraIndex|(% colspan="1" element-id="345" %) |(% colspan="1" element-id="343" %)Laboratorium|(% colspan="1" element-id="342" %)Parameters/Message|(% colspan="1" element-id="341" %)Remarks|(% colspan="1" element-id="340" %)ResultCodes
1383 (% element-id="339" %)|(% element-id="338" %)1|(% element-id="337" %)Request the Order status for a single Order/Labassignment.
1384 Function: GetOrderStatus()|=(% element-id="335" %)>|(% element-id="334" %) |(% element-id="332" %)WebserviceUsername (string), 
1385 WebservicePassword (string),
1386 CustomerUsername (string),
1387 CustomerCode (string),
1388 OrderID (string),|(% element-id="327" %) |(% element-id="325" %)
1389 (% element-id="323" %)|(% element-id="322" %)2|(% element-id="321" %) |(% element-id="319" %) |(% element-id="317" %)Receives the request and gets the status for the Order.|(% element-id="316" %) |(% element-id="314" %) |(% element-id="312" %)
1390 (% element-id="310" %)|(% element-id="309" %)3|(% element-id="308" %) |(% element-id="306" %)<=|(% element-id="305" %)Sends back the status of the order.|(% element-id="304" %)ResultCode (),
1391 ErrorMessage (string),
1392 OrderID (string),
1393 LabassignmentGUID (GUID),
1394 CertificateNumber (string)
1395 OrderStatusSIKB (int),
1396 Delayed (boolean),
1397 ExpectedTimeStamp (DateTime),|(% element-id="296" %)OrderStatusSIKB is the SIKB Labassignment status.
1398 \\Delayed is a boolean to tell the customer a order will be later ready then expected. The ExpectedTimestamp.
1399 If Delayed for the firsttime, TerraIndex can send a notification to the users and show a different layout.
1400 \\LabassignmentGUID is filled to support also Labassignments that are not from TerraIndex Ordered.|(% element-id="290" %)1 = Success,
1401 2 = GeneralError,
1402 3 = WrongSIKBVersion,
1403 4 = InvalidCredentials,
1404 5 = CustomerUsernameInvalid,
1405 6 = CustomerUsernameNotValidForCustomerCode
1406 7 = FileContentProblem,
1407 8 = InvalidOrderId,
1408 9 = OrderIdAlreadyApproved
1409 10 = PDFNotAvailable
1410 (% element-id="280" %)|(% element-id="279" %)4|(% element-id="278" %)Receives the status and shows in the interface the updated info.
1411 Update the CertificateNr if this is not already present in the labassignment. |(% element-id="276" %) |(% element-id="274" %) |(% element-id="272" %) |(% element-id="270" %)CertifcateNumber could be new here, if the lab wasn't able to fill it directly at the ApproveOrder.|(% element-id="269" %)
1412
1413 (% element-id="265" %)
1414