{"database": "fishbowl_archive", "table": "biscript", "rows": [[10, "_binary \u0001", "google.charts.load('current', {\r\n  'packages': ['geochart'],\r\n  'mapsApiKey': 'AIzaSyBZsbr4RQBre8LIOeEN9P-qlmiKGSi95aU'\r\n});\r\n\r\nconst dateRange = $RANGE{Date_Range|This year-to-date};\r\nlet defaultDrillDown = {\r\n    region: \"$TEXT{Default_Location|Global}\"\r\n};\r\nlet dateStr = UTIL.convertDate(dateRange.fromDate, true) + \" - \" + UTIL.convertDate(dateRange.toDate, false);\r\nif (moment(dateRange.fromDate).isSame('1000-01-01', 'year') && moment(dateRange.toDate).isSame('3000-01-01', 'year')) {\r\n  dateStr = 'All';\r\n}\r\n\r\nconst VIEW = {\r\n  world: \"world\",\r\n  country: \"country\",\r\n  province: \"province\"\r\n};\r\n\r\nlet currentView = VIEW.world;\r\nlet previousCountry;\r\ngoogle.charts.setOnLoadCallback(drawWorldMap);\r\n\r\nconst btnBack = document.getElementById('button');\r\nconst subTitleHTML = document.getElementById('subTitle');\r\nconst titleHTML = document.getElementById('title');\r\nconst descriptionHTML = document.getElementById('description');\r\n\r\nbtnBack.addEventListener(\"click\", btnBackEvent);\r\nlet chart;\r\n\r\nlet currentData = {};\r\n\r\nlet subTitle = 'Global';\r\n\r\nlet worldData;\r\n\r\nlet countryData;\r\nlet countryOptions = {\r\n  legend: {\r\n    textStyle: {\r\n      fontSize: 16\r\n    },\r\n    numberFormat: '\u00c2\u00a4#,##0.00'\r\n  },\r\n  resolution: \"provinces\",\r\n  keepAspectRatio: true,\r\n  width: '100%',\r\n  height: '100%'\r\n};\r\n\r\nfunction getWorldData() {\r\n  let worldFbData = JSON.parse(runQuery(\"SELECT SUM(postSoItem.totalPrice) AS totalPrice, abbreviation FROM postSoItem \" +\r\n    \"JOIN soItem ON postSoItem.soItemId = soItem.id \" +\r\n    \"JOIN so ON so.id = soItem.soId AND soItem.statusID = 50 AND soItem.typeId <> 40 \" +\r\n    \"JOIN CountryConst ON so.billToCountryId = CountryConst.id \" +\r\n    \"JOIN postso ON postso.id = postsoitem.postsoid \" +\r\n    \"WHERE postSoItem.totalPrice > 0 AND postSo.postDate >= '\" + dateRange.fromDate + \"' AND postSo.postDate <= '\" + dateRange.toDate + \"' \" +\r\n    \"GROUP BY CountryConst.id\"));\r\n\r\n  let worldData = [\r\n    ['Country', 'Revenue', {\r\n      type: 'string',\r\n      role: 'tooltip'\r\n    }]\r\n  ];\r\n  for (let i = 0; i < worldFbData.length; i++) {\r\n    worldData.push([worldFbData[i].abbreviation, worldFbData[i].totalprice, 'Revenue: ' + UTIL.dollarify(worldFbData[i].totalprice)]);\r\n  }\r\n\r\n  return worldData;\r\n}\r\n\r\n// Solid color fill for US, CA, and AU\r\nfunction getSolidProvincesData(country) {\r\n  let USCAdata = JSON.parse(runQuery(\"SELECT SUM(postSoItem.totalPrice) AS totalPrice, code AS state, billToCity AS city FROM postSoItem \" +\r\n    \"JOIN soItem ON postSoItem.soItemId = soItem.id \" +\r\n    \"JOIN so ON so.Id = soItem.soId AND soItem.statusId = 50 AND soItem.typeId <> 40 \" +\r\n    \"LEFT JOIN StateConst ON so.billToStateId = StateConst.id \" +\r\n    \"JOIN CountryConst ON so.billToCountryId = CountryConst.id AND CountryConst.abbreviation = '\" + country + \"' \" +\r\n    \"JOIN postso ON postso.soId = so.id \" +\r\n    \"WHERE postSoItem.totalPrice > 0 AND postSo.postDate >= '\" + dateRange.fromDate + \"' AND postSo.postDate <= '\" + dateRange.toDate + \"' \" +\r\n    \"GROUP BY state\"));\r\n\r\n  let tableData = [\r\n    [\"State\", \"Revenue\", {\r\n      type: 'string',\r\n      role: 'tooltip'\r\n    }]\r\n  ];\r\n\r\n  for (let i = 0; i < USCAdata.length; i++) {\r\n    let region = country + \"-\" + USCAdata[i].state;\r\n    tableData.push([region, USCAdata[i].totalprice, 'Revenue: ' + UTIL.dollarify(USCAdata[i].totalprice)]);\r\n  }\r\n\r\n  return tableData;\r\n}\r\n\r\nfunction getCountryData(country) {\r\n  let countryFbData = JSON.parse(runQuery(\"SELECT SUM(postSoItem.totalPrice) AS totalPrice, code AS state, billToCity AS city FROM postSoItem \" +\r\n    \"JOIN soItem ON postSoItem.soItemId = soItem.id \" +\r\n    \"JOIN so ON so.Id = soItem.soId AND soItem.statusId = 50 AND soItem.typeId <> 40 \" +\r\n    \"LEFT JOIN StateConst ON so.billToStateId = StateConst.id \" +\r\n    \"JOIN CountryConst ON so.billToCountryId = CountryConst.id AND CountryConst.abbreviation = '\" + country + \"' \" +\r\n    \"JOIN postso ON postso.soId = so.id \" +\r\n    \"WHERE postSoItem.totalPrice > 0 AND postSo.postDate >= '\" + dateRange.fromDate + \"' AND postSo.postDate <= '\" + dateRange.toDate + \"' \" +\r\n    \"GROUP BY city\"));\r\n\r\n  let tableData = [\r\n    [\"City\", \"Revenue\", {\r\n      type: 'string',\r\n      role: 'tooltip'\r\n    }]\r\n  ];\r\n\r\n  for (let i = 0; i < countryFbData.length; i++) {\r\n    tableData.push([countryFbData[i].city, countryFbData[i].totalprice, 'Revenue: ' + UTIL.dollarify(countryFbData[i].totalprice)]);\r\n  }\r\n\r\n  return tableData;\r\n}\r\n\r\nfunction getProvinceData(country, province) {\r\n  let provinceData = JSON.parse(runQuery(\"SELECT SUM(postSoItem.totalPrice) AS totalPrice, code AS state, billToCity AS city FROM postSoItem \" +\r\n    \"JOIN soItem ON postSoItem.soItemId = soItem.id \" +\r\n    \"JOIN so ON so.Id = soItem.soId AND soItem.statusId = 50 AND soItem.typeId <> 40 \" +\r\n    \"LEFT JOIN StateConst ON so.billToStateId = StateConst.id \" +\r\n    \"JOIN CountryConst ON so.billToCountryId = CountryConst.id AND CountryConst.abbreviation = '\" + country + \"' \" +\r\n    \"JOIN postso ON postso.soId = so.id \" +\r\n    \"WHERE postSoItem.totalPrice > 0 AND postSo.postDate >= '\" + dateRange.fromDate + \"' AND postSo.postDate <= '\" + dateRange.toDate + \"' \" +\r\n    \"AND CODE = '\" + province + \"' \" +\r\n    \"GROUP BY city\"));\r\n\r\n  let tableData = [\r\n    [\"City\", \"Revenue\", {\r\n      type: 'string',\r\n      role: 'tooltip'\r\n    }]\r\n  ];\r\n\r\n  for (let i = 0; i < provinceData.length; i++) {\r\n    tableData.push([provinceData[i].city, provinceData[i].totalprice, 'Revenue: ' + UTIL.dollarify(provinceData[i].totalprice)]);\r\n  }\r\n\r\n  return tableData;\r\n}\r\n\r\nfunction drawWorldMap() {\r\n  btnBack.style.visibility = 'hidden';\r\n  subTitle = 'Global';\r\n  currentView = VIEW.world;\r\n  worldData = google.visualization.arrayToDataTable(getWorldData());\r\n  chart = new google.visualization.GeoChart(document.getElementById('regions_div'));\r\n  google.visualization.events.addListener(chart, 'regionClick', drawCountryMap);\r\n\r\n\r\n  const worldOptions = {\r\n    legend: {\r\n      textStyle: {\r\n        fontSize: 16\r\n      },\r\n      numberFormat: '\u00c2\u00a4#,##0.00'\r\n    },\r\n    displayMode: 'auto',\r\n    keepAspectRatio: true,\r\n    width: '100%',\r\n    height: '100%'\r\n  };\r\n\r\n  currentData.data = worldData;\r\n  currentData.options = worldOptions;\r\n\r\n  subTitleHTML.innerHTML = subTitle;\r\n  chart.draw(currentData.data, currentData.options);\r\n  \r\n  if (defaultDrillDown && defaultDrillDown.region != \"Global\") {\r\n      google.visualization.events.trigger(chart, 'regionClick', defaultDrillDown);\r\n      \r\n      if (defaultDrillDown.region.length > 2) {\r\n        currentView = VIEW.province;\r\n        previousCountry = {\r\n            region: defaultDrillDown.region.substring(0, 2)\r\n        };\r\n      }\r\n      defaultDrillDown = null;\r\n  }\r\n}\r\n\r\nfunction drawCountryMap(country) {\r\n  if (currentView == VIEW.world) {\r\n    previousCountry = country;\r\n  }\r\n  currentView = VIEW.country;\r\n  btnBack.style.visibility = 'visible';\r\n  let countryStr = country.region.substring(0, 2);\r\n  let hasProvinces = countryStr == 'US' || countryStr == 'CA' || countryStr == 'AU';\r\n  countryData = hasProvinces ? google.visualization.arrayToDataTable(getSolidProvincesData(countryStr)) :\r\n    google.visualization.arrayToDataTable(getCountryData(countryStr));\r\n\r\n  subTitle = country.region;\r\n\r\n  if (country.region.includes('-')) {\r\n    currentView = VIEW.province;\r\n    let provinceStr = country.region.substring(3);\r\n    countryOptions.displayMode = 'markers';\r\n    countryOptions.region = country.region;\r\n    if (countryStr == 'CA' || countryStr == 'AU') {\r\n      countryOptions.region = countryStr;\r\n    }\r\n    let provinceData = google.visualization.arrayToDataTable(getProvinceData(countryStr, provinceStr));\r\n    currentData.data = provinceData;\r\n    currentData.options = countryOptions;\r\n  } else {\r\n    countryOptions.region = countryStr;\r\n    countryOptions.displayMode = hasProvinces ? 'auto' : 'markers';\r\n    currentData.data = countryData;\r\n    currentData.options = countryOptions;\r\n  }\r\n\r\n  chart.draw(currentData.data, currentData.options);\r\n  subTitleHTML.innerHTML = subTitle;\r\n}\r\n\r\nfunction btnBackEvent() {\r\n  if (currentView == VIEW.province) {\r\n    drawCountryMap(previousCountry);\r\n  } else {\r\n    drawWorldMap();\r\n  }\r\n}\r\n\r\nwindow.onresize = function (event) {\r\n  chart.draw(currentData.data, currentData.options);\r\n}\r\n\r\ntitleHTML.innerHTML = \"Sales By Region\";\r\nsubTitleHTML.innerHTML = subTitle;\r\ndescriptionHTML.innerHTML = dateStr;", "2023-01-05 17:28:06.959000", "Query and logic for the Sales By Region page", "Sales By Region", "", 20, 3, "sales-by-region", 0]], "columns": ["id", "active", "data", "dateLastModified", "description", "name", "note", "typeId", "fbVersion", "fbName", "published"], "primary_keys": ["id"], "primary_key_values": ["10"], "units": {}, "query_ms": 2.9733250266872346}