Files
redmine_qbo_calendar/app/views/my/blocks/_upcoming_appointments.html.erb
T

99 lines
3.5 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('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><%= l(:label_title) %></th>
<th><%= l(:label_customer) %></th>
<th><%= l(:label_vehicle) %></th>
<th><%= l(:label_date) %></th>
<th class="status"><%= l(:label_status) %></th>
</tr>
</thead>
<tbody>
<% expanded_appointments.each do |item| %>
<% appt = item[:appointment] %>
<% status_slug = appt.status.to_s.parameterize %>
<tr class="<%= cycle('odd', 'even') %> appointment-row status-<%= status_slug %>">
<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">
<%= link_to appt.customer unless appt.customer.nil? %>
</td>
<td class="vehicle">
<%= link_to appt.vehicle unless appt.vehicle.nil? %>
</td>
<td class="start-date">
<%= format_date(item[:date]) %>
</td>
<td class="status">
<% if appt.status.present? %>
<span class="badge status-badge status-<%= status_slug %>">
<%= appt.status.to_s.humanize %>
</span>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
<% else %>
<p class="nodata"><%= l(:label_no_data) %></p>
<% end %>