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