diff --git a/Event/WorkPlace/FrontCart.php b/Event/WorkPlace/FrontCart.php index 908a6ff2024..1e525725641 100644 --- a/Event/WorkPlace/FrontCart.php +++ b/Event/WorkPlace/FrontCart.php @@ -1,15 +1,7 @@ app->isGranted('IS_AUTHENTICATED_FULLY'); - // ポイント情報基本設定を取得 - $pointInfo = $this->app['eccube.plugin.point.repository.pointinfo']->getLastInsertData(); - $pointRate = 0; - if (!empty($pointInfo)) { - $pointRate = (integer)$pointInfo->getPlgPointConversionRate(); - } + $PointInfo = $this->app['eccube.plugin.point.repository.pointinfo']->getLastInsertData(); + $pointRate = $PointInfo->getPlgPointConversionRate(); - // ポイント表示用変数作成 $point = array(); + $point['rate'] = $pointRate; - // ポイント換算率取得 - if ($isAuth) { - // ポイント計算ヘルパーを取得 - $calculator = null; + if ($this->app->isGranted('IS_AUTHENTICATED_FULLY')) { $calculator = $this->app['eccube.plugin.point.calculate.helper.factory']; - - // ヘルパーの取得判定 - if (empty($calculator)) { - return false; - } - - // カスタマー情報を取得 - $customer = $this->app['security']->getToken()->getUser(); - - if (empty($customer)) { - return false; - } - - // 計算に必要なエンティティを登録 - // カートアイテム(プロダクトクラス)を取得設定 + $Customer = $this->app->user(); $parameters = $event->getParameters(); - - if (empty($parameters)) { - return false; - } - - // カートオブジェクトの確認 - if (!isset($parameters['Cart']) || empty($parameters['Cart'])) { - return false; - } - - // 計算に必要なエンティティを格納 - $calculator->addEntity('Customer', $customer); + $calculator->addEntity('Customer', $Customer); $calculator->addEntity('Cart', $parameters['Cart']); - - // 会員保有ポイントを取得 + // 現在の保有ポイント $currentPoint = $calculator->getPoint(); - - // 会員保有ポイント取得判定 - if (empty($currentPoint)) { - $currentPoint = 0; - } - - // 購入商品付与ポイント取得 + // カートの加算ポイント $addPoint = $calculator->getAddPointByCart(); - - // 購入商品付与ポイント判定 - if (empty($addPoint)) { - $addPoint = 0; - } - $point['current'] = $currentPoint; + // getPointはnullを返す場合がある. + $point['current'] = is_null($currentPoint) ? 0 : $currentPoint; $point['add'] = $addPoint; - } - - $point['rate'] = $pointRate; - // 使用ポイントボタン付与 - // 権限判定 - if ($isAuth) { - $snippet = $this->app->render( - 'Point/Resource/template/default/Event/Cart/point_box.twig', - array( - 'point' => $point, - ) - )->getContent(); + $template = 'Point/Resource/template/default/Event/Cart/point_box.twig'; } else { - $snippet = $this->app->render( - 'Point/Resource/template/default/Event/Cart/point_box_no_customer.twig', - array( - 'point' => $point, - ) - )->getContent(); + $template = 'Point/Resource/template/default/Event/Cart/point_box_no_customer.twig'; } + + $snippet = $this->app->renderView($template, array('point' => $point)); + $search = '
replaceView($event, $snippet, $search); } diff --git a/Helper/PointCalculateHelper/PointCalculateHelper.php b/Helper/PointCalculateHelper/PointCalculateHelper.php index 81158df9961..d974fc3b76d 100644 --- a/Helper/PointCalculateHelper/PointCalculateHelper.php +++ b/Helper/PointCalculateHelper/PointCalculateHelper.php @@ -249,59 +249,43 @@ public function getLatestAddPointByOrder() } /** - * カート情報をもとに付与ポイントを返却 - * @return bool|int + * カート情報をもとに加算ポイントを返却する. + * + * かートの明細単位で計算を行う + * 商品ごとの付与率が設定されている場合は商品ごと付与率を利用する + * 商品ごとの付与率に0が設定されている場合は加算ポイントは付与しない + * + * @return int */ public function getAddPointByCart() { // カートエンティティチェック if (empty($this->entities['Cart'])) { - return false; - } - - // 商品毎のポイント付与率を取得 - $productClasses = array(); - $cartObjects = array(); - foreach ($this->entities['Cart']->getCartItems() as $cart) { - $productClasses[] = $cart->getObject(); // 商品毎ポイント付与率取得用 - $cartObjects[] = $cart; // 購入数を判定するためのカートオブジェジェクト - } - - // 商品毎のポイント付与率取得 - $productRates = $this->app['eccube.plugin.point.repository.pointproductrate']->getPointProductRateByEntity( - $productClasses - ); - - // 付与率の設定がされていない場合 - if (count($productRates) < 1) { - $productRates = false; - } - - // 商品毎のポイント付与率セット - $this->productRates = $productRates; - - // 取得ポイント付与率商品ID配列を取得 - if ($this->productRates) { - $productKeys = array_keys($this->productRates); + $this->app['monolog']->critical('cart not found.'); + throw new LogicException(); } - // 商品詳細ごとの購入金額にレートをかける - // レート計算後個数をかける - foreach ($cartObjects as $node) { - $rate = 1; - // 商品毎ポイント付与率が設定されていない場合 - $rate = $this->basicRate / 100; - if ($this->productRates) { - if (in_array($node->getObject()->getProduct()->getId(), $productKeys)) { - // 商品ごとポイント付与率が設定されている場合 - $rate = $this->productRates[$node->getObject()->getProduct()->getId()] / 100; - } + $this->addPoint = 0; + $basicRate = $this->basicRate / 100; + + foreach ($this->entities['Cart']->getCartItems() as $cartItem) { + $rate = $basicRate; + $ProductClass = $cartItem->getObject(); + $Product = $ProductClass->getProduct(); + // 商品ごとの付与率を取得 + $productRates = $this->app['eccube.plugin.point.repository.pointproductrate'] + ->getPointProductRateByEntity(array($ProductClass)); + + if ($productRates) { + // 商品ごとの付与率が設定されている場合は、基本付与率ではなく、商品ごとの付与率を利用する + $productId = $Product->getId(); + $rate = $productRates[$productId] / 100; } - $this->addPoint += (integer)$this->getRoundValue( - (($node->getObject()->getPrice02() * $rate) * $node->getQuantity()) - ); + $addPoint = ($ProductClass->getPrice02() * $rate) * $cartItem->getQuantity(); + $this->addPoint += $addPoint; } + $this->addPoint = $this->getRoundValue($this->addPoint); return $this->addPoint; } @@ -355,7 +339,7 @@ public function getAddPointByOrder() $rate = $this->productRates[$node->getProduct()->getId()] / 100; } } - $this->addPoint += $this->getRoundValue(($node->getProductClass()->getPrice02() * $rate) * $node->getQuantity()); + $this->addPoint += ($node->getProductClass()->getPrice02() * $rate) * $node->getQuantity(); } // 減算処理の場合減算値を返却 diff --git a/Repository/PointProductRateRepository.php b/Repository/PointProductRateRepository.php index 65b5f383d2f..aac8c37edbc 100644 --- a/Repository/PointProductRateRepository.php +++ b/Repository/PointProductRateRepository.php @@ -130,10 +130,12 @@ public function getPointProductRateByEntity($entity = null) SELECT MAX(t2.plg_point_product_rate_id) FROM Plugin\Point\Entity\PointProductRate t2 - WHERE t1.product_id = t1.product_id -) AND t1.plg_point_product_rate IS NOT NULL'; + WHERE t1.product_id = t2.product_id +) AND t1.plg_point_product_rate IS NOT NULL AND t1.product_id IN (:ids)'; - $result = $this->getEntityManager()->createQuery($dql)->getArrayResult(); + $query = $this->getEntityManager()->createQuery($dql); + $query->setParameters(array('ids' => $ids)); + $result = $query->getArrayResult(); // データが一件もない場合処理をキャンセル if (count($result) < 1) { diff --git a/Tests/Helper/PointCalculateHelper/PointCalculateHelperTest.php b/Tests/Helper/PointCalculateHelper/PointCalculateHelperTest.php index 191a44537ef..54ba50e0325 100644 --- a/Tests/Helper/PointCalculateHelper/PointCalculateHelperTest.php +++ b/Tests/Helper/PointCalculateHelper/PointCalculateHelperTest.php @@ -13,18 +13,6 @@ */ class PointCalculateHelperTest extends EccubeTestCase { -// public function testGetAddPointByCart() -// { -// -// } -// - -// -// public function testGetAddPointByProduct() -// { -// -// } - /** * 端数計算のテスト */ @@ -204,4 +192,128 @@ public function testGetAddPointByOrder() $this->verify('index ' . $i . ' failed.'); } } + + public function testGetAddPointByCart() + { + $testData = array( + /** + * - 基本ポイント付与率 + * - ポイント換算レート + * - 端数計算方法 + * //- ポイント利用(不要) + * //- ポイント減算方式(不要) + * - 商品毎ポイント付与率 + * - 商品価格 + * - 商品個数 + * - 期待値 + */ + array(1, 1, 0, 0, 1, null, 5000, 1, 50), + array(1, 1, 0, 0, 1, 5, 1000, 2, 100), + + ); + + $Product = $this->createProduct(); + $ProductClasses = $Product->getProductClasses(); + $ProductClass = $ProductClasses[0]; + + /** @var $calculater \Plugin\Point\Helper\PointCalculateHelper\PointCalculateHelper **/ + $calculater = $this->app['eccube.plugin.point.calculate.helper.factory']; + /** @var $PointInfo \Plugin\Point\Entity\PointInfo **/ + $PointInfo = $this->app['eccube.plugin.point.repository.pointinfo']->getLastInsertData(); + + $calculater->addEntity('Cart', $this->app['eccube.service.cart']->getCart()); + + $max = count($testData); + for ($i = 0; $i < $max; $i++) { + $data = $testData[$i]; + + // 基本ポイント付与率 + $PointInfo->setPlgBasicPointRate($data[0]); + // ポイント換算レート + $PointInfo->setPlgPointConversionRate($data[1]); + // 端数計算方法 + $PointInfo->setPlgRoundType($data[2]); + + // 商品ごとポイント付与率 + $this->app['eccube.plugin.point.repository.pointproductrate']->savePointProductRate($data[5], $Product); + // 商品価格 + $ProductClass->setPrice02($data[6]); + + // 商品個数 + $this->app['eccube.service.cart']->clear(); + $this->app['eccube.service.cart']->setProductQuantity($ProductClass, $data[7]); + $this->app['eccube.service.cart']->save(); + + $Cart = $this->app['session']->get('cart'); + $CartItems = $Cart->getCartItems(); + foreach ($CartItems as $item) { + $item->setObject($ProductClass); + } + $calculater->addEntity('Cart', $Cart); + + $this->expected = $data[8]; + $this->actual = $calculater->getAddPointByCart(); + $this->verify('index ' . $i . ' failed.'); + } + } + + public function testGetAddPointByProduct() + { + $testData = array( + /** + * - 基本ポイント付与率 + * - 端数計算方法 + * - 商品毎ポイント付与率 + * - 商品価格(最小) + * - 商品価格(最大) + * - 期待値(最小) + * - 期待値(最大) + */ + array(1, 0, null, 50, 490, 0, 4), + array(1, 1, null, 50, 490, 1, 5), + array(1, 2, null, 50, 490, 1, 5), + array(1, 0, 5, 50, 490, 2, 24), + array(1, 1, 5, 50, 490, 3, 25), + array(1, 2, 5, 50, 490, 3, 25), + ); + + $Product = $this->createProduct('test', 2); + $ProductClasses = $Product->getProductClasses(); + $ProductClass = $ProductClasses[0]; + + /** @var $calculater \Plugin\Point\Helper\PointCalculateHelper\PointCalculateHelper **/ + $calculater = $this->app['eccube.plugin.point.calculate.helper.factory']; + /** @var $PointInfo \Plugin\Point\Entity\PointInfo **/ + $PointInfo = $this->app['eccube.plugin.point.repository.pointinfo']->getLastInsertData(); + + $calculater->addEntity('Product', $Product); + + $max = count($testData); + for ($i = 0; $i < $max; $i++) { + $data = $testData[$i]; + + // 基本ポイント付与率 + $PointInfo->setPlgBasicPointRate($data[0]); + // 端数計算方法 + $PointInfo->setPlgRoundType($data[1]); + + // 商品ごとポイント付与率 + $this->app['eccube.plugin.point.repository.pointproductrate']->savePointProductRate($data[2], $Product); + // 商品価格 + $ProductClasses[0]->setPrice02($data[3]); + $ProductClasses[1]->setPrice02($data[4]); + + $point = $calculater->getAddPointByProduct(); + + // min + $this->expected = $data[5]; + $this->actual = $point['min']; + $this->verify('index ' . $i . ' min failed.'); + + // max + $this->expected = $data[6]; + $this->actual = $point['max']; + $this->verify('index ' . $i . ' max failed.'); + } + } }