We're using the remote-pay-windows to interact with the Mini from our POS. In older terminals, there were two options to handle a reversal. A Void was used before the batch closed. A Refund was used after the batch closed.
It appears that there are two options in the SDK. What are the differences and where should they be used? I don't find anything specifically clear.
It sounds like if we use the refund exclusively, the mini/clover will determine whether to void or refund based on if the batch was settled making the separate void functions unnecessary. But I find using the void feature removes all aspect of the transaction (even on the mini dashboard) but doesn't provide any record (maybe this is intended). But I know many customers will want some proof that the transaction was reversed, which the void payment doesn't provide. Can you clarify when each would be appropriate and if my findings are correct?
You're correct: if you use the RefundPayment API while the void window is still open, our server will initiate a void at the gateway. Regardless of what happens at the gateway, the payment record is updated in accordance with the API used.
Our system apps typically use voids during the payment flow. For example, if a transaction is authorized but the merchant rejects the signature, then the payment is voided and the Mini returns to the Payment Method Selection screen, where the customer can swipe again or the transaction can be canceled. From the merchant's perspective, the transaction either finishes successfully after the second card swipe (which creates a second payment record) or is canceled. That's why voided payments don't show up in the Transactions app; it's a UX decision to show the merchant the successful payment or none at all.
In semi-integration, using ICloverConnector.voidPayment() doesn't typically involve any UI_STATE transitions on the Mini (Remote Pay Windows is an exception). The paymentId returned in ICloverConnectorListener.onVoidPaymentResponse() is the same id as the payment that was voided, and that payment record is updated with the voidReason that was set on the VoidPaymentRequest.
Using ICloverConnector.RefundPayment() shows the Receipt Options screen on the Mini, so that a refund receipt can be printed for the customer. The paymentId returned in ICloverConnectorListener.onRefundPaymentResponse() is the same id as the payment that was refunded, and that payment record still shows result: SUCCESS; however, the response also contains the refund record that was created and associated with the payment.
Unlike with a void, the payment and its refund are visible to the merchant in the Transactions app.