Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions apps/hellgate/src/hg_invoice_payment.erl
Original file line number Diff line number Diff line change
Expand Up @@ -800,10 +800,12 @@ check_risk_score(_RiskScore) ->
get_routing_predestination(#domain_InvoicePayment{make_recurrent = true}) ->
recurrent_payment;
get_routing_predestination(#domain_InvoicePayment{payer = ?payment_resource_payer()}) ->
payment;
%% Cascade recurrent payments go through full routing (filtered by tokens)
%% instead of a predefined parent route, so they need an explicit predestination.
get_routing_predestination(#domain_InvoicePayment{payer = ?recurrent_payer()}) ->
payment.

% Other payers has predefined routes

log_route_choice_meta(#{choice_meta := ChoiceMeta}, Revision) ->
Metadata = hg_routing:get_logger_metadata(ChoiceMeta, Revision),
logger:log(notice, "Routing decision made", #{routing => Metadata}).
Expand Down
32 changes: 16 additions & 16 deletions apps/hellgate/test/hg_direct_recurrent_tests_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ register_parent_payment_test(C) ->
%% second recurrent payment
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
Payment2ID = await_payment_capture(Invoice2ID, Payment2ID, Client),
?invoice_state(
Expand All @@ -294,7 +294,7 @@ another_party_test(C) ->
%% second recurrent payment
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
ExpectedError = #payproc_InvalidRecurrentParentPayment{details = <<"Parent payment refer to another party">>},
{error, ExpectedError} = start_payment(Invoice2ID, Payment2Params, Client).

Expand All @@ -310,7 +310,7 @@ same_party_different_shops_test(C) ->
SecondShopConfigRef = cfg(second_shop_config_ref, C),
Invoice2ID = start_invoice(SecondShopConfigRef, <<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
Payment2ID = await_payment_capture(Invoice2ID, Payment2ID, Client),
?invoice_state(
Expand All @@ -329,7 +329,7 @@ not_recurring_first_test(C) ->
%% second recurrent payment
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
ExpectedError = #payproc_InvalidRecurrentParentPayment{details = <<"Parent payment has no recurrent token">>},
{error, ExpectedError} = start_payment(Invoice2ID, Payment2Params, Client).

Expand All @@ -344,7 +344,7 @@ cancelled_first_payment_test(C) ->
%% second recurrent payment
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
Payment2ID = await_payment_capture(Invoice2ID, Payment2ID, Client),
?invoice_state(
Expand All @@ -366,7 +366,7 @@ not_exists_invoice_test(C) ->
Client = cfg(client, C),
InvoiceID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(<<"not_exists">>, <<"not_exists">>),
PaymentParams = make_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
PaymentParams = make_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
ExpectedError = #payproc_InvalidRecurrentParentPayment{details = <<"Parent invoice not found">>},
{error, ExpectedError} = start_payment(InvoiceID, PaymentParams, Client).

Expand All @@ -375,7 +375,7 @@ not_exists_payment_test(C) ->
Client = cfg(client, C),
InvoiceID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(InvoiceID, <<"not_exists">>),
PaymentParams = make_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
PaymentParams = make_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
ExpectedError = #payproc_InvalidRecurrentParentPayment{details = <<"Parent payment not found">>},
{error, ExpectedError} = start_payment(InvoiceID, PaymentParams, Client).

Expand Down Expand Up @@ -448,7 +448,7 @@ customer_id_stored_test(C) ->
%% Child recurrent payment inherits customer_id from parent — not passed explicitly
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
Payment2ID = await_payment_capture(Invoice2ID, Payment2ID, Client),
#payproc_InvoicePayment{
Expand Down Expand Up @@ -487,7 +487,7 @@ different_customer_id_test(C) ->
%% Child recurrent payment with different CustomerB should be rejected
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
BaseParams = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
BaseParams = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = BaseParams#payproc_InvoicePaymentParams{customer_id = CustomerB},
{error, #payproc_InvalidRecurrentParentPayment{details = <<"Customer ID mismatch with parent">>}} =
start_payment(Invoice2ID, Payment2Params, Client).
Expand Down Expand Up @@ -525,7 +525,7 @@ cascade_tokens_filter_success_test(C) ->
%% finds cascade tokens saved by first payment
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
Payment2ID = await_payment_capture(Invoice2ID, Payment2ID, Client),
?invoice_state(
Expand Down Expand Up @@ -568,7 +568,7 @@ cascade_recurrent_payment_success_test(C) ->
%% Step 4: Routing picks from candidates filtered by tokens; ?prv(1) fails, cascades to ?prv(2)
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
Payment2ID = await_payment_capture(Invoice2ID, Payment2ID, Client),
?invoice_state(
Expand Down Expand Up @@ -607,11 +607,11 @@ recurrent_no_customer_bankcard_lookup_test(C) ->
Payment1Params = make_payment_params(?pmt_sys(<<"visa-ref">>)),
{ok, Payment1ID} = start_payment(Invoice1ID, Payment1Params, Client),
Payment1ID = await_payment_capture(Invoice1ID, Payment1ID, Client),
%% Step 2: Child recurrent payment, also NO customer_id
%% Step 2: Child recurrent (make_recurrent=false), also NO customer_id
%% System should find BankCard by bank_card_token and load cascade tokens
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
Payment2ID = await_payment_capture(Invoice2ID, Payment2ID, Client),
%% Verify: payment succeeded, no customer_id
Expand Down Expand Up @@ -654,7 +654,7 @@ new_client_old_card_cascade_test(C) ->
%% prv(1) fails, cascades to prv(2)
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
Payment2ID = await_payment_capture(Invoice2ID, Payment2ID, Client),
%% Verify: cascade succeeded via ?prv(2)/?trm(2)
Expand All @@ -679,7 +679,7 @@ cascade_exhaustion_test(C) ->
%% Step 3: Recurrent payment should exhaust cascade and fail
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
%% Await payment failure
Pattern = [
Expand Down Expand Up @@ -723,7 +723,7 @@ cascade_routing_filter_test(C) ->
%% Step 4: Recurrent payment
Invoice2ID = start_invoice(<<"rubberduck">>, make_due_date(10), 42000, C),
RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID),
Payment2Params = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
Payment2Params = make_recurrent_payment_params(false, RecurrentParent, ?pmt_sys(<<"visa-ref">>)),
{ok, Payment2ID} = start_payment(Invoice2ID, Payment2Params, Client),
Payment2ID = await_payment_capture(Invoice2ID, Payment2ID, Client),
%% Verify: routed to prv(3)/trm(3) — prv(2) was excluded by routing despite having a token
Expand Down
Loading