You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

88 lines
4.1 KiB

require "csv"
module Api
module V1
class EntriesController < BaseController
before_action :set_entry, only: %i[show update destroy stop_timer]
def index
scope = current_user.entries.order(date: :desc, created_at: :desc)
scope = scope.where(praktikums_typ: params[:typ]) if params[:typ].present?
scope = scope.where(entry_art: params[:art]) if params[:art].present?
scope = scope.where("beschreibung ILIKE ?", "%#{ActiveRecord::Base.sanitize_sql_like(params[:search])}%") if params[:search].present?
render json: scope.map { |entry| payload(entry) }
end
def show
render json: payload(@entry)
end
def create
entry = current_user.entries.new(entry_params)
return render json: { error: "Das Propädeutikum ist bereits abgeschlossen" }, status: :unprocessable_entity if blocked?(entry)
return render_disabled_type(entry.praktikums_typ) unless current_user.praktikums_typ_enabled?(entry.praktikums_typ)
entry.save ? render(json: payload(entry), status: :created) : render_validation(entry)
end
def update
return render json: { error: "Das Propädeutikum ist bereits abgeschlossen" }, status: :unprocessable_entity if params.dig(:entry, :praktikums_typ) == "propädeutikum" && current_user.praepedeutikum_abgeschlossen?
requested_type = params.dig(:entry, :praktikums_typ).presence || @entry.praktikums_typ
if requested_type != @entry.praktikums_typ && !current_user.praktikums_typ_enabled?(requested_type)
return render_disabled_type(requested_type)
end
@entry.update(entry_params) ? render(json: payload(@entry)) : render_validation(@entry)
end
def destroy
@entry.destroy!
head :no_content
end
def start_timer
return render json: { error: "Es läuft bereits ein Timer" }, status: :unprocessable_entity if current_user.entries.exists?(end_time: nil, beschreibung: "Timer")
entry = current_user.entries.new(date: Date.current, start_time: Time.current, beschreibung: "Timer", praktikums_typ: params[:typ], entry_art: params[:art])
return render json: { error: "Das Propädeutikum ist bereits abgeschlossen" }, status: :unprocessable_entity if blocked?(entry)
return render_disabled_type(entry.praktikums_typ) unless current_user.praktikums_typ_enabled?(entry.praktikums_typ)
entry.save ? render(json: payload(entry), status: :created) : render_validation(entry)
end
def stop_timer
return render json: { error: "Dieser Eintrag besitzt keine Startzeit" }, status: :unprocessable_entity unless @entry.start_time
@entry.end_time = Time.current
@entry.lunch_break_minutes = ActiveModel::Type::Boolean.new.cast(params[:lunch_break]) ? 30 : 0
minutes = @entry.total_minutes_including_break.to_i
@entry.hours, @entry.minutes = minutes.divmod(60)
@entry.save!
render json: payload(@entry)
end
def export_csv
data = current_user.entries.order(date: :desc).to_csv
send_data data, filename: "eintraege-#{Date.current}.csv", type: "text/csv; charset=utf-8"
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, :start_time, :end_time, :lunch_break_minutes, :zaehlt_als_fortbildung)
end
def blocked?(entry)
current_user.praepedeutikum_abgeschlossen? && entry.praktikums_typ == "propädeutikum"
end
def render_disabled_type(type)
label = User::PRAKTIKUMSTYP_LABELS[type.to_s] || type.to_s
render json: { error: "#{label} ist in den Einstellungen nicht aktiviert" }, status: :unprocessable_entity
end
def payload(entry)
entry.as_json(only: %i[id date hours minutes praktikums_typ entry_art distance_km beschreibung kosten start_time end_time lunch_break_minutes zaehlt_als_fortbildung created_at updated_at]).merge(kilometer_pauschale: entry.kilometer_pauschale)
end
end
end
end