<?php
namespace Customize\Service;
use Customize\Repository\ContractRepository;
use Eccube\Entity\Order;
use Eccube\Exception\ShoppingException;
use Eccube\Repository\Master\OrderStatusRepository;
use Eccube\Service\PurchaseFlow\Processor\{
PointProcessor,
StockReduceProcessor
};
use Eccube\Service\{
OrderStateMachine as BaseOrderStateMachine,
OrderStateMachineContext
};
use Symfony\Component\Workflow\{
Event\Event,
StateMachine
};
class OrderStateMachine extends BaseOrderStateMachine
{
private ContractRepository $contractRepository;
public function __construct(
StateMachine $_orderStateMachine,
OrderStatusRepository $orderStatusRepository,
PointProcessor $pointProcessor,
StockReduceProcessor $stockReduceProcessor,
ContractRepository $contractRepository
)
{
parent::__construct($_orderStateMachine, $orderStatusRepository, $pointProcessor, $stockReduceProcessor);
$this->contractRepository = $contractRepository;
}
public function updatePaymentDate(Event $event): void
{
parent::updatePaymentDate($event);
/** @var OrderStateMachineContext $subject */
$subject = $event->getSubject();
/** @var Order $Order */
$Order = $subject->getOrder();
$contractId = $Order->getContractId();
$paymentMethod = $Order->getPayment()?->getBackendMethod();
$updateDate = $Order->getContract()?->getUpdateDate();
if (!$contractId || !$paymentMethod || !$updateDate) {
throw new ShoppingException(trans('purchase_flow.contract_confirm_param_not_found'));
}
// 入金確認
$result = $this->contractRepository->confirmPayment($contractId, $paymentMethod, $updateDate);
if (!$result) {
throw new ShoppingException(trans('purchase_flow.backend_over_stock'));
}
}
}