# frozen_string_literal: true module Admin class CostEntriesController < Admin::BaseController before_action :set_entry, only: %i[edit update destroy] def new @entry = PlatformCostEntry.new( month: parse_month(params[:month]) || Time.zone.today.beginning_of_month, label: PlatformCostEntry::DEFAULT_LABEL ) end def create @entry = PlatformCostEntry.new(entry_attributes) if @entry.save redirect_to admin_costs_path(month: month_param(@entry.month)), notice: t("admin.flash.cost_entry_created") else flash.now[:alert] = @entry.errors.full_messages.join(", ") render :new, status: :unprocessable_entity end end def edit; end def update if @entry.update(entry_attributes) redirect_to admin_costs_path(month: month_param(@entry.month)), notice: t("admin.flash.cost_entry_updated") else flash.now[:alert] = @entry.errors.full_messages.join(", ") render :edit, status: :unprocessable_entity end end def destroy month = @entry.month @entry.destroy! redirect_to admin_costs_path(month: month_param(month)), notice: t("admin.flash.cost_entry_destroyed") end private def set_entry @entry = PlatformCostEntry.find(params[:id]) end def entry_attributes attrs = params.require(:platform_cost_entry).permit(:month, :label, :amount_euros, :notes) if attrs[:amount_euros].present? attrs[:amount_cents] = Billing::EuroAmount.to_cents(attrs.delete(:amount_euros)) end attrs[:notes] = nil if attrs[:notes].blank? attrs end def parse_month(value) return nil if value.blank? Date.strptime(value.to_s, "%Y-%m").beginning_of_month rescue ArgumentError, TypeError nil end def month_param(date) date.strftime("%Y-%m") end end end