src/Diplix/KMGBundle/Repository/OrderRepository.php line 107

Open in your IDE?
  1. <?php
  2. namespace Diplix\KMGBundle\Repository;
  3. use Diplix\KMGBundle\Controller\Rating\RatingController;
  4. use Diplix\KMGBundle\Entity\Accounting\CoopMember;
  5. use Diplix\KMGBundle\Entity\Order;
  6. use Diplix\KMGBundle\Entity\OrderStatus;
  7. use Diplix\KMGBundle\Entity\Rating;
  8. use Diplix\KMGBundle\Entity\User;
  9. use Doctrine\ORM\AbstractQuery;
  10. use Doctrine\ORM\QueryBuilder;
  11. use PDO;
  12. class OrderRepository extends BasicRepository
  13. {
  14.     public function findHistoryFor(Order $o)
  15.     {
  16.         $st $this->dbQuery("SELECT A.*,B.username, B.first_name,B.last_name
  17.                                   FROM syslog A
  18.                                   LEFT JOIN users B ON B.id = A.user_id
  19.                                   WHERE ref_entity = :class
  20.                                     AND ref_id = :id
  21.                                   ORDER BY log_time DESC
  22.                                   LIMIT 0,20",
  23.                     array("class"=>get_class($o),"id"=>$o->getId()));
  24.         $res $st->fetchAllAssociative();
  25.         if (count($res)>0)
  26.         for ($i=0$i count($res); $i++)
  27.         {
  28.             $res[$i]["log_time"] = new \DateTime($res[$i]["log_time"]);
  29.             if ($res[$i]["changeset"]!="[]"$res[$i]["message"] .= $res[$i]["changeset"];
  30.         }
  31.         return $res;
  32.     }
  33.     public function countByDay($from,$to,$userList = [], $customerId=0)
  34.     {
  35.         $sql "SELECT DATE_FORMAT(order_time,'%Y-%m-%d') AS day, COUNT(*) AS cnt
  36.                                   FROM orders
  37.                                   WHERE order_time >= :from AND order_time <= :to
  38.                                   ";
  39.         $params = array("from"=>$from->format("Y-m-d"),"to"=>$to->format("Y-m-d"));
  40.         if ($customerId 0)
  41.         {
  42.             $sql .= " AND customer_id = :cid";
  43.             $params["cid"] = $customerId;
  44.         }
  45.         if ($userList != null )
  46.         {
  47.             if (count($userList)<1) throw new \Exception("No userlist provided.");
  48.             $sql .= "AND be_owner IN (:userlist)";
  49.             $params["userlist"] = implode(",",array_map(function($u){return (int)$u->getId();},$userList));
  50.         }
  51.         $sql .= "                                                                   
  52.                                   GROUP BY day
  53.                                   ORDER BY day ASC";
  54.         $st $this->dbQuery($sql,$params);
  55.         $list $st->fetchAllAssociative();
  56.         $ret = [];
  57.         foreach ($list as $l)
  58.         {
  59.             $ret[$l["day"]] = $l["cnt"];
  60.         }
  61.         return $ret;
  62.     }
  63.     public function findForTamiStatusUpdate()
  64.     {
  65.         $qb $this->createQueryBuilder("A")
  66.             ->select("A,B,C,S")
  67.             ->leftJoin("A.customer","B")
  68.             ->leftJoin("A.beOwner","C")
  69.             ->leftJoin("A.orderStatus","S")
  70.             ->where("A.remoteStatus = :rs")
  71.             ->setParameter("rs",Order::REMOTE_SUCCESS)
  72.             ->andWhere("A.orderStatus < 3"); // 1==offen,2==vermittelt,3==erledigt, > 3 = fehler/storno/...
  73.         return $qb->getQuery()->getResult(AbstractQuery::HYDRATE_OBJECT);
  74.     }
  75.     /** @return QueryBuilder */
  76.     public function getQb(): QueryBuilder
  77.     {
  78.         return $this->createQueryBuilder("A")
  79.             ->select("A,B,C,S,D,R,P,M,X,J")
  80.             ->leftJoin("A.customer","B")
  81.             ->leftJoin("A.beOwner","C")
  82.             ->leftJoin("A.orderStatus","S")
  83.             ->leftJoin('A.paymentType','P')
  84.             ->leftJoin("A.addressList","D")
  85.             ->leftJoin("A.referencedParentOrder","R")
  86.             ->leftJoin('A.assignedTo','M')
  87.             ->leftJoin("A.xchgTo","X")
  88.             ->leftJoin("A.job","J");
  89.     }
  90.     /**
  91.      * @param array $userList
  92.      * @param int $customerId
  93.      * @param $filterStatus
  94.      * @param int $from
  95.      * @param int $to
  96.      * @param int $assignedTo
  97.      * @return array
  98.      * @throws \Exception
  99.      */
  100.     public function findAllForOverview($userList = array(), $customerId=0$filterStatus,$from=0$to=0,$assignedTo=0)
  101.     {
  102.         $qb $this->getQb();
  103.         if ($userList != null )
  104.         {
  105.             if (count($userList)<1) throw new \Exception("No userlist provided.");
  106.             $or $qb->expr()->orX();
  107.             foreach ($userList as $u)
  108.             {
  109.                 $or->add(sprintf("A.beOwner = '%d'",$u->getId()));
  110.             }
  111.             $qb->where($or);
  112.         }
  113.         if ($customerId 0)
  114.         {
  115.             $qb->andWhere("B.id = :cid")
  116.                 ->setParameter("cid",$customerId);
  117.         }
  118.         if ($assignedTo 0)
  119.         {
  120.             $qb->andWhere("A.assignedTo = :mm")
  121.                 ->setParameter('mm',$assignedTo);
  122.         }
  123.         if (is_array($filterStatus))
  124.         {
  125.             $qb->andWhere$qb->expr()->in('A.orderStatus',':hiddenStati'))
  126.                 ->setParameter('hiddenStati',$filterStatus);
  127.         }
  128.         else
  129.         if ($filterStatus>0)
  130.         {
  131.             $qb->andWhere("A.orderStatus = :os")
  132.                 ->setParameter("os",$filterStatus);
  133.         }
  134.         if (is_object($from))
  135.         {
  136.             $qb->andWhere("A.orderTime >= :start")
  137.                 ->setParameter("start",$from);
  138.         }
  139.         if (is_object($to))
  140.         {
  141.             $qb->andWhere("A.orderTime <= :to")
  142.                 ->setParameter("to",$to);
  143.         }
  144.         $qb->orderBy("A.orderTime");
  145.         return $qb->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY);
  146.     }
  147.     public function getSingleAsArray($id)
  148.     {
  149.         $qb $this->getQb();
  150.         $qb->andWhere('A.id = :id')->setParameter('id',$id);
  151.         return $qb->getQuery()->getSingleResult(AbstractQuery::HYDRATE_ARRAY);
  152.     }
  153.     public function getPendingInstantOrdersForDispo($hydrationMode AbstractQuery::HYDRATE_ARRAY)
  154.     {
  155.         $limit = new \DateTime();
  156.         $limit->modify('-7 days');
  157.         $qb $this->getQb();
  158.         $qb->where(
  159.                 $qb->expr()->orX(
  160.                     $qb->expr()->eq('A.instantOrderStatus',Order::INSTANT_ORDER_REQUEST_PENDING),
  161.                     $qb->expr()->andX(
  162.                         $qb->expr()->gte('A.instantOrderStatus',Order::INSTANT_ORDER_REQUEST_PENDING),
  163.                         $qb->expr()->gte('A.instantOrderInitiated',':timelimit')
  164.                     )
  165.                 )
  166.             )
  167.             ->setParameter('timelimit',$limit->format('Y-m-d H:i'))
  168.             ->orderBy('A.instantOrderInitiated','desc');
  169.         return $qb->getQuery()->getResult($hydrationMode);
  170.     }
  171.     public function getPendingInstantOrder(User $forUser$hydrationMode AbstractQuery::HYDRATE_ARRAY)
  172.     {
  173.         $limit = new \DateTime();
  174.         $limit->modify('-7 days');
  175.         $qb $this->getQb();
  176.         $qb->andWhere('A.beOwner = :owner')
  177.             ->andWhere(
  178.                 $qb->expr()->orX(
  179.                     $qb->expr()->eq('S.id',OrderStatus::STATUS_INSTANT_ORDER_PENDING),
  180.                     $qb->expr()->andX(
  181.                         $qb->expr()->gte('A.instantOrderStatus',Order::INSTANT_ORDER_REQUEST_PENDING),
  182.                         $qb->expr()->gte('A.instantOrderInitiated',':timelimit')
  183.                    )
  184.                 )
  185.             )
  186.             ->setParameter('owner',$forUser->getId())
  187.             ->setParameter('timelimit',$limit->format('Y-m-d H:i'))
  188.             ->orderBy('A.instantOrderInitiated','desc');
  189.         return $qb->getQuery()->getResult($hydrationMode);
  190.     }
  191.     /**
  192.      * Find all Orders for customers with showRating=1 which are not yet rated
  193.      * @param $customerId int customer.id or -1 for all customers
  194.      * @param null $userList
  195.      * @return array
  196.      * @throws \Exception
  197.      */
  198.     public function findUnrated($customerId,$userList null,$maxDaysIntoPast=null)
  199.     {
  200.         if ($maxDaysIntoPast===null$maxDaysIntoPast RatingController::MAX_AGE_FOR_RATING_DAYS;
  201.         $maxPast = (new \DateTime())->sub(new \DateInterval(sprintf("P%dD"$maxDaysIntoPast)));
  202.         $now = (new \DateTime())->sub(new \DateInterval(sprintf("PT%dH"2)));
  203.         $qb $this->createQueryBuilder("A")
  204.             ->select("A,B")
  205.             ->leftJoin("A.customer","B")
  206.             ->where("A.orderStatus = :os")
  207.                 ->setParameter("os",OrderStatus::STATUS_FINISHED)
  208.             ->andWhere("A.orderTime > :limit")
  209.                 ->setParameter("limit",$maxPast)
  210.             ->andWhere("A.orderTime < :now")
  211.                 ->setParameter("now",$now)
  212.             ->andWhere("B.showRating = '1'");
  213.         if ($customerId>=0)
  214.         {
  215.             $qb->andWhere("B.id = :cid")
  216.                     ->setParameter("cid",$customerId);
  217.         }
  218.         if ($userList != null )
  219.         {
  220.             if (count($userList)<1) throw new \Exception("No userlist provided.");
  221.             $or $qb->expr()->orX();
  222.             foreach ($userList as $u)
  223.             {
  224.                 $or->add(sprintf("A.beOwner = '%d'",$u->getId()));
  225.             }
  226.             $qb->andWhere($or);
  227.         }
  228.         $qb->orderBy("A.orderTime");
  229.         $all $qb->getQuery()->getResult(AbstractQuery::HYDRATE_OBJECT);
  230.         $ids = [];
  231.         /** @var Order $order */
  232.         foreach ($all as $order)
  233.         {
  234.             $ids[]= $order->getId();
  235.         }
  236.         $ratingRepo $this->_em->getRepository(Rating::class);
  237.         $exist $ratingRepo->findExistingRatings($ids);
  238.         $newResult = [];
  239.         foreach ($all as $order)
  240.         {
  241.             if (!in_array($order->getId(),$exist))
  242.                 $newResult[]=$order;
  243.         }
  244.         return $newResult;
  245.     }
  246.     public function findByTamiOrderNumbers(array $list)
  247.     {
  248.         $qb $this->createQueryBuilder("A")
  249.             ->select("A,B,C,S,D,R")
  250.             ->leftJoin("A.customer","B")
  251.             ->leftJoin("A.beOwner","C")
  252.             ->leftJoin("A.orderStatus","S")
  253.             ->leftJoin("A.addressList","D")
  254.             ->leftJoin("A.referencedParentOrder","R");
  255.         $qb->where($qb->expr()->in('A.remoteOrderId',$list));
  256.         $all $qb->getQuery()->getResult();
  257.         $ret = [];
  258.         /** @var Order $one */
  259.         foreach ($all as $one)
  260.         {
  261.             $ret[$one->getRemoteOrderId()] = $one;
  262.         }
  263.         return $ret;
  264.     }
  265.     public function findOpenNotInSyncWithTami()
  266.     {
  267.         $last = (new \DateTime())->sub(new \DateInterval("P14D"));
  268.         $qb $this->getQb();
  269.         $qb ->where($qb->expr()->in("A.orderStatus",":status"))->setParameter("status",[OrderStatus::STATUS_OPEN,OrderStatus::STATUS_CANCELED])
  270.             ->andWhere("A.remoteStatus != :remoteStatus")->setParameter("remoteStatus"Order::REMOTE_SUCCESS)
  271.             ->andWhere("A.orderTime > :last")->setParameter("last",$last)
  272.             ->orderBy("A.orderTime",'desc');
  273.         return $qb->getQuery()->getResult();
  274.     }
  275.     public function getNewOrderId($date null)
  276.     {
  277.         if ($date === null$date = new \DateTime();
  278.         // Format: YYMMDDXXX
  279.         $prefix $date->format("ymd"); // length of prefix = 6
  280.         // MySQL: For all forms of SUBSTRING(), the position of the first character in the string from which the substring is to be extracted is reckoned as 1.
  281.         $st $this->dbQuery("
  282.                                   SELECT MAX(CAST(SUBSTRING(order_id,7) AS UNSIGNED)) FROM orders
  283.                                   WHERE order_id LIKE :pattern
  284.                                   AND be_deleted = '0'
  285.                                   ", array("pattern"=>$prefix"%"));
  286.         $max $st->fetchOne();
  287.         if ($max === false$max 0;
  288.         if ($max >= 999)
  289.         {
  290.             throw new \Exception("Reached max. order number limit on this day !");
  291.         }
  292.         return sprintf("%s%03d",$prefix,$max+1);
  293.     }
  294.     public function findAssignedToAnyMemberForDay($day$sortByMemberId true$specificMember null)
  295.     {
  296.         $from = clone $day;
  297.         $until = clone $day;
  298.         $from->modify('today'); // start of day
  299.         $until->modify('tomorrow')->modify('1 second ago'); // end of day
  300.         $list $this->findAssignedToAnyMemberForDateRange($from,$until,$specificMember);
  301.         if ($sortByMemberId)
  302.         {
  303.             $sorted = [];
  304.             /** @var Order $item */
  305.             foreach ($list as $item)
  306.             {
  307.                 $mid $item->getAssignedTo()->getId();
  308.                 if (!array_key_exists($mid,$sorted)) $sorted[$mid] = [];
  309.                 $sorted[$mid] []= $item;
  310.             }
  311.             return $sorted;
  312.         }
  313.         return $list;
  314.     }
  315.     public function findNotAssignedToAnyMemberForDateRange($dateFrom$dateUntil)
  316.     {
  317.         return $this->_findAssignedToAnyMemberOrNotForDateRange($dateFrom,$dateUntil,null,true);
  318.     }
  319.     public function findAssignedToAnyMemberForDateRange($dateFrom$dateUntil$specificMember=null)
  320.     {
  321.         return $this->_findAssignedToAnyMemberOrNotForDateRange($dateFrom,$dateUntil,$specificMember,false);
  322.     }
  323.     protected function _findAssignedToAnyMemberOrNotForDateRange($dateFrom$dateUntil$specificMember$notAssignedToAnyMember)
  324.     {
  325.         $qb $this->getQb();
  326.         $ex $qb->expr();
  327.         $qb->andWhere($ex->gte("A.orderTime"':from' ),$ex->lte("A.orderTime"':until' ))
  328.             ->setParameter('from',$dateFrom)
  329.             ->setParameter('until',$dateUntil);
  330.         $qb->andWhere('A.orderStatus < :s')->setParameter('s',OrderStatus::STATUS_CANCELED);
  331.         if ($specificMember != null)
  332.         {
  333.             $qb->andWhere('A.assignedTo = :m')->setParameter('m',$specificMember);
  334.         }
  335.         else
  336.         {
  337.             if ($notAssignedToAnyMember)
  338.                 $qb->andWhere('A.assignedTo is null');
  339.             else
  340.                 $qb->andWhere('A.assignedTo is not null');
  341.         }
  342.         $qb->addOrderBy('A.orderTime','asc');
  343.         return $qb->getQuery()->getResult();
  344.     }
  345.     public function findAssignedButNotConfirmedFor(CoopMember $specificMember)
  346.     {
  347.         $qb $this->getQb();
  348.         $maxPast = (new \DateTime())->modify('-1 days');
  349.         $qb ->andWhere($qb->expr()->gte("A.orderTime"':from' ))->setParameter('from',$maxPast)
  350.             ->andWhere('A.assignedTo = :m')->setParameter('m',$specificMember)
  351.             ->andWhere('A.assignmentConfirmed = 0')
  352.             ->addOrderBy('A.orderTime','asc');
  353.         return $qb->getQuery()->getResult();
  354.     }
  355. }