File: D:/HostingSpaces/SBogers10/inzigd.komma.pro/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\User;
/**
* 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 User $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();
}
}