src/Trinity/WebshopBundle/Repository/OrderRepository.php line 275

Open in your IDE?
  1. <?php
  2. namespace App\Trinity\WebshopBundle\Repository;
  3. use Doctrine\ORM\EntityRepository;
  4. /**
  5.  * OrderRepository
  6.  */
  7. class OrderRepository extends EntityRepository
  8. {
  9.     public function countBy($Webshop){
  10.         $em $this->getEntityManager();
  11.         $query $em->createQuery(
  12.             'SELECT count(p)
  13.             FROM TrinityWebshopBundle:Order p
  14.             JOIN p.webshop w
  15.             WHERE w.id LIKE :webshopid'
  16.         )->setParameter('webshopid', (!empty($Webshop) ? $Webshop->getId() : null));
  17.         return $query->getSingleScalarResult();
  18.     }
  19.     public function findOpenToday(){
  20.         $em $this->getEntityManager();
  21.         $time strtotime('-7 DAY');
  22.         $query $em->createQuery(
  23.             "
  24.             SELECT p
  25.             FROM TrinityWebshopBundle:Order p
  26.             WHERE p.payment_status = 'open'
  27.             OR (p.payment_status = '' OR p.payment_status = 'pending')
  28.             AND p.date > '" date('Y-m-d H:i:s'$time) . "'
  29.             "
  30.         );
  31.         return $query->getResult();
  32.     }
  33.     public function findOrdersToNotifyPayment($Webshop$WebshopSettings){
  34.         $em $this->getEntityManager();
  35.         $time strtotime('-' $WebshopSettings->getAutoNotifyPeriod() . ' MINUTE');
  36.         $query $em->createQuery(
  37.             "
  38.             SELECT p
  39.             FROM TrinityWebshopBundle:Order p
  40.             JOIN p.webshop w WITH (w.id = " $Webshop->getId() . ")
  41.             WHERE p.status = ''
  42.             AND p.payment != 'banktransfer'
  43.             AND p.payment != 'BANKTRANS'
  44.             AND p.payment != 'invoice'
  45.             AND p.date_notify IS NULL
  46.             AND (
  47.                     p.payment_status = 'open'
  48.                 OR
  49.                     p.payment_status IS NULL
  50.             )
  51.             AND p.date < '" date('Y-m-d H:i:s'$time) . "'
  52.             "
  53.         );
  54.         return $query->getResult();
  55.     }
  56.     public function findOrdersToCancelAfterNotify($Webshop$WebshopSettings){
  57.         $em $this->getEntityManager();
  58.         $time strtotime('-' $WebshopSettings->getAutoCancelPeriod() . ' MINUTE');
  59.         $query $em->createQuery(
  60.             "
  61.             SELECT p
  62.             FROM TrinityWebshopBundle:Order p
  63.             JOIN p.webshop w WITH (w.id = " $Webshop->getId() . ")
  64.             WHERE p.status = ''
  65.             AND p.admin != 1
  66.             AND p.payment != 'banktransfer'
  67.             AND p.payment != 'BANKTRANS'
  68.             AND p.payment != 'invoice'
  69.             AND (
  70.                     p.payment_status = 'open'
  71.                 OR
  72.                     p.payment_status = 'expired'
  73.                 OR
  74.                     p.payment_status = 'failure'    
  75.                 OR
  76.                     p.payment_status IS NULL
  77.             )
  78.             AND (p.date_notify IS NULL OR p.date_notify < '" date('Y-m-d H:i:s'$time) . "')
  79.             AND (p.date < '" date('Y-m-d H:i:s'$time) . "')
  80.             "
  81.         );
  82.         return $query->getResult();
  83.     }
  84.     public function findTempOrdersToCancelAfterNotify($Webshop$WebshopSettings){
  85.         $em $this->getEntityManager();
  86.         $time strtotime('-' $WebshopSettings->getAutoCancelPeriod() . ' MINUTE');
  87.         $query $em->createQuery(
  88.             "
  89.             SELECT p
  90.             FROM TrinityWebshopBundle:Order p
  91.             JOIN p.webshop w WITH (w.id = " $Webshop->getId() . ")
  92.             WHERE p.status = ''
  93.             AND p.admin != 1
  94.             AND p.payment != 'banktransfer'
  95.             AND p.payment != 'BANKTRANS'
  96.             AND p.payment != 'invoice'
  97.             AND (
  98.                     p.payment_status = 'open'
  99.                 OR
  100.                     p.payment_status = 'expired'
  101.                 OR
  102.                     p.payment_status = 'failure'    
  103.                 OR
  104.                     p.payment_status = 'declined'    
  105.                 OR
  106.                     p.payment_status IS NULL
  107.             )
  108.             AND (p.date_notify IS NULL OR p.date_notify > '" date('Y-m-d H:i:s'$time) . "')
  109.             AND (p.date > '" date('Y-m-d H:i:s'$time) . "')
  110.             "
  111.         );
  112.         return $query->getResult();
  113.     }
  114.     public function search($Webshop$q){
  115.         $em $this->getEntityManager();
  116.         $query $em->createQuery(
  117.             'SELECT o
  118.             FROM TrinityWebshopBundle:Order o
  119.             JOIN o.webshop wp
  120.             LEFT JOIN o.user u
  121.             WHERE wp.id LIKE :webshopid
  122.             AND (
  123.                 o.payment_id LIKE :q
  124.             OR
  125.                 u.firstname LIKE :q
  126.             OR
  127.                 u.lastname LIKE :q
  128.             )
  129.             ORDER BY o.date DESC'
  130.         )
  131.         ->setParameter('webshopid', (!empty($Webshop) ? $Webshop->getId() : null))
  132.         ->setParameter('q''%' $q '%');
  133.         return $query->getResult();
  134.     }
  135.     public function filter($doCount false$Webshop null$offset 0$limit 0$filter = []){
  136.         $em $this->getEntityManager();
  137.         $q      = (!empty($filter) && !empty($filter['q']) ? $filter['q'] : null);
  138.         $status = (!empty($filter) && isset($filter['status']) && $filter['status'] != '' $filter['status'] : null);
  139.         $sort     = (!empty($filter['sort']) && $filter['sort'] != '' $filter['sort'] : 'p.id');
  140.         $order    = (!empty($filter['order']) && $filter['order'] == 'asc' 'asc' 'desc');
  141.         // Force $q to array
  142.         if(!is_array($q)){
  143.             $q explode(' '$q);
  144.             // $q = [$q];
  145.         }
  146.         $search = [];
  147.         if(!empty($status)){
  148.             if($status == 'open'){
  149.                 $search[] = "(p.status = '' or p.status is null)";
  150.                 $search[] = "(p.payment_status != 'cancelled' or p.payment_status IS NULL)";
  151.             }else{
  152.                 if($status == 'paid'){
  153.                     $search[] = "(p.status != 'done' and p.status != 'send' and p.status != 'credit' and p.payment_status = 'paid' and p.status != 'cancelled')";
  154.                 }else{
  155.                     $search[] = "(p.status = '" $status "' or p.payment_status = '" $status "')";
  156.                     if($status != 'cancelled'){
  157.                         $search[] = "p.status != 'cancelled'";
  158.                     }
  159.                 }
  160.             }
  161.         }
  162.         if(!empty($filter['start'])){
  163.             $search[] = "p.date >= '" $filter['start'] . " 00:00:00'";
  164.         }
  165.         if(!empty($filter['end'])){
  166.             $search[] = "p.date <= '" $filter['end'] . " 23:59:59'";
  167.         }
  168.         if(!empty($q)){
  169.             foreach($q as $part){
  170.                 if(!empty($part)){
  171.                     $search[] = "
  172.                     (
  173.                         p.order_id LIKE '%" $part "%' OR
  174.                         u.firstname LIKE '%" $part "%' OR
  175.                         u.lastname LIKE '%" $part "%' OR
  176.                         p.email LIKE '%" $part "%' OR
  177.                         p.firstname LIKE '%" $part "%' OR
  178.                         p.lastname LIKE '%" $part "%'
  179.                     )
  180.                     ";
  181.                 }
  182.             }
  183.         }
  184.         $sql "
  185.         SELECT " . ($doCount "count(p)" "p") . "
  186.         FROM TrinityWebshopBundle:Order p
  187.         " . ($Webshop "JOIN p.webshop w" "") . "
  188.         
  189.         LEFT JOIN p.user c
  190.         LEFT JOIN c.user u
  191.         WHERE 1 = 1
  192.         " . ($Webshop "AND w.id LIKE :webshopid" "") . "
  193.         " . ($search "AND " implode(" AND "$search) : "") . "
  194.         ORDER BY {$sort} {$order}
  195.         ";
  196.         $query $em->createQuery($sql);
  197.         if($Webshop){
  198.             $query $query->setParameter('webshopid', (!empty($Webshop) ? $Webshop->getId() : null));
  199.         }
  200.         if($doCount){
  201.             return $query->getSingleScalarResult();
  202.         }
  203.         return $query->setFirstResult($offset)->setMaxResults($limit)->getResult();
  204.     }
  205.     public function getBy($Webshop$offset$limit){
  206.         $em $this->getEntityManager();
  207.         $query $em->createQuery(
  208.             'SELECT p
  209.             FROM TrinityWebshopBundle:Order p
  210.             JOIN p.webshop w
  211.             WHERE w.id LIKE :webshopid
  212.             ORDER BY p.date DESC'
  213.         )->setParameter('webshopid', (!empty($Webshop) ? $Webshop->getId() : null));
  214.         return $query->setFirstResult($offset)->setMaxResults($limit)->getResult();
  215.     }
  216.     public function thisMonth($Webshop$date_range){
  217.         $stats = [
  218.             'earned'     => 0,
  219.             'orders'     => 0,
  220.             'visitors'   => 0,
  221.             'page-views' => 0,
  222.         ];
  223.         $em $this->getEntityManager();
  224.         $sql "SELECT    SUM(o.total_price) as total_price,
  225.                         COUNT(o.id) as num
  226.                 FROM    TrinityWebshopBundle:Order o
  227.                 WHERE    (o.date BETWEEN '" $date_range[0] . "' AND '" $date_range[1] . "')
  228.                 AND        (o.payment_status != 'expired'
  229.                 AND        o.payment_status != 'cancelled'
  230.                 AND        o.status != 'cancelled')
  231.                 AND        o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . "
  232.                 ";
  233.         $query $em->createQuery($sql);
  234.         $res $query->getSingleResult();
  235.         $stats['earned'] = (float)$res['total_price'];
  236.         $stats['orders'] = (float)$res['num'];
  237.         return $stats;
  238.     }
  239.     public function recent($Webshop$limit 4$date_range){
  240.         $em $this->getEntityManager();
  241.         $query $em->createQuery("SELECT o FROM TrinityWebshopBundle:Order o WHERE (o.date BETWEEN '" $date_range[0] . "' AND '" $date_range[1] . "') AND o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . " ORDER BY o.date DESC");
  242.         return $query->setMaxResults($limit)->getResult();
  243.     }
  244.     public function today($Webshop){
  245.         $em $this->getEntityManager();
  246.         $query $em->createQuery("SELECT o FROM TrinityWebshopBundle:Order o WHERE o.date LIKE '" date('Y-m-d') . "%' AND o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . " ORDER BY o.date ASC");
  247.         return $query->getResult();
  248.     }
  249.     public function day($Webshop){
  250.         $em $this->getEntityManager();
  251.         $query $em->createQuery("SELECT o FROM TrinityWebshopBundle:Order o WHERE o.date LIKE '" date('Y-m-d') . "%' AND o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . " ORDER BY o.date ASC");
  252.         return $query->getResult();
  253.     }
  254.     public function month($Webshop){
  255.         $em $this->getEntityManager();
  256.         $query $em->createQuery("SELECT o FROM TrinityWebshopBundle:Order o WHERE o.date LIKE '" date('Y-m') . "%' AND o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . " AND o.status != 'cancelled' ORDER BY o.date ASC");
  257.         return $query->getResult();
  258.     }
  259.     public function year($Webshop){
  260.         $em $this->getEntityManager();
  261.         $query $em->createQuery("SELECT o FROM TrinityWebshopBundle:Order o WHERE o.date LIKE '" date('Y') . "%' AND o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . " AND o.status != 'cancelled' ORDER BY o.date ASC");
  262.         return $query->getResult();
  263.     }
  264.     public function open($Webshop$limit 4$date_range){
  265.         $em $this->getEntityManager();
  266.         $query $em->createQuery("SELECT o FROM TrinityWebshopBundle:Order o WHERE (o.payment_status = 'open' or o.payment_status = 'banktransfer' or o.payment_status = 'BANKTRANS' or o.payment_status = '' or o.payment_status IS NULL) AND (o.date BETWEEN '" $date_range[0] . "' AND '" $date_range[1] . "') AND o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . " ORDER BY o.date DESC");
  267.         return $query->setMaxResults($limit)->getResult();
  268.     }
  269.     public function paid($Webshop$limit 4$date_range){
  270.         $em $this->getEntityManager();
  271.         $query $em->createQuery("SELECT o FROM TrinityWebshopBundle:Order o WHERE (o.payment_status = 'paid') AND (o.date BETWEEN '" $date_range[0] . "' AND '" $date_range[1] . "') AND o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . " ORDER BY o.date DESC");
  272.         return $query->setMaxResults($limit)->getResult();
  273.     }
  274.     public function profit($Webshop$date_range){
  275.         $em $this->getEntityManager();
  276.         $sql "SELECT        (op.price_excl * op.amount) AS earnings,
  277.                             ((op.price_excl - op.price_in) * op.amount) AS profit,
  278.                             o.total_delivery_excl as deliverycost,
  279.                             o.id as orderid,
  280.                             ((((op.price - op.price_in) * op.amount) / (op.price * op.amount)) * 100) AS percentage
  281.                 FROM        TrinityWebshopBundle:OrderProduct op
  282.                 JOIN        TrinityWebshopBundle:Product p WITH (op.product = p)
  283.                 JOIN        TrinityWebshopBundle:Order o WITH (op.order = o)
  284.                 WHERE        (o.payment_status != 'expired' AND o.payment_status != 'cancelled' AND o.status != 'credit')
  285.                 AND            (o.date BETWEEN '" $date_range[0] . "' AND '" $date_range[1] . "')
  286.                 AND            o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . "
  287.                 ";
  288.         $query $em->createQuery($sql);
  289.         $result $query->getResult();
  290.         $orders = [];
  291.         $data = ['profit' => 0'earnings' => 0'profitnoshipping' => 0'earningsnoshipping' => 0'percentage' => 0];
  292.         foreach($result as $r){
  293.             $data['profit'] += round($r['profit'], 2);
  294.             $data['earnings'] += round($r['earnings'], 2);
  295.             $data['earningsnoshipping'] += round($r['earnings'], 2);
  296.             $data['profitnoshipping'] += round($r['profit'], 2);
  297.             if(!in_array($r['orderid'], $orders)){
  298.                 $data['profit'] += round($r['deliverycost'], 2);
  299.                 $data['earnings'] += round($r['deliverycost'], 2);
  300.                 array_push($orders$r['orderid']);
  301.             }
  302.         }
  303.         if(!empty($data['profitnoshipping']) || !empty($data['profitnoshipping'])){
  304.             $data['percentage'] = (!empty($data['profit'] ) ? (($data['profitnoshipping'] / $data['earningsnoshipping']) * 100) : 0);
  305.         } else {
  306.             $data['percentage'] = 0.0;
  307.         }
  308.         return $data;
  309.     }
  310.     public function bestSold($Webshop$limit 4$date_range){
  311.         $em $this->getEntityManager();
  312.         $query $em->createQuery("SELECT COUNT(op.id) as num, p as Product FROM TrinityWebshopBundle:OrderProduct op JOIN TrinityWebshopBundle:Order o WITH o = op.order JOIN TrinityWebshopBundle:Product p WITH p = op.product WHERE (o.date BETWEEN '" $date_range[0] . "' AND '" $date_range[1] . "') AND o.webshop " . (!empty($Webshop) ? '= ' $Webshop->getId() : 'is null') . " GROUP BY op.product ORDER BY num DESC");
  313.         return $query->setMaxResults($limit)->getResult();
  314.     }
  315.     public function filterGuests($doCount false$Webshop null$offset 0$limit 0$filter = []){
  316.         $q     = (!empty($filter) && !empty($filter['q']) ? $filter['q'] : null);
  317.         $sort  = (!empty($filter['sort']) && $filter['sort'] != '' $filter['sort'] : 'P.id');
  318.         $order = (!empty($filter['order']) && $filter['order'] == 'desc' 'desc' 'asc');
  319.         $em $this->getEntityManager();
  320.         // Force $q to array
  321.         if(!is_array($q)){
  322.             $q explode(' '$q);
  323.             // $q = [$q];
  324.         }
  325.         $queries = [];
  326.         foreach($q as $part){
  327.             if(empty($part)) continue;
  328.             $queries[] = "
  329.             (
  330.                 P.firstname LIKE '%" $part "%' OR
  331.                 P.lastname LIKE '%" $part "%' OR
  332.                 P.email LIKE '%" $part "%' OR
  333.                 P.street LIKE '%" $part "%' OR
  334.                 P.postalcode LIKE '%" $part "%' OR
  335.                 P.city LIKE '%" $part "%' OR
  336.                 P.company LIKE '%" $part "%' OR
  337.                 P.country LIKE '%" $part "%'
  338.             )
  339.             ";
  340.         }
  341.         $sql "
  342.         SELECT " . ($doCount "COUNT(DISTINCT P.email)" "P") . "
  343.         FROM TrinityWebshopBundle:Order P
  344.         WHERE         P.guest = 1
  345.         " . (!empty($queries) ? " AND " implode(" AND "$queries) : "") . "
  346.         " . (!$doCount "
  347.             GROUP BY P.email
  348.             ORDER BY {$sort} {$order}
  349.         " "") . "
  350.         ";
  351.         // if(!$doCount)die( "<pre>" . print_r( $sql, 1 ) . "</pre>" );
  352.         $query $em->createQuery($sql);
  353.         // if(!$doCount)die( "<pre>" . print_r( $query->getSql(), 1 ) . "</pre>" );
  354.         if($doCount){
  355.             return $query->getSingleScalarResult();
  356.         }
  357.         return $query->setFirstResult($offset)->setMaxResults($limit)->getResult();
  358.     }
  359.     public function findPossibleMatchingCustomer(){
  360.         $em $this->getEntityManager();
  361.         $sql "
  362.         SELECT     O.id as order_id,O.lastname as order_lastname,O.email as order_email,WU.id as user_id,U.lastname as user_lastname,U.email as user_email
  363.         FROM     TrinityWebshopBundle:Order O
  364.         JOIN     CmsBundle:User U WITH (U.email = O.email)
  365.         JOIN     TrinityWebshopBundle:User WU WITH (WU.user = U)
  366.         WHERE    O.user IS NULL
  367.         ";
  368.         $query $em->createQuery($sql);
  369.         return $query->getResult();
  370.     }
  371.     public function findGuestWhileNotGuest(){
  372.         $em $this->getEntityManager();
  373.         $sql "
  374.         SELECT     O
  375.         FROM     TrinityWebshopBundle:Order O
  376.         JOIN     O.user WU
  377.         JOIN     WU.user U
  378.         WHERE    U.username != 'guest'
  379.         AND     O.guest = 1
  380.         ";
  381.         $query $em->createQuery($sql);
  382.         return $query->getResult();
  383.     }
  384.     public function findLastOrderidWithPrefix($prefix){
  385.         $em $this->getEntityManager();
  386.         $sql "
  387.         SELECT      O
  388.         FROM      TrinityWebshopBundle:Order O
  389.         WHERE    O.order_id LIKE '{$prefix}%'
  390.         ORDER BY O.order_id DESC
  391.         ";
  392.         $query $em->createQuery($sql);
  393.         return $query->setMaxResults(1)->getResult();
  394.     }
  395.     public function findPossibleUserMismatch(){
  396.         $em $this->getEntityManager();
  397.         $sql "
  398.         SELECT     O
  399.         FROM     TrinityWebshopBundle:Order O
  400.         JOIN     O.user WU
  401.         JOIN     WU.user U
  402.         WHERE    U.email != O.email
  403.         AND     U.username != 'guest'
  404.         AND     U.firstname != O.firstname
  405.         AND     U.lastname != O.lastname
  406.         ";
  407.         $query $em->createQuery($sql);
  408.         return $query->getResult();
  409.     }
  410.     /*public function filterAll($doCount = false, $Webshop = null, $offset = 0, $limit = 0, $filter = []){
  411.         $q     = (!empty($filter) && !empty($filter['q']) ? $filter['q'] : null);
  412.         $sort  = (!empty($filter['sort']) && $filter['sort'] != '' ? $filter['sort'] : 'P.id');
  413.         $order = (!empty($filter['order']) && $filter['order'] == 'desc' ? 'desc' : 'asc');
  414.         $em = $this->getEntityManager();
  415.         // Force $q to array
  416.         if(!is_array($q)){
  417.             $q = [$q];
  418.         }
  419.         $queries = [];
  420.         foreach($q as $part){
  421.             if(empty($part)) continue;
  422.             $queries[] = "
  423.             (
  424.                 P.firstname LIKE '%" . $part . "%' OR
  425.                 P.lastname LIKE '%" . $part . "%' OR
  426.                 P.email LIKE '%" . $part . "%' OR
  427.                 P.street LIKE '%" . $part . "%' OR
  428.                 P.postalcode LIKE '%" . $part . "%' OR
  429.                 P.city LIKE '%" . $part . "%' OR
  430.                 P.company LIKE '%" . $part . "%' OR
  431.                 P.country LIKE '%" . $part . "%'
  432.             )
  433.             ";
  434.         }
  435.         $sql = "
  436.         SELECT    P.id AS tmpid, CONCAT(P.firstname, ' ', P.lastname) as name, P.email, CONCAT('/', T.id, '/', P.id) AS uri
  437.         FROM TrinityWebshopBundle:Order P
  438.         JOIN        P.user as PT
  439.         JOIN        PT.user as T
  440.         WHERE         P.guest = 1
  441.         " . (!empty($queries) ? " AND " . implode(" AND ", $queries) : "") . "
  442.         UNION
  443.         SELECT    U.id AS tmpid, CONCAT(T.firstname, ' ', T.lastname) as name, U.email, CONCAT('/', U.id) AS uri
  444.         FROM TrinityWebshopBundle:User U
  445.         JOIN    U.user T
  446.         ORDER    BY `tmpid` asc
  447.         ";
  448.         // if(!$doCount){ dump($sql);die(); }
  449.         // if(!$doCount)die( "<pre>" . print_r( $sql, 1 ) . "</pre>" );
  450.         $query = $em->createQuery($sql);
  451.         // if(!$doCount)die( "<pre>" . print_r( $query->getSql(), 1 ) . "</pre>" );
  452.         if($doCount){
  453.             return $query->getSingleScalarResult();
  454.         }
  455.         return $query->setFirstResult($offset)->setMaxResults($limit)->getResult();
  456.     }*/
  457. }