Eccube\Service\ShoppingService::isOrderProduct PHP Method

isOrderProduct() public method

商品公開ステータスチェック、在庫チェック、購入制限数チェックを行い、在庫情報をロックする
public isOrderProduct ( $em, Order $Order ) : boolean
$em トランザクション制御されているEntityManager
$Order Eccube\Entity\Order 受注情報
return boolean true : 成功、false : 失敗
    public function isOrderProduct($em, \Eccube\Entity\Order $Order)
    {
        // 商品公開ステータスチェック
        $orderDetails = $Order->getOrderDetails();
        foreach ($orderDetails as $orderDetail) {
            if ($orderDetail->getProduct()->getStatus()->getId() != \Eccube\Entity\Master\Disp::DISPLAY_SHOW) {
                // 商品が非公開ならエラー
                return false;
            }
            // 購入制限数チェック
            if (!is_null($orderDetail->getProductClass()->getSaleLimit())) {
                if ($orderDetail->getQuantity() > $orderDetail->getProductClass()->getSaleLimit()) {
                    return false;
                }
            }
        }
        // 在庫チェック
        foreach ($orderDetails as $orderDetail) {
            // 在庫が無制限かチェックし、制限ありなら在庫数をチェック
            if ($orderDetail->getProductClass()->getStockUnlimited() == Constant::DISABLED) {
                // 在庫チェックあり
                // 在庫に対してロック(select ... for update)を実行
                $productStock = $em->getRepository('Eccube\\Entity\\ProductStock')->find($orderDetail->getProductClass()->getProductStock()->getId(), LockMode::PESSIMISTIC_WRITE);
                // 購入数量と在庫数をチェックして在庫がなければエラー
                if ($orderDetail->getQuantity() > $productStock->getStock()) {
                    return false;
                }
            }
        }
        return true;
    }