Browse Source

add more entrie types for fachspezifikum

main
Christoph Marzell 1 month ago
parent
commit
d623beade9
  1. 38
      app/models/entry.rb
  2. 45
      app/models/user.rb
  3. 7
      db/seeds.rb

38
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

45
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

7
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!"
Loading…
Cancel
Save