@@ -2218,8 +2218,18 @@ process_chargeback(Type = finalising_accounter, ID, Action0, St) ->
22182218process_chargeback (Type , ID , Action0 , St ) ->
22192219 ChargebackState = get_chargeback_state (ID , St ),
22202220 ChargebackOpts = get_chargeback_opts (St ),
2221- {Changes , Action1 } = hg_invoice_payment_chargeback :process_timeout (Type , ChargebackState , Action0 , ChargebackOpts ),
2222- {done , {[? chargeback_ev (ID , C ) || C <- Changes ], Action1 }}.
2221+ {Changes0 , Action1 } = hg_invoice_payment_chargeback :process_timeout (Type , ChargebackState , Action0 , ChargebackOpts ),
2222+ Changes1 = [? chargeback_ev (ID , C ) || C <- Changes0 ],
2223+ case Type of
2224+ % % NOTE In case if payment is already charged back and we want
2225+ % % to reopen and change it, this will ensure machine to
2226+ % % continue processing activities following cashflow update
2227+ % % event.
2228+ updating_cash_flow ->
2229+ {next , {Changes1 , Action1 }};
2230+ _ ->
2231+ {done , {Changes1 , Action1 }}
2232+ end .
22232233
22242234maybe_set_charged_back_status (? chargeback_status_accepted (), ChargebackBody , St ) ->
22252235 InterimPaymentAmount = get_remaining_payment_balance (St ),
@@ -2229,6 +2239,15 @@ maybe_set_charged_back_status(?chargeback_status_accepted(), ChargebackBody, St)
22292239 ? cash (Amount , _ ) when Amount > 0 ->
22302240 []
22312241 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+ [? payment_status_changed (PrevStatus )];
22322251maybe_set_charged_back_status (_ChargebackStatus , _ChargebackBody , _St ) ->
22332252 [].
22342253
@@ -3262,22 +3281,22 @@ merge_change(Change = ?payment_status_changed({failed, _} = Status), #st{payment
32623281 St ,
32633282 Opts
32643283 ),
3265- St # st {
3284+ ( record_status_change ( Change , St )) # st {
32663285 payment = Payment # domain_InvoicePayment {status = Status },
32673286 activity = idle ,
32683287 failure = undefined ,
32693288 timings = accrue_status_timing (failed , Opts , St )
32703289 };
32713290merge_change (Change = ? payment_status_changed ({cancelled , _ } = Status ), # st {payment = Payment } = St , Opts ) ->
32723291 _ = validate_transition ({payment , finalizing_accounter }, Change , St , Opts ),
3273- St # st {
3292+ ( record_status_change ( Change , St )) # st {
32743293 payment = Payment # domain_InvoicePayment {status = Status },
32753294 activity = idle ,
32763295 timings = accrue_status_timing (cancelled , Opts , St )
32773296 };
32783297merge_change (Change = ? payment_status_changed ({captured , Captured } = Status ), # st {payment = Payment } = St , Opts ) ->
3279- _ = validate_transition ({payment , finalizing_accounter }, Change , St , Opts ),
3280- St # st {
3298+ _ = validate_transition ([ idle , {payment , finalizing_accounter }] , Change , St , Opts ),
3299+ ( record_status_change ( Change , St )) # st {
32813300 payment = Payment # domain_InvoicePayment {
32823301 status = Status ,
32833302 cost = get_captured_cost (Captured , Payment )
@@ -3288,19 +3307,19 @@ merge_change(Change = ?payment_status_changed({captured, Captured} = Status), #s
32883307 };
32893308merge_change (Change = ? payment_status_changed ({processed , _ } = Status ), # st {payment = Payment } = St , Opts ) ->
32903309 _ = validate_transition ({payment , processing_accounter }, Change , St , Opts ),
3291- St # st {
3310+ ( record_status_change ( Change , St )) # st {
32923311 payment = Payment # domain_InvoicePayment {status = Status },
32933312 activity = {payment , flow_waiting },
32943313 timings = accrue_status_timing (processed , Opts , St )
32953314 };
32963315merge_change (Change = ? payment_status_changed ({refunded , _ } = Status ), # st {payment = Payment } = St , Opts ) ->
32973316 _ = validate_transition (idle , Change , St , Opts ),
3298- St # st {
3317+ ( record_status_change ( Change , St )) # st {
32993318 payment = Payment # domain_InvoicePayment {status = Status }
33003319 };
33013320merge_change (Change = ? payment_status_changed ({charged_back , _ } = Status ), # st {payment = Payment } = St , Opts ) ->
33023321 _ = validate_transition (idle , Change , St , Opts ),
3303- St # st {
3322+ ( record_status_change ( Change , St )) # st {
33043323 payment = Payment # domain_InvoicePayment {status = Status }
33053324 };
33063325merge_change (Change = ? chargeback_ev (ID , Event ), St , Opts ) ->
@@ -3467,6 +3486,9 @@ merge_change(Change = ?session_ev(Target, Event), St = #st{activity = Activity},
34673486 St2
34683487 end .
34693488
3489+ record_status_change (? payment_status_changed (Status ), St ) ->
3490+ St # st {status_log = [Status | St # st .status_log ]}.
3491+
34703492latest_adjustment_id (# st {adjustments = []}) ->
34713493 undefined ;
34723494latest_adjustment_id (# st {adjustments = Adjustments }) ->
0 commit comments