Skip to content

Commit 0218395

Browse files
committed
Adds payment status reversal for canceling accepted chargeback
1 parent 99c452a commit 0218395

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

apps/hellgate/include/hg_invoice_payment.hrl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
-record(st, {
55
activity :: hg_invoice_payment:activity(),
6+
status_log = [] :: [dmsl_domain_thrift:'InvoicePaymentStatus'()],
67
payment :: undefined | hg_invoice_payment:payment(),
78
risk_score :: undefined | hg_inspector:risk_score(),
89
routes = [] :: [hg_route:payment_route()],

apps/hellgate/src/hg_invoice_payment.erl

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2239,6 +2239,17 @@ maybe_set_charged_back_status(?chargeback_status_accepted(), ChargebackBody, St)
22392239
?cash(Amount, _) when Amount > 0 ->
22402240
[]
22412241
end;
2242+
maybe_set_charged_back_status(
2243+
?chargeback_status_cancelled(),
2244+
_ChargebackBody,
2245+
#st{
2246+
payment = #domain_InvoicePayment{status = ?charged_back()},
2247+
status_log = [_ActualStatus, PrevStatus | _]
2248+
}
2249+
) ->
2250+
%% NOTE Mind warning (or constraint) of `invalid_transition` from
2251+
%% 'idle' activity.
2252+
[?payment_status_changed(PrevStatus)];
22422253
maybe_set_charged_back_status(_ChargebackStatus, _ChargebackBody, _St) ->
22432254
[].
22442255

@@ -3272,22 +3283,22 @@ merge_change(Change = ?payment_status_changed({failed, _} = Status), #st{payment
32723283
St,
32733284
Opts
32743285
),
3275-
St#st{
3286+
(record_status_change(Change, St))#st{
32763287
payment = Payment#domain_InvoicePayment{status = Status},
32773288
activity = idle,
32783289
failure = undefined,
32793290
timings = accrue_status_timing(failed, Opts, St)
32803291
};
32813292
merge_change(Change = ?payment_status_changed({cancelled, _} = Status), #st{payment = Payment} = St, Opts) ->
32823293
_ = validate_transition({payment, finalizing_accounter}, Change, St, Opts),
3283-
St#st{
3294+
(record_status_change(Change, St))#st{
32843295
payment = Payment#domain_InvoicePayment{status = Status},
32853296
activity = idle,
32863297
timings = accrue_status_timing(cancelled, Opts, St)
32873298
};
32883299
merge_change(Change = ?payment_status_changed({captured, Captured} = Status), #st{payment = Payment} = St, Opts) ->
3289-
_ = validate_transition({payment, finalizing_accounter}, Change, St, Opts),
3290-
St#st{
3300+
_ = validate_transition([idle, {payment, finalizing_accounter}], Change, St, Opts),
3301+
(record_status_change(Change, St))#st{
32913302
payment = Payment#domain_InvoicePayment{
32923303
status = Status,
32933304
cost = get_captured_cost(Captured, Payment)
@@ -3298,19 +3309,19 @@ merge_change(Change = ?payment_status_changed({captured, Captured} = Status), #s
32983309
};
32993310
merge_change(Change = ?payment_status_changed({processed, _} = Status), #st{payment = Payment} = St, Opts) ->
33003311
_ = validate_transition({payment, processing_accounter}, Change, St, Opts),
3301-
St#st{
3312+
(record_status_change(Change, St))#st{
33023313
payment = Payment#domain_InvoicePayment{status = Status},
33033314
activity = {payment, flow_waiting},
33043315
timings = accrue_status_timing(processed, Opts, St)
33053316
};
33063317
merge_change(Change = ?payment_status_changed({refunded, _} = Status), #st{payment = Payment} = St, Opts) ->
33073318
_ = validate_transition(idle, Change, St, Opts),
3308-
St#st{
3319+
(record_status_change(Change, St))#st{
33093320
payment = Payment#domain_InvoicePayment{status = Status}
33103321
};
33113322
merge_change(Change = ?payment_status_changed({charged_back, _} = Status), #st{payment = Payment} = St, Opts) ->
33123323
_ = validate_transition(idle, Change, St, Opts),
3313-
St#st{
3324+
(record_status_change(Change, St))#st{
33143325
payment = Payment#domain_InvoicePayment{status = Status}
33153326
};
33163327
merge_change(Change = ?chargeback_ev(ID, Event), St, Opts) ->
@@ -3477,6 +3488,9 @@ merge_change(Change = ?session_ev(Target, Event), St = #st{activity = Activity},
34773488
St2
34783489
end.
34793490

3491+
record_status_change(?payment_status_changed(Status), St) ->
3492+
St#st{status_log = [Status | St#st.status_log]}.
3493+
34803494
latest_adjustment_id(#st{adjustments = []}) ->
34813495
undefined;
34823496
latest_adjustment_id(#st{adjustments = Adjustments}) ->

apps/hellgate/test/hg_invoice_tests_SUITE.erl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4097,10 +4097,9 @@ reopen_accepted_payment_chargeback_and_cancel_ok(C) ->
40974097
[
40984098
?payment_ev(PID, ?chargeback_ev(CBID, ?chargeback_target_status_changed(?chargeback_status_cancelled()))),
40994099
?payment_ev(PID, ?chargeback_ev(CBID, ?chargeback_cash_flow_changed([]))),
4100-
?payment_ev(PID, ?chargeback_ev(CBID, ?chargeback_status_changed(?chargeback_status_cancelled())))
4101-
] = next_changes(IID, 3, Client),
4102-
%% TODO Implement status reversal and assert payment status is
4103-
%% prior the chargeback acceptance.
4100+
?payment_ev(PID, ?chargeback_ev(CBID, ?chargeback_status_changed(?chargeback_status_cancelled()))),
4101+
?payment_ev(PID, ?payment_status_changed(?captured()))
4102+
] = next_changes(IID, 4, Client),
41044103
ok.
41054104

41064105
-spec reopen_payment_chargeback_inconsistent(config()) -> _ | no_return().

0 commit comments

Comments
 (0)