HEX
Server: Apache/2.4.6 (CentOS) mpm-itk/2.4.7-04 mod_fcgid/2.3.9 PHP/5.4.16
System: Linux dvm.vladweb.ru 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User: region-gk.ru (1016)
PHP: 7.3.33
Disabled: NONE
Upload Files
File: //home/bk/__backup/api/Cart.php
<?php

require_once('Mgc.php');

class Cart extends Mgc {

    /*Выбираем содержимое корзины*/
    public function get_cart() {
        $cart = new stdClass();
        $cart->purchases = array();
        $cart->total_price = 0;
        $cart->total_products = 0;
        $cart->coupon = null;
        $cart->discount = 0;
        $cart->coupon_discount = 0;

        // Берем из сессии список variant_id=>amount
        if(!empty($_SESSION['shopping_cart'])) {
            $session_items = $_SESSION['shopping_cart'];

            $variants = $this->variants->get_variants(array('id'=>array_keys($session_items)));
            if(!empty($variants)) {
                foreach($variants as $variant) {
                    $num_opt[$variant->product_id] = $this->features->get_option($variant->product_id,25);

                    $items[$variant->id] = new stdClass();
                    $variant->price = ($variant->opt_price>0 && !empty($num_opt[$variant->product_id]->value) && ($num_opt[$variant->product_id]->value<=$session_items[$variant->id] || $this->products->check_opt($variant))?$variant->opt_price:$variant->price);
               //  var_dump(  $this->products->get_opt($variant) );
                    $items[$variant->id]->variant = $variant;
                    $items[$variant->id]->amount = $session_items[$variant->id];
                    $products_ids[] = $variant->product_id;
                }

                $products = array();
                foreach($this->products->get_products(array('id'=>$products_ids, 'limit' => count($products_ids))) as $p) {
                    $products[$p->id]=$p;
                    if(!isset($num_opt[$p->id]))
                    $num_opt[$p->id] = $this->features->get_option($p->id,25);
                    $products[$p->id]->num_opt = !empty($num_opt[$p->id]->value)?(int)$num_opt[$p->id]->value:0;
                }

                $images = $this->products->get_images(array('product_id'=>$products_ids));
                foreach($images as $image) {
                    $products[$image->product_id]->images[$image->id] = $image;
                }

$opt = 0;
                // Пользовательская скидка
                     $cart->discount = 0;
                     if(isset($_SESSION['user_id']) && $user = $this->users->get_user(intval($_SESSION['user_id']))) {
                         $cart->discount = $user->discount;
                         /**
                          * BAD
                          */
                         if($user->group_id ==4){
                             $opt = 1;
                         }
                     }


                foreach($items as $variant_id=>$item) {
                    $purchase = null;
                    if(!empty($products[$item->variant->product_id])) {
                        $purchase = new stdClass();
                        $purchase->product = $products[$item->variant->product_id];
                        $purchase->variant = $item->variant;
                        $purchase->amount = $item->amount;

                        $cart->purchases[] = $purchase;
                        if(!empty($products[$item->variant->product_id]->num_opt) && $products[$item->variant->product_id]->num_opt<=$item->amount){
                            $opt = 1;
                        }
                        $cart->total_price += ($opt && $item->variant->opt_price>0?$item->variant->opt_price:$item->variant->price)*$item->amount;
                        $cart->total_products += $item->amount;
                    }
                }


                $cart->total_price *= (100-$cart->discount)/100;

                // Скидка по купону
                if(isset($_SESSION['coupon_code'])) {
                    $cart->coupon = $this->coupons->get_coupon($_SESSION['coupon_code']);
                    if($cart->coupon && $cart->coupon->valid && $cart->total_price>=$cart->coupon->min_order_price) {
                        if($cart->coupon->type=='absolute') {
                            // Абсолютная скидка не более суммы заказа
                            $cart->coupon_discount = $cart->total_price>$cart->coupon->value?$cart->coupon->value:$cart->total_price;
                            $cart->total_price = max(0, $cart->total_price-$cart->coupon->value);
                            $cart->coupon->coupon_percent = round(100-($cart->total_price*100)/($cart->total_price+$cart->coupon->value),2);
                        } else {
                            $cart->coupon->coupon_percent = $cart->coupon->value;
                            $cart->coupon_discount = $cart->total_price * ($cart->coupon->value)/100;
                            $cart->total_price = $cart->total_price-$cart->coupon_discount;
                        }
                    } else {
                        unset($_SESSION['coupon_code']);
                    }
                }
            }
        }
        return $cart;
    }

    /*Добавление товара в корзину*/
    public function add_item($variant_id, $amount = 1) {
        // Выберем товар из базы, заодно убедившись в его существовании
        $variant = $this->variants->get_variant($variant_id);
        // Если товар существует, добавим его в корзину
        if(!empty($variant) && ($variant->stock>0 || $this->settings->is_preorder)) {
            $amount = max(1, $amount);
            if(isset($_SESSION['shopping_cart'][$variant_id])) {
                $amount = max(1, $amount+$_SESSION['shopping_cart'][$variant_id]);
            }
            // Не дадим больше чем на складе
            $amount = min($amount, ($variant->stock ? $variant->stock : min($this->settings->max_order_amount, $amount)));
            $_SESSION['shopping_cart'][$variant_id] = intval($amount);
        }
    }

    /*Обновление товара в корзине*/
    public function update_item($variant_id, $amount = 1) {
        // Выберем товар из базы, заодно убедившись в его существовании
        $variant = $this->variants->get_variant($variant_id);
        // Если товар существует, добавим его в корзину
        if(!empty($variant) && ($variant->stock>0 || $this->settings->is_preorder)) {
            $amount = max(1, $amount);
            // Не дадим больше чем на складе
            $amount = min($amount, ($variant->stock ? $variant->stock : min($this->settings->max_order_amount, $amount)));
            $_SESSION['shopping_cart'][$variant_id] = intval($amount);
        }
    }

    /*Удаление товара из корзины*/
    public function delete_item($variant_id) {
        unset($_SESSION['shopping_cart'][$variant_id]);
    }

    /*Очистка корзины*/
    public function empty_cart() {
        unset($_SESSION['shopping_cart']);
        unset($_SESSION['coupon_code']);
    }

    /*Применение купона в корзине*/
    public function apply_coupon($coupon_code) {
        $coupon = $this->coupons->get_coupon((string)$coupon_code);
        if($coupon && $coupon->valid) {
            $_SESSION['coupon_code'] = $coupon->code;
        } else {
            unset($_SESSION['coupon_code']);
        }
    }





}