<?php
namespace Customize\Repository\Admin;
use Customize\Entity\ProductSchool;
use Customize\Repository\ProductSchoolRepository;
use Doctrine\ORM\QueryBuilder;
use Eccube\Doctrine\Query\QueryCustomizer;
use Customize\Repository\ProductStoreRepository;
use Eccube\Common\EccubeConfig;
use Eccube\Repository\CustomerRepository;
use Eccube\Repository\QueryKey;
use Eccube\Request\Context;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class SearchOrderCustomizer implements QueryCustomizer
{
/**
* @var Context
*/
private $context;
private $productStoreRepository;
private $productSchoolRepository;
private $session;
private $config;
private $customerRepository;
/**
* SearchOrderCustomizer constructor.
*
* @param Context $context
*/
public function __construct(Context $context,
ProductStoreRepository $productStoreRepository,
ProductSchoolRepository $productSchoolRepository,
CustomerRepository $customerRepository,
SessionInterface $session,
EccubeConfig $config)
{
$this->context = $context;
$this->productStoreRepository = $productStoreRepository;
$this->productSchoolRepository = $productSchoolRepository;
$this->customerRepository = $customerRepository;
$this->session = $session;
$this->config = $config;
}
/**
* {@inheritdoc}
*/
public function customize(QueryBuilder $builder, $params, $queryKey)
{
$pl_store = false;
// store
//0:システム管理者 && 1:企業責任者
if (isset($params['store']) && $obj_store = $params['store']) {
$pl_store = true;
$store_id = $obj_store->getStoreId();
}
//2:店舗責任者 || 3:閲覧者
else {
$user = unserialize($this->session->get('_security_admin'))->getUser();
$user_authority = $user->getAuthority();
$ls_new_member = [$this->config['member_viewer_id'], $this->config['member_store_manager_id']];
if(in_array($user->getId(), $ls_new_member)) {
$pl_store = true;
$store_id = 0;
$user_store = $user->getStore();
if($user_store) {
$store_id = $user_store->getStoreId();
}
}
}
$arr_store_product_id = [];
//store
if(isset($store_id)) {
$arr_product_store = $this->productStoreRepository
->createQueryBuilder('ps')
->innerJoin('ps.Product', 'psp')
->innerJoin('ps.Store', 'pss')
->select('psp.id')
->where('pss.store_id = :store_id')
->setParameter('store_id', $store_id)
->getQuery()
->getResult();
if($arr_product_store) {
foreach ($arr_product_store as $item_product_store) {
if(!in_array($item_product_store, $arr_store_product_id)) {
$arr_store_product_id[] = $item_product_store['id'];
}
}
}
}
if ($pl_store){
if($arr_store_product_id) {
$builder->andWhere($builder->expr()->in('oi.Product', ':product_id'))
->setParameter('product_id', $arr_store_product_id);
} else {
//条件があっていない場合は
$builder->andWhere('o.id = 0');
}
}
// school
if (!empty($params['school']) && ($obj_school = $params['school'])) {
$school_id = $obj_school->getSchoolId();
$arr_product_school = $this->customerRepository
->createQueryBuilder('c')
->innerJoin('c.School', 'cs')
->select('c.id')
->where('cs.school_id = :school_id')
->setParameter('school_id', $school_id)
->getQuery()
->getResult();
if($arr_product_school) {
$arr_customer_id =[];
foreach ($arr_product_school as $arr_product_school_item) {
if(!in_array($arr_product_school_item['id'], $arr_customer_id)) {
$arr_customer_id[] = $arr_product_school_item['id'];
}
}
$builder->innerJoin('o.Customer', 'oc')->andWhere($builder->expr()->in('oc.id', ':customer_id'))
->setParameter('customer_id', $arr_customer_id);
} else {
//学校がない場合は
$builder->andWhere('o.id = 0');
}
}
if (!empty($params['school_code'])) {
$builder
->leftJoin('o.Customer', 'oc')
->leftJoin('oc.School', 'ocs')
->andWhere('ocs.school_code = :school_code')
->setParameter('school_code', $params['school_code']);
}
if (isset($params['prev_school']) && $params['prev_school'] != '') {
$builder->andWhere('o.prev_school LIKE :prev_school')
->setParameter('prev_school', '%' . $params['prev_school'] . '%');
}
if (!empty($params['stocking_date_start']) && $params['stocking_date_start']) {
$date = $params['stocking_date_start'];
$builder
->andWhere('o.stocking_date >= :stocking_date_start')
->setParameter('stocking_date_start', $date);
}
if (!empty($params['stocking_date_end']) && $params['stocking_date_end']) {
$date = $params['stocking_date_end'];
$date = $date->setTime(23,59,59);
$builder
->andWhere('o.stocking_date <= :stocking_date_end')
->setParameter('stocking_date_end', $date);
}
//仮注文日
if (!empty($params['temp_order_date_start']) && $params['temp_order_date_start']) {
$params['status'] = [$this->config['order_temporary']];
$date = $params['temp_order_date_start'];
//$builder->andWhere('o.temporary_order_date >= :order_date_start')
// ->setParameter('order_date_start', $date);
$builder->andWhere('o.create_date >= :order_date_start')
->setParameter('order_date_start', $date);
}
if (!empty($params['temp_order_date_end']) && $params['temp_order_date_end']) {
$date = $params['temp_order_date_end'];
$date = $date->setTime(23,59,59);
//$builder->andWhere('o.temporary_order_date < :order_date_end')
// ->setParameter('order_date_end', $date);
$builder->andWhere('o.create_date <= :order_date_end')
->setParameter('order_date_end', $date);
}
//本注文日
if (!empty($params['formal_order_date_start']) && $params['formal_order_date_start']) {
$date = $params['formal_order_date_start'];
$builder->andWhere('o.order_date >= :order_date_start')
->setParameter('order_date_start', $date);
}
if (!empty($params['formal_order_date_end']) && $params['formal_order_date_end']) {
$date = $params['formal_order_date_end'];
$date = $date->setTime(23,59,59);
$builder->andWhere('o.order_date <= :order_date_end')
->setParameter('order_date_end', $date);
}
if (!empty($params['ids']) && count($params['ids'])) {
$builder->andWhere("s.id IN(:shipping_ids)")
->setParameter('shipping_ids', array_values($params['ids']));
}
// 配送方法
if (!empty($params['delivery']) && count($params['delivery'])) {
$deliveries = [];
foreach ($params['delivery'] as $delivery) {
$deliveries[] = $delivery->getId();
}
$builder
->leftJoin('s.Delivery', 'd')
->andWhere($builder->expr()->in('d.id', ':deliveries'))
->setParameter('deliveries', $deliveries);
}
}
/**
* {@inheritdoc}
*/
public function getQueryKey()
{
return QueryKey::ORDER_SEARCH_ADMIN;
}
}