Skip to content

Commit

Permalink
Merged Supervision fixes from Oliver
Browse files Browse the repository at this point in the history
  • Loading branch information
soyapi committed Jan 15, 2009
1 parent cad2915 commit 0a3b079
Show file tree
Hide file tree
Showing 11 changed files with 152 additions and 26 deletions.
19 changes: 19 additions & 0 deletions app/controllers/patient_controller.rb
Expand Up @@ -1836,5 +1836,24 @@ def find_by_arv_number
set_patient
return
end

def merge
arv_number = params[:id] unless params[:id].blank?
patients = PatientIdentifier.find(:all, :conditions => ["identifier= ?", arv_number]).map(&:patient)
#need to determine which of the two patients has the most recent visit
#that patient will be the active patient
primary_patient = patients[0].last_art_visit_date > patients[1].last_art_visit_date ? patients[0] : patients[1]
#secondary_patient = patients.map{|pat|pat.id} - primary_patient.id.to_a

secondary_patient = patients[0].last_art_visit_date < patients[1].last_art_visit_date ? patients[0] : patients[1]
# secondary_patient = patients.collect{|pat|pat.id} - primary_patient.id.to_a

# raise primary_patient.id.to_yaml
# raise + " " + primary_patient.id

Patient.merge(primary_patient.id,secondary_patient.id)

redirect_to :controller => :reports, :action => 'duplicate_identifiers'
end

end
91 changes: 88 additions & 3 deletions app/controllers/standard_encounter_controller.rb
@@ -1,7 +1,10 @@
class StandardEncounterController < ApplicationController
def new_art_visit
session[:first_encounter_date] = nil
@art_visit_type_id = EncounterType.find_by_name("ART Visit").id
@patient = Patient.find(params[:patient_id])
encounter_dates = @patient.encounters.sort{|a,b|b.encounter_datetime <=> a.encounter_datetime}
session[:first_encounter_date] = encounter_dates.first.encounter_datetime
@patient_id = @patient.id
end

Expand All @@ -12,6 +15,87 @@ def add_outcome_died
end

def create_art_visit

patient_id = params[:observations][:weight][:patient_id]
patient = Patient.find(patient_id)

art_visit_encounter = Encounter.create(params[:encounter])
#visit_time = art_visit_encounter.encounter_datetime
visit_time = session[:first_encounter_date]


height_weight_encounter = Encounter.new
height_weight_encounter.provider = User.current_user
height_weight_encounter.type = EncounterType.find_by_name("Height/Weight")
height_weight_encounter.encounter_datetime = visit_time
height_weight_encounter.patient_id = patient_id
height_weight_encounter.save

params[:observations].keys.each{|obs_type|
if obs_type == "weight"
encounter = height_weight_encounter
else
encounter = art_visit_encounter
end

other_obs_data = {:encounter_id => encounter.id,
:obs_datetime => encounter.encounter_datetime}
Observation.create(params[:observations][obs_type].update(other_obs_data)) rescue raise obs_type
}

[["Prescribe recommended dosage","Yes"],["Is able to walk unaided","Yes"],["Prescribe Cotrimoxazole (CPT)","Yes"],["Is at work/school","Yes"],["Peripheral neuropathy","No"],["Hepatitis","No"],["Continue treatment at current clinic","Yes"],["Skin rash","No"],["Prescription time period","2 weeks"],["Lactic acidosis","No"],["Lipodystrophy","No"],["ARV regimen","Stavudine Lamivudine + Stavudine Lamivudine Nevirapine"],["Anaemia","No"],["Refer patient to clinician","No"],["Other side effect","No"]].each{|obs_concept_and_answer|

obs_concept, obs_answer_concept = obs_concept_and_answer
observation = Observation.new
observation.patient_id = patient_id
observation.encounter = art_visit_encounter
observation.obs_datetime = visit_time
observation.concept = Concept.find_by_name(obs_concept)
observation.answer_concept = Concept.find_by_name(obs_answer_concept)
observation.save!
}

# Need two prescribed dose observations - mornign and evening
#drug_orders = DrugOrder.recommended_art_prescription(patient.current_weight)["Stavudine Lamivudine Nevirapine"]
drug_orders = DrugOrder.recommended_art_prescription(50)["Stavudine Lamivudine Nevirapine"]
drug_orders.each{|drug_order|
observation = Observation.new
observation.patient = patient
observation.encounter = art_visit_encounter
observation.obs_datetime = visit_time
observation.concept = Concept.find_by_name("Prescribed dose")
# do logic to determine dose from weight
observation.value_drug = drug_order.drug.id
observation.value_text = drug_order.frequency
observation.value_numeric = drug_order.units
observation.save!
}

give_drugs = Encounter.new
give_drugs.provider = User.current_user
give_drugs.type = EncounterType.find_by_name("Give drugs")
give_drugs.encounter_datetime = visit_time
give_drugs.patient = patient
give_drugs.save!

order_type = OrderType.find_by_name("Give drugs")

drug_orders.each{|drug_order|
order = Order.new
order.order_type = order_type
order.orderer = User.current_user.id
order.encounter = give_drugs
order.save!
drug_order.order = order
#drug_order.quantity = params[:number_of_months_supplied].to_i * 60
drug_order.quantity = 1 * 60
drug_order.save!
}

redirect_to :action => "menu", :patient_id => patient_id
end

def create_art_short_visit
patient_id = params[:observations][:weight][:patient_id]
patient = Patient.find(patient_id)

Expand Down Expand Up @@ -88,17 +172,18 @@ def create_art_visit
end

def menu
patient_id = params[:patient_id]
patient_id = params[:id] unless params[:id].blank?
@patient = Patient.find(patient_id) rescue nil

patient_arv_number = Patient.find(patient_id).arv_number unless patient_id.nil? rescue nil
#patient_arv_number = Patient.find(patient_id).arv_number unless patient_id.nil? rescue nil

=begin
(1..5).to_a.each{|offset|
next_patient_arv_number = patient_arv_number.gsub(/(\d+)/){($1.to_i+offset).to_s} unless patient_arv_number.nil?
@next_patient = Patient.find_by_arvnumber(next_patient_arv_number) unless next_patient_arv_number.nil? rescue nil
break unless @next_patient.nil?
}

=end

render :layout => false
end
Expand Down
2 changes: 1 addition & 1 deletion app/models/concept.rb
Expand Up @@ -46,7 +46,7 @@ def self.find_from_ids(args, options)
end

def self.find_by_name(concept_name)
return @@concept_hash_by_name[concept_name.downcase] || super
return @@concept_hash_by_name[concept_name.to_s.downcase] || super
end

def to_s
Expand Down
14 changes: 14 additions & 0 deletions app/models/patient.rb
Expand Up @@ -3106,6 +3106,20 @@ def weight_for_height(date=Date.today)
return nil if median_weight_height.blank?
weight_for_height = ((self.current_weight(date)/median_weight_height)*100).round
end

# Assign ARV numbers to patients in the specified CSV file
# e.g.: Patient.assign_arv_numbers("/var/www/bart/salima_without_arv_numbers.csv")
def self.assign_arv_numbers(file_path)
require "fastercsv"
pat_id_and_arv_numbers = FasterCSV.read(file_path)
User.current_user = User.find(64)
pat_id_and_arv_numbers.each{|row|
pat = Patient.find(row[0].to_i)
pat.arv_number = row[1]
pat.save!
puts "created #{pat.arv_number}"
}
end


# re-cache patients outcomes
Expand Down
8 changes: 5 additions & 3 deletions app/models/retrospective_outcome.rb
Expand Up @@ -21,20 +21,22 @@ def ask_arv_range(start_number = nil, end_number = nil)
puts "Enter the ending ARV number (as a number)"
end_number = STDIN.gets.strip().to_i
end
@arv_range = (start_number..end_number).map {|n| "QEC #{n}"}
@arv_range = (start_number..end_number).map {|n| "#{Location.current_arv_code} #{n}"}
arv_range_2 = (start_number..end_number).map {|n| "#{Location.current_arv_code}#{n}"}
@arv_range << arv_range_2
end

def find_arv_patients_ids
arv_national_id_type = PatientIdentifierType.find_by_name("ARV national id")
identifiers = PatientIdentifier.find(:all, :conditions =>
['identifier_type = ? and identifier IN (?)', arv_national_id_type.id, @arv_range])
['identifier_type = ? and identifier IN (?)', arv_national_id_type.id, @arv_range.flatten])
@arv_patient_ids = identifiers.map(&:patient_id)
end

def find_arv_patients
@arv_patients = Patient.find(:all, :include => [:patient_names, :patient_identifiers],
:conditions => ['patient.patient_id IN (?)', @arv_patient_ids])
@arv_patients = @arv_patients.sort{|a,b| a.arv_number <=> b.arv_number}
@arv_patients = @arv_patients.sort{|a,b| a.arv_number.gsub(" ","") <=> b.arv_number.gsub(" ","")}
end

def update_outcomes(default = nil)
Expand Down
2 changes: 1 addition & 1 deletion app/views/form/art_reception_check_in.rhtml
Expand Up @@ -33,7 +33,7 @@
</script>
<%
when "Patient present"
patient_name = @patient.patient_names.first.given_name + " " + @patient.patient_names.first.family_name
patient_name = @patient.patient_names.first.given_name rescue nil + " " + @patient.patient_names.first.family_name rescue nil
@attributes["helpText"] ="Patient present: " "#{patient_name}"
@attributes["tt_onLoad"] = "ensureOnePresent();"
no_id = Concept.find_by_name('No').id
Expand Down
2 changes: 2 additions & 0 deletions app/views/reports/cohort_debugger.rhtml
Expand Up @@ -26,6 +26,8 @@
<td><%= patient.gender %></td>
<td><%= patient.age_at_initiation %> </td>
<td><%= patient.birthdate %> </td>
<td><%= patient.date_created.strftime("%d-%b-%Y") rescue nil%> </td>
<!--td--><!--%= link_to "Update #{patient.reason_for_art_eligibility rescue nil}", :controller =>:form, :action => :show, :id => :56 %--> <!--/td-->
</tr>
<% } unless @patients.nil? %>
</table>
Expand Down
4 changes: 3 additions & 1 deletion app/views/reports/duplicate_identifiers.rhtml
Expand Up @@ -12,7 +12,9 @@
<td>DOB</td>
</tr>
<% @identifiers.each{|identifier| %>
<tr><td colspan='7'><%= identifier.identifier %></td></tr>
<tr><td colspan='7'><%= identifier.identifier %></td>
<td><%=link_to "merge patients", :controller => :patient, :action => :merge, :id => identifier.identifier%> </td>
</tr>
<%
patients = PatientIdentifier.find(:all, :conditions => ["identifier= ?", identifier.identifier]).map(&:patient)
patients.each{|patient|
Expand Down
2 changes: 2 additions & 0 deletions app/views/reports/missing_visits.rhtml
Expand Up @@ -9,6 +9,7 @@
<td>Gender</td>
<td>Age</td>
<td>DOB</td>
<td>&nbsp;</td>
</tr>
<% @patients.each{|patient|
%>
Expand All @@ -20,6 +21,7 @@
<td><%= patient.gender %></td>
<td><%= patient.age_at_initiation %> </td>
<td><%= patient.birthdate %> </td>
<td><%= link_to_onmousedown "Standard menu", :controller => "standard_encounter", :action => 'menu', :id => patient.id%></td>
</tr>
<% } %>
</table>
Expand Down
1 change: 1 addition & 0 deletions app/views/reports/supervision.rhtml
Expand Up @@ -5,6 +5,7 @@
<%= link_to_onmousedown 'Duplicate Identifiers', :action => 'duplicate_identifiers' %>
<%= link_to_onmousedown 'Missing Identifier Types', :action => 'missing_identifiers'%>
<%= link_to_onmousedown 'System usage tracker', :controller => 'usage_data', :action => 'usage_graph'%>
<%= link_to_onmousedown 'Invalid Visits', :action => 'invalid_visits' if GlobalProperty.find_by_property('use_filing_numbers') == 'true'%>
<%= link_to_onmousedown 'Cancel', {:controller => 'patient', :action => 'menu'} ,:id => "logout"%>
Expand Down
33 changes: 16 additions & 17 deletions app/views/standard_encounter/new_art_visit.rhtml
Expand Up @@ -4,19 +4,19 @@
<%= hidden_field :encounter, :encounter_type, :value => EncounterType.find_by_name("ART Visit").id %>
<%= hidden_field :encounter, :patient_id, :value => @patient_id %>
<%= hidden_field :encounter, :provider_id, :value => User.current_user.id %>
<%= hidden_field :encounter, :encounter_datetime, :value => nil %>
<%= hidden_field :encounter, :encounter_datetime, :value => session[:first_encounter_date] %>
<%= hidden_field_tag :encounter_year, :value => 2007 %>
<label for="encounter_month">Month - <%= @patient.arv_number %> <%= @patient.name %></label>
<!-- Note the funky javascript month number -->
<%= select_tag :encounter_month, "<option value='8'>September</option><option value='9'>October</option><option value='10'>November</option>", {:tt_onLoad => "$('cancelButton').setAttribute('onMouseDown','document.location = \"/standard_encounter/menu?patient_id=#{@patient_id}\"')"} %>
<% days = [""] + (1..31).to_a %>
<%= select_tag :encounter_day, options_for_select(days), {:field_type => 'number', :helpText => 'Date of Visit', :tt_onLoad => "getDayOfMonthPicker(2007,$('encounter_month').value-1)"} %>
<!--%= select_tag :encounter_month, "<option value='8'>September</option><option value='9'>October</option><option value='10'>November</option>", {:tt_onLoad => "$('cancelButton').setAttribute('onMouseDown','document.location = \"/standard_encounter/menu?patient_id=#{@patient_id}\"')"} %-->
<!--% days = [""] + (1..31).to_a %-->
<!--%= select_tag :encounter_day, options_for_select(days), {:field_type => 'number', :helpText => 'Date of Visit', :tt_onLoad => "getDayOfMonthPicker(2007,$('encounter_month').value-1)"} %-->

<%= hidden_field_tag "observations[weight][patient_id]", @patient_id %>
<%= hidden_field_tag "observations[weight][concept_id]", Concept.find_by_name("Weight").id %>
<%= hidden_field_tag "observations[weight][obs_datetime]" %>

<%
<!--%
@attributes = Hash.new
@attributes["field_type"] = "number"
@attributes["tt_pageStyleClass"] = "Numeric NumbersOnly"
Expand All @@ -29,14 +29,14 @@
# Need to allow optional in case patient is immobile
@attributes["optional"] = true
@attributes["helpText"] = "Weight (kg)"
%>
<%= text_field_tag "observations[weight][value_numeric]", {}, @attributes %>
%-->
<!--%= text_field_tag "observations[weight][value_numeric]", {}, @attributes %-->

<%= hidden_field_tag "observations[tablets_remaining][patient_id]", @patient_id %>
<%= hidden_field_tag "observations[tablets_remaining][concept_id]", Concept.find_by_name("Total number of whole ARV tablets remaining").id %>
<%= hidden_field_tag "observations[tablets_remaining][obs_datetime]" %>
<!--%= hidden_field_tag "observations[tablets_remaining][patient_id]", @patient_id %-->
<!--%= hidden_field_tag "observations[tablets_remaining][concept_id]", Concept.find_by_name("Total number of whole ARV tablets remaining").id %-->
<!--%= hidden_field_tag "observations[tablets_remaining][obs_datetime]" %-->

<%
<!--%
@attributes.clear
@attributes["field_type"] = "number"
@attributes["tt_pageStyleClass"] = "Numeric NumbersOnly"
Expand All @@ -46,9 +46,9 @@
@attributes[:absoluteMax] = 360
@attributes["optional"] = true
@attributes["helpText"] = "No. Pills in Bottle"
%>
<%= text_field_tag "observations[tablets_remaining][value_numeric]", {}, @attributes %>
<%
%-->
<!--%= text_field_tag "observations[tablets_remaining][value_numeric]", {}, @attributes %-->
<!--%
@attributes.clear
@attributes["field_type"] = "number"
@attributes["tt_pageStyleClass"] = "Numeric NumbersOnly"
Expand All @@ -58,8 +58,8 @@
@attributes[:absoluteMax] = 12
@attributes["optional"] = false
@attributes["helpText"] = "No. months supplied"
%>
<%= text_field_tag "number_of_months_supplied", {}, @attributes %>
%-->
<!--%= text_field_tag "number_of_months_supplied", {}, @attributes %-->
<%= text_field_tag "confirm", {}, :helpText => "Summary", :tt_onLoad => "update()", :optional => true %>
</form>

Expand Down Expand Up @@ -88,7 +88,6 @@
<script>
function update(){
var date = new Date(2007, $('encounter_month').value, $('encounter_day').value)
alert(date)
$('encounter_encounter_datetime').value = date
$('observations[weight][obs_datetime]').value = date
if(date.getMonth() == 9)
Expand Down

0 comments on commit 0a3b079

Please sign in to comment.