mirror of
https://github.com/rickbarrette/redmine_qbo_calendar.git
synced 2026-10-04 04:40:43 -04:00
118 lines
4.2 KiB
ERB
118 lines
4.2 KiB
ERB
<h3><%= l(:label_upcoming_appointments, default: 'My Upcoming Appointments') %></h3>
|
|
|
|
<%
|
|
# Get Redmine's configured non-working week days (e.g., ["6", "7"] for Sat/Sun)
|
|
non_working_days = Setting.non_working_week_days || []
|
|
|
|
# Safely filter appointments by logged-in user across possible user column names
|
|
appointments_scope = CustomerAppointment.all
|
|
if CustomerAppointment.column_names.include?('user_id')
|
|
appointments_scope = appointments_scope.where(user_id: User.current.id)
|
|
elsif CustomerAppointment.column_names.include?('assigned_to_id')
|
|
appointments_scope = appointments_scope.where(assigned_to_id: User.current.id)
|
|
elsif CustomerAppointment.column_names.include?('author_id')
|
|
appointments_scope = appointments_scope.where(author_id: User.current.id)
|
|
end
|
|
|
|
# Look back up to 60 days to capture multi-day appointments starting in the past
|
|
raw_appointments = appointments_scope.where('start_date >= ?', Date.today - 60.days)
|
|
|
|
expanded_appointments = []
|
|
|
|
raw_appointments.each do |appointment|
|
|
next if appointment.start_date.nil?
|
|
|
|
start_date = appointment.start_date.to_date
|
|
duration = [appointment.duration.to_i, 1].max
|
|
date_cursor = start_date
|
|
working_days_counted = 0
|
|
|
|
# Expand appointment dates strictly across working days based on duration
|
|
while working_days_counted < duration
|
|
unless non_working_days.include?(date_cursor.cwday.to_s)
|
|
working_days_counted += 1
|
|
|
|
# Only list dates falling on or after today
|
|
if date_cursor >= Date.today
|
|
expanded_appointments << {
|
|
appointment: appointment,
|
|
date: date_cursor,
|
|
day_number: working_days_counted,
|
|
total_days: duration
|
|
}
|
|
end
|
|
end
|
|
|
|
date_cursor += 1
|
|
end
|
|
end
|
|
|
|
# Sort upcoming occurrences chronologically and take top 10
|
|
expanded_appointments.sort_by! { |item| item[:date] }
|
|
expanded_appointments = expanded_appointments.first(10)
|
|
%>
|
|
|
|
<% if expanded_appointments.any? %>
|
|
<table class="list appointments">
|
|
<thead>
|
|
<tr>
|
|
<th>Title</th>
|
|
<th>Customer</th>
|
|
<th>Vehicle</th>
|
|
<th>Date</th>
|
|
<th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<% expanded_appointments.each do |item| %>
|
|
<% appt = item[:appointment] %>
|
|
<tr class="<%= cycle('odd', 'even') %>">
|
|
<td class="subject">
|
|
<%= link_to appt.subject, customer_appointment_path(appt) %>
|
|
<% if item[:total_days] > 1 %>
|
|
<small class="muted">(Day <%= item[:day_number] %> of <%= item[:total_days] %>)</small>
|
|
<% end %>
|
|
</td>
|
|
<td class="customer">
|
|
<%
|
|
customer_obj = appt.try(:customer) || appt.try(:qbo_customer) || appt.try(:customer_name)
|
|
customer_text = if customer_obj.respond_to?(:display_name)
|
|
customer_obj.display_name
|
|
elsif customer_obj.respond_to?(:name)
|
|
customer_obj.name
|
|
else
|
|
customer_obj.to_s
|
|
end
|
|
%>
|
|
<%= customer_text.presence || '-' %>
|
|
</td>
|
|
<td class="vehicle">
|
|
<%
|
|
vehicle_obj = appt.try(:vehicle) || appt.try(:vehicle_name)
|
|
vehicle_text = if vehicle_obj.respond_to?(:name)
|
|
vehicle_obj.name
|
|
elsif vehicle_obj.respond_to?(:to_s)
|
|
vehicle_obj.to_s
|
|
else
|
|
nil
|
|
end
|
|
%>
|
|
<%= vehicle_text.presence || '-' %>
|
|
</td>
|
|
<td class="start-date">
|
|
<%= format_date(item[:date]) %>
|
|
</td>
|
|
<td class="status">
|
|
<% if appt.respond_to?(:status) && appt.status.present? %>
|
|
<span class="badge status-<%= appt.status.to_s.parameterize %>">
|
|
<%= appt.status.to_s.humanize %>
|
|
</span>
|
|
<% end %>
|
|
</td>
|
|
</tr>
|
|
<% end %>
|
|
</tbody>
|
|
</table>
|
|
<% else %>
|
|
<p class="nodata"><%= l(:label_no_data) %></p>
|
|
<% end %> |