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) @selbsterfahrungskosten_by_year = Entry.total_selbsterfahrungskosten_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