$paymentTrxnParams['status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Refunded');
}
+ //If Payment is recorded on Failed contribution, update it to Pending.
+ if ($contributionStatus === 'Failed' && $params['total_amount'] > 0) {
+ //Enter a financial trxn to record a payment in receivable account
+ //as failed transaction does not insert any trxn values. Hence, if Payment is
+ //recorded on a failed contribution, the transition happens from Failed -> Pending -> Completed.
+ $ftParams = array_merge($paymentTrxnParams, [
+ 'from_financial_account_id' => NULL,
+ 'to_financial_account_id' => $accountsReceivableAccount,
+ 'is_payment' => 0,
+ 'status_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending'),
+ ]);
+ CRM_Core_BAO_FinancialTrxn::create($ftParams);
+ $contributionStatus = 'Pending';
+ self::updateContributionStatus($contribution['id'], $contributionStatus);
+ }
$trxn = CRM_Core_BAO_FinancialTrxn::create($paymentTrxnParams);
if ($params['total_amount'] < 0 && !empty($params['cancelled_payment_id'])) {