diff --git a/custom-work/support-diagnostic-report-templates/case 4398 test api locahost route.ayrt b/custom-work/support-diagnostic-report-templates/case 4398 test api locahost route.ayrt new file mode 100644 index 00000000..544badec --- /dev/null +++ b/custom-work/support-diagnostic-report-templates/case 4398 test api locahost route.ayrt @@ -0,0 +1 @@ +{"Name":"case 4398 test api locahost route","Active":true,"Notes":"This is a diagnostic test report to troubleshoot issues with case 4398 \"Error rendering reports: JobFailed: PuppeteerSharp -> Evaluation failed: TypeError: Failed to fetch at ayPostToAPI\"","Roles":124415,"AType":8,"IncludeWoItemDescendants":false,"Template":"\n\n\n
LOCALHOST OVERRIDE TEST
\n
\n {{ayJSON ayReportData}}\n
\n\n","Style":"body {\r\n font-family: 'Helvetica', 'Helvetica Neue', Arial, sans-serif; \r\n}\r\n\r\n.reporttitle { \r\n margin-bottom: 20pt; \r\n font-weight: bold; \r\n font-size: 13pt; \r\n color: #9e9e9e;\r\n} \r\n\r\ntable { \r\n border-collapse: collapse;\r\n white-space: pre-wrap;\r\n width: 100%;\r\n table-layout: fixed;\r\n }\r\n\r\nth {\r\n height: 20px;\r\n font-size: 10pt; \r\n color: #9e9e9e;\r\n text-align: right;\r\n}\r\n\r\n.lrgtext {\r\n height: 20px;\r\n font-size: 10pt; \r\n}\r\n\r\ntbody td {\r\n padding: 10px;\r\n word-wrap: break-word;\r\n font-size: 8pt;\r\n}\r\n\r\n\r\ntbody tr:nth-child(even) {\r\n background-color: #f8f8f8; /* MUST checkmark Print background in PDF Options for this to show */\r\n}\r\n\r\n\r\n.rightlean {\r\n text-align: right;\r\n}\r\n.leftlean {\r\n text-align: left;\r\n}\r\n.centerlean {\r\n text-align: center;\r\n}\r\n\r\n\r\n.fontgreen {\r\n color: green;\r\n font-size: 16pt;\r\n}\r\n.fontblue {\r\n color: blue;\r\n}\r\n.fontred {\r\n color:red;\r\n}\r\n\r\n","JsPrerender":"async function ayPrepareData(ayData) {\n\n //Test to diagnose error accessing api during report rendering\n let item = ayData.ayReportData[0];\n item['CASE__4398__TEST__ERRORS'] = 'no error';\n var ayTranslationKeyCache = {};\n var keys = [\"Name\", \"CustomerList\", \"Customer\", \"CustomerAccountNumber\", \"CustomerBillHeadOffice\", \"AddressTypePhysical\", \"CustomerPhone1\", \"CustomerEmail\", \"ContractExpires\", \"Contract\", \"LastServiceWorkOrder\", \"CustomerAlertNotes\", \"CustomerTechNotes\"];\n try {\n let transData = await testAyPostToAPI(\"http://localhost:7575/api/v8.0/translation/subset\", keys, null, item);\n transData.data.forEach(function storeFetchedTranslationItemsInCache(\n item\n ) {\n ayTranslationKeyCache[item.key] = item.value;\n });\n item['CASE__4398__TEST__TRANSLATIONS'] = ayTranslationKeyCache;\n } catch (error) {\n item['CASE__4398__TEST__ERRORS'] = errorToString(error);\n item['CASE__4398__TEST__TRANSLATIONS'] = \"FAILED\";\n }\n\n return ayData;\n}\n\nfunction errorToString(err) {\n if (typeof err.json === \"function\") {\n err.json().then(jsonError => {\n return `Json error from API ${jsonError}`;\n }).catch(genericError => {\n return `Generic error from API ${err.statusText}`;\n });\n } else {\n return `Error ${err}`;\n }\n}\n\nasync function testAyPostToAPI(route, data, token, item) {\n token = token || AYMETA.ayClientMetaData.Authorization;\n if (route && !route.startsWith(\"http\")) {\n route = AYMETA.ayServerMetaData.ayApiUrl + route;\n }\n //api expects custom fields to be a string not an object\n if (data && data.CustomFields && data.CustomFields.constructor === Object) {\n data.CustomFields = JSON.stringify(data.CustomFields);\n }\n try {\n let fetchOptions = {\n method: \"post\",\n mode: \"cors\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: token\n },\n body: JSON.stringify(data)\n };\n item['CASE__4398__POST_TO_API_TEST__FETCH_OPTIONS'] = JSON.stringify(fetchOptions);\n let r = await fetch(route, fetchOptions);\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_OK'] = r.ok;\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_TYPE'] = r.type;\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_STATUS'] = r.status;\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_STATUS_TEXT'] = r.statusText;\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_URL'] = r.url;\n return await testExtractBodyEx(r);\n } catch (error) {\n item['CASE__4398__POST_TO_API_TEST__ERRORS'] = errorToString(error);\n throw error;\n }\n}\n\n\nasync function testExtractBodyEx(response) {\n\n if (response.status == 204) {\n //no content, nothing to process\n return response;\n }\n if (response.status == 202) {\n //Accepted, nothing to process\n return response;\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (!contentType) {\n return response;\n }\n if (contentType.includes(\"json\")) {\n return await response.json();\n }\n if (contentType.includes(\"text/plain\")) {\n return await response.text();\n }\n\n if (contentType.includes(\"application/pdf\")) {\n return await response.blob();\n }\n return response;\n}","JsHelpers":"","RenderType":0,"HeaderTemplate":"  ","FooterTemplate":"                Printed date: PDFDate\nPage of                ","DisplayHeaderFooter":true,"PaperFormat":0,"Landscape":false,"MarginOptionsBottom":"15mm","MarginOptionsLeft":"20mm","MarginOptionsRight":"20mm","MarginOptionsTop":"10mm","PageRanges":null,"PreferCSSPageSize":false,"PrintBackground":true,"Scale":1.00000} \ No newline at end of file diff --git a/custom-work/support-diagnostic-report-templates/case 4398 test api normal route simulation.ayrt b/custom-work/support-diagnostic-report-templates/case 4398 test api normal route simulation.ayrt new file mode 100644 index 00000000..cebc5927 --- /dev/null +++ b/custom-work/support-diagnostic-report-templates/case 4398 test api normal route simulation.ayrt @@ -0,0 +1 @@ +{"Name":"case 4398 test api normal route simulation","Active":true,"Notes":"This is a diagnostic test report to troubleshoot issues with case 4398 \"Error rendering reports: JobFailed: PuppeteerSharp -> Evaluation failed: TypeError: Failed to fetch at ayPostToAPI\"","Roles":124415,"AType":8,"IncludeWoItemDescendants":false,"Template":"\n\n\n
NORMAL ROUTE SIMULATION
\n
\n {{ayJSON ayReportData}}\n
\n\n","Style":"body {\r\n font-family: 'Helvetica', 'Helvetica Neue', Arial, sans-serif; \r\n}\r\n\r\n.reporttitle { \r\n margin-bottom: 20pt; \r\n font-weight: bold; \r\n font-size: 13pt; \r\n color: #9e9e9e;\r\n} \r\n\r\ntable { \r\n border-collapse: collapse;\r\n white-space: pre-wrap;\r\n width: 100%;\r\n table-layout: fixed;\r\n }\r\n\r\nth {\r\n height: 20px;\r\n font-size: 10pt; \r\n color: #9e9e9e;\r\n text-align: right;\r\n}\r\n\r\n.lrgtext {\r\n height: 20px;\r\n font-size: 10pt; \r\n}\r\n\r\ntbody td {\r\n padding: 10px;\r\n word-wrap: break-word;\r\n font-size: 8pt;\r\n}\r\n\r\n\r\ntbody tr:nth-child(even) {\r\n background-color: #f8f8f8; /* MUST checkmark Print background in PDF Options for this to show */\r\n}\r\n\r\n\r\n.rightlean {\r\n text-align: right;\r\n}\r\n.leftlean {\r\n text-align: left;\r\n}\r\n.centerlean {\r\n text-align: center;\r\n}\r\n\r\n\r\n.fontgreen {\r\n color: green;\r\n font-size: 16pt;\r\n}\r\n.fontblue {\r\n color: blue;\r\n}\r\n.fontred {\r\n color:red;\r\n}\r\n\r\n","JsPrerender":"async function ayPrepareData(ayData) {\n\n //Test to diagnose error accessing api during report rendering\n let item = ayData.ayReportData[0];\n item['CASE__4398__TEST__ERRORS'] = 'no error';\n var ayTranslationKeyCache = {};\n var keys = [\"Name\", \"CustomerList\", \"Customer\", \"CustomerAccountNumber\", \"CustomerBillHeadOffice\", \"AddressTypePhysical\", \"CustomerPhone1\", \"CustomerEmail\", \"ContractExpires\", \"Contract\", \"LastServiceWorkOrder\", \"CustomerAlertNotes\", \"CustomerTechNotes\"];\n try {\n //Normal route similar to how AyaNova handles by default \n let transData = await testAyPostToAPI(\"translation/subset\", keys, null, item);\n transData.data.forEach(function storeFetchedTranslationItemsInCache(\n item\n ) {\n ayTranslationKeyCache[item.key] = item.value;\n });\n item['CASE__4398__TEST__TRANSLATIONS'] = ayTranslationKeyCache;\n } catch (error) {\n item['CASE__4398__TEST__ERRORS'] = errorToString(error);\n item['CASE__4398__TEST__TRANSLATIONS'] = \"FAILED\";\n }\n\n return ayData;\n}\n\nfunction errorToString(err) {\n if (typeof err.json === \"function\") {\n err.json().then(jsonError => {\n return `Json error from API ${jsonError}`;\n }).catch(genericError => {\n return `Generic error from API ${err.statusText}`;\n });\n } else {\n return `Error ${err}`;\n }\n}\n\nasync function testAyPostToAPI(route, data, token, item) {\n token = token || AYMETA.ayClientMetaData.Authorization;\n if (route && !route.startsWith(\"http\")) {\n route = AYMETA.ayServerMetaData.ayApiUrl + route;\n }\n //api expects custom fields to be a string not an object\n if (data && data.CustomFields && data.CustomFields.constructor === Object) {\n data.CustomFields = JSON.stringify(data.CustomFields);\n }\n try {\n let fetchOptions = {\n method: \"post\",\n mode: \"cors\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: token\n },\n body: JSON.stringify(data)\n };\n item['CASE__4398__POST_TO_API_TEST__FETCH_OPTIONS'] = JSON.stringify(fetchOptions);\n let r = await fetch(route, fetchOptions);\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_OK'] = r.ok;\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_TYPE'] = r.type;\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_STATUS'] = r.status;\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_STATUS_TEXT'] = r.statusText;\n item['CASE__4398__POST_TO_API_TEST__RESPONSE_URL'] = r.url;\n return await testExtractBodyEx(r);\n } catch (error) {\n item['CASE__4398__POST_TO_API_TEST__ERRORS'] = errorToString(error);\n throw error;\n }\n}\n\n\nasync function testExtractBodyEx(response) {\n\n if (response.status == 204) {\n //no content, nothing to process\n return response;\n }\n if (response.status == 202) {\n //Accepted, nothing to process\n return response;\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (!contentType) {\n return response;\n }\n if (contentType.includes(\"json\")) {\n return await response.json();\n }\n if (contentType.includes(\"text/plain\")) {\n return await response.text();\n }\n\n if (contentType.includes(\"application/pdf\")) {\n return await response.blob();\n }\n return response;\n}","JsHelpers":"","RenderType":0,"HeaderTemplate":"  ","FooterTemplate":"                Printed date: PDFDate\nPage of                ","DisplayHeaderFooter":true,"PaperFormat":0,"Landscape":false,"MarginOptionsBottom":"15mm","MarginOptionsLeft":"20mm","MarginOptionsRight":"20mm","MarginOptionsTop":"10mm","PageRanges":null,"PreferCSSPageSize":false,"PrintBackground":true,"Scale":1.00000} \ No newline at end of file