Skip to content

Commit bfbfbad

Browse files
committed
feat(presentation_group_keys): Change invoice fee object to return only
displayable in invoice presentation breakdowns This commit changes the Fees::Object to filter only the presentation_breakdowns where the display_in_invoice of charge is true. We're also doing a refactor in FeeDisplayHelper to avoid repeat the same option to filter out the presentation breakdowns are not available in invoice. Having this, we have the logic centralised in Fee and the FeeDisplayHelper is calling the methods responsible to provide the presentation_breakdowns.
1 parent d2de197 commit bfbfbad

18 files changed

Lines changed: 234 additions & 91 deletions

app/graphql/types/customers/usage/charge.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ def grouped_usage
6161
end
6262

6363
def presentation_breakdowns
64-
Types::Fees::PresentationBreakdownBuilder.call(object, filter: Types::Fees::PresentationBreakdownBuilder::UNGROUPED)
64+
Types::Fees::PresentationBreakdownBuilder.call(
65+
object,
66+
filter: Types::Fees::PresentationBreakdownBuilder::UNGROUPED,
67+
filter_breakdown: Types::Fees::PresentationBreakdownBuilder::ALL
68+
)
6569
end
6670
end
6771
end

app/graphql/types/customers/usage/grouped_usage.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ def filters
4949
end
5050

5151
def presentation_breakdowns
52-
Types::Fees::PresentationBreakdownBuilder.call(object, filter: Types::Fees::PresentationBreakdownBuilder::GROUPED)
52+
Types::Fees::PresentationBreakdownBuilder.call(
53+
object,
54+
filter: Types::Fees::PresentationBreakdownBuilder::GROUPED,
55+
filter_breakdown: Types::Fees::PresentationBreakdownBuilder::ALL
56+
)
5357
end
5458
end
5559
end

app/graphql/types/customers/usage/projected_charge.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,11 @@ def projected_amount_cents
7676
end
7777

7878
def presentation_breakdowns
79-
Types::Fees::PresentationBreakdownBuilder.call(object, filter: Types::Fees::PresentationBreakdownBuilder::UNGROUPED)
79+
Types::Fees::PresentationBreakdownBuilder.call(
80+
object,
81+
filter: Types::Fees::PresentationBreakdownBuilder::UNGROUPED,
82+
filter_breakdown: Types::Fees::PresentationBreakdownBuilder::ALL
83+
)
8084
end
8185

8286
private

app/graphql/types/customers/usage/projected_grouped_usage.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ def filters
5858
end
5959

6060
def presentation_breakdowns
61-
Types::Fees::PresentationBreakdownBuilder.call(object, filter: Types::Fees::PresentationBreakdownBuilder::GROUPED)
61+
Types::Fees::PresentationBreakdownBuilder.call(
62+
object,
63+
filter: Types::Fees::PresentationBreakdownBuilder::GROUPED,
64+
filter_breakdown: Types::Fees::PresentationBreakdownBuilder::ALL
65+
)
6266
end
6367

6468
private

app/graphql/types/fees/object.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ def adjusted_fee_type
7272
end
7373

7474
def presentation_breakdowns
75-
Types::Fees::PresentationBreakdownBuilder.call([object], filter: Types::Fees::PresentationBreakdownBuilder::ALL)
75+
Types::Fees::PresentationBreakdownBuilder.call(
76+
[object],
77+
filter: Types::Fees::PresentationBreakdownBuilder::ALL,
78+
filter_breakdown: Types::Fees::PresentationBreakdownBuilder::DISPLAY_IN_INVOICE
79+
)
7680
end
7781
end
7882
end

app/graphql/types/fees/presentation_breakdown_builder.rb

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,26 @@ class PresentationBreakdownBuilder
77
UNGROUPED = :ungrouped
88
GROUPED = :grouped
99

10-
def self.call(fees, filter:)
11-
new(fees, filter:).call
10+
DISPLAY_IN_INVOICE = :display_in_invoice
11+
12+
def self.call(fees, filter:, filter_breakdown:)
13+
new(fees, filter:, filter_breakdown:).call
1214
end
1315

14-
def initialize(fees, filter:)
16+
def initialize(fees, filter:, filter_breakdown:)
1517
@fees = fees
1618
@filter = filter
19+
@filter_breakdown = filter_breakdown
1720
end
1821

1922
def call
2023
Array(fees).flat_map do |fee|
2124
next [] if filter == UNGROUPED && fee.grouped_by.present?
2225
next [] if filter == GROUPED && fee.grouped_by.blank?
2326

24-
fee.presentation_breakdowns.map do |breakdown|
27+
breakdowns = (filter_breakdown == DISPLAY_IN_INVOICE) ? fee.presentation_breakdowns_displayed_in_invoice : fee.presentation_breakdowns
28+
29+
breakdowns.map do |breakdown|
2530
{
2631
presentation_by: breakdown.presentation_by,
2732
units: breakdown.units.to_s
@@ -32,7 +37,7 @@ def call
3237

3338
private
3439

35-
attr_reader :fees, :filter
40+
attr_reader :fees, :filter, :filter_breakdown
3641
end
3742
end
3843
end

app/models/fee.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,14 @@ def currency
172172
amount_currency
173173
end
174174

175-
def presentation_breakdowns_displayable_in_invoice?
176-
return false unless charge?
175+
def presentation_group_keys_values_displayed_in_invoice
176+
return [] unless charge
177+
178+
@presentation_group_keys_values_displayed_in_invoice ||= charge.presentation_group_keys_values_displayed_in_invoice
179+
end
177180

178-
displayable_keys = charge.presentation_group_keys_values_displayed_in_invoice
179-
displayable_keys.present? && presentation_breakdowns.any? { |b| displayable_keys.any? { |k| b.presentation_by[k].present? } }
181+
def presentation_breakdowns_displayed_in_invoice
182+
presentation_breakdowns.select { |b| presentation_group_keys_values_displayed_in_invoice.any? { |k| b.presentation_by[k].present? } }
180183
end
181184

182185
def basic_rate_percentage?

app/serializers/v1/customers/charge_usage_serializer.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def serialize
1414
billable_metric: billable_metric_data(fee),
1515
filters: filters(fees),
1616
grouped_usage: grouped_usage(fees),
17-
presentation_breakdowns: PresentationBreakdownBuilder.call(fees, filter: PresentationBreakdownBuilder::UNGROUPED)
17+
presentation_breakdowns: V1::Customers::PresentationBreakdownBuilder.call(fees, filter: V1::Customers::PresentationBreakdownBuilder::UNGROUPED, filter_breakdown: V1::Customers::PresentationBreakdownBuilder::ALL)
1818
}
1919
end
2020
end
@@ -112,7 +112,7 @@ def build_grouped_usage_data(grouped_fees)
112112
**usage_data.except(:amount_currency),
113113
grouped_by: grouped_fees.first.grouped_by,
114114
filters: filters(grouped_fees),
115-
presentation_breakdowns: PresentationBreakdownBuilder.call(grouped_fees, filter: PresentationBreakdownBuilder::GROUPED)
115+
presentation_breakdowns: V1::Customers::PresentationBreakdownBuilder.call(grouped_fees, filter: V1::Customers::PresentationBreakdownBuilder::GROUPED, filter_breakdown: V1::Customers::PresentationBreakdownBuilder::ALL)
116116
}
117117
end
118118
end

app/serializers/v1/customers/presentation_breakdown_builder.rb

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,34 @@ class PresentationBreakdownBuilder
77
UNGROUPED = :ungrouped
88
GROUPED = :grouped
99

10-
def self.call(fees, filter:)
11-
new(fees, filter:).call
10+
DISPLAY_IN_INVOICE = :display_in_invoice
11+
12+
def self.call(fees, filter:, filter_breakdown:)
13+
new(fees, filter:, filter_breakdown:).call
1214
end
1315

14-
def initialize(fees, filter:)
16+
def initialize(fees, filter:, filter_breakdown:)
1517
@fees = fees
1618
@filter = filter
19+
@filter_breakdown = filter_breakdown
1720
end
1821

1922
def call
2023
Array(fees).flat_map do |fee|
2124
next [] if filter == UNGROUPED && fee.grouped_by.present?
2225
next [] if filter == GROUPED && fee.grouped_by.blank?
2326

24-
fee.presentation_breakdowns.map do |breakdown|
27+
breakdowns = (filter_breakdown == DISPLAY_IN_INVOICE) ? fee.presentation_breakdowns_displayed_in_invoice : fee.presentation_breakdowns
28+
29+
breakdowns.map do |breakdown|
2530
::V1::PresentationBreakdownSerializer.new(breakdown).serialize
2631
end
2732
end
2833
end
2934

3035
private
3136

32-
attr_reader :fees, :filter
37+
attr_reader :fees, :filter, :filter_breakdown
3338
end
3439
end
3540
end

app/serializers/v1/customers/projected_charge_usage_serializer.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def serialize
1616
billable_metric: billable_metric_data(fee),
1717
filters: cached_filters(fees),
1818
grouped_usage: cached_grouped_usage(fees),
19-
presentation_breakdowns: PresentationBreakdownBuilder.call(fees, filter: PresentationBreakdownBuilder::UNGROUPED)
19+
presentation_breakdowns: V1::Customers::PresentationBreakdownBuilder.call(fees, filter: V1::Customers::PresentationBreakdownBuilder::UNGROUPED, filter_breakdown: V1::Customers::PresentationBreakdownBuilder::ALL)
2020
}
2121
end
2222
end
@@ -210,7 +210,7 @@ def build_grouped_usage_data(grouped_fees)
210210
**usage_data.except(:amount_currency),
211211
grouped_by: grouped_fees.first.grouped_by,
212212
filters: filters(grouped_fees),
213-
presentation_breakdowns: PresentationBreakdownBuilder.call(grouped_fees, filter: PresentationBreakdownBuilder::GROUPED)
213+
presentation_breakdowns: V1::Customers::PresentationBreakdownBuilder.call(grouped_fees, filter: V1::Customers::PresentationBreakdownBuilder::GROUPED, filter_breakdown: V1::Customers::PresentationBreakdownBuilder::ALL)
214214
}
215215
end
216216

0 commit comments

Comments
 (0)