Contributions held for fraud then approved don't send receipts
When a contribution is made that's held by the Authorize.net Fraud Detection Suite, it doesn't send a receipt to the donor when the payment is approved.
net.authorize.payment.fraud.approved events call
CRM_Core_Payment_MJWIPNTrait::updateContributionCompleted() just like recurring payment events. But that method determines whether to send a receipt based on
getSendEmailReceipt(), which assumes a recurring payment.
This MR teaches
getSendEmailReceipt() to calculate whether to send a receipt based on the contribution page ID (for non-recurring contributions).
The edge case I'm not sure about is a contribution entered through the back-end that gets held for fraud. To my knowledge, the determination to send the receipt in that case is made at the form layer. That probably needs to change in core, but is out of scope here.