Skip to content

Commit

Permalink
Merge pull request EC-CUBE#16 from chihiro-adachi/test-cart
Browse files Browse the repository at this point in the history
商品/カートの加算ポイントのテストを追加
  • Loading branch information
chihiro-adachi committed May 6, 2016
2 parents 68cfd10 + 6f136fc commit baae9f0
Show file tree
Hide file tree
Showing 4 changed files with 173 additions and 140 deletions.
97 changes: 16 additions & 81 deletions Event/WorkPlace/FrontCart.php
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
<?php


namespace Plugin\Point\Event\WorkPlace;

use Eccube\Event\EventArgs;
use Eccube\Event\TemplateEvent;
use Plugin\Point\Resource\lib\PointCalculateHelper\Bridge\CalculateType\FrontCart\NonSubtraction;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Validator\Constraints as Assert;

/**
Expand All @@ -23,98 +15,41 @@ class FrontCart extends AbstractWorkPlace
{
/**
* カートページにポイント情報を表示
*
* @param TemplateEvent $event
* @return bool
*/
public function createTwig(TemplateEvent $event)
{
// 権限判定
$isAuth = $this->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 = '<div id="cart_item_list"';
$this->replaceView($event, $snippet, $search);
}
Expand Down
72 changes: 28 additions & 44 deletions Helper/PointCalculateHelper/PointCalculateHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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();
}

// 減算処理の場合減算値を返却
Expand Down
8 changes: 5 additions & 3 deletions Repository/PointProductRateRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
136 changes: 124 additions & 12 deletions Tests/Helper/PointCalculateHelper/PointCalculateHelperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,6 @@
*/
class PointCalculateHelperTest extends EccubeTestCase
{
// public function testGetAddPointByCart()
// {
//
// }
//

//
// public function testGetAddPointByProduct()
// {
//
// }

/**
* 端数計算のテスト
*/
Expand Down Expand Up @@ -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.');
}
}
}

0 comments on commit baae9f0

Please sign in to comment.