Admin analytics: heatmap per device, anteprima staff e analisi costi.
Separa heatmap mobile/desktop, opt-out analytics per operatori, dashboard costi con KPI e trend mensili. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user