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.
77 lines
3.4 KiB
77 lines
3.4 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)
|
|
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?
|
|
@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)
|
|
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 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
|