HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/pietvanmierlo/stempelbv.nl/app/Komma/Shop/Listeners/TransactionChanged.php
<?php


namespace App\Komma\Shop\Listeners;


use App\Komma\Shop\Orders\Kms\OrderMailServiceInterface;
use App\Komma\Shop\Orders\Kms\OrderServiceInterface;
use App\Komma\Shop\Orders\Models\Order;
use App\Komma\Shop\Orders\OrderStatus;
use App\Komma\Shop\Payment\Events\TransactionChanged as TransactionChangedEvent;
use App\Komma\Shop\Payment\TransactionStatus;
use App\Komma\Users\Models\KmsUser;

/**
 * Class TransactionChanged
 *
 * Triggered when a transaction changed because a psp said so.
 *
 * The purpose of this class is to delegate with a capital D to
 * other services in response of a transaction change. To, for example,
 * update an order, send out mails, make invoices etc.
 *
 * @package App\Komma\Shop\Listeners
 */
class TransactionChanged
{
    /** @var OrderMailServiceInterface $orderMailService */
    private $orderMailService;

    /** @var OrderServiceInterface $orderService */
    private $orderService;

    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        $this->orderService = app(OrderServiceInterface::class);
        $this->orderMailService = app(OrderMailServiceInterface::class);
    }

    /**
     * Handle the event.
     *
     * @param TransactionChangedEvent $event
     * @return void
     */
    public function handle(TransactionChangedEvent $event) {
        /** @var Order $order */
        $order = $event->transaction->order()->first();
        /** @var KmsUser $customer */
        $customer = $order->customer()->first();

        //Change the order status depending on the transaction status. And notify customer and staff if needed
        switch ($event->transaction->status)
        {
            case TransactionStatus::CANCELED_CUSTOMER:
                $order->status = OrderStatus::CANCELED;
                if(!$order->isDirty()) break; //Don't mail about non changed order
                \Log::debug('TransactionChange listener: Mailing the customer that his order was canceled (transaction canceled by customer. Transaction Id: '.$event->transaction->id.', Order Id: '.$order->id.').');
                $this->orderMailService->mailCustomerAboutCurrentOrderStatus($order, $customer, 'The transaction was canceled by the customer');
                break;
            case TransactionStatus::CANCELED:
                $order->status = OrderStatus::CANCELED;
                if(!$order->isDirty()) break; //Don't mail about non changed order
                \Log::debug('TransactionChange listener: Mailing the customer that his order was canceled (transaction canceled by shop. Transaction Id: '.$event->transaction->id.', Order Id: '.$order->id.').');
                $this->orderMailService->mailCustomerAboutCurrentOrderStatus($order, $customer, 'The transaction was canceled by the shop');
                break;
            case TransactionStatus::CHARGEDBACK:
                $order->status = OrderStatus::DISPUTED;
                if(!$order->isDirty()) break; //Don't mail about non changed order
                \Log::debug('TransactionChange listener: Mailing staff that an order was disputed (Transaction chargeback. Transaction Id: '.$event->transaction->id.', Order Id: '.$order->id.').');
                $this->orderMailService->mailStaffAboutCurrentOrderStatus($order, 'A chargeback was done on request of the user at the psp or financial institute side');
                break;
            case TransactionStatus::REFUNDED:
                $order->status = OrderStatus::REFUNDED;
                if(!$order->isDirty()) break; //Don't mail about non changed order
                \Log::debug('TransactionChange listener: Mailing customer that an order was refunded (Transaction refunded. Transaction Id: '.$event->transaction->id.', Order Id: '.$order->id.').');
                $this->orderMailService->mailCustomerAboutCurrentOrderStatus($order, $customer, 'The transaction has refunded');
                break;
            case TransactionStatus::AUTHORISATION_REJECTED:
            case TransactionStatus::REDIRECTED_USER_TO_PSP:
            case TransactionStatus::REFUND_PENDING:
            case TransactionStatus::CHARGEBACK_PENDING:
            case TransactionStatus::CANCEL_PENDING:
            case TransactionStatus::AUTHORISATION_PENDING:
            case TransactionStatus::PAYMENT_PENDING:
            case TransactionStatus::PAYMENT_UNKNOWN:
                break;
            case TransactionStatus::EXPIRED:
                $order->status = OrderStatus::AWAITING_PAYMENT;
                if(!$order->isDirty()) break; //Don't mail about non changed order
                \Log::debug('TransactionChange listener: Mailing staff that an order payment has expired (Transaction expired. Transaction Id: '.$event->transaction->id.', Order Id: '.$order->id.').');
                $this->orderMailService->mailStaffAboutCurrentOrderStatus($order, 'The payment had expired. Contact your shop to start a new payment');
                break;
            case TransactionStatus::OPEN:
                \Log::debug('TransactionChange listener: Order put on pending since the payment process was started (Transaction open. Transaction Id: '.$event->transaction->id.', Order Id: '.$order->id.').');
                $order->status = OrderStatus::PENDING;
                break;
            case TransactionStatus::AUTHORIZED:
                break;
            case TransactionStatus::AUTHORISATION_UNKNOWN:
                break;
            case TransactionStatus::PAYMENT_PAID:
                \Log::debug('TransactionChange listener: Order waiting for fulfillment since transaction was completed / paid. Notifying customer ('.$customer->email.'). (Transaction Id: '.$event->transaction->id.', Order Id: '.$order->id.').');
                $order->status = OrderStatus::AWAITING_FULFILLMENT;
                if(!$order->isDirty()) break; //Don't mail about non changed order
                $this->orderMailService->mailCustomerAboutCurrentOrderStatus($order, $customer, 'Payment had been payed');
                $this->orderMailService->mailStaffAboutCurrentOrderStatus($order, 'Payment had been payed');
                //TODO Send invoice to user
                break;
        }

        //And finally save the order
        $order->save();
    }
}