diff --git a/dao/enrollment/double-enrollment-check.js b/dao/enrollment/double-enrollment-check.js new file mode 100644 index 000000000..7de33b2a1 --- /dev/null +++ b/dao/enrollment/double-enrollment-check.js @@ -0,0 +1,51 @@ +/*jshint -W003, -W097, -W117, -W026 */ +'use strict'; + +var Promise = require('bluebird'); +var squel = require('squel'); +var _ = require('underscore'); +var moment = require('moment'); +var connection = require('../../dao/connection/mysql-connection-service.js'); +var authorizer = require('../../authorization/etl-authorizer'); + +var double_enrollment_check = { + getDoubleEnrollment : getDoubleEnrollment +}; + +module.exports = double_enrollment_check; + +//check if patient is enrolled to a program before autoenrolling to prevent double enrollment +function getDoubleEnrollment(patientUuid,programUuid) { + + return new Promise(function (resolve, reject) { + + connection.getServerConnection() + .then(function (conn) { + var query = squel.select() + .field('count(*) as count') + .from('amrs.patient_program', 'pp') + .join('amrs.person','p','pp.patient_id = p.person_id') + .join('amrs.program','pr','pp.program_id = pr.program_id') + .where('p.uuid = ?',patientUuid) + .where('pr.uuid = ?', programUuid) + .where('pp.date_completed IS NULL') + .toString(); + conn.query(query, {}, function (err, rows, fields) { + if (err) { + console.log(err); + reject('Error querying server'); + } + else { + + resolve(rows); + } + conn.release(); + }); + }) + .catch(function (err) { + reject('Error establishing connection to MySql Server'); + }); +//amrs patient + }); + +}; diff --git a/dao/enrollment/enrollment-patient-program-dao.js b/dao/enrollment/enrollment-patient-program-dao.js new file mode 100644 index 000000000..f7ef6b497 --- /dev/null +++ b/dao/enrollment/enrollment-patient-program-dao.js @@ -0,0 +1,48 @@ +/*jshint -W003, -W097, -W117, -W026 */ +'use strict'; + +var Promise = require('bluebird'); +var squel = require('squel'); +var _ = require('underscore'); +var moment = require('moment'); +var connection = require('../../dao/connection/mysql-connection-service.js'); +var authorizer = require('../../authorization/etl-authorizer'); + +var enrollments = { + getPatientProgramEnrollment : getPatientProgramEnrollment +}; + +module.exports = enrollments; + +function getPatientProgramEnrollment(patientUuid,incompatibleprograms) { + + return new Promise(function (resolve, reject) { + connection.getServerConnection() + .then(function (conn) { + var query = squel.select() + .field('pp.uuid') + .from('amrs.patient_program', 'pp') + .join('amrs.person','p','pp.patient_id = p.person_id') + .join('amrs.program','pr','pp.program_id = pr.program_id') + .where('pr.uuid in ?',incompatibleprograms) + .where('p.uuid = ?',patientUuid) + .where('pp.date_completed IS NULL') + .toString(); + conn.query(query, {}, function (err, rows, fields) { + if (err) { + reject('Error querying server'); + } + else { + // console.log('patient programs Rows', rows); + resolve(rows); + } + conn.release(); + }); + }) + .catch(function (err) { + reject('Error establishing connection to MySql Server'); + }); +//amrs patient + }); + +}; diff --git a/docker/auto-enroll/Dockerfile b/docker/auto-enroll/Dockerfile new file mode 100644 index 000000000..86de8c818 --- /dev/null +++ b/docker/auto-enroll/Dockerfile @@ -0,0 +1,18 @@ +FROM node:6 +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + cron rsyslog \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* +RUN npm install pm2 -g +COPY . /opt/etl +COPY worker/eid-crontab-sample /etc/cron.d/eid-schedule-task +RUN rm -rf /opt/etl/conf +RUN chmod 0644 /etc/cron.d/eid-schedule-task +RUN npm install -g babel-cli +RUN cd /opt/etl && npm install +ENV TZ=Africa/Nairobi +RUN ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && dpkg-reconfigure -f noninteractive tzdata +RUN echo "cron.* /var/log/cron.log" >> /etc/rsyslog.conf +RUN chmod +x /opt/etl/run1.sh +CMD /opt/etl/run1.sh diff --git a/eid-rest-formatter.js b/eid-rest-formatter.js index a2f4d07d9..43a154169 100755 --- a/eid-rest-formatter.js +++ b/eid-rest-formatter.js @@ -30,7 +30,7 @@ module.exports = function () { var hasLessThanSymbol = / 0) { + App.process(data) + .then(function() { + return App.deleteProcessed(data) + }).then(function(deleted) { + + }).catch(function(err) { + console.log(err); + }) + } else { + console.log('No data in the queue', new Date()); + //process.exit(1); + } + }); + }, + process: function(data) { + let arrayList = []; + let promise = new Promise(function(resolve, reject) { + data.forEach((arrayItem) => { + const key = arrayItem.program_uuid; + const person_uuid = arrayItem.person_uuid; + let list = []; + if (program_config[key].incompatibleWith && program_config[key].incompatibleWith.length > 0) { + list = program_config[key].incompatibleWith; + _.each(list, function(item) { + patient_programs.getPatientProgramEnrollment(person_uuid, list) + .then(function(rows) { + if (rows && rows.length !== 0) { + _.each(rows, function(row) { + App.unEnrollIfIncompatible(row.uuid); + resolve() + }) + App.enroll(person_uuid, key); + } else { + App.enroll(person_uuid, key); + resolve() + } + }) + }) + } else { + App.enroll(person_uuid, key); + resolve() + } + }) + }); + return promise; + }, + loadQueueData: function() { + let limit = 100; + + var sql = 'select * from etl.program_registration_queue limit ?'; + var qObject = { + query: sql, + sqlParams: [limit] + }; + return new Promise(function(resolve, reject) { + db.queryReportServer(qObject, function(data) { + resolve(data.result); + }); + }); + }, + unEnrollIfIncompatible: function(uuid) { + + let protocol = config.etl.tls ? 'https' : 'http'; + + let date = moment().format('YYYY-MM-DD'); + + let openmrsAppName = config.openmrs.applicationName || 'amrs'; + let payload = { + dateCompleted: date, + uuid: uuid + } + + var url = protocol + '://' + config.openmrs.host + ':' + config.openmrs.port + '/' + openmrsAppName + '/ws/rest/v1/programenrollment/' + + payload.uuid; + + delete payload['uuid']; + payload = JSON.stringify(payload); + + var usernamePass = config.eidSyncCredentials.username + ":" + config.eidSyncCredentials.password; + var auth = "Basic " + Buffer.from(usernamePass).toString('base64'); + + var options = { + url: url, + data: payload, + headers: { + 'Content-Type': 'application/json', + 'Authorization': auth + }, + method: 'POST' + }; + + return new Promise(function(resolve, reject) { + curl.request(options, function(err, parts) { + if (err || (parts && JSON.parse(parts).error)) { + console.log(parts && JSON.parse(parts).error); + console.log('error unenrolling to program'); + reject(err) + //log error to file or db + } else { + console.log('unenrolling to program: '); + resolve('str') + } + }); + }) + }, + + enroll: function(person_uuid, program_uuid) { + + let dateEnrolled = moment().format('YYYY-MM-DD'); + + var openmrsAppName = config.openmrs.applicationName || 'amrs'; + var payload = { + program: program_uuid, + patient: person_uuid, + dateEnrolled: dateEnrolled + + } + var protocol = config.openmrs.https ? 'https' : 'http'; + var url = protocol + '://' + config.openmrs.host + ':' + config.openmrs.port + '/' + openmrsAppName + '/ws/rest/v1/programenrollment/'; + + var usernamePass = config.eidSyncCredentials.username + ":" + config.eidSyncCredentials.password; + var auth = "Basic " + Buffer.from(usernamePass).toString('base64'); + + payload = JSON.stringify(payload); + + var options = { + url: url, + data: payload, + headers: { + 'Content-Type': 'application/json', + 'Authorization': auth + }, + method: 'POST' + }; + return new Promise(function(resolve, reject) { + + curl.request(options, function(err, parts) { + + if (err || (parts && JSON.parse(parts).error)) { + console.log((parts && JSON.parse(parts).error)); + console.log('error enrolling patient into program'); + //log to file or database + reject('error enrolling patient into viremia') + } else { + console.log('Enrolled Patient Into Standard HIV Treatment'); + resolve('Enrolled Patient Into Program'); + } + + }); + }) + }, + deleteProcessed: function(data) { + let lst = []; + for (var i = 0; i < data.length; i++) { + var row = data[i]; + lst.push(row.person_uuid); + } + + var sql = 'delete from etl.program_registration_queue where person_uuid in (?)'; + + var qObject = { + query: sql, + sqlParams: [lst] + } + return new Promise(function(resolve, reject) { + try { + db.queryReportServer(qObject, function(result) { + console.log(result); + resolve(result); + }); + } catch (e) { + //TODO - ignoring delete + resolve(e); + } + }); + }, + + init: function() { + cron.schedule('* * * * *',function(){ + try { + App.start(); + } catch (e) { + console.log(`Error occured when starting app ${e}`); + } + }) + } +} +App.init(); + +//module.exports = App; diff --git a/worker/shared/un_enroll_hiv_call.js b/worker/shared/un_enroll_hiv_call.js new file mode 100644 index 000000000..a2458764f --- /dev/null +++ b/worker/shared/un_enroll_hiv_call.js @@ -0,0 +1,25 @@ +/*jshint -W003, -W097, -W117, -W026 */ +'use strict'; + +var Promise = require('bluebird'); +var squel = require('squel'); +var _ = require('underscore'); +var moment = require('moment'); + + +var apiHivUnenrollCall = { + unEnrollHivCall: unEnrollHivCall +}; + +module.exports = apiHivUnenrollCall; + + +function unEnrollHivCall() { + + return new Promise(function (resolve, reject) { + + + + }); + +}; diff --git a/worker/un_enrollment_program_failed.csv b/worker/un_enrollment_program_failed.csv deleted file mode 100755 index e69de29bb..000000000