Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
5 / 5 |
CRAP | |
100.00% |
74 / 74 |
| TaxRuleRepository | |
100.00% |
1 / 1 |
|
100.00% |
9 / 9 |
37 | |
100.00% |
74 / 74 |
| setApplication | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| newTaxRule | |
100.00% |
1 / 1 |
1 | |
100.00% |
8 / 8 |
|||
| getByRule | |
100.00% |
1 / 1 |
27 | |
100.00% |
53 / 53 |
|||
| anonymous function | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getList | |
100.00% |
1 / 1 |
1 | |
100.00% |
6 / 6 |
|||
| getById | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
| getByTime | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
| delete | |
100.00% |
1 / 1 |
3 | |
100.00% |
0 / 0 |
|||
| clearCache | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
| <?php | |
| /* | |
| * This file is part of EC-CUBE | |
| * | |
| * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved. | |
| * | |
| * http://www.lockon.co.jp/ | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License | |
| * as published by the Free Software Foundation; either version 2 | |
| * of the License, or (at your option) any later version. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU General Public License | |
| * along with this program; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
| */ | |
| namespace Eccube\Repository; | |
| use Doctrine\ORM\EntityRepository; | |
| use Doctrine\ORM\NoResultException; | |
| use Eccube\Common\Constant; | |
| /** | |
| * TaxRuleRepository | |
| * | |
| * This class was generated by the Doctrine ORM. Add your own custom | |
| * repository methods below. | |
| */ | |
| class TaxRuleRepository extends EntityRepository | |
| { | |
| private $rules = array(); | |
| protected $app; | |
| public function setApplication($app) | |
| { | |
| $this->app = $app; | |
| } | |
| public function newTaxRule() | |
| { | |
| $TaxRule = new \Eccube\Entity\TaxRule(); | |
| $CalcRule = $this->getEntityManager() | |
| ->getRepository('Eccube\Entity\Master\Taxrule') | |
| ->find(1); | |
| $TaxRule->setCalcRule($CalcRule); | |
| $TaxRule->setTaxAdjust(0); | |
| $TaxRule->setDelFlg(0); | |
| return $TaxRule; | |
| } | |
| /** | |
| * 現在有効な税率設定情報を返す | |
| * | |
| * @param int|null|\Eccube\Entity\Product $Product 商品 | |
| * @param int|null|\Eccube\Entity\ProductClass $ProductClass 商品規格 | |
| * @param int|null|\Eccube\Entity\Master\Pref $Pref 都道府県 | |
| * @param int|null|\Eccube\Entity\Master\Country $Country 国 | |
| * @return \Eccube\Entity\TaxRule 税設定情報 | |
| * | |
| * @throws NoResultException | |
| */ | |
| public function getByRule($Product = null, $ProductClass = null, $Pref = null, $Country = null) | |
| { | |
| if (!$this->app) { | |
| throw new \LogicException(); | |
| } | |
| // Pref Country 設定 | |
| if (!$Pref && !$Country && $this->app['security']->getToken() && $this->app['security']->isGranted('ROLE_USER')) { | |
| /* @var $Customer \Eccube\Entity\Customer */ | |
| $Customer = $this->app['security']->getToken()->getUser(); | |
| $Pref = $Customer->getPref(); | |
| $Country = $Customer->getCountry(); | |
| } | |
| // 商品単位税率設定がOFFの場合 | |
| /** @var $BaseInfo \Eccube\Entity\BaseInfo */ | |
| $BaseInfo = $this->app['eccube.repository.base_info']->get(); | |
| if ($BaseInfo->getOptionProductTaxRule() !== Constant::ENABLED) { | |
| $Product = null; | |
| $ProductClass = null; | |
| } | |
| // Cache Key 設定 | |
| if ($Product instanceof \Eccube\Entity\Product) { | |
| $productId = $Product->getId(); | |
| } elseif ($Product) { | |
| $productId = $Product; | |
| } else { | |
| $productId = '0'; | |
| } | |
| if ($ProductClass instanceof \Eccube\Entity\ProductClass) { | |
| $productClassId = $ProductClass->getId(); | |
| } elseif ($ProductClass) { | |
| $productClassId = $ProductClass; | |
| } else { | |
| $productClassId = '0'; | |
| } | |
| if ($Pref instanceof \Eccube\Entity\Master\Pref) { | |
| $prefId = $Pref->getId(); | |
| } elseif ($Pref) { | |
| $prefId = $Pref; | |
| } else { | |
| $prefId = '0'; | |
| } | |
| if ($Country instanceof \Eccube\Entity\Master\Country) { | |
| $countryId = $Country->getId(); | |
| } elseif ($Country) { | |
| $countryId = $Country; | |
| } else { | |
| $countryId = '0'; | |
| } | |
| $cacheKey = $productId.':'.$productClassId.':'.$prefId.':'.$countryId; | |
| // すでに取得している場合はキャッシュから | |
| if (isset($this->rules[$cacheKey])) { | |
| return $this->rules[$cacheKey]; | |
| } | |
| $parameters = array(); | |
| $qb = $this->createQueryBuilder('t') | |
| ->where('t.apply_date < CURRENT_TIMESTAMP()'); | |
| // Pref | |
| if ($Pref) { | |
| $qb->andWhere('t.Pref IS NULL OR t.Pref = :Pref'); | |
| $parameters['Pref'] = $Pref; | |
| } else { | |
| $qb->andWhere('t.Pref IS NULL'); | |
| } | |
| // Country | |
| if ($Country) { | |
| $qb->andWhere('t.Country IS NULL OR t.Country = :Country'); | |
| $parameters['Country'] = $Country; | |
| } else { | |
| $qb->andWhere('t.Country IS NULL'); | |
| } | |
| /* | |
| * Product, ProductClass が persist される前に TaxRuleEventSubscriber によってアクセスされる | |
| * 場合があるため、ID の存在もチェックする. | |
| * https://github.com/EC-CUBE/ec-cube/issues/677 | |
| */ | |
| // Product | |
| if ($Product && $productId > 0) { | |
| $qb->andWhere('t.Product IS NULL OR t.Product = :Product'); | |
| $parameters['Product'] = $Product; | |
| } else { | |
| $qb->andWhere('t.Product IS NULL'); | |
| } | |
| // ProductClass | |
| if ($ProductClass && $productClassId > 0) { | |
| $qb->andWhere('t.ProductClass IS NULL OR t.ProductClass = :ProductClass'); | |
| $parameters['ProductClass'] = $ProductClass; | |
| } else { | |
| $qb->andWhere('t.ProductClass IS NULL'); | |
| } | |
| $TaxRules = $qb | |
| ->setParameters($parameters) | |
| ->orderBy('t.apply_date', 'DESC') // 実際は usort() でソートする | |
| ->getQuery() | |
| ->getResult(); | |
| // 地域設定を優先するが、システムパラメーターなどに設定を持っていくか | |
| // 後に書いてあるほど優先される | |
| $priorityKeys = explode(',', $this->app['config']['tax_rule_priority']); | |
| $priorityKeys = array(); | |
| foreach (explode(',', $this->app['config']['tax_rule_priority']) as $key) { | |
| $priorityKeys[] = str_replace('_', '', preg_replace('/_id\z/', '', $key)); | |
| } | |
| foreach ($TaxRules as $TaxRule) { | |
| $rank = 0; | |
| foreach ($priorityKeys as $index => $key) { | |
| $arrayProperties = array_change_key_case($TaxRule->toArray()); | |
| if ($arrayProperties[$key]) { | |
| // 配列の数値添字を重みとして利用する | |
| $rank += 1 << ($index + 1); | |
| } | |
| } | |
| $TaxRule->setRank($rank); | |
| } | |
| // 適用日降順, rank 降順にソートする | |
| usort($TaxRules, function($a, $b) { | |
| return $a->compareTo($b); | |
| }); | |
| if (!empty($TaxRules)) { | |
| $this->rules[$cacheKey] = $TaxRules[0]; | |
| return $TaxRules[0]; | |
| } else { | |
| throw new NoResultException(); | |
| } | |
| } | |
| /** | |
| * getList | |
| * | |
| * @return array|null | |
| */ | |
| public function getList() | |
| { | |
| $qb = $this->createQueryBuilder('t') | |
| ->orderBy('t.apply_date', 'DESC') | |
| ->where('t.Product IS NULL AND t.ProductClass IS NULL'); | |
| $TaxRules = $qb | |
| ->getQuery() | |
| ->getResult(); | |
| return $TaxRules; | |
| } | |
| /** | |
| * getById | |
| * | |
| * @param int $id | |
| * @return array | |
| */ | |
| public function getById($id) | |
| { | |
| $criteria = array( | |
| 'id' => $id, | |
| ); | |
| return $this->findOneBy($criteria); | |
| } | |
| /** | |
| * getByTime | |
| * | |
| * @param string $applyDate | |
| * @return mixed | |
| */ | |
| public function getByTime($applyDate) | |
| { | |
| $criteria = array( | |
| 'apply_date' => $applyDate, | |
| ); | |
| return $this->findOneBy($criteria); | |
| } | |
| /** | |
| * 税規約の削除. | |
| * | |
| * @param int|\Eccube\Entity\TaxRule $TaxRule 税規約 | |
| * @return void | |
| * @throws NoResultException | |
| */ | |
| public function delete($TaxRule) | |
| { | |
| if (!$TaxRule instanceof \Eccube\Entity\TaxRule) { | |
| $TaxRule = $this->find($TaxRule); | |
| } | |
| if (!$TaxRule) { | |
| throw new NoResultException; | |
| } | |
| $TaxRule->setDelFlg(1); | |
| $em = $this->getEntityManager(); | |
| $em->persist($TaxRule); | |
| $em->flush(); | |
| } | |
| /** | |
| * TaxRule のキャッシュをクリアする. | |
| * | |
| * getByRule() をコールすると、結果をキャッシュし、2回目以降はデータベースへアクセスしない. | |
| * このメソッドをコールすると、キャッシュをクリアし、再度データベースを参照して結果を取得する. | |
| */ | |
| public function clearCache() | |
| { | |
| $this->rules = array(); | |
| } | |
| } |