Separa heatmap mobile/desktop, opt-out analytics per operatori, dashboard costi con KPI e trend mensili. Co-authored-by: Cursor <cursoragent@cursor.com>
69 lines
1.9 KiB
Ruby
69 lines
1.9 KiB
Ruby
# 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
|