class FuelEntriesController < ApplicationController def create @vehicle = Vehicle.find(params[:vehicle_id]) @fuel_entry = @vehicle.fuel_entries.build(fuel_entry_params) @fuel_entry.updated_by_user = Current.user if save_fuel_entry redirect_to @vehicle, notice: "Fuel entry recorded." else prepare_vehicle_show render "vehicles/show", status: :unprocessable_entity end end private def fuel_entry_params params.require(:fuel_entry).permit(:odometer, :gallons_pumped, :price_paid, :date) end def save_fuel_entry saved = false FuelEntry.transaction do if @fuel_entry.save update_vehicle_odometer(@fuel_entry.odometer) saved = true end end saved end def update_vehicle_odometer(odometer) return unless odometer > @vehicle.current_odometer @vehicle.update!(current_odometer: odometer) end def prepare_vehicle_show @maintenance_schedules = @vehicle.maintenance_schedules.active.order(:maintenance_type) @maintenance_schedule_statuses = maintenance_schedule_statuses(@maintenance_schedules) @fuel_entries = @vehicle.fuel_entries.includes(:updated_by_user).order(date: :desc, created_at: :desc) @maintenance_entries = @vehicle.maintenance_entries.includes(:updated_by_user).order(date: :desc, created_at: :desc) @maintenance_entry = @vehicle.maintenance_entries.build(date: Date.current) end def maintenance_schedule_statuses(schedules) schedules.index_with do |schedule| latest_entry = @vehicle.maintenance_entries .where("lower(name) = ?", schedule.maintenance_type.downcase) .order(date: :desc, created_at: :desc) .first MaintenanceScheduleStatus.new(schedule, latest_entry, current_odometer: @vehicle.current_odometer) end end end