diff --git a/app/controllers/entries_controller.rb b/app/controllers/entries_controller.rb index 825ed12..1f4056d 100644 --- a/app/controllers/entries_controller.rb +++ b/app/controllers/entries_controller.rb @@ -1,121 +1,116 @@ 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) - @selbstsupervision_by_year = Entry.total_selbsterfahrungskosten_by_year(current_user) - @selbsterfahrungskosten_by_year = Entry.total_selbsterfahrungskosten_by_year(current_user) - @allekosten_by_year = Entry.total_semesterkosten_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 - - + 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 = Entry.total_kilometer_cost_by_year(current_user) + @fortbildungskosten_by_year = Entry.total_fortbildungskosten_by_year(current_user) + @selbstsupervision_by_year = Entry.total_selbsterfahrungskosten_by_year(current_user) + @selbsterfahrungskosten_by_year = Entry.total_selbsterfahrungskosten_by_year(current_user) + @allekosten_by_year = Entry.total_semesterkosten_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