HEX
Server: Apache
System: Linux webm019.cluster128.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User: petsclubcc (68997)
PHP: 5.4.45
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/petsclubcc/shop/modules/amazonpay/src/classes/AmazonPayCronHandler.php
<?php
/**
 * 2007-2021 patworx.de
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade AmazonPay to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to http://www.prestashop.com for more information.
 *
 *  @author    patworx multimedia GmbH <service@patworx.de>
 *  @copyright 2007-2021 patworx multimedia GmbH
 *  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */

class AmazonPayCronHandler
{

    private $transactions = [];
    private $refunded_transactions = [];

    /**
     * AmazonPayCronHandler constructor.
     */
    public function __construct()
    {
        $this->transactions = $this->findRefreshableTransactions();
        $this->refunded_transactions = $this->findRefreshableRefundTransactions();
    }

    public function refreshOrders()
    {
        foreach ($this->transactions as $transaction) {
            $amazonPayOrder = AmazonPayOrder::findByCheckoutSessionId($transaction['amazon_checkout_session']);
            $amazonPayCheckoutSession = new AmazonPayCheckoutSession(
                false,
                $transaction['amazon_checkout_session']
            );
            $chargeinfo = $amazonPayCheckoutSession->getCharge();

            if (isset($chargeinfo['info']['statusDetails']['state'])) {
                switch ($chargeinfo['info']['statusDetails']['state']) {
                    case 'Declined':
                        self::handleDeclinedTransaction(
                            $amazonPayOrder,
                            $transaction,
                            $chargeinfo
                        );
                        break;
                    case 'Authorized':
                        self::handleAuthorizedTransaction(
                            $amazonPayOrder,
                            $amazonPayCheckoutSession,
                            $chargeinfo
                        );
                        break;
                }
            }
        }
        foreach ($this->refunded_transactions as $transaction) {
            $amazonPayOrder = AmazonPayOrder::findByCheckoutSessionId($transaction['amazon_checkout_session']);
            $amazonPayCheckoutSession = new AmazonPayCheckoutSession(
                false,
                $transaction['amazon_checkout_session']
            );
            $refundinfo = $amazonPayCheckoutSession->getRefund($transaction['amazon_transaction']);
            if (isset($refundinfo['statusDetails']['state'])) {
                switch ($refundinfo['statusDetails']['state']) {
                    case 'Declined':
                        self::handleDeclinedRefund(
                            $amazonPayOrder,
                            $transaction,
                            $refundinfo
                        );
                        break;
                    case 'Refunded':
                        self::handleRefundedRefund(
                            $amazonPayOrder,
                            $amazonPayCheckoutSession,
                            $refundinfo
                        );
                        break;
                }
            }
        }
    }

    /**
     * @return array|false|mysqli_result|PDOStatement|resource|null
     * @throws PrestaShopDatabaseException
     */
    public function findRefreshableTransactions()
    {
        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
            'SELECT * FROM `' . _DB_PREFIX_ . 'amazonpay_transactions` at1
                WHERE at1.`transaction_type` = \'chargePermission\'
                  AND NOT EXISTS (
                    SELECT * FROM `' . _DB_PREFIX_ . 'amazonpay_transactions` at2
                     WHERE at2.amazon_checkout_session = at1.amazon_checkout_session
                       AND (at2.transaction_type = \'capture\' OR at2.transaction_type = \'cancel\' OR at2.transaction_type = \'close\')
                  )
                '
        );
        if ($result && is_array($result) && sizeof($result) > 0) {
            return $result;
        }
        return [];
    }

    /**
     * @return array|false|mysqli_result|PDOStatement|resource|null
     * @throws PrestaShopDatabaseException
     */
    public function findRefreshableRefundTransactions()
    {
        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
            'SELECT * FROM `' . _DB_PREFIX_ . 'amazonpay_transactions` at1
                WHERE at1.`transaction_type` = \'refund_pending\'
                  AND NOT EXISTS (
                    SELECT * FROM `' . _DB_PREFIX_ . 'amazonpay_transactions` at2
                     WHERE at2.amazon_checkout_session = at1.amazon_checkout_session
                       AND (at2.transaction_type = \'cancel\' OR at2.transaction_type = \'close\')
                  )
                '
        );
        if ($result && is_array($result) && sizeof($result) > 0) {
            return $result;
        }
        return [];
    }

    /**
     * @param AmazonPayOrder $amazonPayOrder
     * @param array $transaction
     * @param array $chargeinfo
     * @throws PrestaShopDatabaseException
     * @throws PrestaShopException
     */
    public static function handleDeclinedTransaction(AmazonPayOrder $amazonPayOrder, array $transaction, array $chargeinfo)
    {
        AmazonPayLogger::getInstance()->addLog(
            'Handling Declined Transaction ' . $transaction['amazon_checkout_session'],
            3,
            false,
            $chargeinfo
        );
        $amazonPayOrder->setOrderStatus(AmazonPayHelper::getStatus('decline'));
        AmazonPayTransaction::store(
            $transaction['amazon_checkout_session'],
            $chargeinfo['chargePermissionId'],
            'close',
            0
        );
    }

    /**
     * @param AmazonPayOrder $amazonPayOrder
     * @param AmazonPayCheckoutSession $amazonPayCheckoutSession
     * @param array $chargeinfo
     * @throws PrestaShopDatabaseException
     * @throws PrestaShopException
     */
    public static function handleAuthorizedTransaction(AmazonPayOrder $amazonPayOrder, AmazonPayCheckoutSession $amazonPayCheckoutSession, array $chargeinfo)
    {
        AmazonPayLogger::getInstance()->addLog(
            'Handling Authorized Transaction ' . $amazonPayCheckoutSession->getAmazonPayCheckoutSessionId(),
            3,
            false,
            $chargeinfo
        );
        if (AmazonPayHelper::captureDirectlyAfterCheckout()) {
            $order = new Order((int)$amazonPayOrder->id_order);
            $amazonPayCheckoutSession->capture(
                $chargeinfo['chargeId'],
                $chargeinfo['info']['chargeAmount']['amount'],
                $chargeinfo['info']['chargeAmount']['currencyCode'],
                $order->reference
            );
        }
    }

    /**
     * @param AmazonPayOrder $amazonPayOrder
     * @param AmazonPayCheckoutSession $amazonPayCheckoutSession
     * @param array $refundinfo
     */
    public static function handleDeclinedRefund(AmazonPayOrder $amazonPayOrder, AmazonPayCheckoutSession $amazonPayCheckoutSession, array $refundinfo)
    {
        AmazonPayLogger::getInstance()->addLog(
            'Handling Declined Refund ' . $amazonPayCheckoutSession->getAmazonPayCheckoutSessionId(),
            3,
            false,
            $refundinfo
        );
        $transaction = AmazonPayTransaction::getByRefundId($refundinfo['refundId']);
        if ($transaction) {
            $transaction->transaction_type = 'refund_declined';
            $transaction->save();
        }
    }

    /**
     * @param AmazonPayOrder $amazonPayOrder
     * @param AmazonPayCheckoutSession $amazonPayCheckoutSession
     * @param array $refundinfo
     */
    public static function handleRefundedRefund(AmazonPayOrder $amazonPayOrder, AmazonPayCheckoutSession $amazonPayCheckoutSession, array $refundinfo)
    {
        AmazonPayLogger::getInstance()->addLog(
            'Handling Refunded Refund ' . $amazonPayCheckoutSession->getAmazonPayCheckoutSessionId(),
            3,
            false,
            $refundinfo
        );
        $transaction = AmazonPayTransaction::getByRefundId($refundinfo['refundId']);
        if ($transaction) {
            $transaction->transaction_type = 'refund';
            $transaction->save();
        }
    }
}