@startuml
autonumber
title
<b>Gravy Secure Fields Card Payment Overview (One-Time)</b>
https://docs.gr4vy.com/guides/payments/secure-fields/quick-start/overview
end title

actor User
participant "PaymentsWiki" as A
participant "Secure Fields Form" as B
participant "SmashPig" as C
participant "Gravy" as D

User -> A: Navigate to gravy form
activate A

A -> A: GravyGateway::setClientVariables()
activate A #00FF80



A -> C: GravyAdapter::getCheckoutSession()
activate C

C -> C: PaymentProvider::createPaymentSession()
activate C #00FF80
C -> D: Gravy API Call: POST /checkout/sessions/

activate D
D --> C: Return Session result
deactivate D
deactivate C

C --> A: Return Gravy Session ID

deactivate C
deactivate A
A <-- D: Load https://cdn.wikimedia.gr4vy.app/secure-fields/latest/secure-fields.js

A -> A: Load gravy.js
activate A #00FF80
activate B
A -> B: Initialize Secure Fields with Session ID, gr4vyID\n& environment

A -> B: Set up custom form validation listener

A -> B: Set up field placeholders
A -> B: Show "Donate" button and attach submit event
A -> B: Attach submit event
deactivate B
deactivate A

note over B: Secure Fields payment form setup complete

deactivate A
User -> B: User submits form
activate B
B --> A: gravy.js::handleCardSubmitClick()
deactivate B
activate A

A -> A: Call di_donate_gravy()
activate A #00FF80
A -> A: Call GravyAdapter::doPayment()
activate A #yellow
A -> A: Gateway_Extras_CustomFilters::onGatewayReady( )
activate A #FFCC99
A -> A: QueueWrapper::push( 'payments-antifraud', **$transaction** );
|||
deactivate A
A -> A: GravyAdapter::runSessionVelocityFilter( )

== Authorize Payment ==
A -> C: GravyAdapter::callCreatePayment( )
activate C
C -> C: PaymentProvider::createPayment()
activate C #00FF80

C -> C: PaymentProvider::createPaymentFromSecureFields()
activate C #yellow


alt "Donor already exists in gravy?"
|||
C -> C: PaymentProvider::getDonorRecord()


activate C #99CCFF

C -> D: Gravy API Call: GET /buyers

activate D
D --> C: return /buyers result

deactivate C

|||
else "Donor does not exist in gravy"
|||
note right C: Create donor record in gravy
|||
deactivate D
C -> C: PaymentProvider::createDonor()
activate C #99CCFF

C -> D: Gravy API Call: POST /buyers
activate D
D --> C: return /buyers result

end
deactivate C
deactivate D

|||
note right C: Submit payment
C -> D: Gravy API Call: POST /transactions
activate D
D --> C: return /transactions result

deactivate C
deactivate D
deactivate C

C --> A: Return SmashPig CreatePaymentResponse result
deactivate C
|||
A -> A: GravyAdapter::handleCreatedPayment()
activate A #99CCFF
== Post-Auth Fraud Filter Checks ==
A -> A: GravyAdapter::runFraudFilters(**$authorizeResult**)
activate A #FFCC99
note right A: Add AVS/CVV scores to response from **$authorizeResult**::getRiskScores()
A -> A: Gateway_Extras_CustomFilters::onValidate()
deactivate A

== Capture Payment ==

A -> C: GravyAdapter::callApprovePayment()
activate C
C -> C: PaymentProvider::approvePayment()
activate C #00FF80

C -> D: Gravy API Call: POST /transactions/**$transaction_id**/capture
activate D
D --> C: return /capture result
deactivate C
deactivate D


C --> A: Return SmashPig ApprovePaymentResponse result
deactivate C
== Final Queue Push ==
A -> A: GravyAdapter::finalizeInternalStatus()
activate A #FFCC99
A -> A: QueueWrapper::push( 'payments-init', **$transaction** );
deactivate A
|||
A -> A: GravyAdapter::postProcessDonation()

activate A #FFCC99
A -> A: GravyAdapter::doQueueTransaction()
A -> A: QueueWrapper::push( 'donations', **$transaction** );

== Payment complete ==
deactivate A
deactivate A
deactivate A
deactivate A
A -> A: Display result

A -> User: Done!
deactivate A

@enduml
