app/views/admin/reports/gme_by_opening_html.erb
lets get started:
<h1>GME Department Coverage by Site Openings</h1>
<p><%= @results_count %> records returned.</p>
<% @results.group_by(&:dept_code).each do |dept_code,providers| %>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Name</th>
<th>Date</th>
<th>Shift Hours</th>
<th>Site</th>
</tr>
<tr>
<td colspan="4"><h4><%= dept_code %></h4></td>
</tr>
</thead>
<tbody>
<% providers.group_by(&:full_name).each do |full_name, info| %>
<tr>
<td colspan="4"><b><%= full_name %></b></td>
</tr>
<% info.each do |r| %>
<tr>
<td> </td>
<td><%= r.date_open.try(:strftime,'%-m/%-d/%Y') %></td>
<td><%= r.hours %></td>
<td><%= r.name %></td>
</tr>
<% end %>
<% end %>
</tbody>
</table>
<p> </p>
<% end %>
So, what we have here (building on the previous post) is a list of doctors, from different departments who work at sites on different days for specific shifts. The grouping in this report is by department, then by doctor's name and a list of the sites by date. The key here is to
group_by(&:_field_).each
and then break out a sub grouping. Not too bad. But, wouldn't it be nice to have a filter to cut the data by date or other result? Like if I wanted a quarterly report?In
app/controllers/admin/reports_controller.rb
I'm going to have a default time frame and accept filters. Also I'm going to create a nice label based on the dates (I think I'm supposed to put the label construction in the view, but I like it here where I can see all the filters I'm making- like if I wanted to filter on department instead). This code comes from Stack Overflow.
def gme_by_opening
if params[:start_date] && params[:end_date]
filter_start = params[:start_date]
filter_end = params[:end_date]
@results = ReportGmeByOpening.where(
"date_open <= ? AND date_open >= ?", Date.parse(filter_end), Date.parse(filter_start)
).order(
"dept_code", "full_name", "date_open"
)#.group_by(&:dept_code,:full_name)
@results_label = "Records from " + filter_start + " to " + filter_end
else
@results = ReportGmeByOpening.where(
"date_open <= ? AND date_open >= ?", Date.today, 1.month.ago
).order(
"dept_code", "full_name", "date_open"
)
@results_label = "Records from " + 1.month.ago.try(:strftime,'%-m/%-d/%Y') + " to " + Date.today.try(:strftime,'%-m/%-d/%Y')
end
@results_count = @results.count
respond_to do |format|
format.html # gme_by_opening.html.erb
end
end
Then in my
gme_by_opening.html.erb
I change the header to:
<h1>GME Department Coverage by Site Openings</h1>
<div class="row">
<p class="span6"><%= @results_label %>, with <%= @results_count %> records returned.</p>
<div class="span6"><%= form_tag(admin_reports_gme_by_opening_path, {:class => 'form-inline'}) do %>
<%= text_field_tag :start_date, nil, :class => 'input-small' %> to
<%= text_field_tag :end_date, nil, :class => 'input-small' %>
<%= submit_tag "Update Date Range Filter", :class => "btn" %>
<% end %></div>
</div>