diff --git a/cloud-functions/nodejs/functions/index.js b/cloud-functions/nodejs/functions/index.js index f61d66c..a44da35 100644 --- a/cloud-functions/nodejs/functions/index.js +++ b/cloud-functions/nodejs/functions/index.js @@ -3,6 +3,9 @@ const logger = require("firebase-functions/logger"); const functions = require("firebase-functions"); const admin = require("firebase-admin"); const moment = require('moment'); +const fs = require('fs'); +const csv = require('csv-parser'); +const html_to_pdf = require('html-pdf-node'); admin.initializeApp(); @@ -40,3 +43,78 @@ exports.registerUser = functions.region("asia-south1").https.onRequest(async (re res.json({ status: "400", message: "some error.", result: "true" }); } }); + +exports.addBloodTest = functions.region("asia-south1").https.onRequest(async (req, res) => { + res.set('Access-Control-Allow-Origin', "*") + res.set('Access-Control-Allow-Methods', 'GET, POST'); + + if (req.method === "OPTIONS") { + // stop preflight requests here + res.set("Access-Control-Allow-Headers", "Content-Type, x-client"); + res.status(204).send(''); + return; + } + + try { + const token = "e16a1bd15af2ee640f5a7a18c8d8333f5f01f7c66e003bbc21ee52870f1bce27"; + logger.info(`User-Agent ${req.get("User-Agent")}`); + logger.info(`token ${req.get("x-client")}`); + if (req.get("x-client") !== token) { + res.json({ status: "403", message: "auth error", result: "true" }); + } + else { + const { body } = req; + const { _id } = body; + logger.info(`_id ${_id}`); + await admin + .firestore() + .collection("testData") + .add(Object.assign(Object.assign({}, body), { createdAt: moment().utcOffset("+05:30").format("YYYY-MM-DD HH:mm:ss") })) + res.json({ status: "200" }); + } + } + catch (err) { + logger.info(`error ${err}`); + res.json({ status: "400", message: "some error.", result: "true" }); + } +}); + +exports.reportDownload = functions.region("asia-south1").https.onRequest(async (req, res) => { + res.set('Access-Control-Allow-Origin', "*") + res.set('Access-Control-Allow-Methods', 'GET, POST'); + + if (req.method === "OPTIONS") { + // stop preflight requests here + res.set("Access-Control-Allow-Headers", "Content-Type, x-client"); + res.status(204).send(''); + return; + } + + try { + const token = "e16a1bd15af2ee640f5a7a18c8d8333f5f01f7c66e003bbc21ee52870f1bce27"; + logger.info(`User-Agent ${req.get("User-Agent")}`); + logger.info(`token ${req.get("x-client")}`); + if (req.get("x-client") !== token) { + res.json({ status: "403", message: "auth error", result: "true" }); + } + else { + const { body } = req; + const { data } = body; + logger.info(`_id ${_id}`); + const fileName = `${data["_id"]}.pdf`; + // await makePdf(); + res.sendFile(fileName, options, function (err) { + if (err) { + next(err); + } else { + console.log('Sent:', fileName); + } + }); + } + } + catch (err) { + logger.info(`error ${err}`); + res.json({ status: "400", message: "some error.", result: "true" }); + } +}); + diff --git a/scripts/combine_hemocube_denovix.py b/scripts/combine_hemocube_denovix.py new file mode 100644 index 0000000..45507c9 --- /dev/null +++ b/scripts/combine_hemocube_denovix.py @@ -0,0 +1,27 @@ +import pandas as pd +import os + +curdir = os.getcwd() +path_delim = '/' +df1 = pd.read_excel(curdir + path_delim + "NagpurData_FinalResults_Aug1-a.xlsx", sheet_name="Sheet1") +df2 = pd.read_excel(curdir + path_delim + "NagpurData_FinalResults_Aug1-a.xlsx", sheet_name="Sheet3") + +print(df1) +print(df2) + +df = df1.merge(df2, on="_id") +df['Age'] = 2023 - df['birthYear'] +print(df) + +df = df[["_id", "name", "abhaId", "aadharId", "Age", "gender", "category", "maritalStatus", "house", "district", "state", "pinCode", "phoneNumber", "Result", "bloodGroup"]] +print(df) + +# df = df.sort_values(by=['testTime'], ascending=True) + +df.rename(columns={'_id': "Sample ID", "name": "Name", "abhaId": "ABHA ID", "aadharId": "Aadhaar ID", "gender": "Gender", "category": "Category", "maritalStatus": "Marital Status", "house": "Address", "district": "District", "state": "State", "pinCode": "Pincode", "phoneNumber": "Mobile Number", "Result": "Test Result", "bloodGroup": "Blood Group"}, inplace = True) +df = df.reindex(["Sample ID", "Name", "ABHA ID", "Aadhaar ID", "Age", "Gender", "Category", "Marital Status", "Address", "District", "State", "Pincode", "Mobile Number", "Test Result", "Blood Group"], axis=1) +print(df) + +writer = pd.ExcelWriter(curdir + path_delim + "NagpurData_FinalResults_Aug1-op.xlsx", engine = 'openpyxl') +df.to_excel(writer, sheet_name = 'op', index=False) +writer.close() \ No newline at end of file diff --git a/scripts/consolidated_data.py b/scripts/consolidated_data.py index 4038256..7c8251b 100644 --- a/scripts/consolidated_data.py +++ b/scripts/consolidated_data.py @@ -4,10 +4,10 @@ from firebase_admin import credentials from firebase_admin import firestore from google.cloud.firestore_v1.base_query import FieldFilter import pandas as pd -import datetime +# import datetime import sys import platform -from datetime import datetime +from datetime import datetime, timedelta if __name__ == "__main__": @@ -16,7 +16,7 @@ if __name__ == "__main__": else: path_delim = '/' - key_file_path = os.getcwd() + path_delim + "keys" + path_delim + "hpos-af3cc-firebase-adminsdk-n261k-2bfd463ec0.json" + key_file_path = os.getcwd() + path_delim + "keys" + path_delim + "hpos-prod-firebase-adminsdk-bionp-7af43fc5d6.json" cred = credentials.Certificate(key_file_path) # Replace with your own service account key path firebase_admin.initialize_app(cred) @@ -29,8 +29,14 @@ if __name__ == "__main__": start_date = sys.argv[1] # '2023-01-12' #input("Please enter the start date (yyyy-mm-dd): ") end_date = sys.argv[2] #'2023-07-16' #input("Please enter the end date (yyyy-mm-dd): ") + # if start_date == end_date: + # start_date = datetime.strptime(start_date, "%Y-%m-%d") + # end_date = (start_date + timedelta(days=1)).strftime("%Y-%m-%d") + + print("end_date", end_date) + # patient_collection = db.collection("patientData") - test_collection = db.collection("testData") + query = db.collection("testData").where(filter=FieldFilter("testTime", ">=", start_date)).where(filter=FieldFilter("testTime", "<", end_date)) # query = test_collection # patient_docs = query.stream() @@ -53,7 +59,7 @@ if __name__ == "__main__": # data.append(combined_data) - test_docs = test_collection.stream() + test_docs = query.stream() for test_doc in test_docs: test_data = test_doc.to_dict() data.append(test_data) @@ -74,7 +80,7 @@ if __name__ == "__main__": df = df.sort_values(by=['testTime'], ascending=False) df = df[["_id", "calculatedRatio", "deviceId", "deviceRatio", "deviceType", "kitSerial", "led1Average", "led1Buffer", "led1Sample", "led2Average", "led2Buffer", "led2Sample", "location", "deviceSerialNumber", "name", "testTime"]] - df.rename(columns={'deviceSerialNumber': "login_id", "calculatedRatio": "calibrated_ratio", "led1Buffer": "427_buffer_intensity", "led2Buffer": "555_buffer_intensity", "led1Sample": "427_sample_intensity", "led2Sample": "555_sample_intensity", "led1Average": "427_absorbance", "led2Average": "555_absorbance"}, inplace = True) + # df.rename(columns={'deviceSerialNumber': "login_id", "calculatedRatio": "calibrated_ratio", "led1Buffer": "427_buffer_intensity", "led2Buffer": "555_buffer_intensity", "led1Sample": "427_sample_intensity", "led2Sample": "555_sample_intensity", "led1Average": "427_absorbance", "led2Average": "555_absorbance"}, inplace = True) df = df.reindex(sorted(df.columns), axis=1) df.to_excel(writer, sheet_name = 'data', index=False) diff --git a/scripts/pdf_report.py b/scripts/pdf_report.py new file mode 100644 index 0000000..f28e502 --- /dev/null +++ b/scripts/pdf_report.py @@ -0,0 +1,265 @@ +import sys +import csv +from xhtml2pdf import pisa +import os +import pandas as pd + +rptData = {} + +rptData['Person Name'] = "row['Name']" +rptData['Age'] = "row['Age']" +rptData['Gender'] = "row['Gender']" +rptData['Age / Sex'] = "Male" +rptData['Sample type'] = 'Capillary Whole Blood' +rptData['Family History of Sickle Cell Anemia'] = 'Unknown' +rptData['Marital Status'] = "row['Marital Status']" +rptData['Test Date'] = "date" +rptData['Patient ID'] = "row['ABHA ID']" +rptData['Sample ID'] = "row['_id']" +rptData['value'] = "row['Measured Deovix Ratio']" + +rd = rptData +# template_path = os.path.join(THIS_DIR, 'report_template.html') + +report_template =r''' + + + +
+ + + + +
+ |
+ Person Name: {{ reportData["Person Name"] }}
+ Age / Sex: {{reportData['Age']}} / {{reportData['Gender']}}
+ Sample type:{{ reportData["Sample type"] }}
+ Family History of Sickle Cell Anemia:{{ reportData["Family History of Sickle Cell Anemia"] }}
+ |
+
+ Marital Status:{{ reportData["Marital Status"] }}
+ Test Date:{{ reportData["Test Date"] }}
+ ABHA ID:{{ reportData["Patient ID"] }}
+ Sample ID:{{ reportData["Sample ID"] }}
+ |
+
| + Test Description + | ++ RESULT + | ++ REFERENCE RANGES + | +
|---|---|---|
|
+ Sickle Cell
+ Anemia
+
+ (Method: HPOS)
+ |
+
+ Ra = {{ reportData["value"] }}
+
+ |
+
+
+ < 0.16: Normal (HbA)
+ 0.165 – 0.235: Sickle-cell Trait (HbAS)
+ > 0.24: Sickle-cell Disease (HbSS)
+ 0.16-0.165: Inconclusive (Negative Borderline)
+ 0.235 – 0.24: Inconclusive (Positive Borderline)
+ |
+
+