You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.1 KiB
120 lines
3.1 KiB
class EntriesController < ApplicationController
|
|
before_action :authenticate_user!
|
|
before_action :set_entry, only: %i[edit update destroy]
|
|
|
|
def index
|
|
@entries = current_user.entries.order(date: :desc)
|
|
|
|
# Gesamtzeit in Minuten
|
|
@total_minutes = @entries.sum { |e| e.hours.to_i * 60 + e.minutes.to_i }
|
|
|
|
# Gesamtbetrag der Kilometerpauschale
|
|
@total_kilometer_pauschale = @entries.sum(&:kilometer_pauschale)
|
|
|
|
# Zeitverbrauch je Kombination (typ + art)
|
|
@time_by_typ_art = @entries.group_by(&:praktikums_typ).transform_values do |group|
|
|
group.group_by(&:entry_art).transform_values do |entries|
|
|
entries.sum { |e| e.hours.to_i * 60 + e.minutes.to_i }
|
|
end
|
|
end
|
|
|
|
# Verbleibende Minuten je Kombination
|
|
@remaining_minutes_matrix = {}
|
|
@time_by_typ_art.each do |typ, arts|
|
|
@remaining_minutes_matrix[typ] ||= {}
|
|
|
|
arts.each do |art, spent_minutes|
|
|
target = current_user.required_hours_matrix.dig(typ, art).to_i * 60
|
|
remaining = [target - spent_minutes, 0].max
|
|
@remaining_minutes_matrix[typ][art] = remaining
|
|
end
|
|
end
|
|
|
|
@total_kilometer_costs_by_year = current_user.entries
|
|
.group_by { |e| e.date.year }
|
|
.transform_values do |entries|
|
|
entries.sum(&:kilometer_pauschale)
|
|
end
|
|
|
|
@fortbildungskosten_by_year = Entry.total_fortbildungskosten_by_year(current_user)
|
|
|
|
|
|
# Voraussichtliches Ende je Kombination basierend auf weekly_target_matrix
|
|
@estimated_end_by_typ_art = {}
|
|
@remaining_minutes_matrix.each do |typ, arts|
|
|
@estimated_end_by_typ_art[typ] ||= {}
|
|
|
|
arts.each do |art, remaining_minutes|
|
|
hours_remaining = remaining_minutes / 60.0
|
|
weekly_hours = current_user.weekly_target_matrix.dig(typ, art).to_f
|
|
if weekly_hours > 0
|
|
weeks_remaining = (hours_remaining / weekly_hours).ceil
|
|
@estimated_end_by_typ_art[typ][art] = Date.today + weeks_remaining.weeks
|
|
else
|
|
@estimated_end_by_typ_art[typ][art] = nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
def new
|
|
@entry = current_user.entries.build
|
|
end
|
|
|
|
def create
|
|
@entry = current_user.entries.build(entry_params)
|
|
if @entry.save
|
|
redirect_to entries_path, notice: "Eintrag gespeichert"
|
|
else
|
|
render :new
|
|
end
|
|
end
|
|
|
|
def edit;
|
|
@entry
|
|
end
|
|
|
|
def update
|
|
if @entry.update(entry_params)
|
|
redirect_to entries_path, notice: "Eintrag aktualisiert"
|
|
else
|
|
render :edit
|
|
end
|
|
end
|
|
|
|
def destroy
|
|
@entry.destroy
|
|
redirect_to entries_path, notice: "Eintrag gelöscht"
|
|
end
|
|
|
|
def export_csv
|
|
@entries = current_user.entries.order(date: :desc)
|
|
|
|
respond_to do |format|
|
|
format.csv { send_data @entries.to_csv, filename: "eintraege-#{Date.today}.csv" }
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def set_entry
|
|
@entry = current_user.entries.find(params[:id])
|
|
end
|
|
|
|
def entry_params
|
|
params.require(:entry).permit(
|
|
:date,
|
|
:hours,
|
|
:minutes,
|
|
:praktikums_typ,
|
|
:entry_art,
|
|
:distance_km,
|
|
:beschreibung,
|
|
:kosten
|
|
)
|
|
end
|
|
|
|
|
|
|
|
end
|