Skip to content

Commit 9eea8de

Browse files
authored
feat(fixed-charges): Add fixed charge boundaries to billing period (#4492)
## Roadmap Task 👉 https://getlago.canny.io/feature-requests/p/allow-add-ons-to-be-added-to-subscription-invoices 👉 https://getlago.canny.io/feature-requests/p/define-quantities-for-plan-charges ## Context ### What is the current situation? **Option 1:** User has to create a one off invoice alongside the subscription, it will create 2 different invoices. **Option 2:** User can add a recurring billable metric and use event to have this fee invoice on subscription renewal, but it won’t appear on the first billing subscription. ### What problem are we trying to solve? At subscription creation or afterward, there is no clear way to invoice a fixed fee that is not tied to events, aside from the subscription fee itself. This fee could be either a one-time charge or a recurring one. ## Description Add fixed charge boundaries to billing period serializer. We need to use safe operator as existing invoice subscription does not have fixed charges boundaries.
1 parent e2efa12 commit 9eea8de

File tree

3 files changed

+24
-8
lines changed

3 files changed

+24
-8
lines changed

app/serializers/v1/invoices/billing_period_serializer.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ def serialize
1212
subscription_to_datetime: model.to_datetime.iso8601,
1313
charges_from_datetime: model.charges_from_datetime.iso8601,
1414
charges_to_datetime: model.charges_to_datetime.iso8601,
15+
fixed_charges_from_datetime: model.fixed_charges_from_datetime&.iso8601,
16+
fixed_charges_to_datetime: model.fixed_charges_to_datetime&.iso8601,
1517
invoicing_reason: model.invoicing_reason
1618
}
1719
end

spec/factories/invoice_subscriptions.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
to_datetime { timestamp.end_of_month }
1616
charges_from_datetime { from_datetime - 1.month }
1717
charges_to_datetime { to_datetime.end_of_month }
18+
fixed_charges_from_datetime { from_datetime.beginning_of_month }
19+
fixed_charges_to_datetime { to_datetime.end_of_month }
1820
end
1921
end
2022
end

spec/serializers/v1/invoices/billing_period_serializer_spec.rb

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,27 @@
1010
it "serializes the object" do
1111
result = JSON.parse(serializer.to_json)
1212

13-
aggregate_failures do
13+
expect(result["billing_period"]["lago_subscription_id"]).to eq(invoice_subscription.subscription_id)
14+
expect(result["billing_period"]["external_subscription_id"]).to eq(invoice_subscription.subscription.external_id)
15+
expect(result["billing_period"]["lago_plan_id"]).to eq(invoice_subscription.subscription.plan_id)
16+
expect(result["billing_period"]["subscription_from_datetime"]).to eq(invoice_subscription.from_datetime.iso8601)
17+
expect(result["billing_period"]["subscription_to_datetime"]).to eq(invoice_subscription.to_datetime.iso8601)
18+
expect(result["billing_period"]["charges_from_datetime"]).to eq(invoice_subscription.charges_from_datetime.iso8601)
19+
expect(result["billing_period"]["charges_to_datetime"]).to eq(invoice_subscription.charges_to_datetime.iso8601)
20+
expect(result["billing_period"]["fixed_charges_from_datetime"]).to eq(invoice_subscription.fixed_charges_from_datetime.iso8601)
21+
expect(result["billing_period"]["fixed_charges_to_datetime"]).to eq(invoice_subscription.fixed_charges_to_datetime.iso8601)
22+
expect(result["billing_period"]["invoicing_reason"]).to eq(invoice_subscription.invoicing_reason)
23+
end
24+
25+
context "when legacy invoice subscription without fixed charges boundaries" do
26+
let(:invoice_subscription) { build(:invoice_subscription, :boundaries, fixed_charges_from_datetime: nil, fixed_charges_to_datetime: nil) }
27+
28+
it "serializes the object without fixed charges boundaries" do
29+
result = JSON.parse(serializer.to_json)
30+
1431
expect(result["billing_period"]["lago_subscription_id"]).to eq(invoice_subscription.subscription_id)
15-
expect(result["billing_period"]["external_subscription_id"]).to eq(invoice_subscription.subscription.external_id)
16-
expect(result["billing_period"]["lago_plan_id"]).to eq(invoice_subscription.subscription.plan_id)
17-
expect(result["billing_period"]["subscription_from_datetime"]).to eq(invoice_subscription.from_datetime.iso8601)
18-
expect(result["billing_period"]["subscription_to_datetime"]).to eq(invoice_subscription.to_datetime.iso8601)
19-
expect(result["billing_period"]["charges_from_datetime"]).to eq(invoice_subscription.charges_from_datetime.iso8601)
20-
expect(result["billing_period"]["charges_to_datetime"]).to eq(invoice_subscription.charges_to_datetime.iso8601)
21-
expect(result["billing_period"]["invoicing_reason"]).to eq(invoice_subscription.invoicing_reason)
32+
expect(result["billing_period"]["fixed_charges_from_datetime"]).to be_nil
33+
expect(result["billing_period"]["fixed_charges_to_datetime"]).to be_nil
2234
end
2335
end
2436
end

0 commit comments

Comments
 (0)