<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Eccube\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Eccube\Form\Type\TopType;
use Eccube\Entity\Cart;
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Eccube\Service\CartService;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Service\PurchaseFlow\PurchaseFlow;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Eccube\Entity\ProductClass;
use Eccube\Entity\CartItem;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class TopController extends AbstractController
{
private $connection;
private $httpClient;
protected $session;
protected $entityManager;
/**
* @var CartService
*/
protected $cartService;
/**
* @var PurchaseFlow
*/
protected $purchaseFlow;
public function __construct(Connection $connection,HttpClientInterface $httpClient,CartService $cartService,PurchaseFlow $cartPurchaseFlow, EntityManagerInterface $entityManager,UrlGeneratorInterface $urlGenerator)
{
$this->connection = $connection;
$this->httpClient = $httpClient;
$this->cartService = $cartService;
$this->purchaseFlow = $cartPurchaseFlow;
$this->entityManager = $entityManager;
$this->urlGenerator = $urlGenerator;
}
/**
* @Route("/", name="homepage", methods={"POST", "GET"})
* @Template("index.twig")
*/
public function index(Request $request, FormFactoryInterface $formFactory, SessionInterface $session)
{
$builder = $formFactory->createNamedBuilder('', TopType::class);
$form = $builder->getForm();
$err['shipping_delivery_date'] = "";
$err['end_date'] = "";
if ($request->request->get('mode')=="sel") {
//日付計算
$shipping_delivery_date = new \DateTime( $request->get('shipping_delivery_date') );
$end_date = new \DateTime( $request->get('end_date') );
$today = new \DateTime('today');
$asatte = $today->modify('+1 day');
$order_plan = $request->get('order_plan');
if ($request->get('shipping_delivery_date') < $asatte->format('Y-m-d')) {
$err['shipping_delivery_date'] = "select one day later";
} elseif ($request->get('shipping_delivery_date') > $request->get('end_date')) {
$err['end_date'] = "select two days later";
} elseif (
($end_date->getTimestamp() - $shipping_delivery_date->getTimestamp()) / 86400 > 93 &&
$order_plan != "205" &&
$order_plan != "206" &&
$order_plan != "207" &&
$order_plan != "208" &&
$order_plan != "209" &&
$order_plan != "210" &&
$order_plan != "867" &&
$order_plan != "868" &&
$order_plan != "872"
) {
$err['end_date'] = "select within 93 days";
}
//エラーがない
if ($err['shipping_delivery_date'] == "" && $err['end_date'] == "") {
$kikan = (($end_date->getTimestamp() - $shipping_delivery_date->getTimestamp()) / 86400) + 1;
if ($order_plan == "1") {
$product_code = "Basic";
} elseif ($order_plan == "2") {
$product_code = "Premium";
} elseif ($order_plan == "4") {
$product_code = "5G";
} elseif ($order_plan == "205") {
$product_code = "SIM";
} elseif ($order_plan == "206") {
$product_code = "SIM";
} elseif ($order_plan == "207") {
$product_code = "SIM";
} elseif ($order_plan == "208") {
$product_code = "Basic";
} elseif ($order_plan == "209") {
$product_code = "Basic";
} elseif ($order_plan == "210") {
$product_code = "Basic";
} elseif ($order_plan == "867") {
$product_code = "Basic";
} elseif ($order_plan == "868") {
$product_code = "Basic";
} elseif ($order_plan == "872") {
$product_code = "Basic";
} else {
$product_code = "super";
}
//product_class_idを入手する
$res = null;
if ($product_code == "SIM" || $product_code == "Basic") {
$q = "SELECT pc.id AS product_class_id, pc.product_id
FROM dtb_product_class AS pc
LEFT JOIN dtb_product AS pr ON pc.product_id = pr.id
WHERE pc.visible='1' AND pr.product_status_id='1' AND pc.product_code='" . $product_code . "' AND product_id = '" . $order_plan . "'";
} else {
$q = "SELECT pc.id AS product_class_id, pc.product_id
FROM (SELECT id, product_id FROM dtb_product_class WHERE visible='1' AND product_code='" . $product_code . "') AS pc
LEFT JOIN dtb_product ON pc.product_id=dtb_product.id
WHERE dtb_product.product_status_id='1' AND dtb_product.kikan='" . $kikan . "'";
}
$res = $this->connection->fetchAllAssociative($q);
//たっぷり安心パック(保証)500円(税込) product_id:81 product_class_id:179
//モバイル充電器 800円(税込) product_id:82 product_class_id:180
//カートに入れる
$addCartForm = $builder->getForm();
$addCartForm->handleRequest($request);
$addCartData = $addCartForm->getData();
try {
// データベースから商品情報を取得
$res = $this->connection->fetchAllAssociative($q);
$productClassId = $res[0]['product_class_id'];
$totalQuantity = 1;
// 商品をカートに追加
$this->cartService->addProduct($productClassId, $totalQuantity);
// カートを保存
$this->cartService->save();
// カートの中身を確認
// dump($this->cartService->getCart());
// exit; // dumpの結果を確認したい場合はexitを追加
// if ($result) {
// // 商品がカートに追加された場合
// dd("商品がカートに追加されました。");
// } else {
// // 商品追加が失敗した場合
// dd("商品追加に失敗しました。");
// }
$arrOrderTappuri = $request->get('order_tappuri');
if ($arrOrderTappuri != "") {
for ($i = 0; $i < count($arrOrderTappuri); $i++) {
// 期間なしのPortable Charger
if ($arrOrderTappuri[$i] == "81") {
// $app['eccube.service.cart']->addProduct(179, 1)->save();
$productClassId = 179;
$totalQuantity = 1;
$this->cartService->addProduct($productClassId, $totalQuantity);
$this->cartService->save();
}
// 期間なしのPremium Insurance
elseif ($arrOrderTappuri[$i] == "82") {
// $app['eccube.service.cart']->addProduct(180, 1)->save();
$productClassId = 180;
$totalQuantity = 1;
$this->cartService->addProduct($productClassId, $totalQuantity);
$this->cartService->save();
} elseif ($arrOrderTappuri[$i] == "393") {
// $app['eccube.service.cart']->addProduct(491, 1)->save();
$productClassId = 491;
$totalQuantity = 1;
$this->cartService->addProduct($productClassId, $totalQuantity);
$this->cartService->save();
} elseif ($arrOrderTappuri[$i] == "461") {
// $app['eccube.service.cart']->addProduct(913, 1)->save();
$productClassId = 913;
$totalQuantity = 1;
$this->cartService->addProduct($productClassId, $totalQuantity);
$this->cartService->save();
}
// 本体レンタル期間と同じ日数のPortable Chargerをカートに入れる
elseif ($arrOrderTappuri[$i] == "charger") {
switch ($order_plan) {
case "208":
$optKikan = 90;
break;
case "209":
$optKikan = 180;
break;
case "210":
$optKikan = 360;
break;
case "867":
$optKikan = 120;
break;
case "868":
$optKikan = 150;
break;
case "872":
$optKikan = 300;
break;
default:
$optKikan = $kikan ?? 0;
}
$q = "SELECT pc.id AS product_class_id, pc.product_id
FROM (SELECT id, product_id FROM dtb_product_class WHERE visible='1' AND product_code='4589779235272') AS pc
LEFT JOIN dtb_product ON pc.product_id = dtb_product.id
WHERE dtb_product.product_status_id='1' AND dtb_product.kikan='" . $optKikan . "'";
$resCharger = $this->connection->fetchAllAssociative($q);
// $app['eccube.service.cart']->addProduct($resCharger[0]['product_class_id'], 1)->save();
if (!empty($resCharger)) {
$productClassIdPocketalk = $resCharger[0]['product_class_id'];
// 数量をレンタル期間で決定(例: 90日なら quantity = 3 など)
$totalQuantityPocketalk = ceil($optKikan / 30); // 1ヶ月ごとに1つ加算
// 商品をカートに追加
$this->cartService->addProduct($productClassIdPocketalk, $totalQuantityPocketalk);
// カートを保存
$this->cartService->save();
}
}
// 本体レンタル期間と同じ日数のPremium Insuranceをカートに入れる
elseif ($arrOrderTappuri[$i] == "insurance") {
switch ($order_plan) {
case "208":
$optKikan = 90;
break;
case "209":
$optKikan = 180;
break;
case "210":
$optKikan = 360;
break;
case "867":
$optKikan = 120;
break;
case "868":
$optKikan = 150;
break;
case "872":
$optKikan = 300;
break;
default:
$optKikan = $kikan ?? 0;
}
$q = "SELECT pc.id AS product_class_id, pc.product_id
FROM (SELECT * FROM dtb_product WHERE product_status_id = '1' AND name like '%Premium Insurance%day%' AND kikan = $optKikan) pr
LEFT JOIN dtb_product_class AS pc ON pc.product_id = pr.id AND pc.visible='1'";
$resInsurance = $this->connection->fetchAllAssociative($q);
// $app['eccube.service.cart']->addProduct($resInsurance[0]['product_class_id'], 1)->save();
if (!empty($resInsurance)) {
$productClassIdPocketalk = $resInsurance[0]['product_class_id'];
// 数量をレンタル期間で決定(例: 90日なら quantity = 3 など)
$totalQuantityPocketalk = ceil($optKikan / 30); // 1ヶ月ごとに1つ加算
// 商品をカートに追加
$this->cartService->addProduct($productClassIdPocketalk, $totalQuantityPocketalk);
// カートを保存
$this->cartService->save();
}
}
// 本体レンタル期間と同じ日数のPOCKETALKをカートに入れる
elseif ($arrOrderTappuri[$i] == "pocketalk") {
switch ($order_plan) {
case "208":
$optKikan = 90;
break;
case "209":
$optKikan = 180;
break;
case "210":
$optKikan = 360;
break;
case "867":
$optKikan = 120;
break;
case "868":
$optKikan = 150;
break;
case "872":
$optKikan = 300;
break;
default:
$optKikan = $kikan ?? 0;
}
$q = "SELECT pc.id AS product_class_id, pc.product_id
FROM (SELECT id, product_id FROM dtb_product_class WHERE visible='1' AND product_code='POCKETALK') AS pc
LEFT JOIN dtb_product ON pc.product_id = dtb_product.id
WHERE dtb_product.product_status_id='1' AND dtb_product.kikan='" . $optKikan . "'";
$resPocketalk = $this->connection->fetchAllAssociative($q);
// $app['eccube.service.cart']->addProduct($resPocketalk[0]['product_class_id'], 1)->save();
if (!empty($resPocketalk)) {
$productClassIdPocketalk = $resPocketalk[0]['product_class_id'];
// 数量をレンタル期間で決定(例: 90日なら quantity = 3 など)
$totalQuantityPocketalk = ceil($optKikan / 30); // 1ヶ月ごとに1つ加算
// 商品をカートに追加
$this->cartService->addProduct($productClassIdPocketalk, $totalQuantityPocketalk);
// カートを保存
$this->cartService->save();
}
}
// 本体レンタル期間と同じ日数のSpare Wifi 3GBをカートに入れる
elseif ($arrOrderTappuri[$i] == "sparewifi3gb") {
switch ($order_plan) {
case "208":
$optKikan = 90;
break;
case "209":
$optKikan = 180;
break;
case "210":
$optKikan = 360;
break;
case "867":
$optKikan = 120;
break;
case "868":
$optKikan = 150;
break;
case "872":
$optKikan = 300;
break;
default:
$optKikan = $kikan ?? 0;
}
$q = "SELECT pc.id AS product_class_id, pc.product_id
FROM (SELECT id, product_id FROM dtb_product_class WHERE visible='1' AND product_code='Spare Wi-Fi 3GB') AS pc
LEFT JOIN dtb_product ON pc.product_id = dtb_product.id
WHERE dtb_product.product_status_id='1' AND dtb_product.kikan='" . $optKikan . "'";
$resSpareWifi3GB = $this->connection->fetchAllAssociative($q);
// $app['eccube.service.cart']->addProduct($resSpareWifi3GB[0]['product_class_id'], 1)->save();
if (!empty($resSpareWifi3GB)) {
$productClassIdPocketalk = $resSpareWifi3GB[0]['product_class_id'];
// 数量をレンタル期間で決定(例: 90日なら quantity = 3 など)
$totalQuantityPocketalk = ceil($optKikan / 30); // 1ヶ月ごとに1つ加算
// 商品をカートに追加
$this->cartService->addProduct($productClassIdPocketalk, $totalQuantityPocketalk);
// カートを保存
$this->cartService->save();
}
}
}
}
//セッションへ記録
if ($this->session->get('order_st') != "") {
$this->session->set('order_st', array_merge($this->session->get('order_st'), [$res[0]['product_class_id'] => $request->get('order_st')])); // 商品ごと
} else {
$this->session->set('order_st', [$res[0]['product_class_id'] => $request->get('order_st')]); // 商品ごと
}
$this->session->set('shipping_delivery_date', $request->get('shipping_delivery_date')); // 注文1件ごと
if ($this->session->get('end_date') != "") {
$this->session->set('end_date', array_merge($this->session->get('end_date'), [$res[0]['product_class_id'] => $request->get('end_date')])); // 商品ごと
} else {
$this->session->set('end_date', [$res[0]['product_class_id'] => $request->get('end_date')]); // 商品ごと
}
} catch (CartException $e) {
$this->addRequestError($e->getMessage());
}
// 初期
// return $app->redirect($app->url('cart', ['buystep' => 1]));
// 次のページで右上のカートに一時的に商品入る
// return $this->render('Cart/index.twig', [
// 'totalQuantity' => $request->query->get('totalQuantity', 0), // クエリパラメータから取得
// ]);
//初期を少し改変
return new RedirectResponse($this->urlGenerator->generate('cart', ['buystep' => 1]));
// return $this->render('Cart/index.twig', [
// 'totalQuantity' => $totalQuantity,
// ]);
// return $this->redirectToRoute('cart', ['buystep' => 1]);
//念のためデータ表示
$form->get('order_st')->setData($request->get('order_st'));
$form->get('order_plan')->setData($request->get('order_plan'));
$form->get('shipping_delivery_date')->setData($shipping_delivery_date);
$form->get('end_date')->setData($end_date);
$form->get('order_tappuri')->setData($request->get('order_tappuri'));
//エラーのときの再表示
}else{
$form->get('order_st')->setData($request->get('order_st'));
$form->get('order_plan')->setData($request->get('order_plan'));
$form->get('shipping_delivery_date')->setData($shipping_delivery_date);
$form->get('end_date')->setData($end_date);
$form->get('order_tappuri')->setData($request->get('order_tappuri'));
}
}
// Clear shopping cart
if ($request->request->get('mode') == "set_cancel") {
$this->cartService->clear()->save(); // cartService を使ってカートをクリア
$session->remove('shipping_delivery_date');
$session->remove('end_date');
}
// 買い物を続けた場合、2回目の表示
// セッションへのアクセス
$session = $request->getSession();
// セッションから値を取得
if ($session->get('shipping_delivery_date') != "") {
$SD_Flg = $session->get('shipping_delivery_date');
} else {
$SD_Flg = 2;
}
return $this->render('index.twig', [
'form' => $form->createView(),
'err' => $err,
'SD_Flg' => $SD_Flg,
]);
}
public function getTotalPrice(Request $request)
{
// Ajaxリクエストからパラメータを取得
$product_code = $request->request->get('product_code');
$product_id = $request->request->get('product_id');
$kikan = $request->request->get('num');
$insurance = $request->request->get('insurance');
$charger = $request->request->get('charger');
$adapter = $request->request->get('adapter');
$sparewifi = $request->request->get('sparewifi');
$sparewifi3gb = $request->request->get('sparewifi3gb');
$pocketalk = $request->request->get('pocketalk');
$total = 0;
if ($product_code == 'Basic' || $product_code == 'SIM') {
// 価格を取得
$q = "SELECT pc.id AS product_class_id, pc.price02, pc.product_id
FROM dtb_product_class AS pc
LEFT JOIN dtb_product AS pr ON pc.product_id = pr.id
WHERE pc.visible='1' AND pr.product_status_id='1' AND pc.product_code = :product_code AND pc.product_id = :product_id";
} else {
// 価格を取得
$q = "SELECT pc.id AS product_class_id, pc.price02, pc.product_id
FROM dtb_product_class AS pc
LEFT JOIN dtb_product AS pr ON pc.product_id = pr.id
WHERE pc.visible='1' AND pr.product_status_id='1' AND pc.product_code = :product_code
AND pr.kikan = :kikan";
}
$res = $this->connection->fetchAllAssociative($q, [
'product_code' => $product_code,
'product_id' => $product_id,
'kikan' => $kikan
]);
foreach ($res as $item) {
$total += $item['price02'];
}
// 保険あり
if ($insurance == "true") {
// 価格を取得
$q = "SELECT pc.id AS product_class_id, pc.price02, pc.product_id
FROM (SELECT * FROM dtb_product WHERE product_status_id = 1 AND name like '%Premium Insurance%day%' AND kikan = $kikan) pr
LEFT JOIN dtb_product_class AS pc ON pc.product_id = pr.id AND pc.visible='1'";
$res = $this->connection->fetchAllAssociative($q, ['kikan' => $kikan]);
foreach ($res as $item) {
$total += $item['price02'];
}
}
// バッテリーあり
if ($charger == "true") {
// 価格を取得
$q = "SELECT pc.id AS product_class_id, pc.price02, pc.product_id
FROM dtb_product_class AS pc
LEFT JOIN dtb_product AS pr ON pc.product_id=pr.id
WHERE pc.visible='1' AND pc.product_code='4589779235272' AND pr.product_status_id='1' AND pr.kikan='" . $kikan . "'";
$res = $this->connection->fetchAllAssociative($q, ['kikan' => $kikan]);
foreach ($res as $item) {
$total += $item['price02'];
}
}
// Travel Adapter あり
if ($adapter == "true") {
// 価格を取得
$q = "SELECT pc.id AS product_class_id, pc.price02, pc.product_id
FROM dtb_product_class AS pc
LEFT JOIN dtb_product AS pr ON pc.product_id=pr.id
WHERE pc.visible='1' AND pr.product_status_id='1' AND pc.product_id = '393'";
$res = $this->connection->fetchAllAssociative($q);
foreach ($res as $item) {
$total += $item['price02'];
}
}
// Spare Wifiあり
if ($sparewifi == "true") {
// 価格を取得
$q = "SELECT pc.id AS product_class_id, pc.price02, pc.product_id
FROM dtb_product_class AS pc
LEFT JOIN dtb_product AS pr ON pc.product_id=pr.id
WHERE pc.visible='1' AND pr.product_status_id='1' AND product_id = '461'";
$res = $this->connection->fetchAllAssociative($q);
foreach ($res as $item) {
$total += $item['price02'];
}
}
// Spare Wifi 3GB (日数別料金) あり
if ($sparewifi3gb == "true") {
// 価格を取得
$q = "SELECT pc.id AS product_class_id, pc.price02, pc.product_id
FROM dtb_product_class AS pc
LEFT JOIN dtb_product AS pr ON pc.product_id=pr.id
WHERE pc.visible='1' AND pc.product_code='Spare Wi-Fi 3GB' AND pr.product_status_id='1' AND pr.kikan='" . $kikan . "'";
$res = $this->connection->fetchAllAssociative($q, ['kikan' => $kikan]);
foreach ($res as $item) {
$total += $item['price02'];
}
}
// POCKETALKあり
if ($pocketalk == "true") {
// 価格を取得
$q = "SELECT pc.id AS product_class_id, pc.price02, pc.product_id
FROM dtb_product_class AS pc
LEFT JOIN dtb_product AS pr ON pc.product_id=pr.id
WHERE pc.visible='1' AND pc.product_code='POCKETALK' AND pr.product_status_id='1' AND pr.kikan='" . $kikan . "'";
$res = $this->connection->fetchAllAssociative($q, ['kikan' => $kikan]);
foreach ($res as $item) {
$total += $item['price02'];
}
}
// 為替レートを取得
$response = $this->httpClient->request('GET', 'https://www.gaitameonline.com/rateaj/getrate');
$data = $response->toArray();
if (empty($data)) {
$usd = 0;
} else {
foreach ($data as $row) {
foreach ($row as $r) {
if ($r["currencyPairCode"] == "USDJPY") {
$usd = $total / $r["ask"];
}
}
}
}
// レスポンスを返す(例:JSON形式)
return new JsonResponse(['total' => $total, 'usd' => $usd]);
}
public function addProductToCart($ProductClass, $quantity = 1)
{
if (!$ProductClass instanceof ProductClass) {
$ProductClassId = $ProductClass;
$ProductClass = $this->entityManager
->getRepository(ProductClass::class)
->find($ProductClassId);
if (is_null($ProductClass)) {
return false;
}
}
$ClassCategory1 = $ProductClass->getClassCategory1();
if ($ClassCategory1 && !$ClassCategory1->isVisible()) {
return false;
}
$ClassCategory2 = $ProductClass->getClassCategory2();
if ($ClassCategory2 && !$ClassCategory2->isVisible()) {
return false;
}
$newItem = new CartItem();
$newItem->setQuantity($quantity);
$newItem->setPrice($ProductClass->getPrice02IncTax());
$newItem->setProductClass($ProductClass);
// カートアイテムのマージ処理
$allCartItems = $this->mergeAllCartItems([$newItem]);
$this->restoreCarts($allCartItems);
return true;
}
}