CDPH query for meenaxi

CDPH calculation for days present

by kbcb

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment-with-locales.min.js"></script>
<h2>Input</h2>

<textarea id="data">
99900	Discharge	3/1/2018	11:00 AM	EMC ER	F2	Emergency
12345	Admission	3/8/2018	11:45 PM	EMC ER	K4	Emergency
12345	Discharge	3/9/2018	3:22 AM	EMC ER	K4	Emergency
34567	Admission	3/10/2018	10:17 PM	EMC ER	G1	Emergency
34567	Admission	3/10/2018	4:17 AM	EMC ER	G1	Observation
34567	Transfer Out	3/11/2018	5:56 AM	EMC ER	G1	Observation
45678	Admission	3/12/2018	6:00 AM	EMC ER	A3	Emergency
45678	Transfer Out	3/12/2018	3:45 PM	EMC ER	A3	Emergency
45678	Transfer In	3/12/2018	7:00 PM	EMC ER	Overflow	Emergency
45678	Discharge	3/12/2018	9:00 PM	EMC ER	Overflow	Emergency
45678	Admission	3/14/2018	6:00 AM	EMC ER	A1	Emergency
45678	Transfer In	3/14/2018	3:45 PM	EMC ER	A1	Emergency
45678	Transfer Out	3/14/2018	7:00 PM	EMC ER	A1	Emergency
45678	Discharge	3/15/2018	1:00 AM	EMC ER	A1	Emergency
56789	Admission	3/17/2018	4:13 AM	EMC ER	R2	Emergency
56789	Admission	3/17/2018	6:26 AM	EMC ER	R2	Inpatient
56789	Transfer Out	3/17/2018	8:22 AM	EMC ER	R2    	Inpatient
78889	Admission	3/18/2018	6:52 PM	EMC ER	B2	Emergency
78889	Admission	3/18/2018	10:09 PM	EMC ER	B2	Inpatient
78889	Transfer Out	3/18/2018	10:59 PM	EMC ER	B2	Inpatient
78889	Transfer In	3/18/2018	10:59 PM	EMC ER	OTF Room	Inpatient
78910	Admission	3/20/2018	8:45 AM	EMC ER	FT4	Emergency
78910	Discharge	3/20/2018	11:00 AM	EMC ER	FT4	Emergency
78910	Admission	3/21/2018	2:00 PM	EMC ER	G3	Emergency
78910	Transfer Out	3/21/2018	4:00 PM	EMC ER	G3	Emergency
78910	Transfer In	3/21/2108	4:00 PM	EMC ER	OTF Room	Emergency
78910	Discharge	3/21/2018	4:28 PM	EMC ER	OTF Room	Emergency
99989	Admission	3/22/2018	3:44 PM	EMC ER	R3	Emergency
99989	Admission	3/22/2018	5:31 PM	EMC ER	R3	Inpatient
99989	Admission	3/22/2018	5:48 AM	EMC ER	R3	Observation
99989	Transfer In	3/22/2018	6:43 PM	EMC ER	OTF...

CSS

#data {
  white-space: pre;
}

td {
  border: 1px solid black;
  padding: 5px;
}

textarea {
  width: 100%;
  height: 100px;
}

JavaScript

/*
  1. Copy and paste Excel data INTO the <div> in "HTML" tab
  2. Hit "Run" in top-left
  
  Notes:
  * $(document).ready() is the beginning of the logic
  * parseData is first executed to convert the excel tab-delimited data into javascript arrays of rows and columns (a sub-array)
  * groupData is then executed to group the data together by mrn number (the first column)
*/

function parseData() {
	var data = $('#data').val();
  var lines = data.replace(/\r/g, '').split('\n');
  var parsed = [];
  
  _.each(lines, function(line) {
  	if (!line) {
    	return;
    }
    
  	var columns = line.split('\t');
    var parsedLine = [];
    
    _.each(columns, function(column) {
    	parsedLine.push(column);
    });
    
    parsed.push(parsedLine);
  });
  
  return parsed;
}

function groupData(parsedData) {
	var mrnGroups = [];
  
  _.each(parsedData, function(parsedLine) {
  	var foundMrnGroup = _.find(mrnGroups, function(mrnGroup) {
    	return mrnGroup.mrn === parsedLine[0];
    });
    
    if (!foundMrnGroup) {
    	foundMrnGroup = {
      	mrn: parsedLine[0],
        lines: []
      };
      mrnGroups.push(foundMrnGroup);
    }
    
    foundMrnGroup.lines.push(parsedLine);
  });
  
  return mrnGroups;
}

function getDiff(row1, row2) {
	var date1 = moment(row1[2]);
  var date2 = moment(row2[2]);
  var diff = date2.diff(date1, 'd');		// returns difference in days
  return diff + 1;											// returns a fraction of 24 hours
}

$(document).ready(function() {
	var parsedData = parseData();
  var groupedData = groupData(parsedData);
  
  _.each(groupedData, function(mrnGroup) {
  	var daysPresentForGroup = 0;
    
  	// Scenario 1
    if (mrnGroup.lines.length === 1) {
    	daysPresentForGroup = 1;
    } else {			// All other scenarios
    	var next = 0;
      var countedDates = [];
      for (var i = 0; i < mrnGroup.lines.length; i++) {
        var line = mrnGroup.lines[i];
        
        // Reset the next count on admission
        if...