diff --git a/app/controllers/mileage_rates_controller.rb b/app/controllers/mileage_rates_controller.rb new file mode 100644 index 0000000..80ef373 --- /dev/null +++ b/app/controllers/mileage_rates_controller.rb @@ -0,0 +1,47 @@ +class MileageRatesController < ApplicationController + before_action :authenticate_user! + # Optional: nur Admins erlauben + # before_action :require_admin! + + before_action :set_mileage_rate, only: [:edit, :update] + + def index + @mileage_rates = MileageRate.order(year: :desc) + end + + def new + @mileage_rate = MileageRate.new + end + + def create + @mileage_rate = MileageRate.new(mileage_rate_params) + if @mileage_rate.save + redirect_to mileage_rates_path, notice: "Kilometersatz für #{@mileage_rate.year} gespeichert." + else + flash.now[:alert] = "Speichern fehlgeschlagen" + render :new, status: :unprocessable_entity + end + end + + def edit + end + + def update + if @mileage_rate.update(mileage_rate_params) + redirect_to mileage_rates_path, notice: "Kilometersatz für #{@mileage_rate.year} aktualisiert." + else + flash.now[:alert] = "Aktualisierung fehlgeschlagen" + render :edit, status: :unprocessable_entity + end + end + + private + + def set_mileage_rate + @mileage_rate = MileageRate.find(params[:id]) + end + + def mileage_rate_params + params.require(:mileage_rate).permit(:year, :rate_per_km) + end +end diff --git a/app/helpers/entries_helper.rb b/app/helpers/entries_helper.rb index ed8c595..e43e048 100644 --- a/app/helpers/entries_helper.rb +++ b/app/helpers/entries_helper.rb @@ -1,2 +1,22 @@ module EntriesHelper + # Berechnet Kilometerpauschale für eine Entry anhand der gespeicherten MileageRate + # entry: muss attribute `distance_km` und `date` haben + def kilometrergeld_for(entry) + rate = MileageRate.for_year(entry.date.year) + if rate + (entry.distance_km.to_f * rate).round(2) + else + # Fallback: z. B. Standardrate 0.42 + (entry.distance_km.to_f * 0.05).round(2) + end + end + + # Für Summen: sum_meilen ist Summe der km oder Array von entries + def total_km_cost_for_year(user, year) + rate = MileageRate.for_year(year) || 0.42 + total_km = user.entries + .where("EXTRACT(YEAR FROM date) = ?", year) + .sum(:distance_km).to_f + (total_km * rate).round(2) + end end diff --git a/app/models/entry.rb b/app/models/entry.rb index 9245653..9c6c91a 100644 --- a/app/models/entry.rb +++ b/app/models/entry.rb @@ -29,14 +29,17 @@ class Entry < ApplicationRecord end def self.total_kilometer_cost_by_year(user) - where(user: user) - .where.not(distance_km: nil) - .group(Arel.sql("DATE_PART('year', date)")) - .order(Arel.sql("DATE_PART('year', date) DESC")) - .pluck( - Arel.sql("DATE_PART('year', date)::int"), - Arel.sql("SUM(distance_km * 0.42)") - ).to_h + yearly_distances = where(user: user) + .where.not(distance_km: nil) + .group("EXTRACT(YEAR FROM date)::int") + .sum(:distance_km) + + # Für jedes Jahr die Pauschale holen und multiplizieren + yearly_distances.transform_keys(&:to_i).transform_values do |km_sum| + year = yearly_distances.key(km_sum).to_i + rate = MileageRate.find_by(year: year)&.rate_per_km || 0.42 + (km_sum * rate).round(2) + end end def self.total_fortbildungskosten_by_year(user) diff --git a/app/models/mileage_rate.rb b/app/models/mileage_rate.rb new file mode 100644 index 0000000..b424007 --- /dev/null +++ b/app/models/mileage_rate.rb @@ -0,0 +1,14 @@ +class MileageRate < ApplicationRecord + validates :year, presence: true, uniqueness: true + validates :rate_per_km, presence: true, numericality: { greater_than_or_equal_to: 0 } + + # Gibt die Rate für ein gegebenes Jahr — oder nil + def self.for_year(year) + find_by(year: year)&.rate_per_km + end + + # Gibt die Rate für heute bzw. aktuelles Jahr + def self.current + for_year(Date.today.year) + end +end diff --git a/app/views/entries/index.html.erb b/app/views/entries/index.html.erb index 2787081..4dceae7 100644 --- a/app/views/entries/index.html.erb +++ b/app/views/entries/index.html.erb @@ -7,8 +7,11 @@
<%= year %>: <%= number_to_currency(sum, unit: "€", separator: ",", delimiter: ".", precision: 2) %> + (<%= km %> km bei <%= number_to_currency(rate, unit: "€", separator: ",", delimiter: ".", precision: 2) %>/km)
<% end %>| Jahr | +Satz (€/km) | +Aktionen | +
|---|---|---|
| <%= rate.year %> | +<%= number_to_currency(rate.rate_per_km, unit: "€", separator: ",", delimiter: ".", precision: 2) %> | ++ <%= link_to "Bearbeiten", edit_mileage_rate_path(rate), class: "btn btn-sm btn-outline-secondary" %> + | +