From 85161e992fec2f768560cbe2ae170f0954c481d0 Mon Sep 17 00:00:00 2001
From: Shaun Lum <shaun.lum@gov.bc.ca>
Date: Fri, 17 Nov 2023 14:24:29 -0800
Subject: [PATCH] added school fixes

---
 backend/src/components/utils.js        | 31 ++++++++++++++--
 backend/src/routes/district-router.js  | 11 ++----
 backend/src/routes/institute-router.js | 49 +++++++++++++++++++++++++-
 backend/src/routes/school-router.js    |  6 ++--
 4 files changed, 83 insertions(+), 14 deletions(-)

diff --git a/backend/src/components/utils.js b/backend/src/components/utils.js
index 7100612..8d5d816 100644
--- a/backend/src/components/utils.js
+++ b/backend/src/components/utils.js
@@ -239,7 +239,18 @@ function addDistrictLabels(jsonData, districtList) {
     return data.filter(item => !valuesToExclude.includes(item[field]));
   }
 
-
+  function filterByPubliclyAvailableCodes(jsonArray, fieldName, publicCodes) {
+    // Filter the array based on the condition
+    const filteredArray = jsonArray.filter(item => {
+      // Extract the field value (or use an empty string if the field is not present)
+      const fieldValue = item[fieldName] || '';
+  
+      // Check if the fieldValue exactly matches any string from the stringsToRemove array
+      return publicCodes.includes(fieldValue);
+    });
+  
+    return filteredArray;
+  }
   function filterByField(jsonArray, fieldName, stringsToRemove) {
     // Filter the array based on the condition
     const filteredArray = jsonArray.filter(item => {
@@ -257,7 +268,9 @@ function addDistrictLabels(jsonData, districtList) {
   
     return data.filter(item => {
       const expiryDate = item.expiryDate ? new Date(item.expiryDate) : null;
-      return expiryDate === null || currentDate < expiryDate;
+      const effectiveDate = item.effectiveDate ? new Date(item.effectiveDate) : null;
+   
+      return expiryDate === null && currentDate > effectiveDate || currentDate < expiryDate && currentDate > effectiveDate ;
     });
   }
   function getArrayofNonPubliclyAvailableCodes(codes, field) {
@@ -272,6 +285,18 @@ function addDistrictLabels(jsonData, districtList) {
   
     return nonPubliclyAvailableCodes;
   }
+  function getArrayofPubliclyAvailableCodes(codes, field) {
+    if (!Array.isArray(codes)) {
+      throw new Error('Invalid input. Expecting an array of objects.');
+    }
+  
+    // Filter out objects where "publiclyAvailable" is true
+    const publiclyAvailableCodes = codes
+      .filter(item => item && item.publiclyAvailable === true)
+      .map(item => item[field]);
+  
+    return publiclyAvailableCodes;
+  }
   function createSchoolCache(schoolData, schoolGrades) {
     // Preload convertedGrades with schoolGrades.schoolGradeCode and set the value to "N"
 
@@ -363,4 +388,4 @@ function addDistrictLabels(jsonData, districtList) {
         return school;
     });
 }
-  module.exports = {filterByExpiryDate, filterRemoveByField, sortByProperty,getArrayofNonPubliclyAvailableCodes,filterByField,appendMailingAddressDetailsAndRemoveAddresses,sortJSONBySchoolCode,sortJSONByDistrictNumber,normalizeJsonObject, removeFieldsByCriteria, createList, isSafeFilePath,isAllowedSchoolCategory, addDistrictLabels, districtNumberSort, createSchoolCache, formatGrades, rearrangeAndRelabelObjectProperties};
\ No newline at end of file
+  module.exports = {filterByPubliclyAvailableCodes, getArrayofPubliclyAvailableCodes, filterByExpiryDate, filterRemoveByField, sortByProperty,getArrayofNonPubliclyAvailableCodes,filterByField,appendMailingAddressDetailsAndRemoveAddresses,sortJSONBySchoolCode,sortJSONByDistrictNumber,normalizeJsonObject, removeFieldsByCriteria, createList, isSafeFilePath,isAllowedSchoolCategory, addDistrictLabels, districtNumberSort, createSchoolCache, formatGrades, rearrangeAndRelabelObjectProperties};
\ No newline at end of file
diff --git a/backend/src/routes/district-router.js b/backend/src/routes/district-router.js
index aeb09d1..90da53a 100644
--- a/backend/src/routes/district-router.js
+++ b/backend/src/routes/district-router.js
@@ -137,6 +137,7 @@ async function getAllDistrictContacts(req, res) {
       "server:instituteAPIURL"
     )}/institute/district/contact/paginated?pageSize=4000&searchCriteriaList=${encodedParams}`
   try {
+    
     const districtContactResponse = await axios.get(url, {
       headers: { Authorization: `Bearer ${req.accessToken}` },
     });
@@ -169,9 +170,6 @@ async function getAllDistrictContacts(req, res) {
     });
     let sortedData = sortJSONByDistrictNumber(filteredData)
     const validDistricts = filterRemoveByField(sortedData,"District Number", ["098","102","103"])
-
-    
-    
     res.json(validDistricts);
     //res.json(districtContactsReorderedAndRelabeled );
   } catch (e) {
@@ -179,7 +177,6 @@ async function getAllDistrictContacts(req, res) {
   }
 }
 
-
 async function getAllDistrictMailing(req, res) {
   const districtList = await listCache.get("districtlist")
   const contactTypeCodes= await listCache.get("codesList")
@@ -201,9 +198,7 @@ async function getAllDistrictMailing(req, res) {
     { property: "physicalCountryCode", label: "Courier Country" },    
     { property: "website", label: "Web Address" },
     { property: "phoneNumber", label: "Phone" },
-    { property: "faxNumber", label: "Fax" },
-    
-    
+    { property: "faxNumber", label: "Fax" },   
   ];
 
  const params = [
@@ -291,7 +286,7 @@ async function getDistrict(req, res) {
   const districtSchoolsUrl = `${config.get(
     "server:instituteAPIURL"
   )}/institute/school/paginated?pageNumber=0&pageSize=500&searchCriteriaList=${encodedParams}`;
-
+  
   try {
     const districtDataResponse = await axios.get(url, {
       headers: { Authorization: `Bearer ${req.accessToken}` },
diff --git a/backend/src/routes/institute-router.js b/backend/src/routes/institute-router.js
index 5c32ebf..2fe299e 100644
--- a/backend/src/routes/institute-router.js
+++ b/backend/src/routes/institute-router.js
@@ -89,9 +89,56 @@ async function getContactTypeCodes(req, res) {
   }
 }
 async function getOffshoreSchoolList(req, res) {
+  
+  let currentDate = new Date().toISOString().substring(0, 19)
+  const params = [
+    {
+      condition: 'AND',
+      searchCriteriaList: [
+        {
+          key: 'schoolCategoryCode',
+          operation: 'eq',
+          value: "OFFSHORE",
+          valueType: 'STRING',
+          condition: 'AND'
+        },
+        {
+          key: 'openedDate',
+          operation: 'lte',
+          value: currentDate,
+          valueType: 'DATE_TIME',
+          condition: 'AND'
+        }      
+      ]
+    },
+    {
+      condition: 'AND',
+      searchCriteriaList: [
+        {
+          key: 'closedDate',
+          operation: 'eq',
+          value: null,
+          valueType: 'STRING',
+          condition: 'OR'
+        },
+        {
+          key: 'closedDate',
+          operation: 'gte',
+          value: currentDate,
+          valueType: 'DATE_TIME',
+          condition: 'OR'
+        }          
+      ]
+    }
+  ];
+
+  const jsonString = JSON.stringify(params)
+  const encodedParams = encodeURIComponent(jsonString)
+  
+  
 
   if (await !listCache.has("offshoreschoollist")) {
-    const url = `${config.get("server:instituteAPIURL")}/institute/school/paginated?pageSize=100&pageNumber=0&searchCriteriaList=%5B%7B%22condition%22%3Anull%2C%22searchCriteriaList%22%3A%5B%7B%22key%22%3A%22schoolCategoryCode%22%2C%22operation%22%3A%22eq%22%2C%22value%22%3A%22OFFSHORE%22%2C%22valueType%22%3A%22STRING%22%2C%22condition%22%3A%22AND%22%7D%2C%7B%22key%22%3A%22openedDate%22%2C%22operation%22%3A%22lte%22%2C%22value%22%3A%222023-09-27T17%3A57%3A46%22%2C%22valueType%22%3A%22DATE_TIME%22%2C%22condition%22%3A%22AND%22%7D%2C%7B%22key%22%3A%22closedDate%22%2C%22operation%22%3A%22eq%22%2C%22value%22%3Anull%2C%22valueType%22%3A%22STRING%22%2C%22condition%22%3A%22AND%22%7D%5D%7D%5D`; // Update the URL according to your API endpoint
+    const url = `${config.get('server:instituteAPIURL')}/institute/school/paginated?pageSize=1000&pageNumber=0&searchCriteriaList=${encodedParams}`;
     axios
       .get(url, { headers: { Authorization: `Bearer ${req.accessToken}` } })
       .then((response) => {
diff --git a/backend/src/routes/school-router.js b/backend/src/routes/school-router.js
index 18a9ab8..dfd22cb 100644
--- a/backend/src/routes/school-router.js
+++ b/backend/src/routes/school-router.js
@@ -4,7 +4,7 @@ const log = require("../components/logger");
 const config = require("../config/index");
 const axios = require("axios");
 
-const { filterByField, getArrayofNonPubliclyAvailableCodes, normalizeJsonObject, createSchoolCache, addDistrictLabels, formatGrades, sortJSONBySchoolCode, rearrangeAndRelabelObjectProperties} = require("../components/utils");
+const { filterByField, filterByExpiryDate, getArrayofPubliclyAvailableCodes, normalizeJsonObject, createSchoolCache, addDistrictLabels, formatGrades, sortJSONBySchoolCode, rearrangeAndRelabelObjectProperties, filterByPubliclyAvailableCodes} = require("../components/utils");
 const { checkToken } = require("../components/auth");
 const { schoolCache, listCache, codeCache } = require("../components/cache");
 
@@ -27,7 +27,9 @@ async function getSchool(req, res) {
         const schoolData = response.data;
         const includedFields = ['schoolContactTypeCode', 'label', 'description'];
         schoolData.contacts = normalizeJsonObject(schoolData.contacts, contactTypeCodes.codesList.schoolContactTypeCodes, 'schoolContactTypeCode', (info) => info.publiclyAvailable === true, includedFields);
-        schoolData.contacts = filterByField(schoolData.contacts, "schoolContactTypeCode", ["STUDREGIS"])
+        
+        schoolData.contacts = filterByPubliclyAvailableCodes(schoolData.contacts, "schoolContactTypeCode", getArrayofPubliclyAvailableCodes(contactTypeCodes.codesList.schoolContactTypeCodes, "schoolContactTypeCode"))
+        schoolData.contacts = filterByExpiryDate(schoolData.contacts)
         const formattedGrades = formatGrades(schoolData.grades, schoolGrades);
         const schoolWithFormattedGrades = { ...schoolData, ...formattedGrades };
         res.json(schoolWithFormattedGrades);