Skip to content

Commit a76078d

Browse files
committed
feat(payment_terms): Dual-write to alias and jsonb
1 parent 028be6a commit a76078d

15 files changed

Lines changed: 228 additions & 0 deletions

app/models/payment_term.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ def self.from_h(hash)
1717
)
1818
end
1919

20+
# Backward compatibility for the legacy net_payment_term_field
21+
def self.from_net_payment_term(days)
22+
if days.nil?
23+
nil
24+
else
25+
new(term_type: "net", days:)
26+
end
27+
end
28+
2029
def initialize(term_type:, days: nil, day_of_month: nil, month_offset: nil)
2130
@term_type = term_type.to_s
2231
@days = days&.to_i

app/services/billing_entities/create_service.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ def call
2626
billing_entity.document_locale = billing_config[:document_locale] if billing_config[:document_locale]
2727
billing_entity.einvoicing = params[:einvoicing] if params[:einvoicing]
2828

29+
PaymentTerms::AssignAliasService.call(record: billing_entity, params:)
30+
2931
handle_eu_tax_management if params[:eu_tax_management]
3032
handle_base64_logo
3133

app/services/billing_entities/update_service.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ def call
6969
)
7070
end
7171

72+
PaymentTerms::AssignAliasService.call(record: billing_entity, params:)
73+
7274
if params.key?(:tax_codes)
7375
BillingEntities::Taxes::ManageTaxesService.call!(billing_entity:, tax_codes: params[:tax_codes])
7476
end

app/services/customers/create_service.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ def call
7070
customer_type: args[:customer_type]
7171
)
7272

73+
PaymentTerms::AssignAliasService.call(record: customer, params: args)
74+
7375
if customer&.organization&.revenue_share_enabled?
7476
customer.account_type = args[:account_type] if args.key?(:account_type)
7577
customer.exclude_from_dunning_campaign = customer.partner_account?

app/services/customers/update_service.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ def call
9191

9292
Customers::UpdateInvoiceIssuingDateSettingsService.call(customer:, params: args)
9393

94+
PaymentTerms::AssignAliasService.call(record: customer, params: args)
95+
9496
if args.key?(:net_payment_term)
9597
Customers::UpdateInvoicePaymentDueDateService.call(customer:, net_payment_term: args[:net_payment_term])
9698
end

app/services/customers/upsert_from_api_service.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def call
7171
customer.legal_name = params[:legal_name] if params.key?(:legal_name)
7272
customer.legal_number = params[:legal_number] if params.key?(:legal_number)
7373
customer.net_payment_term = params[:net_payment_term] if params.key?(:net_payment_term)
74+
PaymentTerms::AssignAliasService.call(record: customer, params:)
7475
customer.external_salesforce_id = params[:external_salesforce_id] if params.key?(:external_salesforce_id)
7576
customer.finalize_zero_amount_invoice = params[:finalize_zero_amount_invoice] || "inherit" if params.key?(:finalize_zero_amount_invoice)
7677
customer.firstname = params[:firstname] if params.key?(:firstname)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# frozen_string_literal: true
2+
3+
module PaymentTerms
4+
# Dual-write for the legacy net_payment_term alias: a write of the integer with no
5+
# explicit payment_term mirrors it into the structured jsonb column as {net, N}.
6+
#
7+
# When payment_term is sent too, it wins and this service stays out of the way.
8+
# NOTE: the payment_term input does not exist yet. Whichever change introduces it
9+
# must also assign it, otherwise the value is dropped here while
10+
# net_payment_term still writes, leaving the two columns diverged.
11+
#
12+
# Only assigns, the caller is responsible for saving the record.
13+
class AssignAliasService < BaseService
14+
Result = BaseResult
15+
16+
def initialize(record:, params:)
17+
@record = record
18+
@params = params
19+
super
20+
end
21+
22+
def call
23+
if params.key?(:net_payment_term) && !params.key?(:payment_term)
24+
record.payment_term = PaymentTerm.from_net_payment_term(params[:net_payment_term])&.to_h
25+
end
26+
27+
result
28+
end
29+
30+
private
31+
32+
attr_reader :record, :params
33+
end
34+
end

spec/models/payment_term_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,19 @@
2828
end
2929
end
3030

31+
describe ".from_net_payment_term" do
32+
it "builds a net term from the legacy alias" do
33+
expect(described_class.from_net_payment_term(0)&.to_h)
34+
.to eq("term_type" => "net", "days" => 0)
35+
expect(described_class.from_net_payment_term(30)&.to_h)
36+
.to eq("term_type" => "net", "days" => 30)
37+
end
38+
39+
it "returns nil when the legacy alias is cleared" do
40+
expect(described_class.from_net_payment_term(nil)).to be_nil
41+
end
42+
end
43+
3144
describe "#to_h" do
3245
it "serializes only the fields carried by the term type" do
3346
expect(described_class.from_h(term_type: "due_on_receipt").to_h)

spec/services/billing_entities/create_service_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@
4747
before { result }
4848
end
4949

50+
it "does not set the structured payment term when net_payment_term is not provided" do
51+
expect(result).to be_success
52+
expect(result.billing_entity.net_payment_term).to eq(0)
53+
expect(result.billing_entity.payment_term).to be_nil
54+
end
55+
5056
it "does not set eu_tax_management when not provided" do
5157
expect(result).to be_success
5258
expect(result.billing_entity.eu_tax_management).to be false
@@ -177,6 +183,7 @@
177183
expect(result.billing_entity.legal_name).to eq("Legal Name")
178184
expect(result.billing_entity.legal_number).to eq("Legal Number")
179185
expect(result.billing_entity.net_payment_term).to eq(90)
186+
expect(result.billing_entity.payment_term).to eq("term_type" => "net", "days" => 90)
180187
expect(result.billing_entity.state).to eq("State")
181188
expect(result.billing_entity.tax_identification_number).to eq("EU123456789")
182189
expect(result.billing_entity.vat_rate).to eq(1)

spec/services/billing_entities/update_service_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@
181181
end
182182

183183
before do
184+
billing_entity.update!(net_payment_term: 30, payment_term: {"term_type" => "net", "days" => 30})
184185
allow(BillingEntities::UpdateInvoicePaymentDueDateService).to receive(:call).and_call_original
185186
end
186187

@@ -192,6 +193,7 @@
192193
expect(result).to be_success
193194

194195
expect(result.billing_entity.net_payment_term).to eq(2)
196+
expect(result.billing_entity.payment_term).to eq("term_type" => "net", "days" => 2)
195197
expect(BillingEntities::UpdateInvoicePaymentDueDateService).to have_received(:call).with(billing_entity:, net_payment_term: 2)
196198
end
197199
end

0 commit comments

Comments
 (0)