Guest User

Untitled

a guest
May 21st, 2012
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 11.83 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  * Simpla CMS
  5.  *
  6.  * @copyright   2011 Denis Pikusov
  7.  * @link        http://simplacms.ru
  8.  * @author      Denis Pikusov
  9.  *
  10.  */
  11.  
  12. require_once('Simpla.php');
  13.  
  14. class Orders extends Simpla
  15. {
  16.  
  17.     public function get_order($id)
  18.     {
  19.         if(is_int($id))
  20.             $where = $this->db->placehold(' WHERE id=? ', intval($id));
  21.         else
  22.             $where = $this->db->placehold(' WHERE url=? ', $id);
  23.        
  24.         $query = $this->db->placehold("SELECT * FROM __orders $where LIMIT 1");
  25.  
  26.         if($this->db->query($query))
  27.             return $this->db->result();
  28.         else
  29.             return false;
  30.     }
  31.    
  32.     function get_orders($filter = array())
  33.     {
  34.         // По умолчанию
  35.         $limit = 100;
  36.         $page = 1;
  37.         $keyword_filter = '';  
  38.         $status_filter = '';
  39.         $user_filter = ''; 
  40.         $modified_from_filter = '';
  41.         $id_filter = '';
  42.        
  43.         if(isset($filter['limit']))
  44.             $limit = max(1, intval($filter['limit']));
  45.  
  46.         if(isset($filter['page']))
  47.             $page = max(1, intval($filter['page']));
  48.  
  49.         $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);
  50.        
  51.            
  52.         if(isset($filter['status']))
  53.             $status_filter = $this->db->placehold('AND o.status = ?', intval($filter['status']));
  54.        
  55.         if(isset($filter['id']))
  56.             $id_filter = $this->db->placehold('AND o.id in(?@)', (array)$filter['id']);
  57.        
  58.         if(isset($filter['user_id']))
  59.             $user_filter = $this->db->placehold('AND o.user_id = ?', intval($filter['user_id']));
  60.        
  61.         if(isset($filter['modified_from']))
  62.             $modified_from_filter = $this->db->placehold('AND o.modified > ?', $filter['modified_from']);
  63.        
  64.         if(!empty($filter['keyword']))
  65.         {
  66.             $keywords = explode(' ', $filter['keyword']);
  67.             foreach($keywords as $keyword)
  68.                 $keyword_filter .= $this->db->placehold('AND o.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" ');
  69.         }
  70.        
  71.         // Выбираем заказы
  72.         $query = $this->db->placehold("SELECT id, delivery_id, delivery_price, separate_delivery, payment_method_id, paid, payment_date, closed, discount, date,
  73.                                     user_id, name, address, phone, email, comment, status, url, total_price, note
  74.                                     FROM __orders AS o
  75.                                     WHERE 1
  76.                                     $id_filter $status_filter $user_filter $keyword_filter $modified_from_filter ORDER BY status, id DESC $sql_limit", "%Y-%m-%d");
  77.         $this->db->query($query);
  78.         $orders = array();
  79.         foreach($this->db->results() as $order)
  80.             $orders[$order->id] = $order;
  81.         return $orders;
  82.     }
  83.  
  84.     function count_orders($filter = array())
  85.     {
  86.         $keyword_filter = '';  
  87.         $status_filter = '';
  88.         $user_filter = ''; 
  89.        
  90.         if(isset($filter['status']))
  91.             $status_filter = $this->db->placehold('AND o.status = ?', intval($filter['status']));
  92.        
  93.         if(isset($filter['user_id']))
  94.             $user_filter = $this->db->placehold('AND o.user_id = ?', intval($filter['user_id']));
  95.        
  96.         if(!empty($filter['keyword']))
  97.         {
  98.             $keywords = explode(' ', $filter['keyword']);
  99.             foreach($keywords as $keyword)
  100.                 $keyword_filter .= $this->db->placehold('AND o.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" ');
  101.         }
  102.        
  103.         // Выбираем заказы
  104.         $query = $this->db->placehold("SELECT COUNT(DISTINCT id) as count
  105.                                     FROM __orders AS o
  106.                                     WHERE 1
  107.                                     $status_filter $user_filter $keyword_filter");
  108.         $this->db->query($query);
  109.         return $this->db->result('count');
  110.     }
  111.  
  112.     public function update_order($id, $order)
  113.     {
  114.         $query = $this->db->placehold("UPDATE __orders SET ?%, modified=now() WHERE id=? LIMIT 1", $order, intval($id));
  115.         $this->db->query($query);
  116.         $this->update_total_price(intval($id));
  117.         return $id;
  118.     }
  119.  
  120.     public function delete_order($id)
  121.     {
  122.         if(!empty($id))
  123.         {
  124.             $query = $this->db->placehold("DELETE FROM __purchases WHERE order_id=? LIMIT 1", $id);
  125.             $this->db->query($query);
  126.            
  127.             $query = $this->db->placehold("DELETE FROM __orders WHERE id=? LIMIT 1", $id);
  128.             $this->db->query($query);
  129.         }
  130.     }
  131.    
  132.     public function add_order($order)
  133.     {
  134.         $order = (object)$order;
  135.         $order->url = md5(uniqid($this->config->salt, true));
  136.         $set_curr_date = '';
  137.         if(empty($order->date))
  138.             $set_curr_date = ', date=now()';
  139.         $query = $this->db->placehold("INSERT INTO __orders SET ?%$set_curr_date", $order);
  140.         $this->db->query($query);
  141.         $id = $this->db->insert_id();      
  142.         return $id;
  143.     }
  144.  
  145.  
  146.     public function get_purchase($id)
  147.     {
  148.         $query = $this->db->placehold("SELECT * FROM __purchases WHERE id=? LIMIT 1", $id);
  149.         $this->db->query($query);
  150.         return $this->db->result();
  151.     }
  152.  
  153.     public function get_purchases($filter = array())
  154.     {
  155.         $order_id_filter = '';
  156.         if(!empty($filter['order_id']))
  157.             $order_id_filter = $this->db->placehold('AND order_id in(?@)', (array)$filter['order_id']);
  158.  
  159.         $query = $this->db->placehold("SELECT * FROM __purchases WHERE 1 $order_id_filter ORDER BY id");
  160.         $this->db->query($query);
  161.         return $this->db->results();
  162.     }
  163.    
  164.     public function update_purchase($id, $purchase)
  165.     {  
  166.         $purchase = (object)$purchase;
  167.         $old_purchase = $this->get_purchase($id);
  168.         if(!$old_purchase)
  169.             return false;
  170.            
  171.         $order = $this->get_order(intval($old_purchase->order_id));
  172.         if(!$order)
  173.             return false;
  174.            
  175.         // Если заказ закрыт, нужно обновить склад при изменении покупки
  176.         if($order->closed && !empty($purchase->amount))
  177.         {
  178.             if($old_purchase->variant_id != $purchase->variant_id)
  179.             {
  180.                 if(!empty($old_purchase->variant_id))
  181.                 {
  182.                     $query = $this->db->placehold("UPDATE __variants SET stock=stock+? WHERE id=? AND stock IS NOT NULL LIMIT 1", $old_purchase->amount, $old_purchase->variant_id);
  183.                     $this->db->query($query);
  184.                 }
  185.                 if(!empty($purchase->variant_id))
  186.                 {
  187.                     $query = $this->db->placehold("UPDATE __variants SET stock=stock-? WHERE id=? AND stock IS NOT NULL LIMIT 1", $purchase->amount, $purchase->variant_id);
  188.                     $this->db->query($query);
  189.                 }
  190.             }
  191.             elseif(!empty($purchase->variant_id))
  192.             {
  193.                 $query = $this->db->placehold("UPDATE __variants SET stock=stock+(?) WHERE id=? AND stock IS NOT NULL LIMIT 1", $old_purchase->amount - $purchase->amount, $purchase->variant_id);
  194.                 $this->db->query($query);
  195.             }
  196.         }
  197.        
  198.         $query = $this->db->placehold("UPDATE __purchases SET ?% WHERE id=? LIMIT 1", $purchase, intval($id));
  199.         $this->db->query($query);
  200.         $this->update_total_price($order->id);     
  201.         return $id;
  202.     }
  203.    
  204.     public function add_purchase($purchase)
  205.     {
  206.         $purchase = (object)$purchase;
  207.         if(!empty($purchase->variant_id))
  208.         {
  209.             $variant = $this->variants->get_variant($purchase->variant_id);
  210.             if(empty($variant))
  211.                 return false;
  212.             $product = $this->products->get_product(intval($variant->product_id));
  213.             if(empty($product))
  214.                 return false;
  215.         }          
  216.  
  217.         $order = $this->get_order(intval($purchase->order_id));
  218.         if(empty($order))
  219.             return false;              
  220.    
  221.        
  222.         if(!isset($purchase->product_id) && isset($variant))
  223.             $purchase->product_id = $variant->product_id;
  224.                
  225.         if(!isset($purchase->product_name)  && !empty($product))
  226.             $purchase->product_name = $product->name;
  227.            
  228.         if(!isset($purchase->sku) && !empty($variant))
  229.             $purchase->sku = $variant->sku;
  230.            
  231.         if(!isset($purchase->variant_name) && !empty($variant))
  232.             $purchase->variant_name = $variant->name;
  233.            
  234.         if(!isset($purchase->price) && !empty($variant))
  235.             $purchase->price = $variant->price;
  236.            
  237.         if(!isset($purchase->amount))
  238.             $purchase->amount = 1;
  239.  
  240.         // Если заказ закрыт, нужно обновить склад при добавлении покупки
  241.         if($order->closed && !empty($purchase->amount) && !empty($variant->id))
  242.         {
  243.             $stock_diff = $purchase->amount;
  244.             $query = $this->db->placehold("UPDATE __variants SET stock=stock-? WHERE id=? AND stock IS NOT NULL LIMIT 1", $stock_diff, $variant->id);
  245.             $this->db->query($query);
  246.         }
  247.  
  248.         $query = $this->db->placehold("INSERT INTO __purchases SET ?%", $purchase);
  249.         $this->db->query($query);
  250.         $purchase_id = $this->db->insert_id();
  251.        
  252.         $this->update_total_price($order->id);     
  253.         return $purchase_id;
  254.     }
  255.  
  256.     public function delete_purchase($id)
  257.     {
  258.         $purchase = $this->get_purchase($id);
  259.         if(!$purchase)
  260.             return false;
  261.            
  262.         $order = $this->get_order(intval($purchase->order_id));
  263.         if(!$order)
  264.             return false;
  265.  
  266.         // Если заказ закрыт, нужно обновить склад при изменении покупки
  267.         if($order->closed && !empty($purchase->amount))
  268.         {
  269.             $stock_diff = $purchase->amount;
  270.             $query = $this->db->placehold("UPDATE __variants SET stock=stock+? WHERE id=? AND stock IS NOT NULL LIMIT 1", $stock_diff, $purchase->variant_id);
  271.             $this->db->query($query);
  272.         }
  273.        
  274.         $query = $this->db->placehold("DELETE FROM __purchases WHERE id=? LIMIT 1", intval($id));
  275.         $this->db->query($query);
  276.         $this->update_total_price($order->id);             
  277.         return true;
  278.     }
  279.  
  280.    
  281.     public function close($order_id)
  282.     {
  283.         $order = $this->get_order(intval($order_id));
  284.         if(empty($order))
  285.             return false;
  286.        
  287.         if(!$order->closed)
  288.         {
  289.             $purchases = $this->get_purchases(array('order_id'=>$order->id));
  290.             foreach($purchases as $purchase)
  291.             {
  292.                 $variant = $this->variants->get_variant($purchase->variant_id);
  293.                 if(empty($variant) || ($variant->stock<$purchase->amount))
  294.                     return false;
  295.             }
  296.             foreach($purchases as $purchase)
  297.             {  
  298.                 $variant = $this->variants->get_variant($purchase->variant_id);
  299.                 if(!$variant->infinity)
  300.                 {
  301.                     $new_stock = $variant->stock-$purchase->amount;
  302.                     $this->variants->update_variant($variant->id, array('stock'=>$new_stock));
  303.                 }
  304.             }              
  305.             $query = $this->db->placehold("UPDATE __orders SET closed=1, modified=NOW() WHERE id=? LIMIT 1", $order->id);
  306.             $this->db->query($query);
  307.         }
  308.         return $order->id;
  309.     }
  310.    
  311.     public function open($order_id)
  312.     {
  313.         $order = $this->get_order(intval($order_id));
  314.         if(empty($order))
  315.             return false;
  316.        
  317.         if($order->closed)
  318.         {
  319.             $purchases = $this->get_purchases(array('order_id'=>$order->id));
  320.             foreach($purchases as $purchase)
  321.             {
  322.                 $variant = $this->variants->get_variant($purchase->variant_id);            
  323.                 if($variant && !$variant->infinity)
  324.                 {
  325.                     $new_stock = $variant->stock+$purchase->amount;
  326.                     $this->variants->update_variant($variant->id, array('stock'=>$new_stock));
  327.                 }
  328.             }              
  329.             $query = $this->db->placehold("UPDATE __orders SET closed=0, modified=NOW() WHERE id=? LIMIT 1", $order->id);
  330.             $this->db->query($query);
  331.         }
  332.         return $order->id;
  333.     }
  334.    
  335.     public function pay($order_id)
  336.     {
  337.         $order = $this->get_order(intval($order_id));
  338.         if(empty($order))
  339.             return false;
  340.        
  341.         if(!$this->close($order->id))
  342.         {
  343.             return false;
  344.         }
  345.         $query = $this->db->placehold("UPDATE __orders SET payment_status=1, payment_date=NOW(), modified=NOW() WHERE id=? LIMIT 1", $order->id);
  346.         $this->db->query($query);
  347.         return $order->id;
  348.     }
  349.    
  350.     private function update_total_price($order_id)
  351.     {
  352.         $order = $this->get_order(intval($order_id));
  353.         if(empty($order))
  354.             return false;
  355.        
  356.         $query = $this->db->placehold("UPDATE __orders o SET o.total_price=IFNULL((SELECT SUM(p.price*p.amount)*(100-o.discount)/100 FROM __purchases p WHERE p.order_id=o.id), 0)+o.delivery_price*(1-o.separate_delivery), modified=NOW() WHERE o.id=? LIMIT 1", $order->id);
  357.         $this->db->query($query);
  358.         return $order->id;
  359.     }
  360.    
  361.  
  362.     public function get_next_order($id, $status = null)
  363.     {
  364.         $f = '';
  365.         if($status!==null)
  366.             $f = $this->db->placehold('AND status=?', $status);
  367.         $this->db->query("SELECT MIN(id) as id FROM __orders WHERE id>? $f LIMIT 1", $id);
  368.         $next_id = $this->db->result('id');
  369.         if($next_id)
  370.             return $this->get_order(intval($next_id));
  371.         else
  372.             return false;
  373.     }
  374.    
  375.     public function get_prev_order($id, $status = null)
  376.     {
  377.         $f = '';
  378.         if($status !== null)
  379.             $f = $this->db->placehold('AND status=?', $status);
  380.         $this->db->query("SELECT MAX(id) as id FROM __orders WHERE id<? $f LIMIT 1", $id);
  381.         $prev_id = $this->db->result('id');
  382.         if($prev_id)
  383.             return $this->get_order(intval($prev_id));
  384.         else
  385.             return false;
  386.     }
  387. }
Advertisement
Add Comment
Please, Sign In to add comment