From b9324ba4fc404148b28480919d17b865ad8bfc7d Mon Sep 17 00:00:00 2001 From: Toon Willems Date: Mon, 23 Sep 2024 12:14:18 +0200 Subject: [PATCH] implement dynamic price service --- .../billable_metrics/aggregations/base_service.rb | 8 ++++++++ app/services/billable_metrics/aggregations/sum_service.rb | 6 +++++- app/services/charges/charge_models/dynamic_service.rb | 2 +- app/services/events/stores/postgres_store.rb | 4 ++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/services/billable_metrics/aggregations/base_service.rb b/app/services/billable_metrics/aggregations/base_service.rb index 52db785e8cf..d84698e2981 100644 --- a/app/services/billable_metrics/aggregations/base_service.rb +++ b/app/services/billable_metrics/aggregations/base_service.rb @@ -26,6 +26,10 @@ def aggregate(options: {}) else compute_aggregation(options:) end + if charge.dynamic? + compute_precise_total_amount_cents(options:) + end + result end def compute_aggregation(options: {}) @@ -36,6 +40,10 @@ def compute_grouped_by_aggregation(options: {}) raise NotImplementedError end + def compute_precise_total_amount_cents(options: {}) + raise NotImplementedError + end + def per_event_aggregation(exclude_event: false) Result.new.tap do |result| result.event_aggregation = compute_per_event_aggregation(exclude_event:) diff --git a/app/services/billable_metrics/aggregations/sum_service.rb b/app/services/billable_metrics/aggregations/sum_service.rb index a884866137c..313b75afc4a 100644 --- a/app/services/billable_metrics/aggregations/sum_service.rb +++ b/app/services/billable_metrics/aggregations/sum_service.rb @@ -4,7 +4,7 @@ module BillableMetrics module Aggregations class SumService < BillableMetrics::Aggregations::BaseService def initialize(...) - super(...) + super event_store.numeric_property = true event_store.aggregation_property = billable_metric.field_name @@ -64,6 +64,10 @@ def compute_grouped_by_aggregation(options: {}) result.service_failure!(code: 'aggregation_failure', message: e.message) end + def compute_precise_total_amount_cents(options: {}) + result.precise_total_amount_cents = event_store.sum_precise_total_amount_cents + end + # NOTE: Return cumulative sum of field_name based on the number of free units # (per_events or per_total_aggregation). def running_total(options) diff --git a/app/services/charges/charge_models/dynamic_service.rb b/app/services/charges/charge_models/dynamic_service.rb index 2088f52a641..1df1752c65f 100644 --- a/app/services/charges/charge_models/dynamic_service.rb +++ b/app/services/charges/charge_models/dynamic_service.rb @@ -6,7 +6,7 @@ class DynamicService < Charges::ChargeModels::BaseService protected def compute_amount - (units * BigDecimal(properties['amount'])) + aggregation_result.precise_total_amount_cents end def unit_amount diff --git a/app/services/events/stores/postgres_store.rb b/app/services/events/stores/postgres_store.rb index 31aa186f7cc..79eec82e767 100644 --- a/app/services/events/stores/postgres_store.rb +++ b/app/services/events/stores/postgres_store.rb @@ -189,6 +189,10 @@ def grouped_last prepare_grouped_result(Event.connection.select_all(sql).rows) end + def sum_precise_total_amount_cents + events.sum(:precise_total_amount_cents) + end + def sum events.sum("(#{sanitized_property_name})::numeric") end