1 changed files with 113 additions and 118 deletions
@ -1,121 +1,116 @@ |
|||||
class EntriesController < ApplicationController |
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 |
end |
||||
Loading…
Reference in new issue