From d623beade9cdf912de9910d000e4858e0fdc2090 Mon Sep 17 00:00:00 2001 From: Christoph Marzell Date: Sun, 8 Feb 2026 10:01:05 +0100 Subject: [PATCH] add more entrie types for fachspezifikum --- app/models/entry.rb | 38 ++++++++++++++++++++++++-------------- app/models/user.rb | 45 ++++++++++++++++++++++++++++++++++++++++++++- db/seeds.rb | 7 +++++++ 3 files changed, 75 insertions(+), 15 deletions(-) diff --git a/app/models/entry.rb b/app/models/entry.rb index cd1d350..149c285 100644 --- a/app/models/entry.rb +++ b/app/models/entry.rb @@ -11,7 +11,19 @@ class Entry < ApplicationRecord before_save :normalize_time PRAKTIKUMSTYPEN = %w[propädeutikum fachspezifikum] - ENTRY_ARTEN = %w[Praktikum Selbsterfahrung Supervision Fortbildung Semesterkosten] + ENTRY_ARTEN = [ + "Praktikum", + "Selbsterfahrung", + "Supervision", + "Fortbildung", + "Semesterkosten", + # Neue differenzierte Einträge (nur sichtbar im fachspezifikum-Kontext) + "Gruppenselbsterfahrung", # 64h + "Theorie/Methodikseminare", # 216h + "Peergruppensupervision", # 168h + "Einzel-/Kleingruppensupervision", # 40h + "Eigenständige Tätigkeit" + ] validates :praktikums_typ, inclusion: { in: PRAKTIKUMSTYPEN } validates :entry_art, inclusion: { in: ENTRY_ARTEN } @@ -36,22 +48,22 @@ class Entry < ApplicationRecord .sum(:distance_km) yearly_distances.each_with_object({}) do |(year, km_sum), result| - rate = MileageRate.find_by(year: year.to_i)&.rate_per_km || 0.42 + rate = MileageRate.find_by(year: year.to_i)&.rate_per_km || 0.42 result[year.to_i] = (km_sum * rate).round(2) end end def self.total_fortbildungskosten_by_year(user) where(user: user) - .where.not(kosten: nil) - .where( - Entry.arel_table[:entry_art].eq('Fortbildung') - .or(Entry.arel_table[:zaehlt_als_fortbildung].eq(true)) - ) - .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(kosten)")) - .to_h + .where.not(kosten: nil) + .where( + Entry.arel_table[:entry_art].eq('Fortbildung') + .or(Entry.arel_table[:zaehlt_als_fortbildung].eq(true)) + ) + .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(kosten)")) + .to_h end def self.total_selbsterfahrungskosten_by_year(user) @@ -118,8 +130,6 @@ class Entry < ApplicationRecord end end - - def total_minutes_including_break return nil unless start_time && end_time minutes = ((end_time - start_time) / 60).to_i @@ -140,7 +150,7 @@ class Entry < ApplicationRecord if (hours.to_i + minutes.to_i) == 0 && start_time.present? && end_time.present? total_minutes_worked = total_minutes_including_break if total_minutes_worked - self.hours = total_minutes_worked / 60 + self.hours = total_minutes_worked / 60 self.minutes = total_minutes_worked % 60 end else diff --git a/app/models/user.rb b/app/models/user.rb index ef3e081..c6dbd3d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -7,7 +7,17 @@ class User < ApplicationRecord has_many :entries, dependent: :destroy PRAKTIKUMSTYPEN = %w[propädeutikum fachspezifikum] - ENTRY_ARTEN = %w[Praktikum Selbsterfahrung Supervision] + ENTRY_ARTEN = [ + "Praktikum", + "Selbsterfahrung", + "Supervision", + # Neue differenzierte Einträge (nur sichtbar im fachspezifikum-Kontext) + "Gruppenselbsterfahrung", # 64h + "Theorie/Methodikseminare", # 216h + "Peergruppensupervision", # 168h + "Einzel-/Kleingruppensupervision", # 40h + "Eigenständige Tätigkeit" + ] after_initialize :set_default, if: :new_record? @@ -18,6 +28,38 @@ class User < ApplicationRecord self.email =="christoph@marzell.net" end + def update_required_matrices! + PRAKTIKUMSTYPEN.each do |typ| + required_hours_matrix[typ] ||= {} + weekly_target_matrix[typ] ||= {} + + ENTRY_ARTEN.each do |art| + required_hours_matrix[typ][art] ||= default_hours_for(typ, art) + weekly_target_matrix[typ][art] ||= default_weekly_target_for(typ, art) + end + end + + save! + end + + + def default_weekly_target_for(typ, art) + case [typ, art] + when ["propädeutikum", "Praktikum"] then 12 + when ["fachspezifikum", "Praktikum"] then 10 + when ["propädeutikum", "Selbsterfahrung"], + ["fachspezifikum", "Selbsterfahrung"], + ["fachspezifikum", "Gruppenselbsterfahrung"] then 0.25 + when ["propädeutikum", "Supervision"], + ["fachspezifikum", "Supervision"], + ["fachspezifikum", "Peergruppensupervision"], + ["fachspezifikum", "Einzel-/Kleingruppensupervision"] then 0.25 + when ["fachspezifikum", "Eigenständige Tätigkeit"] then 10 + else 0 + end + end + + def set_default self.required_hours_matrix = PRAKTIKUMSTYPEN.to_h do |typ| [typ, ENTRY_ARTEN.to_h { |art| [art, default_hours_for(typ, art)] }] @@ -37,6 +79,7 @@ class User < ApplicationRecord when ["fachspezifikum", "Praktikum"] then 600 when ["fachspezifikum", "Selbsterfahrung"] then 80 when ["fachspezifikum", "Supervision"] then 40 + when ["fachspezifikum", "Eigenständige Tätigkeit"] then 600 else 0 end end diff --git a/db/seeds.rb b/db/seeds.rb index a160fa8..76a6e7d 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -23,3 +23,10 @@ end TrainingWatchSource.find_or_create_by!(url: "https://www.sfu.ac.at/") do |s| s.name = "SFU" end + + +puts "⚙️ Updating all users with new entry combinations..." +User.find_each do |user| + user.update_required_matrices! +end +puts "✅ All users updated!" \ No newline at end of file