Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Products ex..

Decoded Output download

<?php defined('BASEPATH') OR exit('No direct script access allowed'); 
 
class Products extends MY_Controller 
{ 
 
    function __construct() 
    { 
        parent::__construct(); 
        if (!$this->loggedIn) { 
            $this->session->set_userdata('requested_page', $this->uri->uri_string()); 
            $this->sma->md('login'); 
        } 
        $this->lang->admin_load('products', $this->Settings->user_language); 
        $this->load->library('form_validation'); 
        $this->load->admin_model('products_model'); 
        $this->digital_upload_path = 'files/'; 
        $this->upload_path = 'assets/uploads/'; 
        $this->thumbs_path = 'assets/uploads/thumbs/'; 
        $this->image_types = 'gif|jpg|jpeg|png|tif'; 
        $this->digital_file_types = 'zip|psd|ai|rar|pdf|doc|docx|xls|xlsx|ppt|pptx|gif|jpg|jpeg|png|tif|txt|csv'; 
        $this->allowed_file_size = '1024'; 
        $this->popup_attributes = array('width' => '900', 'height' => '600', 'window_name' => 'sma_popup', 'menubar' => 'yes', 'scrollbars' => 'yes', 'status' => 'no', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0'); 
    } 
    function getProductsByAjax() 
    { 
        if ($rows = $this->products_model->getProducts()) { 
            $data = json_encode($rows); 
        } else { 
            $data = false; 
        } 
        echo $data; 
    } 
    function getCategoriesByAjax() 
    { 
        if ($rows = $this->products_model->getCategories()) { 
            $data = json_encode($rows); 
        } else { 
            $data = false; 
        } 
        echo $data; 
    } 
    function index($warehouse_id = NULL) 
    { 
        $this->sma->checkPermissions(); 
        $user = $this->site->getUser(); 
        $store_id = $user->store_id; 
        $this->data['store_id'] = $store_id; 
        $store = $this->site->getStoreByID($store_id); 
        $this->data['store'] = $store->name; 
        if($store_id==0) 
        { 
            $this->data['error'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('error'); 
            if ($this->Owner || $this->Admin || !$this->session->userdata('store_id')) { 
                
                $this->data['warehouses'] = $this->site->getAllWarehouses($this->data['store_id']); 
                $this->data['stores'] = $this->site->getAllStores(); 
                $this->data['warehouse_id'] = $warehouse_id; 
                $this->data['store_id'] = $store_id; 
                $store = $this->site->getStoreByID($store_id); 
                $this->data['store'] = $store->name; 
                $this->data['warehouse'] = $warehouse_id ? $this->site->getWarehouseByID($warehouse_id) : NULL; 
                $this->data['store'] = $warehouse_id ? $this->site->getStoreByID($warehouse_id) : NULL; 
            } else { 
                $this->data['warehouses'] = NULL; 
                $this->data['warehouse_id'] = $this->session->userdata('warehouse_id'); 
                $this->data['warehouse'] = $this->session->userdata('warehouse_id') ? $this->site->getWarehouseByID($this->session->userdata('warehouse_id')) : NULL; 
            } 
     
            $this->data['supplier'] = $this->input->get('supplier') ? $this->site->getCompanyByID($this->input->get('supplier')) : NULL; 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => '#', 'page' => lang('products'))); 
            $meta = array('page_title' => lang('products'), 'bc' => $bc); 
            $this->page_construct('products/index', $meta, $this->data); 
        }else 
        { 
            if ($this->Owner || $this->Admin || !$this->session->userdata('warehouse_id')) { 
                $user = $this->site->getUser(); 
                $this->data['warehouses'] = $this->site->getAllWarehousesforstore($user->store_id); 
                $this->data['warehouse_id'] = $warehouse_id; 
                $this->data['warehouse'] = $warehouse_id ? $this->site->getWarehouseByID($warehouse_id) : NULL; 
            } else { 
                $this->data['warehouses'] = NULL; 
                $this->data['warehouse_id'] = $this->session->userdata('warehouse_id'); 
                $this->data['warehouse'] = $this->session->userdata('warehouse_id') ? $this->site->getWarehouseByID($this->session->userdata('warehouse_id')) : NULL; 
            } 
     
            $this->data['supplier'] = $this->input->get('supplier') ? $this->site->getCompanyByID($this->input->get('supplier')) : NULL; 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => '#', 'page' => lang('products'))); 
            $meta = array('page_title' => lang('products'), 'bc' => $bc); 
            $this->page_construct('products/index', $meta, $this->data); 
        } 
        
    } 
 
 
    function getProducts($store_id1 = NULL) 
    { 
        $this->sma->checkPermissions('index', TRUE); 
        $supplier = $this->input->get('supplier') ? $this->input->get('supplier') : NULL; 
        $this->load->library('datatables'); 
        $user = $this->site->getUser(); 
        $store_id = $user->store_id; 
        $this->data['store_id'] = $store_id; 
        $user = $this->site->getUser(); 
         
 
        $detail_link = anchor('admin/products/view/$1', '<i class="fa fa-file-text-o"></i> ' . lang('product_details')); 
        $delete_link = "<a href='#' class='tip po' title='<b>" . $this->lang->line("delete_product") . "</b>' data-content=\"<p>" 
            . lang('r_u_sure') . "</p><a class='btn btn-danger po-delete1' id='a__$1' href='" . admin_url('products/delete/$1') . "'>" 
            . lang('i_m_sure') . "</a> <button class='btn po-close'>" . lang('no') . "</button>\"  rel='popover'><i class=\"fa fa-trash-o\"></i> " 
            . lang('delete_product') . "</a>"; 
        $single_barcode = anchor('admin/products/print_barcodes/$1', '<i class="fa fa-print"></i> ' . lang('print_barcode_label')); 
        // $single_label = anchor_popup('products/single_label/$1/' . ($warehouse_id ? $warehouse_id : ''), '<i class="fa fa-print"></i> ' . lang('print_label'), $this->popup_attributes); 
        $action = '<div class="text-center"><div class="btn-group text-left">' 
            . '<button type="button" class="btn btn-default btn-xs btn-primary dropdown-toggle" data-toggle="dropdown">' 
            . lang('actions') . ' <span class="caret"></span></button> 
        <ul class="dropdown-menu pull-right" role="menu"> 
            <li>' . $detail_link . '</li> 
            <li><a href="' . admin_url('products/add/$1') . '"><i class="fa fa-plus-square"></i> ' . lang('duplicate_product') . '</a></li> 
            <li><a href="' . admin_url('products/edit/$1') . '"><i class="fa fa-edit"></i> ' . lang('edit_product') . '</a></li>'; 
 
        $action .= '<li><a href="' . admin_url() . 'assets/uploads/$2" data-type="image" data-toggle="lightbox"><i class="fa fa-file-photo-o"></i> ' 
            . lang('view_image') . '</a></li> 
            <li>' . $single_barcode . '</li> 
            <li class="divider"></li> 
            <li>' . $delete_link . '</li> 
            </ul> 
        </div></div>'; 
        $this->db->order_by('products.sequence','asc'); 
    if($store_id==0) 
    { 
        if ($store_id1) { 
            $this->datatables 
            ->select($this->db->dbprefix('products') . ".id as productid, {$this->db->dbprefix('products')}.image as image, {$this->db->dbprefix('products')}.code as code, {$this->db->dbprefix('products')}.name as name, {$this->db->dbprefix('brands')}.name as brand, {$this->db->dbprefix('categories')}.name as cname, cost as cost, price as price, COALESCE(quantity, 0) as quantity, {$this->db->dbprefix('units')}.name as unit, '' as rack, alert_quantity,ecom_show", FALSE) 
            ->from('products') 
            ->join('categories', 'products.category_id=categories.id', 'left') 
            ->join('units', 'products.unit=units.id', 'left') 
            ->join('brands', 'products.brand=brands.id', 'left') 
            ->join('location', 'products.location=location.id', 'left') 
            ->group_by("products.id") 
            ->where("products.store_id",$store_id1); 
        }  
        else { 
            $this->datatables 
                ->select($this->db->dbprefix('products') . ".id as productid, {$this->db->dbprefix('products')}.image as image, {$this->db->dbprefix('products')}.code as code, {$this->db->dbprefix('products')}.name as name, {$this->db->dbprefix('brands')}.name as brand,{$this->db->dbprefix('categories')}.name as cname, cost as cost, price as price, (SELECT SUM(quantity) AS total 
                FROM   sma_warehouses_products WHERE product_id = ".$this->db->dbprefix('products') . ".id), {$this->db->dbprefix('units')}.name as unit, '' as rack, alert_quantity,ecom_show", FALSE) 
                ->from('products') 
                ->join('categories', 'products.category_id=categories.id', 'left') 
                ->join('units', 'products.unit=units.id', 'left') 
               
                ->join('brands', 'products.brand=brands.id', 'left') 
                ->join('location', 'products.location=location.id', 'left') 
                ->group_by("products.id"); 
        } 
        if (!$this->Owner && !$this->Admin) { 
            if (!$this->session->userdata('show_cost')) { 
                $this->datatables->unset_column("cost"); 
            } 
            if (!$this->session->userdata('show_price')) { 
                $this->datatables->unset_column("price"); 
            } 
        } 
        if ($supplier) { 
            $this->datatables->where('supplier1', $supplier) 
            ->or_where('supplier2', $supplier) 
            ->or_where('supplier3', $supplier) 
            ->or_where('supplier4', $supplier) 
            ->or_where('supplier5', $supplier); 
        } 
    } 
    else{ 
         
            if ($store_id1)  
            { 
                $this->datatables 
                ->select($this->db->dbprefix('products') . ".id as productid, {$this->db->dbprefix('products')}.image as image, {$this->db->dbprefix('products')}.code as code, {$this->db->dbprefix('products')}.name as name, {$this->db->dbprefix('brands')}.name as brand, {$this->db->dbprefix('categories')}.name as cname, cost as cost, price as price, COALESCE(wp.quantity, 0) as quantity, {$this->db->dbprefix('units')}.name as unit, '' as rack, alert_quantity,ecom_show", FALSE) 
                ->from('products'); 
                if ($this->Settings->display_all_products) { 
                    $this->datatables->join("( SELECT product_id, quantity, rack from {$this->db->dbprefix('warehouses_products')} WHERE warehouse_id = {$store_id1}) wp", 'products.id=wp.product_id', 'left'); 
                } else { 
                    $this->datatables->join('warehouses_products wp', 'products.id=wp.product_id', 'left') 
                    ->where('wp.warehouse_id', $store_id1); 
                    // ->where('wp.quantity !=', 0); 
                } 
                $this->datatables->join('categories', 'products.category_id=categories.id', 'left') 
                ->join('units', 'products.unit=units.id', 'left') 
                ->join('brands', 'products.brand=brands.id', 'left') 
                ->join('location', 'products.location=location.id', 'left'); 
            // ->group_by("products.id"); 
            }  
            else { 
             
                $q = $this->datatables 
                    ->select($this->db->dbprefix('products') . ".id as productid, {$this->db->dbprefix('products')}.image as image, {$this->db->dbprefix('products')}.code as code, {$this->db->dbprefix('products')}.name as name, {$this->db->dbprefix('brands')}.name as brand, {$this->db->dbprefix('categories')}.name as cname, cost as cost, price as price 
                    , (SELECT SUM(quantity) AS total 
                    FROM   sma_warehouses_products WHERE product_id = ".$this->db->dbprefix('products') . ".id) 
                    , {$this->db->dbprefix('units')}.name as unit, '' as rack, alert_quantity,ecom_show", FALSE) 
                    ->from('products') 
                    ->join('categories', 'products.category_id=categories.id', 'left') 
                    ->join('units', 'products.unit=units.id', 'left') 
                    ->join('warehouses_products wp', 'products.id=wp.product_id', 'left') 
                    ->join('brands', 'products.brand=brands.id', 'left') 
                    ->join('location', 'products.location=location.id', 'left') 
                    ->where("products.store_id",$user->store_id) 
                    ->group_by("products.id"); 
                     
            } 
        if (!$this->Owner && !$this->Admin) { 
            if (!$this->session->userdata('show_cost')) { 
                $this->datatables->unset_column("cost"); 
            } 
            if (!$this->session->userdata('show_price')) { 
                $this->datatables->unset_column("price"); 
            } 
        } 
        if ($supplier) { 
            $this->datatables->where('supplier1', $supplier) 
            ->or_where('supplier2', $supplier) 
            ->or_where('supplier3', $supplier) 
            ->or_where('supplier4', $supplier) 
            ->or_where('supplier5', $supplier); 
        } 
    } 
        $this->datatables->add_column("Actions", $action, "productid, image, code, name"); 
        echo $this->datatables->generate(); 
    } 
 
    function set_rack($product_id = NULL, $warehouse_id = NULL) 
    { 
        $this->sma->checkPermissions('edit', true); 
 
        $this->form_validation->set_rules('rack', lang("rack_location"), 'trim|required'); 
 
        if ($this->form_validation->run() == true) { 
            $data = array('rack' => $this->input->post('rack'), 
                'product_id' => $product_id, 
                'warehouse_id' => $warehouse_id, 
            ); 
        } elseif ($this->input->post('set_rack')) { 
            $this->session->set_flashdata('error', validation_errors()); 
            admin_redirect("products"); 
        } 
 
        if ($this->form_validation->run() == true && $this->products_model->setRack($data)) { 
            $this->session->set_flashdata('message', lang("rack_set")); 
            admin_redirect("products/" . $warehouse_id); 
        } else { 
            $this->data['error'] = validation_errors() ? validation_errors() : $this->session->flashdata('error'); 
            $this->data['warehouse_id'] = $warehouse_id; 
            $this->data['product'] = $this->site->getProductByID($product_id); 
            $wh_pr = $this->products_model->getProductQuantity($product_id, $warehouse_id); 
            $this->data['rack'] = $wh_pr['rack']; 
            $this->data['modal_js'] = $this->site->modal_js(); 
            $this->load->view($this->theme . 'products/set_rack', $this->data); 
 
        } 
    } 
 
    function product_barcode($product_code = NULL, $bcs = 'code128', $height = 60) 
    { 
        // if ($this->Settings->barcode_img) { 
            return "<img style='width:100%' src='" . admin_url('products/gen_barcode/' . $product_code . '/' . $bcs . '/' . $height) . "' alt='{$product_code}' class='bcimg' />"; 
        // } else { 
        //     return $this->gen_barcode($product_code, $bcs, $height); 
        // } 
    } 
 
    function barcode($product_code = NULL, $bcs = 'code128', $height = 60) 
    { 
        return admin_url('products/gen_barcode/' . $product_code . '/' . $bcs . '/' . $height); 
    } 
 
    function gen_barcode($product_code = NULL, $bcs = 'code128', $height = 60, $text = 1) 
    { 
        $drawText = ($text != 1) ? FALSE : TRUE; 
        $this->load->library('zend'); 
        $this->zend->load('Zend/Barcode'); 
        $barcodeOptions = array('text' => $product_code, 'barHeight' => $height, 'drawText' => $drawText, 'factor' => 1.0); 
        if ($this->Settings->barcode_img) {  
            $rendererOptions = array('imageType' => 'jpg', 'horizontalPosition' => 'center', 'verticalPosition' => 'middle'); 
            $imageResource = Zend_Barcode::render($bcs, 'image', $barcodeOptions, $rendererOptions); 
            return $imageResource; 
        } else { 
            $rendererOptions = array('renderer' => 'svg', 'horizontalPosition' => 'center', 'verticalPosition' => 'middle'); 
            $imageResource = Zend_Barcode::render($bcs, 'svg', $barcodeOptions, $rendererOptions); 
            header("Content-Type: image/svg+xml"); 
            echo $imageResource; 
        } 
    } 
 
    function print_barcodes($product_id = NULL) 
    { 
        $this->sma->checkPermissions('barcode', true); 
 
        $this->form_validation->set_rules('style', lang("style"), 'required'); 
 
        if ($this->form_validation->run() == true) { 
            $style = $this->input->post('style'); 
            $bci_size = ($style == 10 || $style == 12 ? 50 : ($style == 14 || $style == 18 ? 30 : 20)); 
            $currencies = $this->site->getAllCurrencies(); 
            $s = isset($_POST['product']) ? sizeof($_POST['product']) : 0; 
            if ($s < 1) { 
                $this->session->set_flashdata('error', lang('no_product_selected')); 
                admin_redirect("products/print_barcodes"); 
            } 
            for ($m = 0; $m < $s; $m++) { 
                $pid = $_POST['product'][$m]; 
                $quantity = $_POST['quantity'][$m]; 
                $product = $this->products_model->getProductWithCategory($pid); 
                $product->price = $this->input->post('check_promo') ? ($product->promotion ? $product->promo_price : $product->price) : $product->price; 
                if ($variants = $this->products_model->getProductOptions($pid)) { 
                    foreach ($variants as $option) { 
                        if ($this->input->post('vt_'.$product->id.'_'.$option->id)) { 
                            $barcodes[] = array( 
                                'site' => $this->input->post('site_name') ? $this->Settings->site_name : FALSE, 
                                'name' => $this->input->post('product_name') ? $product->name.' - '.$option->name : FALSE, 
                                'image' => $this->input->post('product_image') ? $product->image : FALSE, 
                                'barcode' => $this->product_barcode($product->code . $this->Settings->barcode_separator . $option->id, 'code128', $bci_size), 
                                'price' => $this->input->post('price') ?  $this->sma->formatMoney($option->price != 0 ? ($product->price+$option->price) : $product->price) : FALSE, 
                                'unit' => $this->input->post('unit') ? $product->unit : FALSE, 
                                'category' => $this->input->post('category') ? $product->category : FALSE, 
                                'currencies' => $this->input->post('currencies'), 
                                'location' => $this->input->post('check_location') ? $product->location : FALSE, 
                                'variants' => $this->input->post('variants') ? $variants : FALSE, 
                                'quantity' => $quantity 
                                ); 
                        } 
                    } 
                } else { 
                    $barcodes[] = array( 
                        'site' => $this->input->post('site_name') ? $this->Settings->site_name : FALSE, 
                        'name' => $this->input->post('product_name') ? $product->name : FALSE, 
                        'image' => $this->input->post('product_image') ? $product->image : FALSE, 
                        'location' => $this->input->post('check_location') ? $product->location : FALSE, 
                        'barcode' => $this->product_barcode($product->code, $product->barcode_symbology, $bci_size), 
                        'price' => $this->input->post('price') ?  $product->price : FALSE, 
                        'price' => $this->input->post('price') ? $product->price : FALSE, 
 
 
                        
                        'unit' => $this->input->post('unit') ? $product->unit : FALSE, 
                        'category' => $this->input->post('category') ? $product->category : FALSE, 
                        'currencies' => $this->input->post('currencies'), 
                        'variants' => FALSE, 
                        'quantity' => $quantity 
                        ); 
                } 
 
            } 
            $this->data['barcodes'] = $barcodes; 
             
            $this->data['currencies'] = $currencies; 
            $this->data['style'] = $style; 
            $this->data['items'] = false; 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('print_barcodes'))); 
            $meta = array('page_title' => lang('print_barcodes'), 'bc' => $bc); 
            $this->page_construct('products/print_barcodes', $meta, $this->data); 
 
        } else { 
 
            if ($this->input->get('purchase') || $this->input->get('transfer')) { 
                if ($this->input->get('purchase')) { 
                    $purchase_id = $this->input->get('purchase', TRUE); 
                    $items = $this->products_model->getPurchaseItems($purchase_id); 
                } elseif ($this->input->get('transfer')) { 
                    $transfer_id = $this->input->get('transfer', TRUE); 
                    $items = $this->products_model->getTransferItems($transfer_id); 
                } 
                if ($items) { 
                    foreach ($items as $item) { 
                        if ($row = $this->products_model->getProductByID($item->product_id)) { 
                            $selected_variants = false; 
                            if ($variants = $this->products_model->getProductOptions($row->id)) { 
                                foreach ($variants as $variant) { 
                                    $selected_variants[$variant->id] = isset($pr[$row->id]['selected_variants'][$variant->id]) && !empty($pr[$row->id]['selected_variants'][$variant->id]) ? 1 : ($variant->id == $item->option_id ? 1 : 0); 
                                } 
                            } 
                            $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $item->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants); 
                        } 
                    } 
                    $this->data['message'] = lang('products_added_to_list'); 
                } 
            } 
 
            if ($product_id) { 
                if ($row = $this->site->getProductByID($product_id)) { 
 
                    $selected_variants = false; 
                    if ($variants = $this->products_model->getProductOptions($row->id)) { 
                        foreach ($variants as $variant) { 
                            $selected_variants[$variant->id] = $variant->quantity > 0 ? 1 : 0; 
                        } 
                    } 
                    $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $row->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants); 
 
                    $this->data['message'] = lang('product_added_to_list'); 
                } 
            } 
 
            if ($this->input->get('category')) { 
                if ($products = $this->products_model->getCategoryProducts($this->input->get('category'))) { 
                    foreach ($products as $row) { 
                        $selected_variants = false; 
                        if ($variants = $this->products_model->getProductOptions($row->id)) { 
                            foreach ($variants as $variant) { 
                                $selected_variants[$variant->id] = $variant->quantity > 0 ? 1 : 0; 
                            } 
                        } 
                        $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $row->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants); 
                    } 
                    $this->data['message'] = lang('products_added_to_list'); 
                } else { 
                    $pr = array(); 
                    $this->session->set_flashdata('error', lang('no_product_found')); 
                } 
            } 
 
            if ($this->input->get('subcategory')) { 
                if ($products = $this->products_model->getSubCategoryProducts($this->input->get('subcategory'))) { 
                    foreach ($products as $row) { 
                        $selected_variants = false; 
                        if ($variants = $this->products_model->getProductOptions($row->id)) { 
                            foreach ($variants as $variant) { 
                                $selected_variants[$variant->id] = $variant->quantity > 0 ? 1 : 0; 
                            } 
                        } 
                        $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $row->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants); 
                    } 
                    $this->data['message'] = lang('products_added_to_list'); 
                } else { 
                    $pr = array(); 
                    $this->session->set_flashdata('error', lang('no_product_found')); 
                } 
            } 
 
            $this->data['items'] = isset($pr) ? json_encode($pr) : false; 
            
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('print_barcodes'))); 
            $meta = array('page_title' => lang('print_barcodes'), 'bc' => $bc); 
            $this->page_construct('products/print_barcodes', $meta, $this->data); 
 
        } 
    } 
 
 
    /* ------------------------------------------------------- */ 
 
    function add($id = NULL) 
    { 
        $user = $this->site->getUser(); 
        $store_id = $user->store_id; 
        $this->data['store_id'] = $store_id; 
        $store = $this->site->getStoreByID($store_id); 
        $this->data['store'] = $store; 
        $this->sma->checkPermissions(); 
        $this->load->helper('security'); 
        $warehouses = $this->site->getAllWarehouses($this->data['store_id']); 
        if($store_id == 0) 
        { 
            $this->form_validation->set_rules('store', lang("Store"), 'required|is_natural_no_zero'); 
        } 
 
        $this->form_validation->set_rules('category', lang("category"), 'required|is_natural_no_zero'); 
         
        
        if ($this->input->post('type') == 'standard') { 
            $this->form_validation->set_rules('cost', lang("product_cost"), 'required'); 
            $this->form_validation->set_rules('unit', lang("product_unit"), 'required'); 
        } 
        if ($this->input->post('barcode_symbology') == 'ean13') { 
            $this->form_validation->set_rules('code', lang("product_code"), 'min_length[13]|max_length[13]'); 
        } 
        $this->form_validation->set_rules('code', lang("product_code"), 'alpha_dash'); 
        // $this->form_validation->set_rules('slug', lang("slug"), 'required|is_unique[products.slug]|alpha_dash'); 
        $this->form_validation->set_rules('weight', lang("weight"), 'numeric'); 
        $this->form_validation->set_rules('product_image', lang("product_image"), 'xss_clean'); 
        $this->form_validation->set_rules('digital_file', lang("digital_file"), 'xss_clean'); 
        $this->form_validation->set_rules('userfile', lang("product_gallery_images"), 'xss_clean'); 
         
 
        if ($this->form_validation->run() == true) { 
            if($this->db->where('code',$this->data['store']->code.$this->input->post('code'))->get('sma_products')->row()) 
            { 
                $this->session->set_flashdata('error', 'Duplicate entry '.$this->data['store']->code.$this->input->post('code').' for key'); 
                admin_redirect("products/add"); 
            } 
            $tax_rate = $this->input->post('tax_rate') ? $this->site->getTaxRateByID($this->input->post('tax_rate')) : NULL; 
            if($store_id==0) 
            { 
            
            $data = array( 
                'sequence' => $this->input->post('sequence'), 
                'code' => $this->data['store']->code.$this->input->post('code'), 
                'barcode_symbology' => $this->input->post('barcode_symbology'), 
                'name' => $this->input->post('name'), 
                'model_subcategory' => $this->input->post('model_subcategory'), 
                'model_category' => $this->input->post('model_category'), 
                'model_feature' => $this->input->post('feature'), 
                'type' => $this->input->post('type'), 
                'brand' => $this->input->post('brand'), 
                'location' => $this->input->post('location'), 
                'category_id' => $this->input->post('category'), 
                'subcategory_id' => $this->input->post('subcategory') ? $this->input->post('subcategory') : NULL, 
                'cost' => $this->sma->formatDecimal($this->input->post('cost')), 
                'price' => $this->sma->formatDecimal($this->input->post('price')), 
                'unit' => $this->input->post('unit'), 
                'sale_unit' => $this->input->post('default_sale_unit'), 
                'purchase_unit' => $this->input->post('default_purchase_unit'), 
                'tax_rate' => $this->input->post('tax_rate'), 
                'tax_method' => $this->input->post('tax_method'), 
                'quantity' => $this->input->post('wh_qty'), 
                'alert_quantity' => $this->input->post('alert_quantity'), 
                'track_quantity' => $this->input->post('track_quantity') ? $this->input->post('track_quantity') : '0', 
                'details' => $this->input->post('details'), 
                'product_details' => $this->input->post('product_details'), 
                'supplier1' => $this->input->post('supplier'), 
                'supplier1price' => $this->sma->formatDecimal($this->input->post('supplier_price')), 
                'supplier2' => $this->input->post('supplier_2'), 
                'supplier2price' => $this->sma->formatDecimal($this->input->post('supplier_2_price')), 
                'supplier3' => $this->input->post('supplier_3'), 
                'supplier3price' => $this->sma->formatDecimal($this->input->post('supplier_3_price')), 
                'supplier4' => $this->input->post('supplier_4'), 
                'supplier4price' => $this->sma->formatDecimal($this->input->post('supplier_4_price')), 
                'supplier5' => $this->input->post('supplier_5'), 
                'supplier5price' => $this->sma->formatDecimal($this->input->post('supplier_5_price')), 
                'cf1' => $this->input->post('cf1'), 
                'cf2' => $this->input->post('cf2'), 
                'cf3' => $this->input->post('cf3'), 
                'cf4' => $this->input->post('cf4'), 
                'cf5' => $this->input->post('cf5'), 
                'cf6' => $this->input->post('cf6'), 
                'promotion' => $this->input->post('promotion'), 
                'promo_price' => $this->sma->formatDecimal($this->input->post('promo_price')), 
                'start_date' => $this->input->post('start_date') ? $this->sma->fsd($this->input->post('start_date')) : NULL, 
                'end_date' => $this->input->post('end_date') ? $this->sma->fsd($this->input->post('end_date')) : NULL, 
                'supplier1_part_no' => $this->input->post('supplier_part_no'), 
                'supplier2_part_no' => $this->input->post('supplier_2_part_no'), 
                'supplier3_part_no' => $this->input->post('supplier_3_part_no'), 
                'supplier4_part_no' => $this->input->post('supplier_4_part_no'), 
                'supplier5_part_no' => $this->input->post('supplier_5_part_no'), 
                'file' => $this->input->post('file_link'), 
                'slug' => '0', 
                'weight' => $this->input->post('weight'), 
                'featured' => $this->input->post('featured'), 
                'warehouse'=>$this->input->post('warehouses') ? $this->input->post('warehouses') : NULL, 
                'store_id' => $this->input->post('store'), 
                'tag'=> $this->input->post('tag') 
                // 'price_ret' => NULL, 
            ); 
            $wh_qty= array( 
                'warehouse_id'=>$this->input->post('warehouses') ? $this->input->post('warehouses') : NULL, 
                'quantity'=>$this->input->post('wh_qty'), 
            ); 
        } 
        else{ 
             
            $data = array( 
                'code' => $this->data['store']->code.$this->input->post('code'), 
                'barcode_symbology' => $this->input->post('barcode_symbology'), 
                'name' => $this->input->post('name'), 
                'model_subcategory' => $this->input->post('model_subcategory'), 
                'model_category' => $this->input->post('model_category'), 
                'model_feature' => $this->input->post('feature'), 
                 
                'type' => $this->input->post('type'), 
                'brand' => $this->input->post('brand'), 
                'location' => $this->input->post('location'), 
                'category_id' => $this->input->post('category'), 
                'subcategory_id' => $this->input->post('subcategory') ? $this->input->post('subcategory') : NULL, 
                'cost' => $this->sma->formatDecimal($this->input->post('cost')), 
                'price' => $this->sma->formatDecimal($this->input->post('price')), 
                'unit' => $this->input->post('unit'), 
                'sale_unit' => $this->input->post('default_sale_unit'), 
                'purchase_unit' => $this->input->post('default_purchase_unit'), 
                'tax_rate' => $this->input->post('tax_rate'), 
                'tax_method' => $this->input->post('tax_method'), 
                'alert_quantity' => $this->input->post('alert_quantity'), 
                'track_quantity' => $this->input->post('track_quantity') ? $this->input->post('track_quantity') : '0', 
                'details' => $this->input->post('details'), 
                'product_details' => $this->input->post('product_details'), 
                'supplier1' => $this->input->post('supplier'), 
                'supplier1price' => $this->sma->formatDecimal($this->input->post('supplier_price')), 
                'supplier2' => $this->input->post('supplier_2'), 
                'supplier2price' => $this->sma->formatDecimal($this->input->post('supplier_2_price')), 
                'supplier3' => $this->input->post('supplier_3'), 
                'supplier3price' => $this->sma->formatDecimal($this->input->post('supplier_3_price')), 
                'supplier4' => $this->input->post('supplier_4'), 
                'supplier4price' => $this->sma->formatDecimal($this->input->post('supplier_4_price')), 
                'supplier5' => $this->input->post('supplier_5'), 
                'supplier5price' => $this->sma->formatDecimal($this->input->post('supplier_5_price')), 
                'cf1' => $this->input->post('cf1'), 
                'cf2' => $this->input->post('cf2'), 
                'cf3' => $this->input->post('cf3'), 
                'cf4' => $this->input->post('cf4'), 
                'cf5' => $this->input->post('cf5'), 
                'cf6' => $this->input->post('cf6'), 
                'promotion' => $this->input->post('promotion'), 
                'promo_price' => $this->sma->formatDecimal($this->input->post('promo_price')), 
                'start_date' => $this->input->post('start_date') ? $this->sma->fsd($this->input->post('start_date')) : NULL, 
                'end_date' => $this->input->post('end_date') ? $this->sma->fsd($this->input->post('end_date')) : NULL, 
                'supplier1_part_no' => $this->input->post('supplier_part_no'), 
                'supplier2_part_no' => $this->input->post('supplier_2_part_no'), 
                'supplier3_part_no' => $this->input->post('supplier_3_part_no'), 
                'supplier4_part_no' => $this->input->post('supplier_4_part_no'), 
                'supplier5_part_no' => $this->input->post('supplier_5_part_no'), 
                'file' => $this->input->post('file_link'), 
                'slug' => '0', 
                'weight' => $this->input->post('weight'), 
                'featured' => $this->input->post('featured'), 
                'tag'=> $this->input->post('tag'), 
                'store_id' => $store_id,); 
        } 
            $data['sequence']=$this->input->post('sequence'); 
            $data['ecom_show']=$this->input->post('ecom_show'); 
            $data['show_emenu']=$this->input->post('show_emenu'); 
            $s = sizeof($_POST['type_sale'])-1; 
            // $unitSale_name  = $this->input->post('type_sale'); 
            // $unitSale_price = $this->input->post('price_unit'); 
            for($st = 0; $st<=$s;$st++){ 
                $saleUnit[]=array( 
                    'sale_unitname'=>$_POST['type_sale'][$st], 
                    'sale_unitprice'=>$_POST['price_unit'][$st], 
                ); 
            } 
            $warehouse_qty = NULL; 
            $product_attributes = NULL; 
            $this->load->library('upload'); 
            if ($this->input->post('type') == 'standard') { 
                $wh_total_quantity = 0; 
                $pv_total_quantity = 0; 
                for ($s = 2; $s > 5; $s++) { 
                    $data['suppliers' . $s] = $this->input->post('supplier_' . $s); 
                    $data['suppliers' . $s . 'price'] = $this->input->post('supplier_' . $s . '_price'); 
                } 
                foreach ($warehouses as $warehouse) { 
                    if ($this->input->post('wh_qty_' . $warehouse->id)) { 
                        $warehouse_qty[] = array( 
                            'warehouse_id' => $this->input->post('wh_' . $warehouse->id), 
                            'quantity' => $this->input->post('wh_qty_' . $warehouse->id), 
                            'rack' => $this->input->post('rack_' . $warehouse->id) ? $this->input->post('rack_' . $warehouse->id) : NULL 
                        ); 
                        $wh_total_quantity += $this->input->post('wh_qty_' . $warehouse->id); 
                    } 
                } 
                if($this->input->post('typesInput')) 
                { 
                     
                        $variant_option_type = $this->input->post('typesInput'); 
                     
                }else{ 
                    $variant_option_type = NULL; 
                } 
                if ($this->input->post('attributes')) { 
                    $a = sizeof($_POST['attr_name']); 
                    for ($r = 0; $r <= $a; $r++) { 
                        if (isset($_POST['attr_name'][$r])) { 
                            $product_attributes[] = array( 
                                'name' => $_POST['attr_name'][$r], 
                                'warehouse_id' => $_POST['attr_warehouse'][$r], 
                                'quantity' => $_POST['attr_quantity'][$r], 
                                'price' => $_POST['attr_price'][$r], 
                            ); 
                            $pv_total_quantity += $_POST['attr_quantity'][$r]; 
                        } 
                    } 
 
                } else { 
                    $product_attributes = NULL; 
                } 
 
                if ($wh_total_quantity != $pv_total_quantity && $pv_total_quantity != 0) { 
                    $this->form_validation->set_rules('wh_pr_qty_issue', 'wh_pr_qty_issue', 'required'); 
                    $this->form_validation->set_message('required', lang('wh_pr_qty_issue')); 
                } 
            } 
 
            if ($this->input->post('type') == 'service') { 
                $data['track_quantity'] = 0; 
            } elseif ($this->input->post('type') == 'combo') { 
                $total_price = $this->input->post('price'); 
                $c = sizeof($_POST['combo_item_code']) - 1; 
                for ($r = 0; $r <= $c; $r++) { 
                    if (isset($_POST['combo_item_code'][$r]) && isset($_POST['combo_item_quantity'][$r]) && isset($_POST['combo_item_price'][$r])) { 
                        $items[] = array( 
                            'item_code' => $_POST['combo_item_code'][$r], 
                            'quantity' => $_POST['combo_item_quantity'][$r], 
                            'unit_price' => $_POST['combo_item_price'][$r], 
                        ); 
                    } 
                    //$total_price += $_POST['combo_item_price'][$r] * $_POST['combo_item_quantity'][$r]; 
                } 
                if ($this->sma->formatDecimal($total_price) != $this->sma->formatDecimal($this->input->post('price'))) { 
                    // $this->form_validation->set_rules('combo_price', 'combo_price', 'required'); 
                    // $this->form_validation->set_message('required', lang('pprice_not_match_ciprice')); 
                } 
                $data['track_quantity'] = 0; 
            } elseif ($this->input->post('type') == 'digital') { 
                if ($_FILES['digital_file']['size'] > 0) { 
                    $config['upload_path'] = $this->digital_upload_path; 
                    $config['allowed_types'] = $this->digital_file_types; 
                    $config['max_size'] = $this->allowed_file_size; 
                    $config['overwrite'] = FALSE; 
                    $config['encrypt_name'] = TRUE; 
                    $config['max_filename'] = 25; 
                    $this->upload->initialize($config); 
                    if (!$this->upload->do_upload('digital_file')) { 
                        $error = $this->upload->display_errors(); 
                        $this->session->set_flashdata('error', $error); 
                        admin_redirect("products/add"); 
                    } 
                    $file = $this->upload->file_name; 
                    $data['file'] = $file; 
                } else { 
                    if (!$this->input->post('file_link')) { 
                        $this->form_validation->set_rules('digital_file', lang("digital_file"), 'required'); 
                    } 
                } 
                $config = NULL; 
                $data['track_quantity'] = 0; 
            } 
            if (!isset($items)) { 
                $items = NULL; 
            } 
            if ($_FILES['product_image']['size'] > 0) { 
 
                $config['upload_path'] = $this->upload_path; 
                $config['allowed_types'] = $this->image_types; 
                $config['max_size'] = $this->allowed_file_size; 
                // $config['max_width'] = $this->Settings->iwidth; 
                // $config['max_height'] = $this->Settings->iheight; 
                $config['overwrite'] = FALSE; 
                $config['max_filename'] = 25; 
                $config['encrypt_name'] = TRUE; 
                $this->upload->initialize($config); 
                if (!$this->upload->do_upload('product_image')) { 
                    $error = $this->upload->display_errors(); 
                    $this->session->set_flashdata('error', $error); 
                    admin_redirect("products/add"); 
                } 
                $photo = $this->upload->file_name; 
                $data['image'] = $photo; 
                $this->load->library('image_lib'); 
                $config['image_library'] = 'gd2'; 
                $config['source_image'] = $this->upload_path . $photo; 
		        $data['image_url'] = 'http://'.$_SERVER['SERVER_NAME'].'/'.$this->upload_path . $photo; 
                $config['new_image'] = $this->thumbs_path . $photo; 
                $config['maintain_ratio'] = TRUE; 
                $config['width'] = $this->Settings->twidth; 
                $config['height'] = $this->Settings->theight; 
                $this->image_lib->clear(); 
                $this->image_lib->initialize($config); 
                if (!$this->image_lib->resize()) { 
                    echo $this->image_lib->display_errors(); 
                } 
                if ($this->Settings->watermark) { 
                    $this->image_lib->clear(); 
                    $wm['source_image'] = $this->upload_path . $photo; 
                    $wm['wm_text'] = 'Copyright ' . date('Y') . ' - ' . $this->Settings->site_name; 
                    $wm['wm_type'] = 'text'; 
                    $wm['wm_font_path'] = 'system/fonts/texb.ttf'; 
                    $wm['quality'] = '100'; 
                    $wm['wm_font_size'] = '16'; 
                    $wm['wm_font_color'] = '999999'; 
                    $wm['wm_shadow_color'] = 'CCCCCC'; 
                    $wm['wm_vrt_alignment'] = 'top'; 
                    $wm['wm_hor_alignment'] = 'left'; 
                    $wm['wm_padding'] = '10'; 
                    $this->image_lib->initialize($wm); 
                    $this->image_lib->watermark(); 
                } 
                $this->image_lib->clear(); 
                $config = NULL; 
            } 
 
            if ($_FILES['userfile']['name'][0] != "") { 
 
                $config['upload_path'] = $this->upload_path; 
                $config['allowed_types'] = $this->image_types; 
                $config['max_size'] = $this->allowed_file_size; 
                // $config['max_width'] = $this->Settings->iwidth; 
                // $config['max_height'] = $this->Settings->iheight; 
                $config['overwrite'] = FALSE; 
                $config['encrypt_name'] = TRUE; 
                $config['max_filename'] = 25; 
                $files = $_FILES; 
                $cpt = count($_FILES['userfile']['name']); 
                for ($i = 0; $i < $cpt; $i++) { 
 
                    $_FILES['userfile']['name'] = $files['userfile']['name'][$i]; 
                    $_FILES['userfile']['type'] = $files['userfile']['type'][$i]; 
                    $_FILES['userfile']['tmp_name'] = $files['userfile']['tmp_name'][$i]; 
                    $_FILES['userfile']['error'] = $files['userfile']['error'][$i]; 
                    $_FILES['userfile']['size'] = $files['userfile']['size'][$i]; 
 
                    $this->upload->initialize($config); 
 
                    if (!$this->upload->do_upload()) { 
                        $error = $this->upload->display_errors(); 
                        $this->session->set_flashdata('error', $error); 
                        admin_redirect("products/add"); 
                    } else { 
 
                        $pho = $this->upload->file_name; 
 
                        $photos[] = $pho; 
 
                        $this->load->library('image_lib'); 
                        $config['image_library'] = 'gd2'; 
                        $config['source_image'] = $this->upload_path . $pho; 
                        $config['new_image'] = $this->thumbs_path . $pho; 
                        $config['maintain_ratio'] = TRUE; 
                        $config['width'] = $this->Settings->twidth; 
                        $config['height'] = $this->Settings->theight; 
 
                        $this->image_lib->initialize($config); 
 
                        if (!$this->image_lib->resize()) { 
                            echo $this->image_lib->display_errors(); 
                        } 
 
                        if ($this->Settings->watermark) { 
                            $this->image_lib->clear(); 
                            $wm['source_image'] = $this->upload_path . $pho; 
                            $wm['wm_text'] = 'Copyright ' . date('Y') . ' - ' . $this->Settings->site_name; 
                            $wm['wm_type'] = 'text'; 
                            $wm['wm_font_path'] = 'system/fonts/texb.ttf'; 
                            $wm['quality'] = '100'; 
                            $wm['wm_font_size'] = '16'; 
                            $wm['wm_font_color'] = '999999'; 
                            $wm['wm_shadow_color'] = 'CCCCCC'; 
                            $wm['wm_vrt_alignment'] = 'top'; 
                            $wm['wm_hor_alignment'] = 'left'; 
                            $wm['wm_padding'] = '10'; 
                            $this->image_lib->initialize($wm); 
                            $this->image_lib->watermark(); 
                        } 
 
                        $this->image_lib->clear(); 
                    } 
                } 
                $config = NULL; 
            } else { 
                $photos = NULL; 
            } 
            if($store_id!=0) 
            { 
                $data['quantity'] = isset($wh_total_quantity) ? $wh_total_quantity : 0; 
            } 
             
            // $this->sma->print_arrays($data, $warehouse_qty, $product_attributes); 
        } 
 
        if ($this->form_validation->run() == true && $this->products_model->addProduct($data, $items,$saleUnit, $warehouse_qty, $product_attributes, $photos,$wh_qty,$this->data['store_id'],$variant_option_type)) { 
            $this->session->set_flashdata('message', lang("product_added")); 
            admin_redirect('products'); 
        } else { 
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
            $user = $this->site->getUser(); 
            $store_id = $user->store_id; 
            $this->data['store_id'] = $store_id; 
            $this->data['categories'] = $this->site->getAllCategories($this->data['store_id']); 
            $this->data['model_categories'] = $this->site->getAllModelCategories(); 
            $this->data['stores'] = $this->site->getAllStores(); 
             
            $this->data['tax_rates'] = $this->site->getAllTaxRates(); 
            $this->data['brands'] = $this->site->getAllBrands(); 
            $this->data['location'] = $this->site->getAllLocation($this->data['store_id']); 
            $this->data['base_units'] = $this->site->getAllBaseUnits($this->data['store_id']); 
            if($store_id==0) 
            { 
                $this->data['warehouses'] = $warehouses; 
            } 
            else{ 
                $warehouses = $this->site->getAllWarehousesforstore($store_id); 
                $this->data['warehouses'] = $warehouses; 
            } 
            
             
            $this->data['warehouses_products'] = $id ? $this->products_model->getAllWarehousesWithPQ($id) : NULL; 
            $this->data['product'] = $id ? $this->products_model->getProductByID($id) : NULL; 
            $this->data['variants'] = $this->products_model->getAllVariants(); 
            $this->data['combo_items'] = ($id && $this->data['product']->type == 'combo') ? $this->products_model->getProductComboItems($id) : NULL; 
            $this->data['product_options'] = $id ? $this->products_model->getProductOptionsWithWH($id) : NULL; 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('add_product'))); 
            $meta = array('page_title' => lang('add_product'), 'bc' => $bc); 
            $this->page_construct('products/add', $meta, $this->data); 
        } 
    } 
 
    function suggestions() 
    { 
        $term = $this->input->get('term', TRUE); 
        if (strlen($term) < 1 || !$term) { 
            die("<script type='text/javascript'>setTimeout(function(){ window.top.location.href = '" . admin_url('welcome') . "'; }, 10);</script>"); 
        } 
 
        $rows = $this->products_model->getProductNames($term); 
        if ($rows) { 
            foreach ($rows as $row) { 
                $pr[] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => 1); 
            } 
            $this->sma->send_json($pr); 
        } else { 
            $this->sma->send_json(array(array('id' => 0, 'label' => lang('no_match_found'), 'value' => $term))); 
        } 
    } 
 
    function get_suggestions() 
    { 
        $term = $this->input->get('term', TRUE); 
        if (strlen($term) < 1 || !$term) { 
            die("<script type='text/javascript'>setTimeout(function(){ window.top.location.href = '" . admin_url('welcome') . "'; }, 10);</script>"); 
        } 
 
        $rows = $this->products_model->getProductsForPrinting($term); 
        if ($rows) { 
            foreach ($rows as $row) { 
                $variants = $this->products_model->getProductOptions($row->id); 
                $pr[] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => 1, 'variants' => $variants); 
            } 
            $this->sma->send_json($pr); 
        } else { 
            $this->sma->send_json(array(array('id' => 0, 'label' => lang('no_match_found'), 'value' => $term))); 
        } 
    } 
 
    function addByAjax() 
    { 
        if (!$this->mPermissions('add')) { 
            exit(json_encode(array('msg' => lang('access_denied')))); 
        } 
        if ($this->input->get('token') && $this->input->get('token') == $this->session->userdata('user_csrf') && $this->input->is_ajax_request()) { 
            $product = $this->input->get('product'); 
            if (!isset($product['code']) || empty($product['code'])) { 
                exit(json_encode(array('msg' => lang('product_code_is_required')))); 
            } 
            if (!isset($product['name']) || empty($product['name'])) { 
                exit(json_encode(array('msg' => lang('product_name_is_required')))); 
            } 
            if (!isset($product['category_id']) || empty($product['category_id'])) { 
                exit(json_encode(array('msg' => lang('product_category_is_required')))); 
            } 
            if (!isset($product['unit']) || empty($product['unit'])) { 
                exit(json_encode(array('msg' => lang('product_unit_is_required')))); 
            } 
            if (!isset($product['price']) || empty($product['price'])) { 
                exit(json_encode(array('msg' => lang('product_price_is_required')))); 
            } 
            if (!isset($product['cost']) || empty($product['cost'])) { 
                exit(json_encode(array('msg' => lang('product_cost_is_required')))); 
            } 
            if ($this->products_model->getProductByCode($product['code'])) { 
                exit(json_encode(array('msg' => lang('product_code_already_exist')))); 
            } 
            if ($row = $this->products_model->addAjaxProduct($product)) { 
                $tax_rate = $this->site->getTaxRateByID($row->tax_rate); 
                $pr = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'qty' => 1, 'cost' => $row->cost, 'name' => $row->name, 'tax_method' => $row->tax_method, 'tax_rate' => $tax_rate, 'discount' => '0'); 
                $this->sma->send_json(array('msg' => 'success', 'result' => $pr)); 
            } else { 
                exit(json_encode(array('msg' => lang('failed_to_add_product')))); 
            } 
        } else { 
            json_encode(array('msg' => 'Invalid token')); 
        } 
 
    } 
 
 
    /* -------------------------------------------------------- */ 
 
    function edit($id = NULL) 
    { 
        $this->sma->checkPermissions(); 
        $this->load->helper('security'); 
        if ($this->input->post('id')) { 
            $id = $this->input->post('id'); 
        } 
        $warehouses = $this->site->getallWarehouses($this->data['store_id']); 
        $warehouses_products = $this->products_model->getAllWarehousesWithPQ($id); 
        $product = $this->site->getProductByID($id); 
        if (!$id || !$product) { 
            $this->session->set_flashdata('error', lang('prduct_not_found')); 
            redirect($_SERVER["HTTP_REFERER"]); 
        } 
        $this->form_validation->set_rules('category', lang("category"), 'required|is_natural_no_zero'); 
        if ($this->input->post('type') == 'standard') { 
            $this->form_validation->set_rules('cost', lang("product_cost"), 'required'); 
            $this->form_validation->set_rules('unit', lang("product_unit"), 'required'); 
        } 
        $this->form_validation->set_rules('code', lang("product_code"), 'alpha_dash'); 
        if ($this->input->post('code') !== $product->code) { 
            $this->form_validation->set_rules('code', lang("product_code"), 'is_unique[products.code]'); 
        } 
        if ($this->input->post('barcode_symbology') == 'ean13') { 
            $this->form_validation->set_rules('code', lang("product_code"), 'min_length[13]|max_length[13]'); 
        } 
        // $this->form_validation->set_rules('slug', lang("slug"), 'required|alpha_dash'); 
        // if ($this->input->post('slug') !== $product->slug) { 
        //     $this->form_validation->set_rules('slug', lang("slug"), 'required|is_unique[products.slug]|alpha_dash'); 
        // } 
        $this->form_validation->set_rules('weight', lang("weight"), 'numeric'); 
        $this->form_validation->set_rules('product_image', lang("product_image"), 'xss_clean'); 
        $this->form_validation->set_rules('digital_file', lang("digital_file"), 'xss_clean'); 
        $this->form_validation->set_rules('userfile', lang("product_gallery_images"), 'xss_clean'); 
 
        if ($this->form_validation->run('products/add') == true) { 
            $code = $this->input->post('code'); 
            if (strpos($code, $this->data['store']->code) === false){ 
                $code = $this->data['store']->code.$this->input->post('code'); 
            } 
            $data = array('code' => $code, 
                'sequence' => $this->input->post('sequence'), 
                'barcode_symbology' => $this->input->post('barcode_symbology'), 
                'name' => $this->input->post('name'), 
                'type' => $this->input->post('type'), 
                'brand' => $this->input->post('brand'), 
                'location' => $this->input->post('location'), 
                'category_id' => $this->input->post('category'), 
                'subcategory_id' => $this->input->post('subcategory') ? $this->input->post('subcategory') : NULL, 
                'cost' => $this->sma->formatDecimal($this->input->post('cost')), 
                'price' => $this->sma->formatDecimal($this->input->post('price')), 
                'unit' => $this->input->post('unit'), 
                'sale_unit' => $this->input->post('default_sale_unit'), 
                'purchase_unit' => $this->input->post('default_purchase_unit'), 
                'tax_rate' => $this->input->post('tax_rate'), 
                'tax_method' => $this->input->post('tax_method'), 
                'alert_quantity' => $this->input->post('alert_quantity'), 
                'track_quantity' => $this->input->post('track_quantity') ? $this->input->post('track_quantity') : '0', 
                'details' => $this->input->post('details'), 
                'product_details' => $this->input->post('product_details'), 
                'supplier1' => $this->input->post('supplier'), 
                'supplier1price' => $this->sma->formatDecimal($this->input->post('supplier_price')), 
                'supplier2' => $this->input->post('supplier_2'), 
                'supplier2price' => $this->sma->formatDecimal($this->input->post('supplier_2_price')), 
                'supplier3' => $this->input->post('supplier_3'), 
                'supplier3price' => $this->sma->formatDecimal($this->input->post('supplier_3_price')), 
                'supplier4' => $this->input->post('supplier_4'), 
                'supplier4price' => $this->sma->formatDecimal($this->input->post('supplier_4_price')), 
                'supplier5' => $this->input->post('supplier_5'), 
                'supplier5price' => $this->sma->formatDecimal($this->input->post('supplier_5_price')), 
                'cf1' => $this->input->post('cf1'), 
                'cf2' => $this->input->post('cf2'), 
                'cf3' => $this->input->post('cf3'), 
                'cf4' => $this->input->post('cf4'), 
                'cf5' => $this->input->post('cf5'), 
                'cf6' => $this->input->post('cf6'), 
                'promotion' => $this->input->post('promotion'), 
                'promo_price' => $this->sma->formatDecimal($this->input->post('promo_price')), 
                'start_date' => $this->input->post('start_date') ? $this->sma->fsd($this->input->post('start_date')) : NULL, 
                'end_date' => $this->input->post('end_date') ? $this->sma->fsd($this->input->post('end_date')) : NULL, 
                'supplier1_part_no' => $this->input->post('supplier_part_no'), 
                'supplier2_part_no' => $this->input->post('supplier_2_part_no'), 
                'supplier3_part_no' => $this->input->post('supplier_3_part_no'), 
                'supplier4_part_no' => $this->input->post('supplier_4_part_no'), 
                'supplier5_part_no' => $this->input->post('supplier_5_part_no'), 
                'slug' =>'0', 
                'weight' => $this->input->post('weight'), 
                'featured' => $this->input->post('featured'), 
                'model_category'=>$this->input->post('model_category'), 
                'model_subcategory'=>$this->input->post('model_subcategory'), 
                'model_feature'=>$this->input->post('feature'), 
                'tag'=> $this->input->post('tag') 
                 
            ); 
             
            $data['ecom_show']=$this->input->post('ecom_show'); 
            $data['show_emenu']=$this->input->post('show_emenu'); 
            $warehouse_qty = NULL; 
            $product_attributes = NULL; 
            $update_variants = array(); 
            $update_variant_options = array(); 
            $this->load->library('upload'); 
            if ($this->input->post('type') == 'standard') { 
                if ($product_variants = $this->products_model->getProductOptions($id)) { 
                    foreach ($product_variants as $pv) { 
                        $update_variants[] = array( 
                            'id' => $this->input->post('variant_id_'.$pv->id), 
                            'name' => $this->input->post('variant_name_'.$pv->id), 
                            'cost' => $this->input->post('variant_cost_'.$pv->id), 
                            'price' => $this->input->post('variant_price_'.$pv->id), 
                        ); 
                    } 
                } 
                if ($product_variant_options = $this->db->where('product_id',$id)->get('variant_option')->result()) { 
                    foreach ($product_variant_options as $pv) { 
                        $update_variant_options[] = array( 
                            'id' => $this->input->post('variant_option_id_'.$pv->id), 
                            'name' => $this->input->post('variant_option_name_'.$pv->id), 
                             
                        ); 
                    } 
                } 
                for ($s = 2; $s > 5; $s++) { 
                    $data['suppliers' . $s] = $this->input->post('supplier_' . $s); 
                    $data['suppliers' . $s . 'price'] = $this->input->post('supplier_' . $s . '_price'); 
                } 
                foreach ($warehouses as $warehouse) { 
                    $warehouse_qty[] = array( 
                        'warehouse_id' => $this->input->post('wh_' . $warehouse->id), 
                        'rack' => $this->input->post('rack_' . $warehouse->id) ? $this->input->post('rack_' . $warehouse->id) : NULL 
                    ); 
                } 
                if($this->input->post('typesInput')) 
                { 
                     
                        $variant_option_type = $this->input->post('typesInput'); 
                     
                }else{ 
                    $variant_option_type = NULL; 
                } 
                if ($this->input->post('attributes')) { 
                    $a = sizeof($_POST['attr_name']); 
                    for ($r = 0; $r <= $a; $r++) { 
                        if (isset($_POST['attr_name'][$r])) { 
                            if ($product_variatnt = $this->products_model->getPrductVariantByPIDandName($id, trim($_POST['attr_name'][$r]))) { 
                                $this->form_validation->set_message('required', lang("product_already_has_variant").' ('.$_POST['attr_name'][$r].')'); 
                                $this->form_validation->set_rules('new_product_variant', lang("new_product_variant"), 'required'); 
                            } else { 
                                $product_attributes[] = array( 
                                    'name' => $_POST['attr_name'][$r], 
                                    'warehouse_id' => $_POST['attr_warehouse'][$r], 
                                    'quantity' => $_POST['attr_quantity'][$r], 
                                    'price' => $_POST['attr_price'][$r], 
                                ); 
                            } 
                        } 
                    } 
 
                } else { 
                    $product_attributes = NULL; 
                } 
 
            } 
            $s = sizeof($_POST['type_sale'])-1; 
            for($st = 0; $st<=$s;$st++){ 
                $saleUnit[]=array( 
                    'sale_unitname'=>$_POST['type_sale'][$st], 
                    'sale_unitprice'=>$_POST['price_unit'][$st], 
                ); 
            } 
            // 
 
            if ($this->input->post('type') == 'service') { 
                $data['track_quantity'] = 0; 
            } elseif ($this->input->post('type') == 'combo') { 
                $total_price = $this->input->post('price'); 
                $c = sizeof($_POST['combo_item_code']) - 1; 
                for ($r = 0; $r <= $c; $r++) { 
                    if (isset($_POST['combo_item_code'][$r]) && isset($_POST['combo_item_quantity'][$r]) && isset($_POST['combo_item_price'][$r])) { 
                        $items[] = array( 
                            'item_code' => $_POST['combo_item_code'][$r], 
                            'quantity' => $_POST['combo_item_quantity'][$r], 
                            'unit_price' => $_POST['combo_item_price'][$r], 
                        ); 
                    } 
                    // $total_price += $_POST['combo_item_price'][$r] * $_POST['combo_item_quantity'][$r]; 
                } 
                if ($this->sma->formatDecimal($total_price) != $this->sma->formatDecimal($this->input->post('price'))) { 
                    // $this->form_validation->set_rules('combo_price', 'combo_price', 'required'); 
                    // $this->form_validation->set_message('required', lang('pprice_not_match_ciprice')); 
                } 
                $data['track_quantity'] = 0; 
            } elseif ($this->input->post('type') == 'digital') { 
                if ($this->input->post('file_link')) { 
                    $data['file'] = $this->input->post('file_link'); 
                } 
                if ($_FILES['digital_file']['size'] > 0) { 
                    $config['upload_path'] = $this->digital_upload_path; 
                    $config['allowed_types'] = $this->digital_file_types; 
                    $config['max_size'] = $this->allowed_file_size; 
                    $config['overwrite'] = FALSE; 
                    $config['encrypt_name'] = TRUE; 
                    $config['max_filename'] = 25; 
                    $this->upload->initialize($config); 
                    if (!$this->upload->do_upload('digital_file')) { 
                        $error = $this->upload->display_errors(); 
                        $this->session->set_flashdata('error', $error); 
                        admin_redirect("products/add"); 
                    } 
                    $file = $this->upload->file_name; 
                    $data['file'] = $file; 
                } 
                $config = NULL; 
                $data['track_quantity'] = 0; 
            } 
            if (!isset($items)) { 
                $items = NULL; 
            } 
            if ($_FILES['product_image']['size'] > 0) { 
 
                $config['upload_path'] = $this->upload_path; 
                $config['allowed_types'] = $this->image_types; 
                $config['max_size'] = $this->allowed_file_size; 
                // $config['max_width'] = $this->Settings->iwidth; 
                // $config['max_height'] = $this->Settings->iheight; 
                $config['overwrite'] = FALSE; 
                $config['encrypt_name'] = TRUE; 
                $config['max_filename'] = 25; 
                $this->upload->initialize($config); 
                if (!$this->upload->do_upload('product_image')) { 
                    $error = $this->upload->display_errors(); 
                    $this->session->set_flashdata('error', $error); 
                    admin_redirect("products/edit/" . $id); 
                } 
                $photo = $this->upload->file_name; 
                $data['image'] = $photo; 
                $this->load->library('image_lib'); 
                $config['image_library'] = 'gd2'; 
                $config['source_image'] = $this->upload_path . $photo; 
		$data['image_url'] = 'http://'.$_SERVER['SERVER_NAME'].'/'.$this->upload_path . $photo; 
                $config['new_image'] = $this->thumbs_path . $photo; 
                $config['maintain_ratio'] = TRUE; 
                $config['width'] = $this->Settings->twidth; 
                $config['height'] = $this->Settings->theight; 
                $this->image_lib->clear(); 
                $this->image_lib->initialize($config); 
                if (!$this->image_lib->resize()) { 
                    echo $this->image_lib->display_errors(); 
                } 
                if ($this->Settings->watermark) { 
                    $this->image_lib->clear(); 
                    $wm['source_image'] = $this->upload_path . $photo; 
                    $wm['wm_text'] = 'Copyright ' . date('Y') . ' - ' . $this->Settings->site_name; 
                    $wm['wm_type'] = 'text'; 
                    $wm['wm_font_path'] = 'system/fonts/texb.ttf'; 
                    $wm['quality'] = '100'; 
                    $wm['wm_font_size'] = '16'; 
                    $wm['wm_font_color'] = '999999'; 
                    $wm['wm_shadow_color'] = 'CCCCCC'; 
                    $wm['wm_vrt_alignment'] = 'top'; 
                    $wm['wm_hor_alignment'] = 'left'; 
                    $wm['wm_padding'] = '10'; 
                    $this->image_lib->initialize($wm); 
                    $this->image_lib->watermark(); 
                } 
                $this->image_lib->clear(); 
                $config = NULL; 
            } 
 
            if ($_FILES['userfile']['name'][0] != "") { 
 
                $config['upload_path'] = $this->upload_path; 
                $config['allowed_types'] = $this->image_types; 
                $config['max_size'] = $this->allowed_file_size; 
                // $config['max_width'] = $this->Settings->iwidth; 
                // $config['max_height'] = $this->Settings->iheight; 
                $config['overwrite'] = FALSE; 
                $config['encrypt_name'] = TRUE; 
                $config['max_filename'] = 25; 
                $files = $_FILES; 
                $cpt = count($_FILES['userfile']['name']); 
                for ($i = 0; $i < $cpt; $i++) { 
 
                    $_FILES['userfile']['name'] = $files['userfile']['name'][$i]; 
                    $_FILES['userfile']['type'] = $files['userfile']['type'][$i]; 
                    $_FILES['userfile']['tmp_name'] = $files['userfile']['tmp_name'][$i]; 
                    $_FILES['userfile']['error'] = $files['userfile']['error'][$i]; 
                    $_FILES['userfile']['size'] = $files['userfile']['size'][$i]; 
 
                    $this->upload->initialize($config); 
 
                    if (!$this->upload->do_upload()) { 
                        $error = $this->upload->display_errors(); 
                        $this->session->set_flashdata('error', $error); 
                        admin_redirect("products/edit/" . $id); 
                    } else { 
 
                        $pho = $this->upload->file_name; 
 
                        $photos[] = $pho; 
 
                        $this->load->library('image_lib'); 
                        $config['image_library'] = 'gd2'; 
                        $config['source_image'] = $this->upload_path . $pho; 
                        $config['new_image'] = $this->thumbs_path . $pho; 
                        $config['maintain_ratio'] = TRUE; 
                        $config['width'] = $this->Settings->twidth; 
                        $config['height'] = $this->Settings->theight; 
 
                        $this->image_lib->initialize($config); 
 
                        if (!$this->image_lib->resize()) { 
                            echo $this->image_lib->display_errors(); 
                        } 
 
                        if ($this->Settings->watermark) { 
                            $this->image_lib->clear(); 
                            $wm['source_image'] = $this->upload_path . $pho; 
                            $wm['wm_text'] = 'Copyright ' . date('Y') . ' - ' . $this->Settings->site_name; 
                            $wm['wm_type'] = 'text'; 
                            $wm['wm_font_path'] = 'system/fonts/texb.ttf'; 
                            $wm['quality'] = '100'; 
                            $wm['wm_font_size'] = '16'; 
                            $wm['wm_font_color'] = '999999'; 
                            $wm['wm_shadow_color'] = 'CCCCCC'; 
                            $wm['wm_vrt_alignment'] = 'top'; 
                            $wm['wm_hor_alignment'] = 'left'; 
                            $wm['wm_padding'] = '10'; 
                            $this->image_lib->initialize($wm); 
                            $this->image_lib->watermark(); 
                        } 
 
                        $this->image_lib->clear(); 
                    } 
                } 
                $config = NULL; 
            } else { 
                $photos = NULL; 
            } 
            $data['quantity'] = isset($wh_total_quantity) ? $wh_total_quantity : 0; 
            // $this->sma->print_arrays($data, $warehouse_qty, $update_variants, $product_attributes, $photos, $items); 
        } 
 
        if ($this->form_validation->run() == true && $this->products_model->updateProduct($id, $data, $saleUnit, $items, $warehouse_qty, $product_attributes, $photos, $update_variants,$variant_option_type,$update_variant_options)) { 
            $this->session->set_flashdata('message', lang("product_updated")); 
            admin_redirect('products'); 
        } else { 
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
            $this->data['unit'] = $this->site->getEditValueByID($id); 
             //var_dump($this->data['unit']);die(); 
            $this->data['categories'] = $this->site->getAllCategories($this->data['store_id']); 
            $this->data['tax_rates'] = $this->site->getAllTaxRates(); 
            $this->data['brands'] = $this->site->getAllBrands(); 
            $this->data['location'] = $this->site->getAllLocation($this->data['store_id']); 
            $this->data['base_units'] = $this->site->getAllBaseUnits($this->data['store_id']); 
            $this->data['warehouses'] = $warehouses; 
            $this->data['warehouses_products'] = $warehouses_products; 
            $this->data['product'] = $product; 
            $this->data['variants'] = $this->products_model->getAllVariants(); 
            $this->data['subunits'] = $this->site->getUnitsByBUID($product->unit); 
            $this->data['product_variants'] = $this->products_model->getProductOptions($id); 
            $this->data['product_variant_options'] = $this->db->where('product_id',$id)->get('variant_option')->result(); 
            $this->data['model_categories'] = $this->site->getAllModelCategories(); 
            $this->data['combo_items'] = $product->type == 'combo' ? $this->products_model->getProductComboItems($product->id) : NULL; 
            $this->data['product_options'] = $id ? $this->products_model->getProductOptionsWithWH($id) : NULL; 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('edit_product'))); 
            $meta = array('page_title' => lang('edit_product'), 'bc' => $bc); 
            $this->page_construct('products/edit', $meta, $this->data); 
        } 
    } 
 
    /* ---------------------------------------------------------------- */ 
 
    function import_csv() 
    { 
        $this->sma->checkPermissions('csv'); 
        $this->load->helper('security'); 
        $this->form_validation->set_rules('userfile', lang("upload_file"), 'xss_clean'); 
 
        if ($this->form_validation->run() == true) { 
 
            if (isset($_FILES["userfile"])) { 
 
                $this->load->library('upload'); 
                $config['upload_path'] = $this->digital_upload_path; 
                $config['allowed_types'] = 'csv'; 
                $config['max_size'] = $this->allowed_file_size; 
                $config['overwrite'] = TRUE; 
                $config['encrypt_name'] = TRUE; 
                $config['max_filename'] = 25; 
                $this->upload->initialize($config); 
 
                if (!$this->upload->do_upload()) { 
                    $error = $this->upload->display_errors(); 
                    $this->session->set_flashdata('error', $error); 
                    admin_redirect("products/import_csv"); 
                } 
 
                $csv = $this->upload->file_name; 
 
                $arrResult = array(); 
                $handle = fopen($this->digital_upload_path . $csv, "r"); 
                if ($handle) { 
                    while (($row = fgetcsv($handle, 5000, ",")) !== FALSE) { 
                        $arrResult[] = $row; 
                    } 
                    fclose($handle); 
                } 
                $titles = array_shift($arrResult); 
                $keys = array('name', 'code', 'barcode_symbology', 'brand', 'location', 'category_code', 'unit', 'sale_unit', 'purchase_unit', 'cost', 'price', 'alert_quantity', 'tax_rate', 'tax_method', 'image', 'subcategory_code', 'variants', 'cf1', 'cf2', 'cf3', 'cf4', 'cf5', 'cf6','image_url'); 
 
                $final = array(); 
                foreach ($arrResult as $key => $value) { 
                    $final[] = array_combine($keys, $value); 
                } 
                // $this->sma->print_arrays($final); 
                $rw = 2; $items = array(); 
                foreach ($final as $csv_pr) { 
                    if ( ! $this->products_model->getProductByCode(trim($this->data['store']->code.$csv_pr['code']))) { 
                        if ($catd = $this->products_model->getCategoryByCode(trim($csv_pr['category_code']))) { 
                            $brand = $this->products_model->getBrandByName(trim($csv_pr['brand'])); 
                            $location = $this->products_model->getLocationByName(trim($csv_pr['location'])); 
                            $warehouse = $this->products_model->getWarehouseByName(trim($csv_pr['cf1'])); 
                            if(!$warehouse) 
                            { 
                                $this->session->set_flashdata('error', "Check warehouse!"); 
                                admin_redirect("products/import_csv"); 
                            } 
                            $store = $this->products_model->getStoreByCode(trim($csv_pr['cf6'])); 
                            $unit = $this->products_model->getUnitByCode(trim($csv_pr['unit'])); 
                            $base_unit = $unit ? $unit->id : NULL; 
                            $sale_unit = $base_unit; 
                            $purcahse_unit = $base_unit; 
                            if ($base_unit) { 
                                $units = $this->site->getUnitsByBUID($base_unit); 
                                foreach ($units as $u) { 
                                    if ($u->code == trim($csv_pr['sale_unit'])) { 
                                        $sale_unit = $u->id; 
                                    } 
                                    if ($u->code == trim($csv_pr['purchase_unit'])) { 
                                        $purcahse_unit = $u->id; 
                                    } 
                                } 
                            } else { 
                                $this->session->set_flashdata('error', lang("check_unit") . " (" . $csv_pr['unit'] . "). " . lang("unit_code_x_exist") . " " . lang("line_no") . " " . $rw); 
                                admin_redirect("products/import_csv"); 
                            } 
 
                            $tax_details = $this->products_model->getTaxRateByName(trim($csv_pr['tax_rate'])); 
                            $prsubcat = $this->products_model->getCategoryByCode(trim($csv_pr['subcategory_code'])); 
                            $items[] = array ( 
                                'code' => $this->data['store']->code.trim($csv_pr['code']), 
                                'name' => trim($csv_pr['name']), 
                                'category_id' => $catd->id, 
                                'barcode_symbology' => mb_strtolower(trim($csv_pr['barcode_symbology']), 'UTF-8'), 
                                'brand' => ($brand ? $brand->id : NULL), 
                                'location' => ($location ? $location->id : NULL), 
                                'unit' => $base_unit, 
                                'sale_unit' => $sale_unit, 
                                'purchase_unit' => $purcahse_unit, 
                                'cost' => trim($csv_pr['cost']), 
                                'price' => trim($csv_pr['price']), 
                                'alert_quantity' => trim($csv_pr['alert_quantity']), 
                                'tax_rate' => ($tax_details ? $tax_details->id : NULL), 
                                'tax_method' => ($csv_pr['tax_method'] == 'exclusive' ? 1 : 0), 
                                'subcategory_id' => ($prsubcat ? $prsubcat->id : NULL), 
                                'variants' => trim($csv_pr['variants']), 
                                'image' => trim($csv_pr['image']), 
                                'warehouse' => trim($warehouse->id), 
                                'quantity' => trim($csv_pr['cf2']), 
                                'cf1' => trim($csv_pr['cf3']), 
                                'cf2' => trim($csv_pr['cf4']), 
                                'cf3' => trim($csv_pr['cf5']), 
                                'store_id' => $this->data['store']->id, 
                                'image_url' => trim($csv_pr['image_url']), 
                                 
                                
                                ); 
                        } else { 
                            $this->session->set_flashdata('error', lang("check_category_code") . " (" . $csv_pr['category_code'] . "). " . lang("category_code_x_exist") . " " . lang("line_no") . " " . $rw); 
                            admin_redirect("products/import_csv"); 
                        } 
                    }else{ 
                        $this->session->set_flashdata('error', "Product existed!"); 
                        admin_redirect("products/import_csv"); 
                    } 
 
                    $rw++; 
                } 
            } 
 
            // $this->sma->print_arrays($items); 
        } 
 
        if ($this->form_validation->run() == true && $prs = $this->products_model->add_products($items)) { 
            $this->session->set_flashdata('message', sprintf(lang("products_added"), $prs)); 
            admin_redirect('products'); 
        } else { 
 
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
 
            $this->data['userfile'] = array('name' => 'userfile', 
                'id' => 'userfile', 
                'type' => 'text', 
                'value' => $this->form_validation->set_value('userfile') 
            ); 
 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('import_products_by_csv'))); 
            $meta = array('page_title' => lang('import_products_by_csv'), 'bc' => $bc); 
            $this->page_construct('products/import_csv', $meta, $this->data); 
 
        } 
    } 
 
    /* ------------------------------------------------------------------ */ 
 
    function update_price() 
    { 
        $this->sma->checkPermissions('csv'); 
        $this->load->helper('security'); 
        $this->form_validation->set_rules('userfile', lang("upload_file"), 'xss_clean'); 
 
        if ($this->form_validation->run() == true) { 
 
            if (DEMO) { 
                $this->session->set_flashdata('message', lang("disabled_in_demo")); 
                admin_redirect('welcome'); 
            } 
 
            if (isset($_FILES["userfile"])) { 
 
                $this->load->library('upload'); 
                $config['upload_path'] = $this->digital_upload_path; 
                $config['allowed_types'] = 'csv'; 
                $config['max_size'] = $this->allowed_file_size; 
                $config['overwrite'] = TRUE; 
                $config['encrypt_name'] = TRUE; 
                $config['max_filename'] = 25; 
                $this->upload->initialize($config); 
 
                if (!$this->upload->do_upload()) { 
                    $error = $this->upload->display_errors(); 
                    $this->session->set_flashdata('error', $error); 
                    admin_redirect("products"); 
                } 
 
                $csv = $this->upload->file_name; 
 
                $arrResult = array(); 
                $handle = fopen($this->digital_upload_path . $csv, "r"); 
                if ($handle) { 
                    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) { 
                        $arrResult[] = $row; 
                    } 
                    fclose($handle); 
                } 
                $titles = array_shift($arrResult); 
 
                $keys = array('code', 'price'); 
 
                $final = array(); 
 
                foreach ($arrResult as $key => $value) { 
                    $final[] = array_combine($keys, $value); 
                } 
                $rw = 2; 
                foreach ($final as $csv_pr) { 
                    if (!$this->products_model->getProductByCode(trim($csv_pr['code']))) { 
                        $this->session->set_flashdata('message', lang("check_product_code") . " (" . $csv_pr['code'] . "). " . lang("code_x_exist") . " " . lang("line_no") . " " . $rw); 
                        admin_redirect("products"); 
                    } 
                    $rw++; 
                } 
            } 
 
        } elseif ($this->input->post('update_price')) { 
            $this->session->set_flashdata('error', validation_errors()); 
            admin_redirect("system_settings/group_product_prices/".$group_id); 
        } 
 
        if ($this->form_validation->run() == true && !empty($final)) { 
            $this->products_model->updatePrice($final); 
            $this->session->set_flashdata('message', lang("price_updated")); 
            admin_redirect('products'); 
        } else { 
 
            $this->data['userfile'] = array('name' => 'userfile', 
                'id' => 'userfile', 
                'type' => 'text', 
                'value' => $this->form_validation->set_value('userfile') 
            ); 
            $this->data['modal_js'] = $this->site->modal_js(); 
            $this->load->view($this->theme.'products/update_price', $this->data); 
 
        } 
    } 
 
    /* ------------------------------------------------------------------------------- */ 
 
    function delete($id = NULL) 
    { 
        $this->sma->checkPermissions(NULL, TRUE); 
 
        if ($this->input->get('id')) { 
            $id = $this->input->get('id'); 
        } 
        //check if product has been used 
        if($this->db->where('product_id',$id)->get('sale_items')->row()) 
        { 
            $this->sma->send_json(array('error' => 1, 'msg' => lang("this_product_has_been_used"))); 
        } 
        if($this->db->where('product_id',$id)->get('adjustment_items')->row()) 
        { 
            $this->sma->send_json(array('error' => 1, 'msg' => lang("this_product_has_been_used"))); 
        } 
        if ($this->products_model->deleteProduct($id)) { 
            if($this->input->is_ajax_request()) { 
                $this->sma->send_json(array('error' => 0, 'msg' => lang("product_deleted"))); 
            } 
            $this->session->set_flashdata('message', lang('product_deleted')); 
            admin_redirect('welcome'); 
        } 
 
    } 
 
    /* ----------------------------------------------------------------------------- */ 
 
    function quantity_adjustments($warehouse_id = NULL) 
    { 
        $this->sma->checkPermissions('adjustments'); 
 
        if ($this->Owner || $this->Admin || !$this->session->userdata('warehouse_id')) { 
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']); 
            $this->data['warehouse'] = $warehouse_id ? $this->site->getWarehouseByID($warehouse_id) : null; 
        } else { 
            $this->data['warehouses'] = null; 
            $this->data['warehouse'] = $this->session->userdata('warehouse_id') ? $this->site->getWarehouseByID($this->session->userdata('warehouse_id')) : null; 
        } 
	 $this->data['stores'] = $this->site->getAllStores(); 
        $this->data['error'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('error'); 
        $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('quantity_adjustments'))); 
        $meta = array('page_title' => lang('quantity_adjustments'), 'bc' => $bc); 
        $this->page_construct('products/quantity_adjustments', $meta, $this->data); 
    } 
 
    function getadjustments($warehouse_id = NULL) 
    { 
        $this->sma->checkPermissions('adjustments'); 
 
        $delete_link = "<a href='#' class='tip po' title='<b>" . $this->lang->line("delete_adjustment") . "</b>' data-content=\"<p>" 
            . lang('r_u_sure') . "</p><a class='btn btn-danger po-delete' href='" . admin_url('products/delete_adjustment/$1') . "'>" 
            . lang('i_m_sure') . "</a> <button class='btn po-close'>" . lang('no') . "</button>\"  rel='popover'><i class=\"fa fa-trash-o\"></i></a>"; 
 
        $this->load->library('datatables'); 
        $this->datatables 
            ->select("{$this->db->dbprefix('adjustments')}.id as id, date, reference_no, warehouses.name as wh_name, CONCAT({$this->db->dbprefix('users')}.first_name, ' ', {$this->db->dbprefix('users')}.last_name) as created_by, note, attachment") 
            ->from('adjustments') 
            ->join('warehouses', 'warehouses.id=adjustments.warehouse_id', 'left') 
            ->join('users', 'users.id=adjustments.created_by', 'left') 
            ->group_by("adjustments.id"); 
            if ($warehouse_id) { 
                $this->datatables->where('adjustments.warehouse_id', $warehouse_id); 
            } 
	if($this->data['store_id']!=0) 
	{ 
	 $this->datatables->where('adjustments.store_id',$this->data['store_id']); 
	} 
        $this->datatables->add_column("Actions", "<div class='text-center'><a href='" . admin_url('products/edit_adjustment/$1') . "' class='tip' title='" . lang("edit_adjustment") . "'><i class='fa fa-edit'></i></a> " . $delete_link . "</div>", "id"); 
 
        echo $this->datatables->generate(); 
 
    } 
 
    public function view_adjustment($id) 
    { 
        $this->sma->checkPermissions('adjustments', TRUE); 
 
        $adjustment = $this->products_model->getAdjustmentByID($id); 
        if (!$id || !$adjustment) { 
            $this->session->set_flashdata('error', lang('adjustment_not_found')); 
            $this->sma->md(); 
        } 
 
        $this->data['inv'] = $adjustment; 
        $this->data['rows'] = $this->products_model->getAdjustmentItems($id); 
        $this->data['created_by'] = $this->site->getUser($adjustment->created_by); 
        $this->data['updated_by'] = $this->site->getUser($adjustment->updated_by); 
        $this->data['warehouse'] = $this->site->getWarehouseByID($adjustment->warehouse_id); 
        $this->load->view($this->theme.'products/view_adjustment', $this->data); 
    } 
 
    function add_adjustment($count_id = NULL) 
    { 
        $this->sma->checkPermissions('adjustments', true); 
        $this->form_validation->set_rules('warehouse', lang("warehouse"), 'required'); 
 
        if ($this->form_validation->run() == true) { 
 
            if ($this->Owner || $this->Admin) { 
                $date = $this->sma->fld($this->input->post('date')); 
            } else { 
                $date = date('Y-m-d H:s:i'); 
            } 
 
            $reference_no = $this->input->post('reference_no') ? $this->input->post('reference_no') : $this->site->getReference('qa'); 
            $warehouse_id = $this->input->post('warehouse'); 
            $note = $this->sma->clear_tags($this->input->post('note')); 
 
            $i = isset($_POST['product_id']) ? sizeof($_POST['product_id']) : 0; 
            for ($r = 0; $r < $i; $r++) { 
 
                $product_id = $_POST['product_id'][$r]; 
                $type = $_POST['type'][$r]; 
                $quantity = $_POST['quantity'][$r]; 
                $serial = $_POST['serial'][$r]; 
                $variant = isset($_POST['variant'][$r]) && !empty($_POST['variant'][$r]) ? $_POST['variant'][$r] : NULL; 
 
                if (!$this->Settings->overselling && $type == 'subtraction') { 
                    if ($variant) { 
                        if($op_wh_qty = $this->products_model->getProductWarehouseOptionQty($variant, $warehouse_id)) { 
                            if ($op_wh_qty->quantity < $quantity) { 
                                $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage')); 
                                redirect($_SERVER["HTTP_REFERER"]); 
                            } 
                        } else { 
                            $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage')); 
                            redirect($_SERVER["HTTP_REFERER"]); 
                        } 
                    } 
                    if($wh_qty = $this->products_model->getProductQuantity($product_id, $warehouse_id)) { 
                        if ($wh_qty['quantity'] < $quantity) { 
                            $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage')); 
                            redirect($_SERVER["HTTP_REFERER"]); 
                        } 
                    } else { 
                        $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage')); 
                        redirect($_SERVER["HTTP_REFERER"]); 
                    } 
                } 
 
                $products[] = array( 
                    'product_id' => $product_id, 
                    'type' => $type, 
                    'quantity' => $quantity, 
                    'warehouse_id' => $warehouse_id, 
                    'option_id' => $variant, 
                    'serial_no' => $serial, 
                    ); 
		 
            } 
 
            if (empty($products)) { 
                $this->form_validation->set_rules('product', lang("products"), 'required'); 
            } else { 
                krsort($products); 
            } 
 
            $data = array( 
                'date' => $date, 
                'reference_no' => $reference_no, 
                'warehouse_id' => $warehouse_id, 
                'note' => $note, 
                'created_by' => $this->session->userdata('user_id'), 
                'count_id' => $this->input->post('count_id') ? $this->input->post('count_id') : NULL, 
                ); 
	    if($this->data['store_id']==0) 
		{ 
			 $data['store_id'] = $this->input->post('store'); 
		}else{ 
			$data['store_id'] =$this->data['store_id']; 
		} 
 
            if ($_FILES['document']['size'] > 0) { 
                $this->load->library('upload'); 
                $config['upload_path'] = $this->digital_upload_path; 
                $config['allowed_types'] = $this->digital_file_types; 
                $config['max_size'] = $this->allowed_file_size; 
                $config['overwrite'] = false; 
                $config['encrypt_name'] = true; 
                $this->upload->initialize($config); 
                if (!$this->upload->do_upload('document')) { 
                    $error = $this->upload->display_errors(); 
                    $this->session->set_flashdata('error', $error); 
                    redirect($_SERVER["HTTP_REFERER"]); 
                } 
                $photo = $this->upload->file_name; 
                $data['attachment'] = $photo; 
            } 
 
            // $this->sma->print_arrays($data, $products); 
 
        } 
 
        if ($this->form_validation->run() == true && $this->products_model->addAdjustment($data, $products)) { 
            $this->session->set_userdata('remove_qals', 1); 
            $this->session->set_flashdata('message', lang("quantity_adjusted")); 
            admin_redirect('products/quantity_adjustments'); 
        } else { 
 
            if ($count_id) { 
                $stock_count = $this->products_model->getStouckCountByID($count_id); 
                $items = $this->products_model->getStockCountItems($count_id); 
                $c = rand(100000, 9999999); 
                foreach ($items as $item) { 
                    if ($item->counted != $item->expected) { 
                        $product = $this->site->getProductByID($item->product_id); 
                        $row = json_decode('{}'); 
                        $row->id = $item->product_id; 
                        $row->code = $product->code; 
                        $row->name = $product->name; 
                        $row->qty = $item->counted-$item->expected; 
                        $row->type = $row->qty > 0 ? 'addition' : 'subtraction'; 
                        $row->qty = $row->qty > 0 ? $row->qty : (0-$row->qty); 
                        $options = $this->products_model->getProductOptions($product->id); 
                        $row->option = $item->product_variant_id ? $item->product_variant_id : 0; 
                        $row->serial = ''; 
                        $ri = $this->Settings->item_addition ? $product->id : $c; 
 
                        $pr[$ri] = array('id' => str_replace(".", "", microtime(true)), 'item_id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 
                            'row' => $row, 'options' => $options); 
                        $c++; 
                    } 
                } 
            } 
            $this->data['adjustment_items'] = $count_id ? json_encode($pr) : FALSE; 
            $this->data['warehouse_id'] = $count_id ? $stock_count->warehouse_id : FALSE; 
            $this->data['count_id'] = $count_id; 
	     $this->data['stores'] = $this->site->getAllStores(); 
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']); 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('add_adjustment'))); 
            $meta = array('page_title' => lang('add_adjustment'), 'bc' => $bc); 
            $this->page_construct('products/add_adjustment', $meta, $this->data); 
 
        } 
    } 
 
    function edit_adjustment($id) 
    { 
        $this->sma->checkPermissions('adjustments', true); 
        $adjustment = $this->products_model->getAdjustmentByID($id); 
        if (!$id || !$adjustment) { 
            $this->session->set_flashdata('error', lang('adjustment_not_found')); 
            $this->sma->md(); 
        } 
        $this->form_validation->set_rules('warehouse', lang("warehouse"), 'required'); 
 
        if ($this->form_validation->run() == true) { 
 
            if ($this->Owner || $this->Admin) { 
                $date = $this->sma->fld($this->input->post('date')); 
            } else { 
                $date = $adjustment->date; 
            } 
 
            $reference_no = $this->input->post('reference_no'); 
            $warehouse_id = $this->input->post('warehouse'); 
            $note = $this->sma->clear_tags($this->input->post('note')); 
 
            $i = isset($_POST['product_id']) ? sizeof($_POST['product_id']) : 0; 
            for ($r = 0; $r < $i; $r++) { 
 
                $product_id = $_POST['product_id'][$r]; 
                $type = $_POST['type'][$r]; 
                $quantity = $_POST['quantity'][$r]; 
                $serial = $_POST['serial'][$r]; 
                $variant = isset($_POST['variant'][$r]) && !empty($_POST['variant'][$r]) ? $_POST['variant'][$r] : null; 
 
                if (!$this->Settings->overselling && $type == 'subtraction') { 
                    if ($variant) { 
                        if($op_wh_qty = $this->products_model->getProductWarehouseOptionQty($variant, $warehouse_id)) { 
                            if ($op_wh_qty->quantity < $quantity) { 
                                $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage')); 
                                redirect($_SERVER["HTTP_REFERER"]); 
                            } 
                        } else { 
                            $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage')); 
                            redirect($_SERVER["HTTP_REFERER"]); 
                        } 
                    } 
                    if($wh_qty = $this->products_model->getProductQuantity($product_id, $warehouse_id)) { 
                        if ($wh_qty['quantity'] < $quantity) { 
                            $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage')); 
                            redirect($_SERVER["HTTP_REFERER"]); 
                        } 
                    } else { 
                        $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage')); 
                        redirect($_SERVER["HTTP_REFERER"]); 
                    } 
                } 
 
                $products[] = array( 
                    'product_id' => $product_id, 
                    'type' => $type, 
                    'quantity' => $quantity, 
                    'warehouse_id' => $warehouse_id, 
                    'option_id' => $variant, 
                    'serial_no' => $serial, 
                    ); 
 
            } 
 
            if (empty($products)) { 
                $this->form_validation->set_rules('product', lang("products"), 'required'); 
            } else { 
                krsort($products); 
            } 
 
            $data = array( 
                'date' => $date, 
                'reference_no' => $reference_no, 
                'warehouse_id' => $warehouse_id, 
                'note' => $note, 
                'created_by' => $this->session->userdata('user_id') 
                ); 
 
            if ($_FILES['document']['size'] > 0) { 
                $this->load->library('upload'); 
                $config['upload_path'] = $this->digital_upload_path; 
                $config['allowed_types'] = $this->digital_file_types; 
                $config['max_size'] = $this->allowed_file_size; 
                $config['overwrite'] = false; 
                $config['encrypt_name'] = true; 
                $this->upload->initialize($config); 
                if (!$this->upload->do_upload('document')) { 
                    $error = $this->upload->display_errors(); 
                    $this->session->set_flashdata('error', $error); 
                    redirect($_SERVER["HTTP_REFERER"]); 
                } 
                $photo = $this->upload->file_name; 
                $data['attachment'] = $photo; 
            } 
 
            // $this->sma->print_arrays($data, $products); 
 
        } 
 
        if ($this->form_validation->run() == true && $this->products_model->updateAdjustment($id, $data, $products)) { 
            $this->session->set_userdata('remove_qals', 1); 
            $this->session->set_flashdata('message', lang("quantity_adjusted")); 
            admin_redirect('products/quantity_adjustments'); 
        } else { 
 
            $inv_items = $this->products_model->getAdjustmentItems($id); 
            krsort($inv_items); 
            $c = rand(100000, 9999999); 
            foreach ($inv_items as $item) { 
                $product = $this->site->getProductByID($item->product_id); 
                $row = json_decode('{}'); 
                $row->id = $item->product_id; 
                $row->code = $product->code; 
                $row->name = $product->name; 
                $row->qty = $item->quantity; 
                $row->type = $item->type; 
                $options = $this->products_model->getProductOptions($product->id); 
                $row->option = $item->option_id ? $item->option_id : 0; 
                $row->serial = $item->serial_no ? $item->serial_no : ''; 
                $ri = $this->Settings->item_addition ? $product->id : $c; 
 
                $pr[$ri] = array('id' => str_replace(".", "", microtime(true)), 'item_id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 
                    'row' => $row, 'options' => $options); 
                $c++; 
            } 
 
            $this->data['adjustment'] = $adjustment; 
            $this->data['adjustment_items'] = json_encode($pr); 
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']); 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('edit_adjustment'))); 
            $meta = array('page_title' => lang('edit_adjustment'), 'bc' => $bc); 
            $this->page_construct('products/edit_adjustment', $meta, $this->data); 
 
        } 
    } 
 
    function add_adjustment_by_csv() 
    { 
        $this->sma->checkPermissions('adjustments', true); 
        $this->form_validation->set_rules('warehouse', lang("warehouse"), 'required'); 
 
        if ($this->form_validation->run() == true) { 
 
            if ($this->Owner || $this->Admin) { 
                $date = $this->sma->fld($this->input->post('date')); 
            } else { 
                $date = date('Y-m-d H:s:i'); 
            } 
 
            $reference_no = $this->input->post('reference_no') ? $this->input->post('reference_no') : $this->site->getReference('qa'); 
            $warehouse_id = $this->input->post('warehouse'); 
            $note = $this->sma->clear_tags($this->input->post('note')); 
            $data = array( 
                'date' => $date, 
                'reference_no' => $reference_no, 
                'warehouse_id' => $warehouse_id, 
                'note' => $note, 
                'created_by' => $this->session->userdata('user_id'), 
                'store_id' => $this->data['store_id'], 
                'count_id' => NULL, 
                ); 
 
            if ($_FILES['csv_file']['size'] > 0) { 
 
                $this->load->library('upload'); 
                $config['upload_path'] = $this->digital_upload_path; 
                $config['allowed_types'] = 'csv'; 
                $config['max_size'] = $this->allowed_file_size; 
                $config['overwrite'] = false; 
                $config['encrypt_name'] = true; 
                $this->upload->initialize($config); 
                if (!$this->upload->do_upload('csv_file')) { 
                    $error = $this->upload->display_errors(); 
                    $this->session->set_flashdata('error', $error); 
                    redirect($_SERVER["HTTP_REFERER"]); 
                } 
 
                $csv = $this->upload->file_name; 
                $data['attachment'] = $csv; 
 
                $arrResult = array(); 
                $handle = fopen($this->digital_upload_path . $csv, "r"); 
                if ($handle) { 
                    while (($row = fgetcsv($handle, 5000, ",")) !== FALSE) { 
                        $arrResult[] = $row; 
                    } 
                    fclose($handle); 
                } 
                $titles = array_shift($arrResult); 
                $keys = array('code', 'quantity', 'variant'); 
                $final = array(); 
                foreach ($arrResult as $key => $value) { 
                    $final[] = array_combine($keys, $value); 
                } 
                // $this->sma->print_arrays($final); 
                $rw = 2; 
                foreach ($final as $pr) { 
                    if ($product = $this->products_model->getProductByCode(trim($pr['code']))) { 
                        $csv_variant = trim($pr['variant']); 
                        $variant = !empty($csv_variant) ? $this->products_model->getProductVariantID($product->id, $csv_variant) : FALSE; 
 
                        $csv_quantity = trim($pr['quantity']); 
                        $type = $csv_quantity > 0 ? 'addition' : 'subtraction'; 
                        $quantity = $csv_quantity > 0 ? $csv_quantity : (0-$csv_quantity); 
 
                        if (!$this->Settings->overselling && $type == 'subtraction') { 
                            if ($variant) { 
                                if($op_wh_qty = $this->products_model->getProductWarehouseOptionQty($variant, $warehouse_id)) { 
                                    if ($op_wh_qty->quantity < $quantity) { 
                                        $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage'). ' - ' . lang('line_no') . ' ' . $rw); 
                                        redirect($_SERVER["HTTP_REFERER"]); 
                                    } 
                                } else { 
                                    $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage'). ' - ' . lang('line_no') . ' ' . $rw); 
                                    redirect($_SERVER["HTTP_REFERER"]); 
                                } 
                            } 
                            if($wh_qty = $this->products_model->getProductQuantity($product->id, $warehouse_id)) { 
                                if ($wh_qty['quantity'] < $quantity) { 
                                    $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage'). ' - ' . lang('line_no') . ' ' . $rw); 
                                    redirect($_SERVER["HTTP_REFERER"]); 
                                } 
                            } else { 
                                $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage'). ' - ' . lang('line_no') . ' ' . $rw); 
                                redirect($_SERVER["HTTP_REFERER"]); 
                            } 
                        } 
                         
                        $products[] = array( 
                            'product_id' => $product->id, 
                            'type' => $type, 
                            'quantity' => $quantity, 
                            'warehouse_id' => $warehouse_id, 
                            'option_id' => $variant, 
                            ); 
 
                    } else { 
                        $this->session->set_flashdata('error', lang('check_product_code') . ' (' . $pr['code'] . '). ' . lang('product_code_x_exist') . ' ' . lang('line_no') . ' ' . $rw); 
                        redirect($_SERVER["HTTP_REFERER"]); 
                    } 
                    $rw++; 
                } 
 
            } else { 
                $this->form_validation->set_rules('csv_file', lang("upload_file"), 'required'); 
            } 
 
            // $this->sma->print_arrays($data, $products); 
 
        } 
 
        if ($this->form_validation->run() == true && $this->products_model->addAdjustment($data, $products)) { 
            $this->session->set_flashdata('message', lang("quantity_adjusted")); 
            admin_redirect('products/quantity_adjustments'); 
        } else { 
 
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']); 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('add_adjustment'))); 
            $meta = array('page_title' => lang('add_adjustment_by_csv'), 'bc' => $bc); 
            $this->page_construct('products/add_adjustment_by_csv', $meta, $this->data); 
 
        } 
    } 
 
    function delete_adjustment($id = NULL) 
    { 
        $this->sma->checkPermissions('delete', TRUE); 
 
        //$this->sma->send_json(array('error' =>1 , 'msg' => lang("Can not delete adjustment that has been submitted"))); 
 
        if ($this->products_model->deleteAdjustment($id)) { 
            $this->sma->send_json(array('error' => 0, 'msg' => lang("adjustment_deleted"))); 
        } 
 
    } 
 
    /* --------------------------------------------------------------------------------------------- */ 
 
    function modal_view($id = NULL) 
    { 
        $this->sma->checkPermissions('index', TRUE); 
 
        $pr_details = $this->site->getProductByID($id); 
        if (!$id || !$pr_details) { 
            $this->session->set_flashdata('error', lang('prduct_not_found')); 
            $this->sma->md(); 
        } 
        $this->data['barcode'] = "<img src='" . admin_url('products/gen_barcode/' . $pr_details->code . '/' . $pr_details->barcode_symbology . '/40/0') . "' alt='" . $pr_details->code . "' class='pull-left' />"; 
        if ($pr_details->type == 'combo') { 
            $this->data['combo_items'] = $this->products_model->getProductComboItems($id); 
        } 
        $this->data['product'] = $pr_details; 
        $this->data['unit'] = $this->site->getUnitByID($pr_details->unit); 
        $this->data['brand'] = $this->site->getBrandByID($pr_details->brand); 
        $this->data['images'] = $this->products_model->getProductPhotos($id); 
        $this->data['category'] = $this->site->getCategoryByID($pr_details->category_id); 
        $this->data['subcategory'] = $pr_details->subcategory_id ? $this->site->getCategoryByID($pr_details->subcategory_id) : NULL; 
        $this->data['tax_rate'] = $pr_details->tax_rate ? $this->site->getTaxRateByID($pr_details->tax_rate) : NULL; 
        $this->data['warehouses'] = $this->products_model->getAllWarehousesWithPQ($id); 
        $this->data['options'] = $this->products_model->getProductOptionsWithWH($id); 
        $this->data['variants'] = $this->products_model->getProductOptions($id); 
 
        $this->load->view($this->theme.'products/modal_view', $this->data); 
    } 
 
    function view($id = NULL) 
    { 
        $this->sma->checkPermissions('index'); 
 
        $pr_details = $this->products_model->getProductByID($id); 
        if (!$id || !$pr_details) { 
            $this->session->set_flashdata('error', lang('prduct_not_found')); 
            redirect($_SERVER["HTTP_REFERER"]); 
        } 
        $this->data['barcode'] = "<img src='" . admin_url('products/gen_barcode/' . $pr_details->code . '/' . $pr_details->barcode_symbology . '/40/0') . "' alt='" . $pr_details->code . "' class='pull-left' />"; 
        if ($pr_details->type == 'combo') { 
            $this->data['combo_items'] = $this->products_model->getProductComboItems($id); 
        } 
        $this->data['product'] = $pr_details; 
        $this->data['unit'] = $this->site->getUnitByID($pr_details->unit); 
        $this->data['brand'] = $this->site->getBrandByID($pr_details->brand); 
        $this->data['location'] = $this->site->getLocationByID($pr_details->location); 
        $this->data['images'] = $this->products_model->getProductPhotos($id); 
        $this->data['category'] = $this->site->getCategoryByID($pr_details->category_id); 
        $this->data['subcategory'] = $pr_details->subcategory_id ? $this->site->getCategoryByID($pr_details->subcategory_id) : NULL; 
        $this->data['tax_rate'] = $pr_details->tax_rate ? $this->site->getTaxRateByID($pr_details->tax_rate) : NULL; 
        $this->data['popup_attributes'] = $this->popup_attributes; 
        $this->data['warehouses'] = $this->products_model->getAllWarehousesWithPQ($id); 
        $this->data['options'] = $this->products_model->getProductOptionsWithWH($id); 
        $this->data['variants'] = $this->products_model->getProductOptions($id); 
        $this->data['sold'] = $this->products_model->getSoldQty($id); 
        $this->data['purchased'] = $this->products_model->getPurchasedQty($id); 
 
        $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => $pr_details->name)); 
        $meta = array('page_title' => $pr_details->name, 'bc' => $bc); 
        $this->page_construct('products/view', $meta, $this->data); 
    } 
 
    function pdf($id = NULL, $view = NULL) 
    { 
        $this->sma->checkPermissions('index'); 
 
        $pr_details = $this->products_model->getProductByID($id); 
        if (!$id || !$pr_details) { 
            $this->session->set_flashdata('error', lang('prduct_not_found')); 
            redirect($_SERVER["HTTP_REFERER"]); 
        } 
        $this->data['barcode'] = "<img src='" . admin_url('products/gen_barcode/' . $pr_details->code . '/' . $pr_details->barcode_symbology . '/40/0') . "' alt='" . $pr_details->code . "' class='pull-left' />"; 
        if ($pr_details->type == 'combo') { 
            $this->data['combo_items'] = $this->products_model->getProductComboItems($id); 
        } 
        $this->data['product'] = $pr_details; 
        $this->data['unit'] = $this->site->getUnitByID($pr_details->unit); 
        $this->data['brand'] = $this->site->getBrandByID($pr_details->brand); 
        $this->data['images'] = $this->products_model->getProductPhotos($id); 
        $this->data['category'] = $this->site->getCategoryByID($pr_details->category_id); 
        $this->data['subcategory'] = $pr_details->subcategory_id ? $this->site->getCategoryByID($pr_details->subcategory_id) : NULL; 
        $this->data['tax_rate'] = $pr_details->tax_rate ? $this->site->getTaxRateByID($pr_details->tax_rate) : NULL; 
        $this->data['popup_attributes'] = $this->popup_attributes; 
        $this->data['warehouses'] = $this->products_model->getAllWarehousesWithPQ($id); 
        $this->data['options'] = $this->products_model->getProductOptionsWithWH($id); 
        $this->data['variants'] = $this->products_model->getProductOptions($id); 
 
        $name = $pr_details->code . '_' . str_replace('/', '_', $pr_details->name) . ".pdf"; 
        if ($view) { 
            $this->load->view($this->theme . 'products/pdf', $this->data); 
        } else { 
            $html = $this->load->view($this->theme . 'products/pdf', $this->data, TRUE); 
            if (! $this->Settings->barcode_img) { 
                $html = preg_replace("'\<\?xml(.*)\?\>'", '', $html); 
            } 
            $this->sma->generate_pdf($html, $name); 
        } 
    } 
 
    function getSubCategories($category_id = NULL) 
    { 
        if ($rows = $this->products_model->getSubCategories($category_id)) { 
            $data = json_encode($rows); 
        } else { 
            $data = false; 
        } 
        echo $data; 
    } 
     
 
    function getFeatures($model_category_id = NULL) 
    { 
        if ($rows = $this->products_model->getFeatures($model_category_id)) { 
            $data = json_encode($rows); 
        } else { 
            $data = false; 
        } 
        echo $data; 
    } 
 
     
    function getModelSubcategories($parent_id = NULL) 
    { 
        if ($rows = $this->products_model->getModelSubcategories($parent_id)) { 
            $data = json_encode($rows); 
        } else { 
            $data = false; 
        } 
        echo $data; 
    } 
 
    function getWarehousesByStore($store_id = Null) 
    { 
        if ($rows = $this->products_model->getWarehousesByStore($store_id)) { 
            $data = json_encode($rows); 
        } else { 
            $data = false; 
        } 
        echo $data; 
    } 
 
    function product_actions($wh = NULL) 
    { 
        if (!$this->Owner && !$this->GP['bulk_actions']) { 
            $this->session->set_flashdata('warning', lang('access_denied')); 
            redirect($_SERVER["HTTP_REFERER"]); 
        } 
 
        $this->form_validation->set_rules('form_action', lang("form_action"), 'required'); 
 
        if ($this->form_validation->run() == true) { 
 
            if (!empty($_POST['val'])) { 
                if ($this->input->post('form_action') == 'sync_quantity') { 
 
                    foreach ($_POST['val'] as $id) { 
                        $this->site->syncQuantity(NULL, NULL, NULL, $id); 
                    } 
                    $this->session->set_flashdata('message', $this->lang->line("products_quantity_sync")); 
                    redirect($_SERVER["HTTP_REFERER"]); 
 
                } elseif ($this->input->post('form_action') == 'delete') { 
 
                    $this->sma->checkPermissions('delete'); 
                    foreach ($_POST['val'] as $id) { 
                         
                        if($this->db->where('product_id',$id)->get('sale_items')->row()) 
                        { 
                           continue; 
                        } 
                        if($this->db->where('product_id',$id)->get('adjustment_items')->row()) 
                        { 
                            continue; 
                        } 
 
                        $this->products_model->deleteProduct($id); 
                    } 
                    $this->session->set_flashdata('message', $this->lang->line("products_deleted")); 
                    redirect($_SERVER["HTTP_REFERER"]); 
 
                } elseif ($this->input->post('form_action') == 'labels') { 
 
                    foreach ($_POST['val'] as $id) { 
                        $row = $this->products_model->getProductByID($id); 
                        $selected_variants = false; 
                        if ($variants = $this->products_model->getProductOptions($row->id)) { 
                            foreach ($variants as $variant) { 
                                $selected_variants[$variant->id] = $variant->quantity > 0 ? 1 : 0; 
                            } 
                        } 
                        $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $row->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants); 
                    } 
 
                    $this->data['items'] = isset($pr) ? json_encode($pr) : false; 
                    $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
                    $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('print_barcodes'))); 
                    $meta = array('page_title' => lang('print_barcodes'), 'bc' => $bc); 
                    $this->page_construct('products/print_barcodes', $meta, $this->data); 
 
                } elseif ($this->input->post('form_action') == 'export_excel') { 
 
                    $this->load->library('excel'); 
                    $this->excel->setActiveSheetIndex(0); 
                    $this->excel->getActiveSheet()->setTitle('Products'); 
                    $this->excel->getActiveSheet()->SetCellValue('A1', lang('name')); 
                    $this->excel->getActiveSheet()->SetCellValue('B1', lang('code')); 
                    $this->excel->getActiveSheet()->SetCellValue('C1', lang('barcode_symbology')); 
                    $this->excel->getActiveSheet()->SetCellValue('D1', lang('brand')); 
                    $this->excel->getActiveSheet()->SetCellValue('E1', lang('category_code')); 
                    $this->excel->getActiveSheet()->SetCellValue('F1', lang('unit_code')); 
                    $this->excel->getActiveSheet()->SetCellValue('G1', lang('sale').' '.lang('unit_code')); 
                    $this->excel->getActiveSheet()->SetCellValue('H1', lang('purchase').' '.lang('unit_code')); 
                    $this->excel->getActiveSheet()->SetCellValue('I1', lang('cost')); 
                    $this->excel->getActiveSheet()->SetCellValue('J1', lang('price')); 
                    $this->excel->getActiveSheet()->SetCellValue('K1', lang('alert_quantity')); 
                    $this->excel->getActiveSheet()->SetCellValue('L1', lang('tax_rate')); 
                    $this->excel->getActiveSheet()->SetCellValue('M1', lang('tax_method')); 
                    $this->excel->getActiveSheet()->SetCellValue('N1', lang('image')); 
                    $this->excel->getActiveSheet()->SetCellValue('O1', lang('subcategory_code')); 
                    $this->excel->getActiveSheet()->SetCellValue('P1', lang('product_variants')); 
                    $this->excel->getActiveSheet()->SetCellValue('Q1', lang('pcf1')); 
                    $this->excel->getActiveSheet()->SetCellValue('R1', lang('pcf2')); 
                    $this->excel->getActiveSheet()->SetCellValue('S1', lang('pcf3')); 
                    $this->excel->getActiveSheet()->SetCellValue('T1', lang('pcf4')); 
                    $this->excel->getActiveSheet()->SetCellValue('U1', lang('pcf5')); 
                    $this->excel->getActiveSheet()->SetCellValue('V1', lang('pcf6')); 
                    $this->excel->getActiveSheet()->SetCellValue('W1', lang('quantity')); 
                    $this->excel->getActiveSheet()->SetCellValue('X1', lang('location')); 
 
                    $row = 2; 
                    foreach ($_POST['val'] as $id) { 
                        $product = $this->products_model->getProductDetail($id); 
                        $brand = $this->site->getBrandByID($product->brand); 
                        $base_unit = $sale_unit = $purchase_unit = ''; 
                        if($units = $this->site->getUnitsByBUID($product->unit)) { 
                            foreach($units as $u) { 
                                if ($u->id == $product->unit) { 
                                    $base_unit = $u->code; 
                                } 
                                if ($u->id == $product->sale_unit) { 
                                    $sale_unit = $u->code; 
                                } 
                                if ($u->id == $product->purchase_unit) { 
                                    $purchase_unit = $u->code; 
                                } 
                            } 
                        } 
                        $variants = $this->products_model->getProductOptions($id); 
                        $product_variants = ''; 
                        if ($variants) { 
                            foreach ($variants as $variant) { 
                                $product_variants .= trim($variant->name) . '|'; 
                            } 
                        } 
                                                
                        if ($wh) { 
                            $quantity =$this->db->select_sum('quantity')->where('warehouse_id',$wh)->where('product_id',$product->id)->get('warehouses_products')->row(); 
                             
                        }else{ 
                            $quantity =$this->db->select_sum('quantity')->where('product_id',$product->id)->get('warehouses_products')->row(); 
                             
                        } 
                        $quantity =  $quantity->quantity; 
                        $this->excel->getActiveSheet()->SetCellValue('A' . $row, $product->name); 
                        $this->excel->getActiveSheet()->SetCellValue('B' . $row, $product->code); 
                        $this->excel->getActiveSheet()->SetCellValue('C' . $row, $product->barcode_symbology); 
                        $this->excel->getActiveSheet()->SetCellValue('D' . $row, ($brand ? $brand->name : '')); 
                        $this->excel->getActiveSheet()->SetCellValue('E' . $row, $product->category_code); 
                        $this->excel->getActiveSheet()->SetCellValue('F' . $row, $base_unit); 
                        $this->excel->getActiveSheet()->SetCellValue('G' . $row, $sale_unit); 
                        $this->excel->getActiveSheet()->SetCellValue('H' . $row, $purchase_unit); 
                        if ($this->Owner || $this->Admin || $this->session->userdata('show_cost')) { 
                            $this->excel->getActiveSheet()->SetCellValue('I' . $row, $product->cost); 
                        } 
                        if ($this->Owner || $this->Admin || $this->session->userdata('show_price')) { 
                            $this->excel->getActiveSheet()->SetCellValue('J' . $row, $product->price); 
                        } 
                        $this->excel->getActiveSheet()->SetCellValue('K' . $row, $product->alert_quantity); 
                        $this->excel->getActiveSheet()->SetCellValue('L' . $row, $product->tax_rate_name); 
                        $this->excel->getActiveSheet()->SetCellValue('M' . $row, $product->tax_method ? lang('exclusive') : lang('inclusive')); 
                        $this->excel->getActiveSheet()->SetCellValue('N' . $row, $product->image); 
                        $this->excel->getActiveSheet()->SetCellValue('O' . $row, $product->subcategory_code); 
                        $this->excel->getActiveSheet()->SetCellValue('P' . $row, $product_variants); 
                        $this->excel->getActiveSheet()->SetCellValue('Q' . $row, $product->cf1); 
                        $this->excel->getActiveSheet()->SetCellValue('R' . $row, $product->cf2); 
                        $this->excel->getActiveSheet()->SetCellValue('S' . $row, $product->cf3); 
                        $this->excel->getActiveSheet()->SetCellValue('T' . $row, $product->cf4); 
                        $this->excel->getActiveSheet()->SetCellValue('U' . $row, $product->cf5); 
                        $this->excel->getActiveSheet()->SetCellValue('V' . $row, $product->cf6); 
                        $this->excel->getActiveSheet()->SetCellValue('W' . $row, $quantity); 
                        $this->excel->getActiveSheet()->SetCellValue('X' . $row, ($product->location ? $product->location : '')); 
                        $row++; 
                    } 
 
                    $this->excel->getActiveSheet()->getColumnDimension('A')->setWidth(30); 
                    $this->excel->getActiveSheet()->getColumnDimension('B')->setWidth(20); 
                    $this->excel->getActiveSheet()->getColumnDimension('D')->setWidth(15); 
                    $this->excel->getActiveSheet()->getColumnDimension('E')->setWidth(20); 
                    $this->excel->getActiveSheet()->getColumnDimension('N')->setWidth(40); 
                    $this->excel->getActiveSheet()->getColumnDimension('O')->setWidth(30); 
                    $this->excel->getActiveSheet()->getColumnDimension('P')->setWidth(30); 
                    $this->excel->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); 
                    $filename = 'products_' . date('Y_m_d_H_i_s'); 
                    $this->load->helper('excel'); 
                    return create_excel($this->excel, $filename); 
 
                } 
            } else { 
                $this->session->set_flashdata('error', $this->lang->line("no_product_selected")); 
                redirect($_SERVER["HTTP_REFERER"]); 
            } 
        } else { 
            $this->session->set_flashdata('error', validation_errors()); 
            redirect(isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : 'admin/products'); 
        } 
    } 
 
    public function delete_image($id = NULL) 
    { 
        $this->sma->checkPermissions('edit', true); 
        if ($id && $this->input->is_ajax_request()) { 
            header('Content-Type: application/json'); 
            $this->db->delete('product_photos', array('id' => $id)); 
            $this->sma->send_json(array('error' => 0, 'msg' => lang("image_deleted"))); 
        } 
        $this->sma->send_json(array('error' => 1, 'msg' => lang("ajax_error"))); 
    } 
 
    public function getSubUnits($unit_id) 
    { 
        // $unit = $this->site->getUnitByID($unit_id); 
        // if ($units = $this->site->getUnitsByBUID($unit_id)) { 
        //     array_push($units, $unit); 
        // } else { 
        //     $units = array($unit); 
        // }  
        $units = $this->site->getUnitsByBUID($unit_id); 
        // var_dump($units);die; 
        $this->sma->send_json($units); 
    } 
 
    public function qa_suggestions() 
    { 
        $term = $this->input->get('term', true); 
        
        if (strlen($term) < 1 || !$term) { 
            die("<script type='text/javascript'>setTimeout(function(){ window.top.location.href = '" . admin_url('welcome') . "'; }, 10);</script>"); 
        } 
 
        $analyzed = $this->sma->analyze_term($term); 
        $sr = $analyzed['term']; 
        $option_id = $analyzed['option_id']; 
 
        $rows = $this->products_model->getQASuggestions($sr); 
        if ($rows) { 
            foreach ($rows as $row) { 
                $row->qty = 1; 
                $options = $this->products_model->getProductOptions($row->id); 
                $row->option = $option_id; 
                $row->serial = ''; 
 
                $pr[] = array('id' => str_replace(".", "", microtime(true)), 'item_id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 
                    'row' => $row, 'options' => $options); 
 
            } 
            $this->sma->send_json($pr); 
        } else { 
            $this->sma->send_json(array(array('id' => 0, 'label' => lang('no_match_found'), 'value' => $term))); 
        } 
    } 
 
    function adjustment_actions() 
    { 
        if (!$this->Owner && !$this->GP['bulk_actions']) { 
            $this->session->set_flashdata('warning', lang('access_denied')); 
            redirect($_SERVER["HTTP_REFERER"]); 
        } 
 
        $this->form_validation->set_rules('form_action', lang("form_action"), 'required'); 
 
        if ($this->form_validation->run() == true) { 
 
            if (!empty($_POST['val'])) { 
                if ($this->input->post('form_action') == 'delete') { 
 
                    $this->sma->checkPermissions('delete'); 
                    foreach ($_POST['val'] as $id) { 
                        $this->products_model->deleteAdjustment($id); 
                    } 
                    $this->session->set_flashdata('error', $this->lang->line("Can not delete adjustment that has been submitted!")); 
                    redirect($_SERVER["HTTP_REFERER"]); 
 
                } elseif ($this->input->post('form_action') == 'export_excel') { 
 
                    $this->load->library('excel'); 
                    $this->excel->setActiveSheetIndex(0); 
                    $this->excel->getActiveSheet()->setTitle('quantity_adjustments'); 
                    $this->excel->getActiveSheet()->SetCellValue('A1', lang('date')); 
                    $this->excel->getActiveSheet()->SetCellValue('B1', lang('reference_no')); 
                    $this->excel->getActiveSheet()->SetCellValue('C1', lang('warehouse')); 
                    $this->excel->getActiveSheet()->SetCellValue('D1', lang('created_by')); 
                    $this->excel->getActiveSheet()->SetCellValue('E1', lang('note')); 
                    $this->excel->getActiveSheet()->SetCellValue('F1', lang('items')); 
 
                    $row = 2; 
                    foreach ($_POST['val'] as $id) { 
                        $adjustment = $this->products_model->getAdjustmentByID($id); 
                        $created_by = $this->site->getUser($adjustment->created_by); 
                        $warehouse = $this->site->getWarehouseByID($adjustment->warehouse_id); 
                        $items = $this->products_model->getAdjustmentItems($id);   
                        $products = ''; 
                        if ($items) { 
                            foreach ($items as $item) { 
                                $products .= $item->product_name.'('.$this->sma->formatQuantity($item->type == 'subtraction' ? -$item->quantity : $item->quantity).')'."
"; 
                            } 
                        } 
 
                        $this->excel->getActiveSheet()->SetCellValue('A' . $row, $this->sma->hrld($adjustment->date)); 
                        $this->excel->getActiveSheet()->SetCellValue('B' . $row, $adjustment->reference_no); 
                        $this->excel->getActiveSheet()->SetCellValue('C' . $row, $warehouse->name); 
                        $this->excel->getActiveSheet()->SetCellValue('D' . $row, $created_by->first_name.' ' .$created_by->last_name); 
                        $this->excel->getActiveSheet()->SetCellValue('E' . $row, $this->sma->decode_html($adjustment->note)); 
                        $this->excel->getActiveSheet()->SetCellValue('F' . $row, $products); 
                        $row++; 
                    } 
 
                    $this->excel->getActiveSheet()->getColumnDimension('A')->setWidth(20); 
                    $this->excel->getActiveSheet()->getColumnDimension('B')->setWidth(20); 
                    $this->excel->getActiveSheet()->getColumnDimension('C')->setWidth(15); 
                    $this->excel->getActiveSheet()->getColumnDimension('D')->setWidth(20); 
                    $this->excel->getActiveSheet()->getColumnDimension('E')->setWidth(40); 
                    $this->excel->getActiveSheet()->getColumnDimension('F')->setWidth(30); 
                    $this->excel->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); 
                    $filename = 'quantity_adjustments_' . date('Y_m_d_H_i_s'); 
                    $this->load->helper('excel'); 
                    return create_excel($this->excel, $filename); 
                } 
            } else { 
                $this->session->set_flashdata('error', $this->lang->line("no_record_selected")); 
                redirect($_SERVER["HTTP_REFERER"]); 
            } 
        } else { 
            $this->session->set_flashdata('error', validation_errors()); 
            redirect($_SERVER["HTTP_REFERER"]); 
        } 
    } 
 
    function stock_counts($warehouse_id = NULL) 
    { 
        $this->sma->checkPermissions('stock_count'); 
 
        $this->data['error'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('error'); 
        if ($this->Owner || $this->Admin || !$this->session->userdata('warehouse_id')) { 
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']); 
            $this->data['warehouse_id'] = $warehouse_id; 
            $this->data['warehouse'] = $warehouse_id ? $this->site->getWarehouseByID($warehouse_id) : NULL; 
        } else { 
            $this->data['warehouses'] = NULL; 
            $this->data['warehouse_id'] = $this->session->userdata('warehouse_id'); 
            $this->data['warehouse'] = $this->session->userdata('warehouse_id') ? $this->site->getWarehouseByID($this->session->userdata('warehouse_id')) : NULL; 
        } 
 
        $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('stock_counts'))); 
        $meta = array('page_title' => lang('stock_counts'), 'bc' => $bc); 
        $this->page_construct('products/stock_counts', $meta, $this->data); 
    } 
 
    function getCounts($warehouse_id = NULL) 
    { 
        $this->sma->checkPermissions('stock_count', TRUE); 
 
        if ((! $this->Owner || ! $this->Admin) && ! $warehouse_id) { 
            $user = $this->site->getUser(); 
            $warehouse_id = $user->warehouse_id; 
        } 
        $detail_link = anchor('admin/products/view_count/$1', '<label class="label label-primary pointer">'.lang('details').'</label>', 'class="tip" title="'.lang('details').'" data-toggle="modal" data-target="#myModal"'); 
 
        $this->load->library('datatables'); 
        $this->datatables 
            ->select("{$this->db->dbprefix('stock_counts')}.id as id, date, reference_no, {$this->db->dbprefix('warehouses')}.name as wh_name, type, brand_names, category_names, initial_file, final_file") 
            ->from('stock_counts') 
            ->where('stock_counts.store_id',$this->data['store_id']) 
            ->join('warehouses', 'warehouses.id=stock_counts.warehouse_id', 'left'); 
        if ($warehouse_id) { 
            $this->datatables->where('warehouse_id', $warehouse_id); 
        } 
 
        $this->datatables->add_column('Actions', '<div class="text-center">'.$detail_link.'</div>', "id"); 
        echo $this->datatables->generate(); 
    } 
 
    function view_count($id) 
    { 
        $this->sma->checkPermissions('stock_count', TRUE); 
        $stock_count = $this->products_model->getStouckCountByID($id); 
        if ( ! $stock_count->finalized) { 
            $this->sma->md('admin/products/finalize_count/'.$id); 
        } 
 
        $this->data['stock_count'] = $stock_count; 
        $this->data['stock_count_items'] = $this->products_model->getStockCountItems($id); 
        $this->data['warehouse'] = $this->site->getWarehouseByID($stock_count->warehouse_id); 
        $this->data['adjustment'] = $this->products_model->getAdjustmentByCountID($id); 
        $this->load->view($this->theme.'products/view_count', $this->data); 
    } 
 
    function count_stock($page = NULL) 
    { 
        $this->sma->checkPermissions('stock_count'); 
        $this->form_validation->set_rules('warehouse', lang("warehouse"), 'required'); 
        $this->form_validation->set_rules('type', lang("type"), 'required'); 
 
        if ($this->form_validation->run() == true) { 
 
            $warehouse_id = $this->input->post('warehouse'); 
            $type = $this->input->post('type'); 
            $categories = $this->input->post('category') ? $this->input->post('category') : NULL; 
            $brands = $this->input->post('brand') ? $this->input->post('brand') : NULL; 
            $this->load->helper('string'); 
            $name = random_string('md5').'.csv'; 
            $products = $this->products_model->getStockCountProducts($warehouse_id, $type, $categories, $brands); 
            $pr = 0; $rw = 0; 
            foreach ($products as $product) { 
                if ($variants = $this->products_model->getStockCountProductVariants($warehouse_id, $product->id)) { 
                    foreach ($variants as $variant) { 
                        $items[] = array( 
                            'product_code' => $product->code, 
                            'product_name' => $product->name, 
                            'variant' => $variant->name, 
                            'expected' => $variant->quantity, 
                            'counted' => '' 
                            ); 
                        $rw++; 
                    } 
                } else { 
                    $items[] = array( 
                        'product_code' => $product->code, 
                        'product_name' => $product->name, 
                        'variant' => '', 
                        'expected' => $product->quantity, 
                        'counted' => '' 
                        ); 
                    $rw++; 
                } 
                $pr++; 
            } 
            if ( ! empty($items)) { 
                $csv_file = fopen('./files/'.$name, 'w'); 
                fputcsv($csv_file, array(lang('product_code'), lang('product_name'), lang('variant'), lang('expected'), lang('counted'))); 
                foreach ($items as $item) { 
                    fputcsv($csv_file, $item); 
                } 
                // file_put_contents('./files/'.$name, $csv_file); 
                // fwrite($csv_file, $txt); 
                fclose($csv_file); 
            } else { 
                $this->session->set_flashdata('error', lang('no_product_found')); 
                redirect($_SERVER["HTTP_REFERER"]); 
            } 
 
            if ($this->Owner || $this->Admin) { 
                $date = $this->sma->fld($this->input->post('date')); 
            } else { 
                $date = date('Y-m-d H:s:i'); 
            } 
            $category_ids = ''; 
            $brand_ids = ''; 
            $category_names = ''; 
            $brand_names = ''; 
            if ($categories) { 
                $r = 1; $s = sizeof($categories); 
                foreach ($categories as $category_id) { 
                    $category = $this->site->getCategoryByID($category_id); 
                    if ($r == $s) { 
                        $category_names .= $category->name; 
                        $category_ids .= $category->id; 
                    } else { 
                        $category_names .= $category->name.', '; 
                        $category_ids .= $category->id.', '; 
                    } 
                    $r++; 
                } 
            } 
            if ($brands) { 
                $r = 1; $s = sizeof($brands); 
                foreach ($brands as $brand_id) { 
                    $brand = $this->site->getBrandByID($brand_id); 
                    if ($r == $s) { 
                        $brand_names .= $brand->name; 
                        $brand_ids .= $brand->id; 
                    } else { 
                        $brand_names .= $brand->name.', '; 
                        $brand_ids .= $brand->id.', '; 
                    } 
                    $r++; 
                } 
            } 
            $data = array( 
                'date' => $date, 
                'warehouse_id' => $warehouse_id, 
                'reference_no' => $this->input->post('reference_no'), 
                'type' => $type, 
                'categories' => $category_ids, 
                'category_names' => $category_names, 
                'brands' => $brand_ids, 
                'brand_names' => $brand_names, 
                'initial_file' => $name, 
                'products' => $pr, 
                'rows' => $rw, 
                'created_by' => $this->session->userdata('user_id'), 
                'store_id' => $this->data['store_id'] 
            ); 
 
        } 
         
        if ($this->form_validation->run() == true && $this->products_model->addStockCount($data)) { 
            $this->session->set_flashdata('message', lang("stock_count_intiated")); 
            admin_redirect('products/stock_counts'); 
 
        } else { 
 
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']); 
            $this->data['categories'] = $this->site->getAllCategories($this->data['store_id']); 
            $this->data['brands'] = $this->site->getAllBrands(); 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('count_stock'))); 
            $meta = array('page_title' => lang('count_stock'), 'bc' => $bc); 
            $this->page_construct('products/count_stock', $meta, $this->data); 
 
        } 
 
    } 
 
    function finalize_count($id) 
    { 
        $this->sma->checkPermissions('stock_count'); 
        $stock_count = $this->products_model->getStouckCountByID($id); 
        if ( ! $stock_count || $stock_count->finalized) { 
            $this->session->set_flashdata('error', lang("stock_count_finalized")); 
            admin_redirect('products/stock_counts'); 
        } 
 
        $this->form_validation->set_rules('count_id', lang("count_stock"), 'required'); 
 
        if ($this->form_validation->run() == true) { 
 
            if ($_FILES['csv_file']['size'] > 0) { 
                $note = $this->sma->clear_tags($this->input->post('note')); 
                $data = array( 
                    'updated_by' => $this->session->userdata('user_id'), 
                    'updated_at' => date('Y-m-d H:s:i'), 
                    'note' => $note 
                ); 
 
                $this->load->library('upload'); 
                $config['upload_path'] = $this->digital_upload_path; 
                $config['allowed_types'] = 'csv'; 
                $config['max_size'] = $this->allowed_file_size; 
                $config['overwrite'] = false; 
                $config['encrypt_name'] = true; 
                $this->upload->initialize($config); 
                if (!$this->upload->do_upload('csv_file')) { 
                    $error = $this->upload->display_errors(); 
                    $this->session->set_flashdata('error', $error); 
                    redirect($_SERVER["HTTP_REFERER"]); 
                } 
 
                $csv = $this->upload->file_name; 
 
                $arrResult = array(); 
                $handle = fopen($this->digital_upload_path . $csv, "r"); 
                if ($handle) { 
                    while (($row = fgetcsv($handle, 5000, ",")) !== FALSE) { 
                        $arrResult[] = $row; 
                    } 
                    fclose($handle); 
                } 
                $titles = array_shift($arrResult); 
                $keys = array('product_code', 'product_name', 'product_variant', 'expected', 'counted'); 
                $final = array(); 
                foreach ($arrResult as $key => $value) { 
                    $final[] = array_combine($keys, $value); 
                } 
                // $this->sma->print_arrays($final); 
                $rw = 2; $differences = 0; $matches = 0; 
                foreach ($final as $pr) { 
                    if ($product = $this->products_model->getProductByCode(trim($pr['product_code']))) { 
                        $pr['counted'] = !empty($pr['counted']) ? $pr['counted'] : 0; 
                        if ($pr['expected'] == $pr['counted']) { 
                            $matches++; 
                        } else { 
                            $pr['stock_count_id'] = $id; 
                            $pr['product_id'] = $product->id; 
                            $pr['cost'] = $product->cost; 
                            $pr['product_variant_id'] = empty($pr['product_variant']) ? NULL : $this->products_model->getProductVariantID($pr['product_id'], $pr['product_variant']); 
                            $products[] = $pr; 
                            $differences++; 
                        } 
                    } else { 
                        $this->session->set_flashdata('error', lang('check_product_code') . ' (' . $pr['product_code'] . '). ' . lang('product_code_x_exist') . ' ' . lang('line_no') . ' ' . $rw); 
                        admin_redirect('products/finalize_count/'.$id); 
                    } 
                    $rw++; 
                } 
 
                $data['final_file'] = $csv; 
                $data['differences'] = $differences; 
                $data['matches'] = $matches; 
                $data['missing'] = $stock_count->rows-($rw-2); 
                $data['finalized'] = 1; 
            } 
 
            // $this->sma->print_arrays($data, $products); 
        } 
         
        if ($this->form_validation->run() == true && $this->products_model->finalizeStockCount($id, $data, $products)) { 
            $this->session->set_flashdata('message', lang("stock_count_finalized")); 
            admin_redirect('products/stock_counts'); 
        } else { 
 
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error')); 
            $this->data['stock_count'] = $stock_count; 
            $this->data['warehouse'] = $this->site->getWarehouseByID($stock_count->warehouse_id); 
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => admin_url('products/stock_counts'), 'page' => lang('stock_counts')), array('link' => '#', 'page' => lang('finalize_count'))); 
            $meta = array('page_title' => lang('finalize_count'), 'bc' => $bc); 
            $this->page_construct('products/finalize_count', $meta, $this->data); 
 
        } 
 
    } 
 
} 
 ?>

Did this file decode correctly?

Original Code

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Products extends MY_Controller
{

    function __construct()
    {
        parent::__construct();
        if (!$this->loggedIn) {
            $this->session->set_userdata('requested_page', $this->uri->uri_string());
            $this->sma->md('login');
        }
        $this->lang->admin_load('products', $this->Settings->user_language);
        $this->load->library('form_validation');
        $this->load->admin_model('products_model');
        $this->digital_upload_path = 'files/';
        $this->upload_path = 'assets/uploads/';
        $this->thumbs_path = 'assets/uploads/thumbs/';
        $this->image_types = 'gif|jpg|jpeg|png|tif';
        $this->digital_file_types = 'zip|psd|ai|rar|pdf|doc|docx|xls|xlsx|ppt|pptx|gif|jpg|jpeg|png|tif|txt|csv';
        $this->allowed_file_size = '1024';
        $this->popup_attributes = array('width' => '900', 'height' => '600', 'window_name' => 'sma_popup', 'menubar' => 'yes', 'scrollbars' => 'yes', 'status' => 'no', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0');
    }
    function getProductsByAjax()
    {
        if ($rows = $this->products_model->getProducts()) {
            $data = json_encode($rows);
        } else {
            $data = false;
        }
        echo $data;
    }
    function getCategoriesByAjax()
    {
        if ($rows = $this->products_model->getCategories()) {
            $data = json_encode($rows);
        } else {
            $data = false;
        }
        echo $data;
    }
    function index($warehouse_id = NULL)
    {
        $this->sma->checkPermissions();
        $user = $this->site->getUser();
        $store_id = $user->store_id;
        $this->data['store_id'] = $store_id;
        $store = $this->site->getStoreByID($store_id);
        $this->data['store'] = $store->name;
        if($store_id==0)
        {
            $this->data['error'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('error');
            if ($this->Owner || $this->Admin || !$this->session->userdata('store_id')) {
               
                $this->data['warehouses'] = $this->site->getAllWarehouses($this->data['store_id']);
                $this->data['stores'] = $this->site->getAllStores();
                $this->data['warehouse_id'] = $warehouse_id;
                $this->data['store_id'] = $store_id;
                $store = $this->site->getStoreByID($store_id);
                $this->data['store'] = $store->name;
                $this->data['warehouse'] = $warehouse_id ? $this->site->getWarehouseByID($warehouse_id) : NULL;
                $this->data['store'] = $warehouse_id ? $this->site->getStoreByID($warehouse_id) : NULL;
            } else {
                $this->data['warehouses'] = NULL;
                $this->data['warehouse_id'] = $this->session->userdata('warehouse_id');
                $this->data['warehouse'] = $this->session->userdata('warehouse_id') ? $this->site->getWarehouseByID($this->session->userdata('warehouse_id')) : NULL;
            }
    
            $this->data['supplier'] = $this->input->get('supplier') ? $this->site->getCompanyByID($this->input->get('supplier')) : NULL;
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => '#', 'page' => lang('products')));
            $meta = array('page_title' => lang('products'), 'bc' => $bc);
            $this->page_construct('products/index', $meta, $this->data);
        }else
        {
            if ($this->Owner || $this->Admin || !$this->session->userdata('warehouse_id')) {
                $user = $this->site->getUser();
                $this->data['warehouses'] = $this->site->getAllWarehousesforstore($user->store_id);
                $this->data['warehouse_id'] = $warehouse_id;
                $this->data['warehouse'] = $warehouse_id ? $this->site->getWarehouseByID($warehouse_id) : NULL;
            } else {
                $this->data['warehouses'] = NULL;
                $this->data['warehouse_id'] = $this->session->userdata('warehouse_id');
                $this->data['warehouse'] = $this->session->userdata('warehouse_id') ? $this->site->getWarehouseByID($this->session->userdata('warehouse_id')) : NULL;
            }
    
            $this->data['supplier'] = $this->input->get('supplier') ? $this->site->getCompanyByID($this->input->get('supplier')) : NULL;
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => '#', 'page' => lang('products')));
            $meta = array('page_title' => lang('products'), 'bc' => $bc);
            $this->page_construct('products/index', $meta, $this->data);
        }
       
    }


    function getProducts($store_id1 = NULL)
    {
        $this->sma->checkPermissions('index', TRUE);
        $supplier = $this->input->get('supplier') ? $this->input->get('supplier') : NULL;
        $this->load->library('datatables');
        $user = $this->site->getUser();
        $store_id = $user->store_id;
        $this->data['store_id'] = $store_id;
        $user = $this->site->getUser();
        

        $detail_link = anchor('admin/products/view/$1', '<i class="fa fa-file-text-o"></i> ' . lang('product_details'));
        $delete_link = "<a href='#' class='tip po' title='<b>" . $this->lang->line("delete_product") . "</b>' data-content=\"<p>"
            . lang('r_u_sure') . "</p><a class='btn btn-danger po-delete1' id='a__$1' href='" . admin_url('products/delete/$1') . "'>"
            . lang('i_m_sure') . "</a> <button class='btn po-close'>" . lang('no') . "</button>\"  rel='popover'><i class=\"fa fa-trash-o\"></i> "
            . lang('delete_product') . "</a>";
        $single_barcode = anchor('admin/products/print_barcodes/$1', '<i class="fa fa-print"></i> ' . lang('print_barcode_label'));
        // $single_label = anchor_popup('products/single_label/$1/' . ($warehouse_id ? $warehouse_id : ''), '<i class="fa fa-print"></i> ' . lang('print_label'), $this->popup_attributes);
        $action = '<div class="text-center"><div class="btn-group text-left">'
            . '<button type="button" class="btn btn-default btn-xs btn-primary dropdown-toggle" data-toggle="dropdown">'
            . lang('actions') . ' <span class="caret"></span></button>
        <ul class="dropdown-menu pull-right" role="menu">
            <li>' . $detail_link . '</li>
            <li><a href="' . admin_url('products/add/$1') . '"><i class="fa fa-plus-square"></i> ' . lang('duplicate_product') . '</a></li>
            <li><a href="' . admin_url('products/edit/$1') . '"><i class="fa fa-edit"></i> ' . lang('edit_product') . '</a></li>';

        $action .= '<li><a href="' . admin_url() . 'assets/uploads/$2" data-type="image" data-toggle="lightbox"><i class="fa fa-file-photo-o"></i> '
            . lang('view_image') . '</a></li>
            <li>' . $single_barcode . '</li>
            <li class="divider"></li>
            <li>' . $delete_link . '</li>
            </ul>
        </div></div>';
        $this->db->order_by('products.sequence','asc');
    if($store_id==0)
    {
        if ($store_id1) {
            $this->datatables
            ->select($this->db->dbprefix('products') . ".id as productid, {$this->db->dbprefix('products')}.image as image, {$this->db->dbprefix('products')}.code as code, {$this->db->dbprefix('products')}.name as name, {$this->db->dbprefix('brands')}.name as brand, {$this->db->dbprefix('categories')}.name as cname, cost as cost, price as price, COALESCE(quantity, 0) as quantity, {$this->db->dbprefix('units')}.name as unit, '' as rack, alert_quantity,ecom_show", FALSE)
            ->from('products')
            ->join('categories', 'products.category_id=categories.id', 'left')
            ->join('units', 'products.unit=units.id', 'left')
            ->join('brands', 'products.brand=brands.id', 'left')
            ->join('location', 'products.location=location.id', 'left')
            ->group_by("products.id")
            ->where("products.store_id",$store_id1);
        } 
        else {
            $this->datatables
                ->select($this->db->dbprefix('products') . ".id as productid, {$this->db->dbprefix('products')}.image as image, {$this->db->dbprefix('products')}.code as code, {$this->db->dbprefix('products')}.name as name, {$this->db->dbprefix('brands')}.name as brand,{$this->db->dbprefix('categories')}.name as cname, cost as cost, price as price, (SELECT SUM(quantity) AS total
                FROM   sma_warehouses_products WHERE product_id = ".$this->db->dbprefix('products') . ".id), {$this->db->dbprefix('units')}.name as unit, '' as rack, alert_quantity,ecom_show", FALSE)
                ->from('products')
                ->join('categories', 'products.category_id=categories.id', 'left')
                ->join('units', 'products.unit=units.id', 'left')
              
                ->join('brands', 'products.brand=brands.id', 'left')
                ->join('location', 'products.location=location.id', 'left')
                ->group_by("products.id");
        }
        if (!$this->Owner && !$this->Admin) {
            if (!$this->session->userdata('show_cost')) {
                $this->datatables->unset_column("cost");
            }
            if (!$this->session->userdata('show_price')) {
                $this->datatables->unset_column("price");
            }
        }
        if ($supplier) {
            $this->datatables->where('supplier1', $supplier)
            ->or_where('supplier2', $supplier)
            ->or_where('supplier3', $supplier)
            ->or_where('supplier4', $supplier)
            ->or_where('supplier5', $supplier);
        }
    }
    else{
        
            if ($store_id1) 
            {
                $this->datatables
                ->select($this->db->dbprefix('products') . ".id as productid, {$this->db->dbprefix('products')}.image as image, {$this->db->dbprefix('products')}.code as code, {$this->db->dbprefix('products')}.name as name, {$this->db->dbprefix('brands')}.name as brand, {$this->db->dbprefix('categories')}.name as cname, cost as cost, price as price, COALESCE(wp.quantity, 0) as quantity, {$this->db->dbprefix('units')}.name as unit, '' as rack, alert_quantity,ecom_show", FALSE)
                ->from('products');
                if ($this->Settings->display_all_products) {
                    $this->datatables->join("( SELECT product_id, quantity, rack from {$this->db->dbprefix('warehouses_products')} WHERE warehouse_id = {$store_id1}) wp", 'products.id=wp.product_id', 'left');
                } else {
                    $this->datatables->join('warehouses_products wp', 'products.id=wp.product_id', 'left')
                    ->where('wp.warehouse_id', $store_id1);
                    // ->where('wp.quantity !=', 0);
                }
                $this->datatables->join('categories', 'products.category_id=categories.id', 'left')
                ->join('units', 'products.unit=units.id', 'left')
                ->join('brands', 'products.brand=brands.id', 'left')
                ->join('location', 'products.location=location.id', 'left');
            // ->group_by("products.id");
            } 
            else {
            
                $q = $this->datatables
                    ->select($this->db->dbprefix('products') . ".id as productid, {$this->db->dbprefix('products')}.image as image, {$this->db->dbprefix('products')}.code as code, {$this->db->dbprefix('products')}.name as name, {$this->db->dbprefix('brands')}.name as brand, {$this->db->dbprefix('categories')}.name as cname, cost as cost, price as price
                    , (SELECT SUM(quantity) AS total
                    FROM   sma_warehouses_products WHERE product_id = ".$this->db->dbprefix('products') . ".id)
                    , {$this->db->dbprefix('units')}.name as unit, '' as rack, alert_quantity,ecom_show", FALSE)
                    ->from('products')
                    ->join('categories', 'products.category_id=categories.id', 'left')
                    ->join('units', 'products.unit=units.id', 'left')
                    ->join('warehouses_products wp', 'products.id=wp.product_id', 'left')
                    ->join('brands', 'products.brand=brands.id', 'left')
                    ->join('location', 'products.location=location.id', 'left')
                    ->where("products.store_id",$user->store_id)
                    ->group_by("products.id");
                    
            }
        if (!$this->Owner && !$this->Admin) {
            if (!$this->session->userdata('show_cost')) {
                $this->datatables->unset_column("cost");
            }
            if (!$this->session->userdata('show_price')) {
                $this->datatables->unset_column("price");
            }
        }
        if ($supplier) {
            $this->datatables->where('supplier1', $supplier)
            ->or_where('supplier2', $supplier)
            ->or_where('supplier3', $supplier)
            ->or_where('supplier4', $supplier)
            ->or_where('supplier5', $supplier);
        }
    }
        $this->datatables->add_column("Actions", $action, "productid, image, code, name");
        echo $this->datatables->generate();
    }

    function set_rack($product_id = NULL, $warehouse_id = NULL)
    {
        $this->sma->checkPermissions('edit', true);

        $this->form_validation->set_rules('rack', lang("rack_location"), 'trim|required');

        if ($this->form_validation->run() == true) {
            $data = array('rack' => $this->input->post('rack'),
                'product_id' => $product_id,
                'warehouse_id' => $warehouse_id,
            );
        } elseif ($this->input->post('set_rack')) {
            $this->session->set_flashdata('error', validation_errors());
            admin_redirect("products");
        }

        if ($this->form_validation->run() == true && $this->products_model->setRack($data)) {
            $this->session->set_flashdata('message', lang("rack_set"));
            admin_redirect("products/" . $warehouse_id);
        } else {
            $this->data['error'] = validation_errors() ? validation_errors() : $this->session->flashdata('error');
            $this->data['warehouse_id'] = $warehouse_id;
            $this->data['product'] = $this->site->getProductByID($product_id);
            $wh_pr = $this->products_model->getProductQuantity($product_id, $warehouse_id);
            $this->data['rack'] = $wh_pr['rack'];
            $this->data['modal_js'] = $this->site->modal_js();
            $this->load->view($this->theme . 'products/set_rack', $this->data);

        }
    }

    function product_barcode($product_code = NULL, $bcs = 'code128', $height = 60)
    {
        // if ($this->Settings->barcode_img) {
            return "<img style='width:100%' src='" . admin_url('products/gen_barcode/' . $product_code . '/' . $bcs . '/' . $height) . "' alt='{$product_code}' class='bcimg' />";
        // } else {
        //     return $this->gen_barcode($product_code, $bcs, $height);
        // }
    }

    function barcode($product_code = NULL, $bcs = 'code128', $height = 60)
    {
        return admin_url('products/gen_barcode/' . $product_code . '/' . $bcs . '/' . $height);
    }

    function gen_barcode($product_code = NULL, $bcs = 'code128', $height = 60, $text = 1)
    {
        $drawText = ($text != 1) ? FALSE : TRUE;
        $this->load->library('zend');
        $this->zend->load('Zend/Barcode');
        $barcodeOptions = array('text' => $product_code, 'barHeight' => $height, 'drawText' => $drawText, 'factor' => 1.0);
        if ($this->Settings->barcode_img) { 
            $rendererOptions = array('imageType' => 'jpg', 'horizontalPosition' => 'center', 'verticalPosition' => 'middle');
            $imageResource = Zend_Barcode::render($bcs, 'image', $barcodeOptions, $rendererOptions);
            return $imageResource;
        } else {
            $rendererOptions = array('renderer' => 'svg', 'horizontalPosition' => 'center', 'verticalPosition' => 'middle');
            $imageResource = Zend_Barcode::render($bcs, 'svg', $barcodeOptions, $rendererOptions);
            header("Content-Type: image/svg+xml");
            echo $imageResource;
        }
    }

    function print_barcodes($product_id = NULL)
    {
        $this->sma->checkPermissions('barcode', true);

        $this->form_validation->set_rules('style', lang("style"), 'required');

        if ($this->form_validation->run() == true) {
            $style = $this->input->post('style');
            $bci_size = ($style == 10 || $style == 12 ? 50 : ($style == 14 || $style == 18 ? 30 : 20));
            $currencies = $this->site->getAllCurrencies();
            $s = isset($_POST['product']) ? sizeof($_POST['product']) : 0;
            if ($s < 1) {
                $this->session->set_flashdata('error', lang('no_product_selected'));
                admin_redirect("products/print_barcodes");
            }
            for ($m = 0; $m < $s; $m++) {
                $pid = $_POST['product'][$m];
                $quantity = $_POST['quantity'][$m];
                $product = $this->products_model->getProductWithCategory($pid);
                $product->price = $this->input->post('check_promo') ? ($product->promotion ? $product->promo_price : $product->price) : $product->price;
                if ($variants = $this->products_model->getProductOptions($pid)) {
                    foreach ($variants as $option) {
                        if ($this->input->post('vt_'.$product->id.'_'.$option->id)) {
                            $barcodes[] = array(
                                'site' => $this->input->post('site_name') ? $this->Settings->site_name : FALSE,
                                'name' => $this->input->post('product_name') ? $product->name.' - '.$option->name : FALSE,
                                'image' => $this->input->post('product_image') ? $product->image : FALSE,
                                'barcode' => $this->product_barcode($product->code . $this->Settings->barcode_separator . $option->id, 'code128', $bci_size),
                                'price' => $this->input->post('price') ?  $this->sma->formatMoney($option->price != 0 ? ($product->price+$option->price) : $product->price) : FALSE,
                                'unit' => $this->input->post('unit') ? $product->unit : FALSE,
                                'category' => $this->input->post('category') ? $product->category : FALSE,
                                'currencies' => $this->input->post('currencies'),
                                'location' => $this->input->post('check_location') ? $product->location : FALSE,
                                'variants' => $this->input->post('variants') ? $variants : FALSE,
                                'quantity' => $quantity
                                );
                        }
                    }
                } else {
                    $barcodes[] = array(
                        'site' => $this->input->post('site_name') ? $this->Settings->site_name : FALSE,
                        'name' => $this->input->post('product_name') ? $product->name : FALSE,
                        'image' => $this->input->post('product_image') ? $product->image : FALSE,
                        'location' => $this->input->post('check_location') ? $product->location : FALSE,
                        'barcode' => $this->product_barcode($product->code, $product->barcode_symbology, $bci_size),
                        'price' => $this->input->post('price') ?  $product->price : FALSE,
                        'price' => $this->input->post('price') ? $product->price : FALSE,


                       
                        'unit' => $this->input->post('unit') ? $product->unit : FALSE,
                        'category' => $this->input->post('category') ? $product->category : FALSE,
                        'currencies' => $this->input->post('currencies'),
                        'variants' => FALSE,
                        'quantity' => $quantity
                        );
                }

            }
            $this->data['barcodes'] = $barcodes;
            
            $this->data['currencies'] = $currencies;
            $this->data['style'] = $style;
            $this->data['items'] = false;
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('print_barcodes')));
            $meta = array('page_title' => lang('print_barcodes'), 'bc' => $bc);
            $this->page_construct('products/print_barcodes', $meta, $this->data);

        } else {

            if ($this->input->get('purchase') || $this->input->get('transfer')) {
                if ($this->input->get('purchase')) {
                    $purchase_id = $this->input->get('purchase', TRUE);
                    $items = $this->products_model->getPurchaseItems($purchase_id);
                } elseif ($this->input->get('transfer')) {
                    $transfer_id = $this->input->get('transfer', TRUE);
                    $items = $this->products_model->getTransferItems($transfer_id);
                }
                if ($items) {
                    foreach ($items as $item) {
                        if ($row = $this->products_model->getProductByID($item->product_id)) {
                            $selected_variants = false;
                            if ($variants = $this->products_model->getProductOptions($row->id)) {
                                foreach ($variants as $variant) {
                                    $selected_variants[$variant->id] = isset($pr[$row->id]['selected_variants'][$variant->id]) && !empty($pr[$row->id]['selected_variants'][$variant->id]) ? 1 : ($variant->id == $item->option_id ? 1 : 0);
                                }
                            }
                            $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $item->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants);
                        }
                    }
                    $this->data['message'] = lang('products_added_to_list');
                }
            }

            if ($product_id) {
                if ($row = $this->site->getProductByID($product_id)) {

                    $selected_variants = false;
                    if ($variants = $this->products_model->getProductOptions($row->id)) {
                        foreach ($variants as $variant) {
                            $selected_variants[$variant->id] = $variant->quantity > 0 ? 1 : 0;
                        }
                    }
                    $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $row->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants);

                    $this->data['message'] = lang('product_added_to_list');
                }
            }

            if ($this->input->get('category')) {
                if ($products = $this->products_model->getCategoryProducts($this->input->get('category'))) {
                    foreach ($products as $row) {
                        $selected_variants = false;
                        if ($variants = $this->products_model->getProductOptions($row->id)) {
                            foreach ($variants as $variant) {
                                $selected_variants[$variant->id] = $variant->quantity > 0 ? 1 : 0;
                            }
                        }
                        $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $row->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants);
                    }
                    $this->data['message'] = lang('products_added_to_list');
                } else {
                    $pr = array();
                    $this->session->set_flashdata('error', lang('no_product_found'));
                }
            }

            if ($this->input->get('subcategory')) {
                if ($products = $this->products_model->getSubCategoryProducts($this->input->get('subcategory'))) {
                    foreach ($products as $row) {
                        $selected_variants = false;
                        if ($variants = $this->products_model->getProductOptions($row->id)) {
                            foreach ($variants as $variant) {
                                $selected_variants[$variant->id] = $variant->quantity > 0 ? 1 : 0;
                            }
                        }
                        $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $row->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants);
                    }
                    $this->data['message'] = lang('products_added_to_list');
                } else {
                    $pr = array();
                    $this->session->set_flashdata('error', lang('no_product_found'));
                }
            }

            $this->data['items'] = isset($pr) ? json_encode($pr) : false;
           
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('print_barcodes')));
            $meta = array('page_title' => lang('print_barcodes'), 'bc' => $bc);
            $this->page_construct('products/print_barcodes', $meta, $this->data);

        }
    }


    /* ------------------------------------------------------- */

    function add($id = NULL)
    {
        $user = $this->site->getUser();
        $store_id = $user->store_id;
        $this->data['store_id'] = $store_id;
        $store = $this->site->getStoreByID($store_id);
        $this->data['store'] = $store;
        $this->sma->checkPermissions();
        $this->load->helper('security');
        $warehouses = $this->site->getAllWarehouses($this->data['store_id']);
        if($store_id == 0)
        {
            $this->form_validation->set_rules('store', lang("Store"), 'required|is_natural_no_zero');
        }

        $this->form_validation->set_rules('category', lang("category"), 'required|is_natural_no_zero');
        
       
        if ($this->input->post('type') == 'standard') {
            $this->form_validation->set_rules('cost', lang("product_cost"), 'required');
            $this->form_validation->set_rules('unit', lang("product_unit"), 'required');
        }
        if ($this->input->post('barcode_symbology') == 'ean13') {
            $this->form_validation->set_rules('code', lang("product_code"), 'min_length[13]|max_length[13]');
        }
        $this->form_validation->set_rules('code', lang("product_code"), 'alpha_dash');
        // $this->form_validation->set_rules('slug', lang("slug"), 'required|is_unique[products.slug]|alpha_dash');
        $this->form_validation->set_rules('weight', lang("weight"), 'numeric');
        $this->form_validation->set_rules('product_image', lang("product_image"), 'xss_clean');
        $this->form_validation->set_rules('digital_file', lang("digital_file"), 'xss_clean');
        $this->form_validation->set_rules('userfile', lang("product_gallery_images"), 'xss_clean');
        

        if ($this->form_validation->run() == true) {
            if($this->db->where('code',$this->data['store']->code.$this->input->post('code'))->get('sma_products')->row())
            {
                $this->session->set_flashdata('error', 'Duplicate entry '.$this->data['store']->code.$this->input->post('code').' for key');
                admin_redirect("products/add");
            }
            $tax_rate = $this->input->post('tax_rate') ? $this->site->getTaxRateByID($this->input->post('tax_rate')) : NULL;
            if($store_id==0)
            {
           
            $data = array(
                'sequence' => $this->input->post('sequence'),
                'code' => $this->data['store']->code.$this->input->post('code'),
                'barcode_symbology' => $this->input->post('barcode_symbology'),
                'name' => $this->input->post('name'),
                'model_subcategory' => $this->input->post('model_subcategory'),
                'model_category' => $this->input->post('model_category'),
                'model_feature' => $this->input->post('feature'),
                'type' => $this->input->post('type'),
                'brand' => $this->input->post('brand'),
                'location' => $this->input->post('location'),
                'category_id' => $this->input->post('category'),
                'subcategory_id' => $this->input->post('subcategory') ? $this->input->post('subcategory') : NULL,
                'cost' => $this->sma->formatDecimal($this->input->post('cost')),
                'price' => $this->sma->formatDecimal($this->input->post('price')),
                'unit' => $this->input->post('unit'),
                'sale_unit' => $this->input->post('default_sale_unit'),
                'purchase_unit' => $this->input->post('default_purchase_unit'),
                'tax_rate' => $this->input->post('tax_rate'),
                'tax_method' => $this->input->post('tax_method'),
                'quantity' => $this->input->post('wh_qty'),
                'alert_quantity' => $this->input->post('alert_quantity'),
                'track_quantity' => $this->input->post('track_quantity') ? $this->input->post('track_quantity') : '0',
                'details' => $this->input->post('details'),
                'product_details' => $this->input->post('product_details'),
                'supplier1' => $this->input->post('supplier'),
                'supplier1price' => $this->sma->formatDecimal($this->input->post('supplier_price')),
                'supplier2' => $this->input->post('supplier_2'),
                'supplier2price' => $this->sma->formatDecimal($this->input->post('supplier_2_price')),
                'supplier3' => $this->input->post('supplier_3'),
                'supplier3price' => $this->sma->formatDecimal($this->input->post('supplier_3_price')),
                'supplier4' => $this->input->post('supplier_4'),
                'supplier4price' => $this->sma->formatDecimal($this->input->post('supplier_4_price')),
                'supplier5' => $this->input->post('supplier_5'),
                'supplier5price' => $this->sma->formatDecimal($this->input->post('supplier_5_price')),
                'cf1' => $this->input->post('cf1'),
                'cf2' => $this->input->post('cf2'),
                'cf3' => $this->input->post('cf3'),
                'cf4' => $this->input->post('cf4'),
                'cf5' => $this->input->post('cf5'),
                'cf6' => $this->input->post('cf6'),
                'promotion' => $this->input->post('promotion'),
                'promo_price' => $this->sma->formatDecimal($this->input->post('promo_price')),
                'start_date' => $this->input->post('start_date') ? $this->sma->fsd($this->input->post('start_date')) : NULL,
                'end_date' => $this->input->post('end_date') ? $this->sma->fsd($this->input->post('end_date')) : NULL,
                'supplier1_part_no' => $this->input->post('supplier_part_no'),
                'supplier2_part_no' => $this->input->post('supplier_2_part_no'),
                'supplier3_part_no' => $this->input->post('supplier_3_part_no'),
                'supplier4_part_no' => $this->input->post('supplier_4_part_no'),
                'supplier5_part_no' => $this->input->post('supplier_5_part_no'),
                'file' => $this->input->post('file_link'),
                'slug' => '0',
                'weight' => $this->input->post('weight'),
                'featured' => $this->input->post('featured'),
                'warehouse'=>$this->input->post('warehouses') ? $this->input->post('warehouses') : NULL,
                'store_id' => $this->input->post('store'),
                'tag'=> $this->input->post('tag')
                // 'price_ret' => NULL,
            );
            $wh_qty= array(
                'warehouse_id'=>$this->input->post('warehouses') ? $this->input->post('warehouses') : NULL,
                'quantity'=>$this->input->post('wh_qty'),
            );
        }
        else{
            
            $data = array(
                'code' => $this->data['store']->code.$this->input->post('code'),
                'barcode_symbology' => $this->input->post('barcode_symbology'),
                'name' => $this->input->post('name'),
                'model_subcategory' => $this->input->post('model_subcategory'),
                'model_category' => $this->input->post('model_category'),
                'model_feature' => $this->input->post('feature'),
                
                'type' => $this->input->post('type'),
                'brand' => $this->input->post('brand'),
                'location' => $this->input->post('location'),
                'category_id' => $this->input->post('category'),
                'subcategory_id' => $this->input->post('subcategory') ? $this->input->post('subcategory') : NULL,
                'cost' => $this->sma->formatDecimal($this->input->post('cost')),
                'price' => $this->sma->formatDecimal($this->input->post('price')),
                'unit' => $this->input->post('unit'),
                'sale_unit' => $this->input->post('default_sale_unit'),
                'purchase_unit' => $this->input->post('default_purchase_unit'),
                'tax_rate' => $this->input->post('tax_rate'),
                'tax_method' => $this->input->post('tax_method'),
                'alert_quantity' => $this->input->post('alert_quantity'),
                'track_quantity' => $this->input->post('track_quantity') ? $this->input->post('track_quantity') : '0',
                'details' => $this->input->post('details'),
                'product_details' => $this->input->post('product_details'),
                'supplier1' => $this->input->post('supplier'),
                'supplier1price' => $this->sma->formatDecimal($this->input->post('supplier_price')),
                'supplier2' => $this->input->post('supplier_2'),
                'supplier2price' => $this->sma->formatDecimal($this->input->post('supplier_2_price')),
                'supplier3' => $this->input->post('supplier_3'),
                'supplier3price' => $this->sma->formatDecimal($this->input->post('supplier_3_price')),
                'supplier4' => $this->input->post('supplier_4'),
                'supplier4price' => $this->sma->formatDecimal($this->input->post('supplier_4_price')),
                'supplier5' => $this->input->post('supplier_5'),
                'supplier5price' => $this->sma->formatDecimal($this->input->post('supplier_5_price')),
                'cf1' => $this->input->post('cf1'),
                'cf2' => $this->input->post('cf2'),
                'cf3' => $this->input->post('cf3'),
                'cf4' => $this->input->post('cf4'),
                'cf5' => $this->input->post('cf5'),
                'cf6' => $this->input->post('cf6'),
                'promotion' => $this->input->post('promotion'),
                'promo_price' => $this->sma->formatDecimal($this->input->post('promo_price')),
                'start_date' => $this->input->post('start_date') ? $this->sma->fsd($this->input->post('start_date')) : NULL,
                'end_date' => $this->input->post('end_date') ? $this->sma->fsd($this->input->post('end_date')) : NULL,
                'supplier1_part_no' => $this->input->post('supplier_part_no'),
                'supplier2_part_no' => $this->input->post('supplier_2_part_no'),
                'supplier3_part_no' => $this->input->post('supplier_3_part_no'),
                'supplier4_part_no' => $this->input->post('supplier_4_part_no'),
                'supplier5_part_no' => $this->input->post('supplier_5_part_no'),
                'file' => $this->input->post('file_link'),
                'slug' => '0',
                'weight' => $this->input->post('weight'),
                'featured' => $this->input->post('featured'),
                'tag'=> $this->input->post('tag'),
                'store_id' => $store_id,);
        }
            $data['sequence']=$this->input->post('sequence');
            $data['ecom_show']=$this->input->post('ecom_show');
            $data['show_emenu']=$this->input->post('show_emenu');
            $s = sizeof($_POST['type_sale'])-1;
            // $unitSale_name  = $this->input->post('type_sale');
            // $unitSale_price = $this->input->post('price_unit');
            for($st = 0; $st<=$s;$st++){
                $saleUnit[]=array(
                    'sale_unitname'=>$_POST['type_sale'][$st],
                    'sale_unitprice'=>$_POST['price_unit'][$st],
                );
            }
            $warehouse_qty = NULL;
            $product_attributes = NULL;
            $this->load->library('upload');
            if ($this->input->post('type') == 'standard') {
                $wh_total_quantity = 0;
                $pv_total_quantity = 0;
                for ($s = 2; $s > 5; $s++) {
                    $data['suppliers' . $s] = $this->input->post('supplier_' . $s);
                    $data['suppliers' . $s . 'price'] = $this->input->post('supplier_' . $s . '_price');
                }
                foreach ($warehouses as $warehouse) {
                    if ($this->input->post('wh_qty_' . $warehouse->id)) {
                        $warehouse_qty[] = array(
                            'warehouse_id' => $this->input->post('wh_' . $warehouse->id),
                            'quantity' => $this->input->post('wh_qty_' . $warehouse->id),
                            'rack' => $this->input->post('rack_' . $warehouse->id) ? $this->input->post('rack_' . $warehouse->id) : NULL
                        );
                        $wh_total_quantity += $this->input->post('wh_qty_' . $warehouse->id);
                    }
                }
                if($this->input->post('typesInput'))
                {
                    
                        $variant_option_type = $this->input->post('typesInput');
                    
                }else{
                    $variant_option_type = NULL;
                }
                if ($this->input->post('attributes')) {
                    $a = sizeof($_POST['attr_name']);
                    for ($r = 0; $r <= $a; $r++) {
                        if (isset($_POST['attr_name'][$r])) {
                            $product_attributes[] = array(
                                'name' => $_POST['attr_name'][$r],
                                'warehouse_id' => $_POST['attr_warehouse'][$r],
                                'quantity' => $_POST['attr_quantity'][$r],
                                'price' => $_POST['attr_price'][$r],
                            );
                            $pv_total_quantity += $_POST['attr_quantity'][$r];
                        }
                    }

                } else {
                    $product_attributes = NULL;
                }

                if ($wh_total_quantity != $pv_total_quantity && $pv_total_quantity != 0) {
                    $this->form_validation->set_rules('wh_pr_qty_issue', 'wh_pr_qty_issue', 'required');
                    $this->form_validation->set_message('required', lang('wh_pr_qty_issue'));
                }
            }

            if ($this->input->post('type') == 'service') {
                $data['track_quantity'] = 0;
            } elseif ($this->input->post('type') == 'combo') {
                $total_price = $this->input->post('price');
                $c = sizeof($_POST['combo_item_code']) - 1;
                for ($r = 0; $r <= $c; $r++) {
                    if (isset($_POST['combo_item_code'][$r]) && isset($_POST['combo_item_quantity'][$r]) && isset($_POST['combo_item_price'][$r])) {
                        $items[] = array(
                            'item_code' => $_POST['combo_item_code'][$r],
                            'quantity' => $_POST['combo_item_quantity'][$r],
                            'unit_price' => $_POST['combo_item_price'][$r],
                        );
                    }
                    //$total_price += $_POST['combo_item_price'][$r] * $_POST['combo_item_quantity'][$r];
                }
                if ($this->sma->formatDecimal($total_price) != $this->sma->formatDecimal($this->input->post('price'))) {
                    // $this->form_validation->set_rules('combo_price', 'combo_price', 'required');
                    // $this->form_validation->set_message('required', lang('pprice_not_match_ciprice'));
                }
                $data['track_quantity'] = 0;
            } elseif ($this->input->post('type') == 'digital') {
                if ($_FILES['digital_file']['size'] > 0) {
                    $config['upload_path'] = $this->digital_upload_path;
                    $config['allowed_types'] = $this->digital_file_types;
                    $config['max_size'] = $this->allowed_file_size;
                    $config['overwrite'] = FALSE;
                    $config['encrypt_name'] = TRUE;
                    $config['max_filename'] = 25;
                    $this->upload->initialize($config);
                    if (!$this->upload->do_upload('digital_file')) {
                        $error = $this->upload->display_errors();
                        $this->session->set_flashdata('error', $error);
                        admin_redirect("products/add");
                    }
                    $file = $this->upload->file_name;
                    $data['file'] = $file;
                } else {
                    if (!$this->input->post('file_link')) {
                        $this->form_validation->set_rules('digital_file', lang("digital_file"), 'required');
                    }
                }
                $config = NULL;
                $data['track_quantity'] = 0;
            }
            if (!isset($items)) {
                $items = NULL;
            }
            if ($_FILES['product_image']['size'] > 0) {

                $config['upload_path'] = $this->upload_path;
                $config['allowed_types'] = $this->image_types;
                $config['max_size'] = $this->allowed_file_size;
                // $config['max_width'] = $this->Settings->iwidth;
                // $config['max_height'] = $this->Settings->iheight;
                $config['overwrite'] = FALSE;
                $config['max_filename'] = 25;
                $config['encrypt_name'] = TRUE;
                $this->upload->initialize($config);
                if (!$this->upload->do_upload('product_image')) {
                    $error = $this->upload->display_errors();
                    $this->session->set_flashdata('error', $error);
                    admin_redirect("products/add");
                }
                $photo = $this->upload->file_name;
                $data['image'] = $photo;
                $this->load->library('image_lib');
                $config['image_library'] = 'gd2';
                $config['source_image'] = $this->upload_path . $photo;
		        $data['image_url'] = 'http://'.$_SERVER['SERVER_NAME'].'/'.$this->upload_path . $photo;
                $config['new_image'] = $this->thumbs_path . $photo;
                $config['maintain_ratio'] = TRUE;
                $config['width'] = $this->Settings->twidth;
                $config['height'] = $this->Settings->theight;
                $this->image_lib->clear();
                $this->image_lib->initialize($config);
                if (!$this->image_lib->resize()) {
                    echo $this->image_lib->display_errors();
                }
                if ($this->Settings->watermark) {
                    $this->image_lib->clear();
                    $wm['source_image'] = $this->upload_path . $photo;
                    $wm['wm_text'] = 'Copyright ' . date('Y') . ' - ' . $this->Settings->site_name;
                    $wm['wm_type'] = 'text';
                    $wm['wm_font_path'] = 'system/fonts/texb.ttf';
                    $wm['quality'] = '100';
                    $wm['wm_font_size'] = '16';
                    $wm['wm_font_color'] = '999999';
                    $wm['wm_shadow_color'] = 'CCCCCC';
                    $wm['wm_vrt_alignment'] = 'top';
                    $wm['wm_hor_alignment'] = 'left';
                    $wm['wm_padding'] = '10';
                    $this->image_lib->initialize($wm);
                    $this->image_lib->watermark();
                }
                $this->image_lib->clear();
                $config = NULL;
            }

            if ($_FILES['userfile']['name'][0] != "") {

                $config['upload_path'] = $this->upload_path;
                $config['allowed_types'] = $this->image_types;
                $config['max_size'] = $this->allowed_file_size;
                // $config['max_width'] = $this->Settings->iwidth;
                // $config['max_height'] = $this->Settings->iheight;
                $config['overwrite'] = FALSE;
                $config['encrypt_name'] = TRUE;
                $config['max_filename'] = 25;
                $files = $_FILES;
                $cpt = count($_FILES['userfile']['name']);
                for ($i = 0; $i < $cpt; $i++) {

                    $_FILES['userfile']['name'] = $files['userfile']['name'][$i];
                    $_FILES['userfile']['type'] = $files['userfile']['type'][$i];
                    $_FILES['userfile']['tmp_name'] = $files['userfile']['tmp_name'][$i];
                    $_FILES['userfile']['error'] = $files['userfile']['error'][$i];
                    $_FILES['userfile']['size'] = $files['userfile']['size'][$i];

                    $this->upload->initialize($config);

                    if (!$this->upload->do_upload()) {
                        $error = $this->upload->display_errors();
                        $this->session->set_flashdata('error', $error);
                        admin_redirect("products/add");
                    } else {

                        $pho = $this->upload->file_name;

                        $photos[] = $pho;

                        $this->load->library('image_lib');
                        $config['image_library'] = 'gd2';
                        $config['source_image'] = $this->upload_path . $pho;
                        $config['new_image'] = $this->thumbs_path . $pho;
                        $config['maintain_ratio'] = TRUE;
                        $config['width'] = $this->Settings->twidth;
                        $config['height'] = $this->Settings->theight;

                        $this->image_lib->initialize($config);

                        if (!$this->image_lib->resize()) {
                            echo $this->image_lib->display_errors();
                        }

                        if ($this->Settings->watermark) {
                            $this->image_lib->clear();
                            $wm['source_image'] = $this->upload_path . $pho;
                            $wm['wm_text'] = 'Copyright ' . date('Y') . ' - ' . $this->Settings->site_name;
                            $wm['wm_type'] = 'text';
                            $wm['wm_font_path'] = 'system/fonts/texb.ttf';
                            $wm['quality'] = '100';
                            $wm['wm_font_size'] = '16';
                            $wm['wm_font_color'] = '999999';
                            $wm['wm_shadow_color'] = 'CCCCCC';
                            $wm['wm_vrt_alignment'] = 'top';
                            $wm['wm_hor_alignment'] = 'left';
                            $wm['wm_padding'] = '10';
                            $this->image_lib->initialize($wm);
                            $this->image_lib->watermark();
                        }

                        $this->image_lib->clear();
                    }
                }
                $config = NULL;
            } else {
                $photos = NULL;
            }
            if($store_id!=0)
            {
                $data['quantity'] = isset($wh_total_quantity) ? $wh_total_quantity : 0;
            }
            
            // $this->sma->print_arrays($data, $warehouse_qty, $product_attributes);
        }

        if ($this->form_validation->run() == true && $this->products_model->addProduct($data, $items,$saleUnit, $warehouse_qty, $product_attributes, $photos,$wh_qty,$this->data['store_id'],$variant_option_type)) {
            $this->session->set_flashdata('message', lang("product_added"));
            admin_redirect('products');
        } else {
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
            $user = $this->site->getUser();
            $store_id = $user->store_id;
            $this->data['store_id'] = $store_id;
            $this->data['categories'] = $this->site->getAllCategories($this->data['store_id']);
            $this->data['model_categories'] = $this->site->getAllModelCategories();
            $this->data['stores'] = $this->site->getAllStores();
            
            $this->data['tax_rates'] = $this->site->getAllTaxRates();
            $this->data['brands'] = $this->site->getAllBrands();
            $this->data['location'] = $this->site->getAllLocation($this->data['store_id']);
            $this->data['base_units'] = $this->site->getAllBaseUnits($this->data['store_id']);
            if($store_id==0)
            {
                $this->data['warehouses'] = $warehouses;
            }
            else{
                $warehouses = $this->site->getAllWarehousesforstore($store_id);
                $this->data['warehouses'] = $warehouses;
            }
           
            
            $this->data['warehouses_products'] = $id ? $this->products_model->getAllWarehousesWithPQ($id) : NULL;
            $this->data['product'] = $id ? $this->products_model->getProductByID($id) : NULL;
            $this->data['variants'] = $this->products_model->getAllVariants();
            $this->data['combo_items'] = ($id && $this->data['product']->type == 'combo') ? $this->products_model->getProductComboItems($id) : NULL;
            $this->data['product_options'] = $id ? $this->products_model->getProductOptionsWithWH($id) : NULL;
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('add_product')));
            $meta = array('page_title' => lang('add_product'), 'bc' => $bc);
            $this->page_construct('products/add', $meta, $this->data);
        }
    }

    function suggestions()
    {
        $term = $this->input->get('term', TRUE);
        if (strlen($term) < 1 || !$term) {
            die("<script type='text/javascript'>setTimeout(function(){ window.top.location.href = '" . admin_url('welcome') . "'; }, 10);</script>");
        }

        $rows = $this->products_model->getProductNames($term);
        if ($rows) {
            foreach ($rows as $row) {
                $pr[] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => 1);
            }
            $this->sma->send_json($pr);
        } else {
            $this->sma->send_json(array(array('id' => 0, 'label' => lang('no_match_found'), 'value' => $term)));
        }
    }

    function get_suggestions()
    {
        $term = $this->input->get('term', TRUE);
        if (strlen($term) < 1 || !$term) {
            die("<script type='text/javascript'>setTimeout(function(){ window.top.location.href = '" . admin_url('welcome') . "'; }, 10);</script>");
        }

        $rows = $this->products_model->getProductsForPrinting($term);
        if ($rows) {
            foreach ($rows as $row) {
                $variants = $this->products_model->getProductOptions($row->id);
                $pr[] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => 1, 'variants' => $variants);
            }
            $this->sma->send_json($pr);
        } else {
            $this->sma->send_json(array(array('id' => 0, 'label' => lang('no_match_found'), 'value' => $term)));
        }
    }

    function addByAjax()
    {
        if (!$this->mPermissions('add')) {
            exit(json_encode(array('msg' => lang('access_denied'))));
        }
        if ($this->input->get('token') && $this->input->get('token') == $this->session->userdata('user_csrf') && $this->input->is_ajax_request()) {
            $product = $this->input->get('product');
            if (!isset($product['code']) || empty($product['code'])) {
                exit(json_encode(array('msg' => lang('product_code_is_required'))));
            }
            if (!isset($product['name']) || empty($product['name'])) {
                exit(json_encode(array('msg' => lang('product_name_is_required'))));
            }
            if (!isset($product['category_id']) || empty($product['category_id'])) {
                exit(json_encode(array('msg' => lang('product_category_is_required'))));
            }
            if (!isset($product['unit']) || empty($product['unit'])) {
                exit(json_encode(array('msg' => lang('product_unit_is_required'))));
            }
            if (!isset($product['price']) || empty($product['price'])) {
                exit(json_encode(array('msg' => lang('product_price_is_required'))));
            }
            if (!isset($product['cost']) || empty($product['cost'])) {
                exit(json_encode(array('msg' => lang('product_cost_is_required'))));
            }
            if ($this->products_model->getProductByCode($product['code'])) {
                exit(json_encode(array('msg' => lang('product_code_already_exist'))));
            }
            if ($row = $this->products_model->addAjaxProduct($product)) {
                $tax_rate = $this->site->getTaxRateByID($row->tax_rate);
                $pr = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'qty' => 1, 'cost' => $row->cost, 'name' => $row->name, 'tax_method' => $row->tax_method, 'tax_rate' => $tax_rate, 'discount' => '0');
                $this->sma->send_json(array('msg' => 'success', 'result' => $pr));
            } else {
                exit(json_encode(array('msg' => lang('failed_to_add_product'))));
            }
        } else {
            json_encode(array('msg' => 'Invalid token'));
        }

    }


    /* -------------------------------------------------------- */

    function edit($id = NULL)
    {
        $this->sma->checkPermissions();
        $this->load->helper('security');
        if ($this->input->post('id')) {
            $id = $this->input->post('id');
        }
        $warehouses = $this->site->getallWarehouses($this->data['store_id']);
        $warehouses_products = $this->products_model->getAllWarehousesWithPQ($id);
        $product = $this->site->getProductByID($id);
        if (!$id || !$product) {
            $this->session->set_flashdata('error', lang('prduct_not_found'));
            redirect($_SERVER["HTTP_REFERER"]);
        }
        $this->form_validation->set_rules('category', lang("category"), 'required|is_natural_no_zero');
        if ($this->input->post('type') == 'standard') {
            $this->form_validation->set_rules('cost', lang("product_cost"), 'required');
            $this->form_validation->set_rules('unit', lang("product_unit"), 'required');
        }
        $this->form_validation->set_rules('code', lang("product_code"), 'alpha_dash');
        if ($this->input->post('code') !== $product->code) {
            $this->form_validation->set_rules('code', lang("product_code"), 'is_unique[products.code]');
        }
        if ($this->input->post('barcode_symbology') == 'ean13') {
            $this->form_validation->set_rules('code', lang("product_code"), 'min_length[13]|max_length[13]');
        }
        // $this->form_validation->set_rules('slug', lang("slug"), 'required|alpha_dash');
        // if ($this->input->post('slug') !== $product->slug) {
        //     $this->form_validation->set_rules('slug', lang("slug"), 'required|is_unique[products.slug]|alpha_dash');
        // }
        $this->form_validation->set_rules('weight', lang("weight"), 'numeric');
        $this->form_validation->set_rules('product_image', lang("product_image"), 'xss_clean');
        $this->form_validation->set_rules('digital_file', lang("digital_file"), 'xss_clean');
        $this->form_validation->set_rules('userfile', lang("product_gallery_images"), 'xss_clean');

        if ($this->form_validation->run('products/add') == true) {
            $code = $this->input->post('code');
            if (strpos($code, $this->data['store']->code) === false){
                $code = $this->data['store']->code.$this->input->post('code');
            }
            $data = array('code' => $code,
                'sequence' => $this->input->post('sequence'),
                'barcode_symbology' => $this->input->post('barcode_symbology'),
                'name' => $this->input->post('name'),
                'type' => $this->input->post('type'),
                'brand' => $this->input->post('brand'),
                'location' => $this->input->post('location'),
                'category_id' => $this->input->post('category'),
                'subcategory_id' => $this->input->post('subcategory') ? $this->input->post('subcategory') : NULL,
                'cost' => $this->sma->formatDecimal($this->input->post('cost')),
                'price' => $this->sma->formatDecimal($this->input->post('price')),
                'unit' => $this->input->post('unit'),
                'sale_unit' => $this->input->post('default_sale_unit'),
                'purchase_unit' => $this->input->post('default_purchase_unit'),
                'tax_rate' => $this->input->post('tax_rate'),
                'tax_method' => $this->input->post('tax_method'),
                'alert_quantity' => $this->input->post('alert_quantity'),
                'track_quantity' => $this->input->post('track_quantity') ? $this->input->post('track_quantity') : '0',
                'details' => $this->input->post('details'),
                'product_details' => $this->input->post('product_details'),
                'supplier1' => $this->input->post('supplier'),
                'supplier1price' => $this->sma->formatDecimal($this->input->post('supplier_price')),
                'supplier2' => $this->input->post('supplier_2'),
                'supplier2price' => $this->sma->formatDecimal($this->input->post('supplier_2_price')),
                'supplier3' => $this->input->post('supplier_3'),
                'supplier3price' => $this->sma->formatDecimal($this->input->post('supplier_3_price')),
                'supplier4' => $this->input->post('supplier_4'),
                'supplier4price' => $this->sma->formatDecimal($this->input->post('supplier_4_price')),
                'supplier5' => $this->input->post('supplier_5'),
                'supplier5price' => $this->sma->formatDecimal($this->input->post('supplier_5_price')),
                'cf1' => $this->input->post('cf1'),
                'cf2' => $this->input->post('cf2'),
                'cf3' => $this->input->post('cf3'),
                'cf4' => $this->input->post('cf4'),
                'cf5' => $this->input->post('cf5'),
                'cf6' => $this->input->post('cf6'),
                'promotion' => $this->input->post('promotion'),
                'promo_price' => $this->sma->formatDecimal($this->input->post('promo_price')),
                'start_date' => $this->input->post('start_date') ? $this->sma->fsd($this->input->post('start_date')) : NULL,
                'end_date' => $this->input->post('end_date') ? $this->sma->fsd($this->input->post('end_date')) : NULL,
                'supplier1_part_no' => $this->input->post('supplier_part_no'),
                'supplier2_part_no' => $this->input->post('supplier_2_part_no'),
                'supplier3_part_no' => $this->input->post('supplier_3_part_no'),
                'supplier4_part_no' => $this->input->post('supplier_4_part_no'),
                'supplier5_part_no' => $this->input->post('supplier_5_part_no'),
                'slug' =>'0',
                'weight' => $this->input->post('weight'),
                'featured' => $this->input->post('featured'),
                'model_category'=>$this->input->post('model_category'),
                'model_subcategory'=>$this->input->post('model_subcategory'),
                'model_feature'=>$this->input->post('feature'),
                'tag'=> $this->input->post('tag')
                
            );
            
            $data['ecom_show']=$this->input->post('ecom_show');
            $data['show_emenu']=$this->input->post('show_emenu');
            $warehouse_qty = NULL;
            $product_attributes = NULL;
            $update_variants = array();
            $update_variant_options = array();
            $this->load->library('upload');
            if ($this->input->post('type') == 'standard') {
                if ($product_variants = $this->products_model->getProductOptions($id)) {
                    foreach ($product_variants as $pv) {
                        $update_variants[] = array(
                            'id' => $this->input->post('variant_id_'.$pv->id),
                            'name' => $this->input->post('variant_name_'.$pv->id),
                            'cost' => $this->input->post('variant_cost_'.$pv->id),
                            'price' => $this->input->post('variant_price_'.$pv->id),
                        );
                    }
                }
                if ($product_variant_options = $this->db->where('product_id',$id)->get('variant_option')->result()) {
                    foreach ($product_variant_options as $pv) {
                        $update_variant_options[] = array(
                            'id' => $this->input->post('variant_option_id_'.$pv->id),
                            'name' => $this->input->post('variant_option_name_'.$pv->id),
                            
                        );
                    }
                }
                for ($s = 2; $s > 5; $s++) {
                    $data['suppliers' . $s] = $this->input->post('supplier_' . $s);
                    $data['suppliers' . $s . 'price'] = $this->input->post('supplier_' . $s . '_price');
                }
                foreach ($warehouses as $warehouse) {
                    $warehouse_qty[] = array(
                        'warehouse_id' => $this->input->post('wh_' . $warehouse->id),
                        'rack' => $this->input->post('rack_' . $warehouse->id) ? $this->input->post('rack_' . $warehouse->id) : NULL
                    );
                }
                if($this->input->post('typesInput'))
                {
                    
                        $variant_option_type = $this->input->post('typesInput');
                    
                }else{
                    $variant_option_type = NULL;
                }
                if ($this->input->post('attributes')) {
                    $a = sizeof($_POST['attr_name']);
                    for ($r = 0; $r <= $a; $r++) {
                        if (isset($_POST['attr_name'][$r])) {
                            if ($product_variatnt = $this->products_model->getPrductVariantByPIDandName($id, trim($_POST['attr_name'][$r]))) {
                                $this->form_validation->set_message('required', lang("product_already_has_variant").' ('.$_POST['attr_name'][$r].')');
                                $this->form_validation->set_rules('new_product_variant', lang("new_product_variant"), 'required');
                            } else {
                                $product_attributes[] = array(
                                    'name' => $_POST['attr_name'][$r],
                                    'warehouse_id' => $_POST['attr_warehouse'][$r],
                                    'quantity' => $_POST['attr_quantity'][$r],
                                    'price' => $_POST['attr_price'][$r],
                                );
                            }
                        }
                    }

                } else {
                    $product_attributes = NULL;
                }

            }
            $s = sizeof($_POST['type_sale'])-1;
            for($st = 0; $st<=$s;$st++){
                $saleUnit[]=array(
                    'sale_unitname'=>$_POST['type_sale'][$st],
                    'sale_unitprice'=>$_POST['price_unit'][$st],
                );
            }
            //

            if ($this->input->post('type') == 'service') {
                $data['track_quantity'] = 0;
            } elseif ($this->input->post('type') == 'combo') {
                $total_price = $this->input->post('price');
                $c = sizeof($_POST['combo_item_code']) - 1;
                for ($r = 0; $r <= $c; $r++) {
                    if (isset($_POST['combo_item_code'][$r]) && isset($_POST['combo_item_quantity'][$r]) && isset($_POST['combo_item_price'][$r])) {
                        $items[] = array(
                            'item_code' => $_POST['combo_item_code'][$r],
                            'quantity' => $_POST['combo_item_quantity'][$r],
                            'unit_price' => $_POST['combo_item_price'][$r],
                        );
                    }
                    // $total_price += $_POST['combo_item_price'][$r] * $_POST['combo_item_quantity'][$r];
                }
                if ($this->sma->formatDecimal($total_price) != $this->sma->formatDecimal($this->input->post('price'))) {
                    // $this->form_validation->set_rules('combo_price', 'combo_price', 'required');
                    // $this->form_validation->set_message('required', lang('pprice_not_match_ciprice'));
                }
                $data['track_quantity'] = 0;
            } elseif ($this->input->post('type') == 'digital') {
                if ($this->input->post('file_link')) {
                    $data['file'] = $this->input->post('file_link');
                }
                if ($_FILES['digital_file']['size'] > 0) {
                    $config['upload_path'] = $this->digital_upload_path;
                    $config['allowed_types'] = $this->digital_file_types;
                    $config['max_size'] = $this->allowed_file_size;
                    $config['overwrite'] = FALSE;
                    $config['encrypt_name'] = TRUE;
                    $config['max_filename'] = 25;
                    $this->upload->initialize($config);
                    if (!$this->upload->do_upload('digital_file')) {
                        $error = $this->upload->display_errors();
                        $this->session->set_flashdata('error', $error);
                        admin_redirect("products/add");
                    }
                    $file = $this->upload->file_name;
                    $data['file'] = $file;
                }
                $config = NULL;
                $data['track_quantity'] = 0;
            }
            if (!isset($items)) {
                $items = NULL;
            }
            if ($_FILES['product_image']['size'] > 0) {

                $config['upload_path'] = $this->upload_path;
                $config['allowed_types'] = $this->image_types;
                $config['max_size'] = $this->allowed_file_size;
                // $config['max_width'] = $this->Settings->iwidth;
                // $config['max_height'] = $this->Settings->iheight;
                $config['overwrite'] = FALSE;
                $config['encrypt_name'] = TRUE;
                $config['max_filename'] = 25;
                $this->upload->initialize($config);
                if (!$this->upload->do_upload('product_image')) {
                    $error = $this->upload->display_errors();
                    $this->session->set_flashdata('error', $error);
                    admin_redirect("products/edit/" . $id);
                }
                $photo = $this->upload->file_name;
                $data['image'] = $photo;
                $this->load->library('image_lib');
                $config['image_library'] = 'gd2';
                $config['source_image'] = $this->upload_path . $photo;
		$data['image_url'] = 'http://'.$_SERVER['SERVER_NAME'].'/'.$this->upload_path . $photo;
                $config['new_image'] = $this->thumbs_path . $photo;
                $config['maintain_ratio'] = TRUE;
                $config['width'] = $this->Settings->twidth;
                $config['height'] = $this->Settings->theight;
                $this->image_lib->clear();
                $this->image_lib->initialize($config);
                if (!$this->image_lib->resize()) {
                    echo $this->image_lib->display_errors();
                }
                if ($this->Settings->watermark) {
                    $this->image_lib->clear();
                    $wm['source_image'] = $this->upload_path . $photo;
                    $wm['wm_text'] = 'Copyright ' . date('Y') . ' - ' . $this->Settings->site_name;
                    $wm['wm_type'] = 'text';
                    $wm['wm_font_path'] = 'system/fonts/texb.ttf';
                    $wm['quality'] = '100';
                    $wm['wm_font_size'] = '16';
                    $wm['wm_font_color'] = '999999';
                    $wm['wm_shadow_color'] = 'CCCCCC';
                    $wm['wm_vrt_alignment'] = 'top';
                    $wm['wm_hor_alignment'] = 'left';
                    $wm['wm_padding'] = '10';
                    $this->image_lib->initialize($wm);
                    $this->image_lib->watermark();
                }
                $this->image_lib->clear();
                $config = NULL;
            }

            if ($_FILES['userfile']['name'][0] != "") {

                $config['upload_path'] = $this->upload_path;
                $config['allowed_types'] = $this->image_types;
                $config['max_size'] = $this->allowed_file_size;
                // $config['max_width'] = $this->Settings->iwidth;
                // $config['max_height'] = $this->Settings->iheight;
                $config['overwrite'] = FALSE;
                $config['encrypt_name'] = TRUE;
                $config['max_filename'] = 25;
                $files = $_FILES;
                $cpt = count($_FILES['userfile']['name']);
                for ($i = 0; $i < $cpt; $i++) {

                    $_FILES['userfile']['name'] = $files['userfile']['name'][$i];
                    $_FILES['userfile']['type'] = $files['userfile']['type'][$i];
                    $_FILES['userfile']['tmp_name'] = $files['userfile']['tmp_name'][$i];
                    $_FILES['userfile']['error'] = $files['userfile']['error'][$i];
                    $_FILES['userfile']['size'] = $files['userfile']['size'][$i];

                    $this->upload->initialize($config);

                    if (!$this->upload->do_upload()) {
                        $error = $this->upload->display_errors();
                        $this->session->set_flashdata('error', $error);
                        admin_redirect("products/edit/" . $id);
                    } else {

                        $pho = $this->upload->file_name;

                        $photos[] = $pho;

                        $this->load->library('image_lib');
                        $config['image_library'] = 'gd2';
                        $config['source_image'] = $this->upload_path . $pho;
                        $config['new_image'] = $this->thumbs_path . $pho;
                        $config['maintain_ratio'] = TRUE;
                        $config['width'] = $this->Settings->twidth;
                        $config['height'] = $this->Settings->theight;

                        $this->image_lib->initialize($config);

                        if (!$this->image_lib->resize()) {
                            echo $this->image_lib->display_errors();
                        }

                        if ($this->Settings->watermark) {
                            $this->image_lib->clear();
                            $wm['source_image'] = $this->upload_path . $pho;
                            $wm['wm_text'] = 'Copyright ' . date('Y') . ' - ' . $this->Settings->site_name;
                            $wm['wm_type'] = 'text';
                            $wm['wm_font_path'] = 'system/fonts/texb.ttf';
                            $wm['quality'] = '100';
                            $wm['wm_font_size'] = '16';
                            $wm['wm_font_color'] = '999999';
                            $wm['wm_shadow_color'] = 'CCCCCC';
                            $wm['wm_vrt_alignment'] = 'top';
                            $wm['wm_hor_alignment'] = 'left';
                            $wm['wm_padding'] = '10';
                            $this->image_lib->initialize($wm);
                            $this->image_lib->watermark();
                        }

                        $this->image_lib->clear();
                    }
                }
                $config = NULL;
            } else {
                $photos = NULL;
            }
            $data['quantity'] = isset($wh_total_quantity) ? $wh_total_quantity : 0;
            // $this->sma->print_arrays($data, $warehouse_qty, $update_variants, $product_attributes, $photos, $items);
        }

        if ($this->form_validation->run() == true && $this->products_model->updateProduct($id, $data, $saleUnit, $items, $warehouse_qty, $product_attributes, $photos, $update_variants,$variant_option_type,$update_variant_options)) {
            $this->session->set_flashdata('message', lang("product_updated"));
            admin_redirect('products');
        } else {
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
            $this->data['unit'] = $this->site->getEditValueByID($id);
             //var_dump($this->data['unit']);die();
            $this->data['categories'] = $this->site->getAllCategories($this->data['store_id']);
            $this->data['tax_rates'] = $this->site->getAllTaxRates();
            $this->data['brands'] = $this->site->getAllBrands();
            $this->data['location'] = $this->site->getAllLocation($this->data['store_id']);
            $this->data['base_units'] = $this->site->getAllBaseUnits($this->data['store_id']);
            $this->data['warehouses'] = $warehouses;
            $this->data['warehouses_products'] = $warehouses_products;
            $this->data['product'] = $product;
            $this->data['variants'] = $this->products_model->getAllVariants();
            $this->data['subunits'] = $this->site->getUnitsByBUID($product->unit);
            $this->data['product_variants'] = $this->products_model->getProductOptions($id);
            $this->data['product_variant_options'] = $this->db->where('product_id',$id)->get('variant_option')->result();
            $this->data['model_categories'] = $this->site->getAllModelCategories();
            $this->data['combo_items'] = $product->type == 'combo' ? $this->products_model->getProductComboItems($product->id) : NULL;
            $this->data['product_options'] = $id ? $this->products_model->getProductOptionsWithWH($id) : NULL;
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('edit_product')));
            $meta = array('page_title' => lang('edit_product'), 'bc' => $bc);
            $this->page_construct('products/edit', $meta, $this->data);
        }
    }

    /* ---------------------------------------------------------------- */

    function import_csv()
    {
        $this->sma->checkPermissions('csv');
        $this->load->helper('security');
        $this->form_validation->set_rules('userfile', lang("upload_file"), 'xss_clean');

        if ($this->form_validation->run() == true) {

            if (isset($_FILES["userfile"])) {

                $this->load->library('upload');
                $config['upload_path'] = $this->digital_upload_path;
                $config['allowed_types'] = 'csv';
                $config['max_size'] = $this->allowed_file_size;
                $config['overwrite'] = TRUE;
                $config['encrypt_name'] = TRUE;
                $config['max_filename'] = 25;
                $this->upload->initialize($config);

                if (!$this->upload->do_upload()) {
                    $error = $this->upload->display_errors();
                    $this->session->set_flashdata('error', $error);
                    admin_redirect("products/import_csv");
                }

                $csv = $this->upload->file_name;

                $arrResult = array();
                $handle = fopen($this->digital_upload_path . $csv, "r");
                if ($handle) {
                    while (($row = fgetcsv($handle, 5000, ",")) !== FALSE) {
                        $arrResult[] = $row;
                    }
                    fclose($handle);
                }
                $titles = array_shift($arrResult);
                $keys = array('name', 'code', 'barcode_symbology', 'brand', 'location', 'category_code', 'unit', 'sale_unit', 'purchase_unit', 'cost', 'price', 'alert_quantity', 'tax_rate', 'tax_method', 'image', 'subcategory_code', 'variants', 'cf1', 'cf2', 'cf3', 'cf4', 'cf5', 'cf6','image_url');

                $final = array();
                foreach ($arrResult as $key => $value) {
                    $final[] = array_combine($keys, $value);
                }
                // $this->sma->print_arrays($final);
                $rw = 2; $items = array();
                foreach ($final as $csv_pr) {
                    if ( ! $this->products_model->getProductByCode(trim($this->data['store']->code.$csv_pr['code']))) {
                        if ($catd = $this->products_model->getCategoryByCode(trim($csv_pr['category_code']))) {
                            $brand = $this->products_model->getBrandByName(trim($csv_pr['brand']));
                            $location = $this->products_model->getLocationByName(trim($csv_pr['location']));
                            $warehouse = $this->products_model->getWarehouseByName(trim($csv_pr['cf1']));
                            if(!$warehouse)
                            {
                                $this->session->set_flashdata('error', "Check warehouse!");
                                admin_redirect("products/import_csv");
                            }
                            $store = $this->products_model->getStoreByCode(trim($csv_pr['cf6']));
                            $unit = $this->products_model->getUnitByCode(trim($csv_pr['unit']));
                            $base_unit = $unit ? $unit->id : NULL;
                            $sale_unit = $base_unit;
                            $purcahse_unit = $base_unit;
                            if ($base_unit) {
                                $units = $this->site->getUnitsByBUID($base_unit);
                                foreach ($units as $u) {
                                    if ($u->code == trim($csv_pr['sale_unit'])) {
                                        $sale_unit = $u->id;
                                    }
                                    if ($u->code == trim($csv_pr['purchase_unit'])) {
                                        $purcahse_unit = $u->id;
                                    }
                                }
                            } else {
                                $this->session->set_flashdata('error', lang("check_unit") . " (" . $csv_pr['unit'] . "). " . lang("unit_code_x_exist") . " " . lang("line_no") . " " . $rw);
                                admin_redirect("products/import_csv");
                            }

                            $tax_details = $this->products_model->getTaxRateByName(trim($csv_pr['tax_rate']));
                            $prsubcat = $this->products_model->getCategoryByCode(trim($csv_pr['subcategory_code']));
                            $items[] = array (
                                'code' => $this->data['store']->code.trim($csv_pr['code']),
                                'name' => trim($csv_pr['name']),
                                'category_id' => $catd->id,
                                'barcode_symbology' => mb_strtolower(trim($csv_pr['barcode_symbology']), 'UTF-8'),
                                'brand' => ($brand ? $brand->id : NULL),
                                'location' => ($location ? $location->id : NULL),
                                'unit' => $base_unit,
                                'sale_unit' => $sale_unit,
                                'purchase_unit' => $purcahse_unit,
                                'cost' => trim($csv_pr['cost']),
                                'price' => trim($csv_pr['price']),
                                'alert_quantity' => trim($csv_pr['alert_quantity']),
                                'tax_rate' => ($tax_details ? $tax_details->id : NULL),
                                'tax_method' => ($csv_pr['tax_method'] == 'exclusive' ? 1 : 0),
                                'subcategory_id' => ($prsubcat ? $prsubcat->id : NULL),
                                'variants' => trim($csv_pr['variants']),
                                'image' => trim($csv_pr['image']),
                                'warehouse' => trim($warehouse->id),
                                'quantity' => trim($csv_pr['cf2']),
                                'cf1' => trim($csv_pr['cf3']),
                                'cf2' => trim($csv_pr['cf4']),
                                'cf3' => trim($csv_pr['cf5']),
                                'store_id' => $this->data['store']->id,
                                'image_url' => trim($csv_pr['image_url']),
                                
                               
                                );
                        } else {
                            $this->session->set_flashdata('error', lang("check_category_code") . " (" . $csv_pr['category_code'] . "). " . lang("category_code_x_exist") . " " . lang("line_no") . " " . $rw);
                            admin_redirect("products/import_csv");
                        }
                    }else{
                        $this->session->set_flashdata('error', "Product existed!");
                        admin_redirect("products/import_csv");
                    }

                    $rw++;
                }
            }

            // $this->sma->print_arrays($items);
        }

        if ($this->form_validation->run() == true && $prs = $this->products_model->add_products($items)) {
            $this->session->set_flashdata('message', sprintf(lang("products_added"), $prs));
            admin_redirect('products');
        } else {

            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));

            $this->data['userfile'] = array('name' => 'userfile',
                'id' => 'userfile',
                'type' => 'text',
                'value' => $this->form_validation->set_value('userfile')
            );

            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('import_products_by_csv')));
            $meta = array('page_title' => lang('import_products_by_csv'), 'bc' => $bc);
            $this->page_construct('products/import_csv', $meta, $this->data);

        }
    }

    /* ------------------------------------------------------------------ */

    function update_price()
    {
        $this->sma->checkPermissions('csv');
        $this->load->helper('security');
        $this->form_validation->set_rules('userfile', lang("upload_file"), 'xss_clean');

        if ($this->form_validation->run() == true) {

            if (DEMO) {
                $this->session->set_flashdata('message', lang("disabled_in_demo"));
                admin_redirect('welcome');
            }

            if (isset($_FILES["userfile"])) {

                $this->load->library('upload');
                $config['upload_path'] = $this->digital_upload_path;
                $config['allowed_types'] = 'csv';
                $config['max_size'] = $this->allowed_file_size;
                $config['overwrite'] = TRUE;
                $config['encrypt_name'] = TRUE;
                $config['max_filename'] = 25;
                $this->upload->initialize($config);

                if (!$this->upload->do_upload()) {
                    $error = $this->upload->display_errors();
                    $this->session->set_flashdata('error', $error);
                    admin_redirect("products");
                }

                $csv = $this->upload->file_name;

                $arrResult = array();
                $handle = fopen($this->digital_upload_path . $csv, "r");
                if ($handle) {
                    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
                        $arrResult[] = $row;
                    }
                    fclose($handle);
                }
                $titles = array_shift($arrResult);

                $keys = array('code', 'price');

                $final = array();

                foreach ($arrResult as $key => $value) {
                    $final[] = array_combine($keys, $value);
                }
                $rw = 2;
                foreach ($final as $csv_pr) {
                    if (!$this->products_model->getProductByCode(trim($csv_pr['code']))) {
                        $this->session->set_flashdata('message', lang("check_product_code") . " (" . $csv_pr['code'] . "). " . lang("code_x_exist") . " " . lang("line_no") . " " . $rw);
                        admin_redirect("products");
                    }
                    $rw++;
                }
            }

        } elseif ($this->input->post('update_price')) {
            $this->session->set_flashdata('error', validation_errors());
            admin_redirect("system_settings/group_product_prices/".$group_id);
        }

        if ($this->form_validation->run() == true && !empty($final)) {
            $this->products_model->updatePrice($final);
            $this->session->set_flashdata('message', lang("price_updated"));
            admin_redirect('products');
        } else {

            $this->data['userfile'] = array('name' => 'userfile',
                'id' => 'userfile',
                'type' => 'text',
                'value' => $this->form_validation->set_value('userfile')
            );
            $this->data['modal_js'] = $this->site->modal_js();
            $this->load->view($this->theme.'products/update_price', $this->data);

        }
    }

    /* ------------------------------------------------------------------------------- */

    function delete($id = NULL)
    {
        $this->sma->checkPermissions(NULL, TRUE);

        if ($this->input->get('id')) {
            $id = $this->input->get('id');
        }
        //check if product has been used
        if($this->db->where('product_id',$id)->get('sale_items')->row())
        {
            $this->sma->send_json(array('error' => 1, 'msg' => lang("this_product_has_been_used")));
        }
        if($this->db->where('product_id',$id)->get('adjustment_items')->row())
        {
            $this->sma->send_json(array('error' => 1, 'msg' => lang("this_product_has_been_used")));
        }
        if ($this->products_model->deleteProduct($id)) {
            if($this->input->is_ajax_request()) {
                $this->sma->send_json(array('error' => 0, 'msg' => lang("product_deleted")));
            }
            $this->session->set_flashdata('message', lang('product_deleted'));
            admin_redirect('welcome');
        }

    }

    /* ----------------------------------------------------------------------------- */

    function quantity_adjustments($warehouse_id = NULL)
    {
        $this->sma->checkPermissions('adjustments');

        if ($this->Owner || $this->Admin || !$this->session->userdata('warehouse_id')) {
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']);
            $this->data['warehouse'] = $warehouse_id ? $this->site->getWarehouseByID($warehouse_id) : null;
        } else {
            $this->data['warehouses'] = null;
            $this->data['warehouse'] = $this->session->userdata('warehouse_id') ? $this->site->getWarehouseByID($this->session->userdata('warehouse_id')) : null;
        }
	 $this->data['stores'] = $this->site->getAllStores();
        $this->data['error'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('error');
        $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('quantity_adjustments')));
        $meta = array('page_title' => lang('quantity_adjustments'), 'bc' => $bc);
        $this->page_construct('products/quantity_adjustments', $meta, $this->data);
    }

    function getadjustments($warehouse_id = NULL)
    {
        $this->sma->checkPermissions('adjustments');

        $delete_link = "<a href='#' class='tip po' title='<b>" . $this->lang->line("delete_adjustment") . "</b>' data-content=\"<p>"
            . lang('r_u_sure') . "</p><a class='btn btn-danger po-delete' href='" . admin_url('products/delete_adjustment/$1') . "'>"
            . lang('i_m_sure') . "</a> <button class='btn po-close'>" . lang('no') . "</button>\"  rel='popover'><i class=\"fa fa-trash-o\"></i></a>";

        $this->load->library('datatables');
        $this->datatables
            ->select("{$this->db->dbprefix('adjustments')}.id as id, date, reference_no, warehouses.name as wh_name, CONCAT({$this->db->dbprefix('users')}.first_name, ' ', {$this->db->dbprefix('users')}.last_name) as created_by, note, attachment")
            ->from('adjustments')
            ->join('warehouses', 'warehouses.id=adjustments.warehouse_id', 'left')
            ->join('users', 'users.id=adjustments.created_by', 'left')
            ->group_by("adjustments.id");
            if ($warehouse_id) {
                $this->datatables->where('adjustments.warehouse_id', $warehouse_id);
            }
	if($this->data['store_id']!=0)
	{
	 $this->datatables->where('adjustments.store_id',$this->data['store_id']);
	}
        $this->datatables->add_column("Actions", "<div class='text-center'><a href='" . admin_url('products/edit_adjustment/$1') . "' class='tip' title='" . lang("edit_adjustment") . "'><i class='fa fa-edit'></i></a> " . $delete_link . "</div>", "id");

        echo $this->datatables->generate();

    }

    public function view_adjustment($id)
    {
        $this->sma->checkPermissions('adjustments', TRUE);

        $adjustment = $this->products_model->getAdjustmentByID($id);
        if (!$id || !$adjustment) {
            $this->session->set_flashdata('error', lang('adjustment_not_found'));
            $this->sma->md();
        }

        $this->data['inv'] = $adjustment;
        $this->data['rows'] = $this->products_model->getAdjustmentItems($id);
        $this->data['created_by'] = $this->site->getUser($adjustment->created_by);
        $this->data['updated_by'] = $this->site->getUser($adjustment->updated_by);
        $this->data['warehouse'] = $this->site->getWarehouseByID($adjustment->warehouse_id);
        $this->load->view($this->theme.'products/view_adjustment', $this->data);
    }

    function add_adjustment($count_id = NULL)
    {
        $this->sma->checkPermissions('adjustments', true);
        $this->form_validation->set_rules('warehouse', lang("warehouse"), 'required');

        if ($this->form_validation->run() == true) {

            if ($this->Owner || $this->Admin) {
                $date = $this->sma->fld($this->input->post('date'));
            } else {
                $date = date('Y-m-d H:s:i');
            }

            $reference_no = $this->input->post('reference_no') ? $this->input->post('reference_no') : $this->site->getReference('qa');
            $warehouse_id = $this->input->post('warehouse');
            $note = $this->sma->clear_tags($this->input->post('note'));

            $i = isset($_POST['product_id']) ? sizeof($_POST['product_id']) : 0;
            for ($r = 0; $r < $i; $r++) {

                $product_id = $_POST['product_id'][$r];
                $type = $_POST['type'][$r];
                $quantity = $_POST['quantity'][$r];
                $serial = $_POST['serial'][$r];
                $variant = isset($_POST['variant'][$r]) && !empty($_POST['variant'][$r]) ? $_POST['variant'][$r] : NULL;

                if (!$this->Settings->overselling && $type == 'subtraction') {
                    if ($variant) {
                        if($op_wh_qty = $this->products_model->getProductWarehouseOptionQty($variant, $warehouse_id)) {
                            if ($op_wh_qty->quantity < $quantity) {
                                $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage'));
                                redirect($_SERVER["HTTP_REFERER"]);
                            }
                        } else {
                            $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage'));
                            redirect($_SERVER["HTTP_REFERER"]);
                        }
                    }
                    if($wh_qty = $this->products_model->getProductQuantity($product_id, $warehouse_id)) {
                        if ($wh_qty['quantity'] < $quantity) {
                            $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage'));
                            redirect($_SERVER["HTTP_REFERER"]);
                        }
                    } else {
                        $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage'));
                        redirect($_SERVER["HTTP_REFERER"]);
                    }
                }

                $products[] = array(
                    'product_id' => $product_id,
                    'type' => $type,
                    'quantity' => $quantity,
                    'warehouse_id' => $warehouse_id,
                    'option_id' => $variant,
                    'serial_no' => $serial,
                    );
		
            }

            if (empty($products)) {
                $this->form_validation->set_rules('product', lang("products"), 'required');
            } else {
                krsort($products);
            }

            $data = array(
                'date' => $date,
                'reference_no' => $reference_no,
                'warehouse_id' => $warehouse_id,
                'note' => $note,
                'created_by' => $this->session->userdata('user_id'),
                'count_id' => $this->input->post('count_id') ? $this->input->post('count_id') : NULL,
                );
	    if($this->data['store_id']==0)
		{
			 $data['store_id'] = $this->input->post('store');
		}else{
			$data['store_id'] =$this->data['store_id'];
		}

            if ($_FILES['document']['size'] > 0) {
                $this->load->library('upload');
                $config['upload_path'] = $this->digital_upload_path;
                $config['allowed_types'] = $this->digital_file_types;
                $config['max_size'] = $this->allowed_file_size;
                $config['overwrite'] = false;
                $config['encrypt_name'] = true;
                $this->upload->initialize($config);
                if (!$this->upload->do_upload('document')) {
                    $error = $this->upload->display_errors();
                    $this->session->set_flashdata('error', $error);
                    redirect($_SERVER["HTTP_REFERER"]);
                }
                $photo = $this->upload->file_name;
                $data['attachment'] = $photo;
            }

            // $this->sma->print_arrays($data, $products);

        }

        if ($this->form_validation->run() == true && $this->products_model->addAdjustment($data, $products)) {
            $this->session->set_userdata('remove_qals', 1);
            $this->session->set_flashdata('message', lang("quantity_adjusted"));
            admin_redirect('products/quantity_adjustments');
        } else {

            if ($count_id) {
                $stock_count = $this->products_model->getStouckCountByID($count_id);
                $items = $this->products_model->getStockCountItems($count_id);
                $c = rand(100000, 9999999);
                foreach ($items as $item) {
                    if ($item->counted != $item->expected) {
                        $product = $this->site->getProductByID($item->product_id);
                        $row = json_decode('{}');
                        $row->id = $item->product_id;
                        $row->code = $product->code;
                        $row->name = $product->name;
                        $row->qty = $item->counted-$item->expected;
                        $row->type = $row->qty > 0 ? 'addition' : 'subtraction';
                        $row->qty = $row->qty > 0 ? $row->qty : (0-$row->qty);
                        $options = $this->products_model->getProductOptions($product->id);
                        $row->option = $item->product_variant_id ? $item->product_variant_id : 0;
                        $row->serial = '';
                        $ri = $this->Settings->item_addition ? $product->id : $c;

                        $pr[$ri] = array('id' => str_replace(".", "", microtime(true)), 'item_id' => $row->id, 'label' => $row->name . " (" . $row->code . ")",
                            'row' => $row, 'options' => $options);
                        $c++;
                    }
                }
            }
            $this->data['adjustment_items'] = $count_id ? json_encode($pr) : FALSE;
            $this->data['warehouse_id'] = $count_id ? $stock_count->warehouse_id : FALSE;
            $this->data['count_id'] = $count_id;
	     $this->data['stores'] = $this->site->getAllStores();
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']);
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('add_adjustment')));
            $meta = array('page_title' => lang('add_adjustment'), 'bc' => $bc);
            $this->page_construct('products/add_adjustment', $meta, $this->data);

        }
    }

    function edit_adjustment($id)
    {
        $this->sma->checkPermissions('adjustments', true);
        $adjustment = $this->products_model->getAdjustmentByID($id);
        if (!$id || !$adjustment) {
            $this->session->set_flashdata('error', lang('adjustment_not_found'));
            $this->sma->md();
        }
        $this->form_validation->set_rules('warehouse', lang("warehouse"), 'required');

        if ($this->form_validation->run() == true) {

            if ($this->Owner || $this->Admin) {
                $date = $this->sma->fld($this->input->post('date'));
            } else {
                $date = $adjustment->date;
            }

            $reference_no = $this->input->post('reference_no');
            $warehouse_id = $this->input->post('warehouse');
            $note = $this->sma->clear_tags($this->input->post('note'));

            $i = isset($_POST['product_id']) ? sizeof($_POST['product_id']) : 0;
            for ($r = 0; $r < $i; $r++) {

                $product_id = $_POST['product_id'][$r];
                $type = $_POST['type'][$r];
                $quantity = $_POST['quantity'][$r];
                $serial = $_POST['serial'][$r];
                $variant = isset($_POST['variant'][$r]) && !empty($_POST['variant'][$r]) ? $_POST['variant'][$r] : null;

                if (!$this->Settings->overselling && $type == 'subtraction') {
                    if ($variant) {
                        if($op_wh_qty = $this->products_model->getProductWarehouseOptionQty($variant, $warehouse_id)) {
                            if ($op_wh_qty->quantity < $quantity) {
                                $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage'));
                                redirect($_SERVER["HTTP_REFERER"]);
                            }
                        } else {
                            $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage'));
                            redirect($_SERVER["HTTP_REFERER"]);
                        }
                    }
                    if($wh_qty = $this->products_model->getProductQuantity($product_id, $warehouse_id)) {
                        if ($wh_qty['quantity'] < $quantity) {
                            $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage'));
                            redirect($_SERVER["HTTP_REFERER"]);
                        }
                    } else {
                        $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage'));
                        redirect($_SERVER["HTTP_REFERER"]);
                    }
                }

                $products[] = array(
                    'product_id' => $product_id,
                    'type' => $type,
                    'quantity' => $quantity,
                    'warehouse_id' => $warehouse_id,
                    'option_id' => $variant,
                    'serial_no' => $serial,
                    );

            }

            if (empty($products)) {
                $this->form_validation->set_rules('product', lang("products"), 'required');
            } else {
                krsort($products);
            }

            $data = array(
                'date' => $date,
                'reference_no' => $reference_no,
                'warehouse_id' => $warehouse_id,
                'note' => $note,
                'created_by' => $this->session->userdata('user_id')
                );

            if ($_FILES['document']['size'] > 0) {
                $this->load->library('upload');
                $config['upload_path'] = $this->digital_upload_path;
                $config['allowed_types'] = $this->digital_file_types;
                $config['max_size'] = $this->allowed_file_size;
                $config['overwrite'] = false;
                $config['encrypt_name'] = true;
                $this->upload->initialize($config);
                if (!$this->upload->do_upload('document')) {
                    $error = $this->upload->display_errors();
                    $this->session->set_flashdata('error', $error);
                    redirect($_SERVER["HTTP_REFERER"]);
                }
                $photo = $this->upload->file_name;
                $data['attachment'] = $photo;
            }

            // $this->sma->print_arrays($data, $products);

        }

        if ($this->form_validation->run() == true && $this->products_model->updateAdjustment($id, $data, $products)) {
            $this->session->set_userdata('remove_qals', 1);
            $this->session->set_flashdata('message', lang("quantity_adjusted"));
            admin_redirect('products/quantity_adjustments');
        } else {

            $inv_items = $this->products_model->getAdjustmentItems($id);
            krsort($inv_items);
            $c = rand(100000, 9999999);
            foreach ($inv_items as $item) {
                $product = $this->site->getProductByID($item->product_id);
                $row = json_decode('{}');
                $row->id = $item->product_id;
                $row->code = $product->code;
                $row->name = $product->name;
                $row->qty = $item->quantity;
                $row->type = $item->type;
                $options = $this->products_model->getProductOptions($product->id);
                $row->option = $item->option_id ? $item->option_id : 0;
                $row->serial = $item->serial_no ? $item->serial_no : '';
                $ri = $this->Settings->item_addition ? $product->id : $c;

                $pr[$ri] = array('id' => str_replace(".", "", microtime(true)), 'item_id' => $row->id, 'label' => $row->name . " (" . $row->code . ")",
                    'row' => $row, 'options' => $options);
                $c++;
            }

            $this->data['adjustment'] = $adjustment;
            $this->data['adjustment_items'] = json_encode($pr);
            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']);
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('edit_adjustment')));
            $meta = array('page_title' => lang('edit_adjustment'), 'bc' => $bc);
            $this->page_construct('products/edit_adjustment', $meta, $this->data);

        }
    }

    function add_adjustment_by_csv()
    {
        $this->sma->checkPermissions('adjustments', true);
        $this->form_validation->set_rules('warehouse', lang("warehouse"), 'required');

        if ($this->form_validation->run() == true) {

            if ($this->Owner || $this->Admin) {
                $date = $this->sma->fld($this->input->post('date'));
            } else {
                $date = date('Y-m-d H:s:i');
            }

            $reference_no = $this->input->post('reference_no') ? $this->input->post('reference_no') : $this->site->getReference('qa');
            $warehouse_id = $this->input->post('warehouse');
            $note = $this->sma->clear_tags($this->input->post('note'));
            $data = array(
                'date' => $date,
                'reference_no' => $reference_no,
                'warehouse_id' => $warehouse_id,
                'note' => $note,
                'created_by' => $this->session->userdata('user_id'),
                'store_id' => $this->data['store_id'],
                'count_id' => NULL,
                );

            if ($_FILES['csv_file']['size'] > 0) {

                $this->load->library('upload');
                $config['upload_path'] = $this->digital_upload_path;
                $config['allowed_types'] = 'csv';
                $config['max_size'] = $this->allowed_file_size;
                $config['overwrite'] = false;
                $config['encrypt_name'] = true;
                $this->upload->initialize($config);
                if (!$this->upload->do_upload('csv_file')) {
                    $error = $this->upload->display_errors();
                    $this->session->set_flashdata('error', $error);
                    redirect($_SERVER["HTTP_REFERER"]);
                }

                $csv = $this->upload->file_name;
                $data['attachment'] = $csv;

                $arrResult = array();
                $handle = fopen($this->digital_upload_path . $csv, "r");
                if ($handle) {
                    while (($row = fgetcsv($handle, 5000, ",")) !== FALSE) {
                        $arrResult[] = $row;
                    }
                    fclose($handle);
                }
                $titles = array_shift($arrResult);
                $keys = array('code', 'quantity', 'variant');
                $final = array();
                foreach ($arrResult as $key => $value) {
                    $final[] = array_combine($keys, $value);
                }
                // $this->sma->print_arrays($final);
                $rw = 2;
                foreach ($final as $pr) {
                    if ($product = $this->products_model->getProductByCode(trim($pr['code']))) {
                        $csv_variant = trim($pr['variant']);
                        $variant = !empty($csv_variant) ? $this->products_model->getProductVariantID($product->id, $csv_variant) : FALSE;

                        $csv_quantity = trim($pr['quantity']);
                        $type = $csv_quantity > 0 ? 'addition' : 'subtraction';
                        $quantity = $csv_quantity > 0 ? $csv_quantity : (0-$csv_quantity);

                        if (!$this->Settings->overselling && $type == 'subtraction') {
                            if ($variant) {
                                if($op_wh_qty = $this->products_model->getProductWarehouseOptionQty($variant, $warehouse_id)) {
                                    if ($op_wh_qty->quantity < $quantity) {
                                        $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage'). ' - ' . lang('line_no') . ' ' . $rw);
                                        redirect($_SERVER["HTTP_REFERER"]);
                                    }
                                } else {
                                    $this->session->set_flashdata('error', lang('warehouse_option_qty_is_less_than_damage'). ' - ' . lang('line_no') . ' ' . $rw);
                                    redirect($_SERVER["HTTP_REFERER"]);
                                }
                            }
                            if($wh_qty = $this->products_model->getProductQuantity($product->id, $warehouse_id)) {
                                if ($wh_qty['quantity'] < $quantity) {
                                    $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage'). ' - ' . lang('line_no') . ' ' . $rw);
                                    redirect($_SERVER["HTTP_REFERER"]);
                                }
                            } else {
                                $this->session->set_flashdata('error', lang('warehouse_qty_is_less_than_damage'). ' - ' . lang('line_no') . ' ' . $rw);
                                redirect($_SERVER["HTTP_REFERER"]);
                            }
                        }
                        
                        $products[] = array(
                            'product_id' => $product->id,
                            'type' => $type,
                            'quantity' => $quantity,
                            'warehouse_id' => $warehouse_id,
                            'option_id' => $variant,
                            );

                    } else {
                        $this->session->set_flashdata('error', lang('check_product_code') . ' (' . $pr['code'] . '). ' . lang('product_code_x_exist') . ' ' . lang('line_no') . ' ' . $rw);
                        redirect($_SERVER["HTTP_REFERER"]);
                    }
                    $rw++;
                }

            } else {
                $this->form_validation->set_rules('csv_file', lang("upload_file"), 'required');
            }

            // $this->sma->print_arrays($data, $products);

        }

        if ($this->form_validation->run() == true && $this->products_model->addAdjustment($data, $products)) {
            $this->session->set_flashdata('message', lang("quantity_adjusted"));
            admin_redirect('products/quantity_adjustments');
        } else {

            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']);
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('add_adjustment')));
            $meta = array('page_title' => lang('add_adjustment_by_csv'), 'bc' => $bc);
            $this->page_construct('products/add_adjustment_by_csv', $meta, $this->data);

        }
    }

    function delete_adjustment($id = NULL)
    {
        $this->sma->checkPermissions('delete', TRUE);

        //$this->sma->send_json(array('error' =>1 , 'msg' => lang("Can not delete adjustment that has been submitted")));

        if ($this->products_model->deleteAdjustment($id)) {
            $this->sma->send_json(array('error' => 0, 'msg' => lang("adjustment_deleted")));
        }

    }

    /* --------------------------------------------------------------------------------------------- */

    function modal_view($id = NULL)
    {
        $this->sma->checkPermissions('index', TRUE);

        $pr_details = $this->site->getProductByID($id);
        if (!$id || !$pr_details) {
            $this->session->set_flashdata('error', lang('prduct_not_found'));
            $this->sma->md();
        }
        $this->data['barcode'] = "<img src='" . admin_url('products/gen_barcode/' . $pr_details->code . '/' . $pr_details->barcode_symbology . '/40/0') . "' alt='" . $pr_details->code . "' class='pull-left' />";
        if ($pr_details->type == 'combo') {
            $this->data['combo_items'] = $this->products_model->getProductComboItems($id);
        }
        $this->data['product'] = $pr_details;
        $this->data['unit'] = $this->site->getUnitByID($pr_details->unit);
        $this->data['brand'] = $this->site->getBrandByID($pr_details->brand);
        $this->data['images'] = $this->products_model->getProductPhotos($id);
        $this->data['category'] = $this->site->getCategoryByID($pr_details->category_id);
        $this->data['subcategory'] = $pr_details->subcategory_id ? $this->site->getCategoryByID($pr_details->subcategory_id) : NULL;
        $this->data['tax_rate'] = $pr_details->tax_rate ? $this->site->getTaxRateByID($pr_details->tax_rate) : NULL;
        $this->data['warehouses'] = $this->products_model->getAllWarehousesWithPQ($id);
        $this->data['options'] = $this->products_model->getProductOptionsWithWH($id);
        $this->data['variants'] = $this->products_model->getProductOptions($id);

        $this->load->view($this->theme.'products/modal_view', $this->data);
    }

    function view($id = NULL)
    {
        $this->sma->checkPermissions('index');

        $pr_details = $this->products_model->getProductByID($id);
        if (!$id || !$pr_details) {
            $this->session->set_flashdata('error', lang('prduct_not_found'));
            redirect($_SERVER["HTTP_REFERER"]);
        }
        $this->data['barcode'] = "<img src='" . admin_url('products/gen_barcode/' . $pr_details->code . '/' . $pr_details->barcode_symbology . '/40/0') . "' alt='" . $pr_details->code . "' class='pull-left' />";
        if ($pr_details->type == 'combo') {
            $this->data['combo_items'] = $this->products_model->getProductComboItems($id);
        }
        $this->data['product'] = $pr_details;
        $this->data['unit'] = $this->site->getUnitByID($pr_details->unit);
        $this->data['brand'] = $this->site->getBrandByID($pr_details->brand);
        $this->data['location'] = $this->site->getLocationByID($pr_details->location);
        $this->data['images'] = $this->products_model->getProductPhotos($id);
        $this->data['category'] = $this->site->getCategoryByID($pr_details->category_id);
        $this->data['subcategory'] = $pr_details->subcategory_id ? $this->site->getCategoryByID($pr_details->subcategory_id) : NULL;
        $this->data['tax_rate'] = $pr_details->tax_rate ? $this->site->getTaxRateByID($pr_details->tax_rate) : NULL;
        $this->data['popup_attributes'] = $this->popup_attributes;
        $this->data['warehouses'] = $this->products_model->getAllWarehousesWithPQ($id);
        $this->data['options'] = $this->products_model->getProductOptionsWithWH($id);
        $this->data['variants'] = $this->products_model->getProductOptions($id);
        $this->data['sold'] = $this->products_model->getSoldQty($id);
        $this->data['purchased'] = $this->products_model->getPurchasedQty($id);

        $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => $pr_details->name));
        $meta = array('page_title' => $pr_details->name, 'bc' => $bc);
        $this->page_construct('products/view', $meta, $this->data);
    }

    function pdf($id = NULL, $view = NULL)
    {
        $this->sma->checkPermissions('index');

        $pr_details = $this->products_model->getProductByID($id);
        if (!$id || !$pr_details) {
            $this->session->set_flashdata('error', lang('prduct_not_found'));
            redirect($_SERVER["HTTP_REFERER"]);
        }
        $this->data['barcode'] = "<img src='" . admin_url('products/gen_barcode/' . $pr_details->code . '/' . $pr_details->barcode_symbology . '/40/0') . "' alt='" . $pr_details->code . "' class='pull-left' />";
        if ($pr_details->type == 'combo') {
            $this->data['combo_items'] = $this->products_model->getProductComboItems($id);
        }
        $this->data['product'] = $pr_details;
        $this->data['unit'] = $this->site->getUnitByID($pr_details->unit);
        $this->data['brand'] = $this->site->getBrandByID($pr_details->brand);
        $this->data['images'] = $this->products_model->getProductPhotos($id);
        $this->data['category'] = $this->site->getCategoryByID($pr_details->category_id);
        $this->data['subcategory'] = $pr_details->subcategory_id ? $this->site->getCategoryByID($pr_details->subcategory_id) : NULL;
        $this->data['tax_rate'] = $pr_details->tax_rate ? $this->site->getTaxRateByID($pr_details->tax_rate) : NULL;
        $this->data['popup_attributes'] = $this->popup_attributes;
        $this->data['warehouses'] = $this->products_model->getAllWarehousesWithPQ($id);
        $this->data['options'] = $this->products_model->getProductOptionsWithWH($id);
        $this->data['variants'] = $this->products_model->getProductOptions($id);

        $name = $pr_details->code . '_' . str_replace('/', '_', $pr_details->name) . ".pdf";
        if ($view) {
            $this->load->view($this->theme . 'products/pdf', $this->data);
        } else {
            $html = $this->load->view($this->theme . 'products/pdf', $this->data, TRUE);
            if (! $this->Settings->barcode_img) {
                $html = preg_replace("'\<\?xml(.*)\?\>'", '', $html);
            }
            $this->sma->generate_pdf($html, $name);
        }
    }

    function getSubCategories($category_id = NULL)
    {
        if ($rows = $this->products_model->getSubCategories($category_id)) {
            $data = json_encode($rows);
        } else {
            $data = false;
        }
        echo $data;
    }
    

    function getFeatures($model_category_id = NULL)
    {
        if ($rows = $this->products_model->getFeatures($model_category_id)) {
            $data = json_encode($rows);
        } else {
            $data = false;
        }
        echo $data;
    }

    
    function getModelSubcategories($parent_id = NULL)
    {
        if ($rows = $this->products_model->getModelSubcategories($parent_id)) {
            $data = json_encode($rows);
        } else {
            $data = false;
        }
        echo $data;
    }

    function getWarehousesByStore($store_id = Null)
    {
        if ($rows = $this->products_model->getWarehousesByStore($store_id)) {
            $data = json_encode($rows);
        } else {
            $data = false;
        }
        echo $data;
    }

    function product_actions($wh = NULL)
    {
        if (!$this->Owner && !$this->GP['bulk_actions']) {
            $this->session->set_flashdata('warning', lang('access_denied'));
            redirect($_SERVER["HTTP_REFERER"]);
        }

        $this->form_validation->set_rules('form_action', lang("form_action"), 'required');

        if ($this->form_validation->run() == true) {

            if (!empty($_POST['val'])) {
                if ($this->input->post('form_action') == 'sync_quantity') {

                    foreach ($_POST['val'] as $id) {
                        $this->site->syncQuantity(NULL, NULL, NULL, $id);
                    }
                    $this->session->set_flashdata('message', $this->lang->line("products_quantity_sync"));
                    redirect($_SERVER["HTTP_REFERER"]);

                } elseif ($this->input->post('form_action') == 'delete') {

                    $this->sma->checkPermissions('delete');
                    foreach ($_POST['val'] as $id) {
                        
                        if($this->db->where('product_id',$id)->get('sale_items')->row())
                        {
                           continue;
                        }
                        if($this->db->where('product_id',$id)->get('adjustment_items')->row())
                        {
                            continue;
                        }

                        $this->products_model->deleteProduct($id);
                    }
                    $this->session->set_flashdata('message', $this->lang->line("products_deleted"));
                    redirect($_SERVER["HTTP_REFERER"]);

                } elseif ($this->input->post('form_action') == 'labels') {

                    foreach ($_POST['val'] as $id) {
                        $row = $this->products_model->getProductByID($id);
                        $selected_variants = false;
                        if ($variants = $this->products_model->getProductOptions($row->id)) {
                            foreach ($variants as $variant) {
                                $selected_variants[$variant->id] = $variant->quantity > 0 ? 1 : 0;
                            }
                        }
                        $pr[$row->id] = array('id' => $row->id, 'label' => $row->name . " (" . $row->code . ")", 'code' => $row->code, 'name' => $row->name, 'price' => $row->price, 'qty' => $row->quantity, 'variants' => $variants, 'selected_variants' => $selected_variants);
                    }

                    $this->data['items'] = isset($pr) ? json_encode($pr) : false;
                    $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
                    $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('print_barcodes')));
                    $meta = array('page_title' => lang('print_barcodes'), 'bc' => $bc);
                    $this->page_construct('products/print_barcodes', $meta, $this->data);

                } elseif ($this->input->post('form_action') == 'export_excel') {

                    $this->load->library('excel');
                    $this->excel->setActiveSheetIndex(0);
                    $this->excel->getActiveSheet()->setTitle('Products');
                    $this->excel->getActiveSheet()->SetCellValue('A1', lang('name'));
                    $this->excel->getActiveSheet()->SetCellValue('B1', lang('code'));
                    $this->excel->getActiveSheet()->SetCellValue('C1', lang('barcode_symbology'));
                    $this->excel->getActiveSheet()->SetCellValue('D1', lang('brand'));
                    $this->excel->getActiveSheet()->SetCellValue('E1', lang('category_code'));
                    $this->excel->getActiveSheet()->SetCellValue('F1', lang('unit_code'));
                    $this->excel->getActiveSheet()->SetCellValue('G1', lang('sale').' '.lang('unit_code'));
                    $this->excel->getActiveSheet()->SetCellValue('H1', lang('purchase').' '.lang('unit_code'));
                    $this->excel->getActiveSheet()->SetCellValue('I1', lang('cost'));
                    $this->excel->getActiveSheet()->SetCellValue('J1', lang('price'));
                    $this->excel->getActiveSheet()->SetCellValue('K1', lang('alert_quantity'));
                    $this->excel->getActiveSheet()->SetCellValue('L1', lang('tax_rate'));
                    $this->excel->getActiveSheet()->SetCellValue('M1', lang('tax_method'));
                    $this->excel->getActiveSheet()->SetCellValue('N1', lang('image'));
                    $this->excel->getActiveSheet()->SetCellValue('O1', lang('subcategory_code'));
                    $this->excel->getActiveSheet()->SetCellValue('P1', lang('product_variants'));
                    $this->excel->getActiveSheet()->SetCellValue('Q1', lang('pcf1'));
                    $this->excel->getActiveSheet()->SetCellValue('R1', lang('pcf2'));
                    $this->excel->getActiveSheet()->SetCellValue('S1', lang('pcf3'));
                    $this->excel->getActiveSheet()->SetCellValue('T1', lang('pcf4'));
                    $this->excel->getActiveSheet()->SetCellValue('U1', lang('pcf5'));
                    $this->excel->getActiveSheet()->SetCellValue('V1', lang('pcf6'));
                    $this->excel->getActiveSheet()->SetCellValue('W1', lang('quantity'));
                    $this->excel->getActiveSheet()->SetCellValue('X1', lang('location'));

                    $row = 2;
                    foreach ($_POST['val'] as $id) {
                        $product = $this->products_model->getProductDetail($id);
                        $brand = $this->site->getBrandByID($product->brand);
                        $base_unit = $sale_unit = $purchase_unit = '';
                        if($units = $this->site->getUnitsByBUID($product->unit)) {
                            foreach($units as $u) {
                                if ($u->id == $product->unit) {
                                    $base_unit = $u->code;
                                }
                                if ($u->id == $product->sale_unit) {
                                    $sale_unit = $u->code;
                                }
                                if ($u->id == $product->purchase_unit) {
                                    $purchase_unit = $u->code;
                                }
                            }
                        }
                        $variants = $this->products_model->getProductOptions($id);
                        $product_variants = '';
                        if ($variants) {
                            foreach ($variants as $variant) {
                                $product_variants .= trim($variant->name) . '|';
                            }
                        }
                                               
                        if ($wh) {
                            $quantity =$this->db->select_sum('quantity')->where('warehouse_id',$wh)->where('product_id',$product->id)->get('warehouses_products')->row();
                            
                        }else{
                            $quantity =$this->db->select_sum('quantity')->where('product_id',$product->id)->get('warehouses_products')->row();
                            
                        }
                        $quantity =  $quantity->quantity;
                        $this->excel->getActiveSheet()->SetCellValue('A' . $row, $product->name);
                        $this->excel->getActiveSheet()->SetCellValue('B' . $row, $product->code);
                        $this->excel->getActiveSheet()->SetCellValue('C' . $row, $product->barcode_symbology);
                        $this->excel->getActiveSheet()->SetCellValue('D' . $row, ($brand ? $brand->name : ''));
                        $this->excel->getActiveSheet()->SetCellValue('E' . $row, $product->category_code);
                        $this->excel->getActiveSheet()->SetCellValue('F' . $row, $base_unit);
                        $this->excel->getActiveSheet()->SetCellValue('G' . $row, $sale_unit);
                        $this->excel->getActiveSheet()->SetCellValue('H' . $row, $purchase_unit);
                        if ($this->Owner || $this->Admin || $this->session->userdata('show_cost')) {
                            $this->excel->getActiveSheet()->SetCellValue('I' . $row, $product->cost);
                        }
                        if ($this->Owner || $this->Admin || $this->session->userdata('show_price')) {
                            $this->excel->getActiveSheet()->SetCellValue('J' . $row, $product->price);
                        }
                        $this->excel->getActiveSheet()->SetCellValue('K' . $row, $product->alert_quantity);
                        $this->excel->getActiveSheet()->SetCellValue('L' . $row, $product->tax_rate_name);
                        $this->excel->getActiveSheet()->SetCellValue('M' . $row, $product->tax_method ? lang('exclusive') : lang('inclusive'));
                        $this->excel->getActiveSheet()->SetCellValue('N' . $row, $product->image);
                        $this->excel->getActiveSheet()->SetCellValue('O' . $row, $product->subcategory_code);
                        $this->excel->getActiveSheet()->SetCellValue('P' . $row, $product_variants);
                        $this->excel->getActiveSheet()->SetCellValue('Q' . $row, $product->cf1);
                        $this->excel->getActiveSheet()->SetCellValue('R' . $row, $product->cf2);
                        $this->excel->getActiveSheet()->SetCellValue('S' . $row, $product->cf3);
                        $this->excel->getActiveSheet()->SetCellValue('T' . $row, $product->cf4);
                        $this->excel->getActiveSheet()->SetCellValue('U' . $row, $product->cf5);
                        $this->excel->getActiveSheet()->SetCellValue('V' . $row, $product->cf6);
                        $this->excel->getActiveSheet()->SetCellValue('W' . $row, $quantity);
                        $this->excel->getActiveSheet()->SetCellValue('X' . $row, ($product->location ? $product->location : ''));
                        $row++;
                    }

                    $this->excel->getActiveSheet()->getColumnDimension('A')->setWidth(30);
                    $this->excel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
                    $this->excel->getActiveSheet()->getColumnDimension('D')->setWidth(15);
                    $this->excel->getActiveSheet()->getColumnDimension('E')->setWidth(20);
                    $this->excel->getActiveSheet()->getColumnDimension('N')->setWidth(40);
                    $this->excel->getActiveSheet()->getColumnDimension('O')->setWidth(30);
                    $this->excel->getActiveSheet()->getColumnDimension('P')->setWidth(30);
                    $this->excel->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
                    $filename = 'products_' . date('Y_m_d_H_i_s');
                    $this->load->helper('excel');
                    return create_excel($this->excel, $filename);

                }
            } else {
                $this->session->set_flashdata('error', $this->lang->line("no_product_selected"));
                redirect($_SERVER["HTTP_REFERER"]);
            }
        } else {
            $this->session->set_flashdata('error', validation_errors());
            redirect(isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : 'admin/products');
        }
    }

    public function delete_image($id = NULL)
    {
        $this->sma->checkPermissions('edit', true);
        if ($id && $this->input->is_ajax_request()) {
            header('Content-Type: application/json');
            $this->db->delete('product_photos', array('id' => $id));
            $this->sma->send_json(array('error' => 0, 'msg' => lang("image_deleted")));
        }
        $this->sma->send_json(array('error' => 1, 'msg' => lang("ajax_error")));
    }

    public function getSubUnits($unit_id)
    {
        // $unit = $this->site->getUnitByID($unit_id);
        // if ($units = $this->site->getUnitsByBUID($unit_id)) {
        //     array_push($units, $unit);
        // } else {
        //     $units = array($unit);
        // } 
        $units = $this->site->getUnitsByBUID($unit_id);
        // var_dump($units);die;
        $this->sma->send_json($units);
    }

    public function qa_suggestions()
    {
        $term = $this->input->get('term', true);
       
        if (strlen($term) < 1 || !$term) {
            die("<script type='text/javascript'>setTimeout(function(){ window.top.location.href = '" . admin_url('welcome') . "'; }, 10);</script>");
        }

        $analyzed = $this->sma->analyze_term($term);
        $sr = $analyzed['term'];
        $option_id = $analyzed['option_id'];

        $rows = $this->products_model->getQASuggestions($sr);
        if ($rows) {
            foreach ($rows as $row) {
                $row->qty = 1;
                $options = $this->products_model->getProductOptions($row->id);
                $row->option = $option_id;
                $row->serial = '';

                $pr[] = array('id' => str_replace(".", "", microtime(true)), 'item_id' => $row->id, 'label' => $row->name . " (" . $row->code . ")",
                    'row' => $row, 'options' => $options);

            }
            $this->sma->send_json($pr);
        } else {
            $this->sma->send_json(array(array('id' => 0, 'label' => lang('no_match_found'), 'value' => $term)));
        }
    }

    function adjustment_actions()
    {
        if (!$this->Owner && !$this->GP['bulk_actions']) {
            $this->session->set_flashdata('warning', lang('access_denied'));
            redirect($_SERVER["HTTP_REFERER"]);
        }

        $this->form_validation->set_rules('form_action', lang("form_action"), 'required');

        if ($this->form_validation->run() == true) {

            if (!empty($_POST['val'])) {
                if ($this->input->post('form_action') == 'delete') {

                    $this->sma->checkPermissions('delete');
                    foreach ($_POST['val'] as $id) {
                        $this->products_model->deleteAdjustment($id);
                    }
                    $this->session->set_flashdata('error', $this->lang->line("Can not delete adjustment that has been submitted!"));
                    redirect($_SERVER["HTTP_REFERER"]);

                } elseif ($this->input->post('form_action') == 'export_excel') {

                    $this->load->library('excel');
                    $this->excel->setActiveSheetIndex(0);
                    $this->excel->getActiveSheet()->setTitle('quantity_adjustments');
                    $this->excel->getActiveSheet()->SetCellValue('A1', lang('date'));
                    $this->excel->getActiveSheet()->SetCellValue('B1', lang('reference_no'));
                    $this->excel->getActiveSheet()->SetCellValue('C1', lang('warehouse'));
                    $this->excel->getActiveSheet()->SetCellValue('D1', lang('created_by'));
                    $this->excel->getActiveSheet()->SetCellValue('E1', lang('note'));
                    $this->excel->getActiveSheet()->SetCellValue('F1', lang('items'));

                    $row = 2;
                    foreach ($_POST['val'] as $id) {
                        $adjustment = $this->products_model->getAdjustmentByID($id);
                        $created_by = $this->site->getUser($adjustment->created_by);
                        $warehouse = $this->site->getWarehouseByID($adjustment->warehouse_id);
                        $items = $this->products_model->getAdjustmentItems($id);  
                        $products = '';
                        if ($items) {
                            foreach ($items as $item) {
                                $products .= $item->product_name.'('.$this->sma->formatQuantity($item->type == 'subtraction' ? -$item->quantity : $item->quantity).')'."\n";
                            }
                        }

                        $this->excel->getActiveSheet()->SetCellValue('A' . $row, $this->sma->hrld($adjustment->date));
                        $this->excel->getActiveSheet()->SetCellValue('B' . $row, $adjustment->reference_no);
                        $this->excel->getActiveSheet()->SetCellValue('C' . $row, $warehouse->name);
                        $this->excel->getActiveSheet()->SetCellValue('D' . $row, $created_by->first_name.' ' .$created_by->last_name);
                        $this->excel->getActiveSheet()->SetCellValue('E' . $row, $this->sma->decode_html($adjustment->note));
                        $this->excel->getActiveSheet()->SetCellValue('F' . $row, $products);
                        $row++;
                    }

                    $this->excel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
                    $this->excel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
                    $this->excel->getActiveSheet()->getColumnDimension('C')->setWidth(15);
                    $this->excel->getActiveSheet()->getColumnDimension('D')->setWidth(20);
                    $this->excel->getActiveSheet()->getColumnDimension('E')->setWidth(40);
                    $this->excel->getActiveSheet()->getColumnDimension('F')->setWidth(30);
                    $this->excel->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
                    $filename = 'quantity_adjustments_' . date('Y_m_d_H_i_s');
                    $this->load->helper('excel');
                    return create_excel($this->excel, $filename);
                }
            } else {
                $this->session->set_flashdata('error', $this->lang->line("no_record_selected"));
                redirect($_SERVER["HTTP_REFERER"]);
            }
        } else {
            $this->session->set_flashdata('error', validation_errors());
            redirect($_SERVER["HTTP_REFERER"]);
        }
    }

    function stock_counts($warehouse_id = NULL)
    {
        $this->sma->checkPermissions('stock_count');

        $this->data['error'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('error');
        if ($this->Owner || $this->Admin || !$this->session->userdata('warehouse_id')) {
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']);
            $this->data['warehouse_id'] = $warehouse_id;
            $this->data['warehouse'] = $warehouse_id ? $this->site->getWarehouseByID($warehouse_id) : NULL;
        } else {
            $this->data['warehouses'] = NULL;
            $this->data['warehouse_id'] = $this->session->userdata('warehouse_id');
            $this->data['warehouse'] = $this->session->userdata('warehouse_id') ? $this->site->getWarehouseByID($this->session->userdata('warehouse_id')) : NULL;
        }

        $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('stock_counts')));
        $meta = array('page_title' => lang('stock_counts'), 'bc' => $bc);
        $this->page_construct('products/stock_counts', $meta, $this->data);
    }

    function getCounts($warehouse_id = NULL)
    {
        $this->sma->checkPermissions('stock_count', TRUE);

        if ((! $this->Owner || ! $this->Admin) && ! $warehouse_id) {
            $user = $this->site->getUser();
            $warehouse_id = $user->warehouse_id;
        }
        $detail_link = anchor('admin/products/view_count/$1', '<label class="label label-primary pointer">'.lang('details').'</label>', 'class="tip" title="'.lang('details').'" data-toggle="modal" data-target="#myModal"');

        $this->load->library('datatables');
        $this->datatables
            ->select("{$this->db->dbprefix('stock_counts')}.id as id, date, reference_no, {$this->db->dbprefix('warehouses')}.name as wh_name, type, brand_names, category_names, initial_file, final_file")
            ->from('stock_counts')
            ->where('stock_counts.store_id',$this->data['store_id'])
            ->join('warehouses', 'warehouses.id=stock_counts.warehouse_id', 'left');
        if ($warehouse_id) {
            $this->datatables->where('warehouse_id', $warehouse_id);
        }

        $this->datatables->add_column('Actions', '<div class="text-center">'.$detail_link.'</div>', "id");
        echo $this->datatables->generate();
    }

    function view_count($id)
    {
        $this->sma->checkPermissions('stock_count', TRUE);
        $stock_count = $this->products_model->getStouckCountByID($id);
        if ( ! $stock_count->finalized) {
            $this->sma->md('admin/products/finalize_count/'.$id);
        }

        $this->data['stock_count'] = $stock_count;
        $this->data['stock_count_items'] = $this->products_model->getStockCountItems($id);
        $this->data['warehouse'] = $this->site->getWarehouseByID($stock_count->warehouse_id);
        $this->data['adjustment'] = $this->products_model->getAdjustmentByCountID($id);
        $this->load->view($this->theme.'products/view_count', $this->data);
    }

    function count_stock($page = NULL)
    {
        $this->sma->checkPermissions('stock_count');
        $this->form_validation->set_rules('warehouse', lang("warehouse"), 'required');
        $this->form_validation->set_rules('type', lang("type"), 'required');

        if ($this->form_validation->run() == true) {

            $warehouse_id = $this->input->post('warehouse');
            $type = $this->input->post('type');
            $categories = $this->input->post('category') ? $this->input->post('category') : NULL;
            $brands = $this->input->post('brand') ? $this->input->post('brand') : NULL;
            $this->load->helper('string');
            $name = random_string('md5').'.csv';
            $products = $this->products_model->getStockCountProducts($warehouse_id, $type, $categories, $brands);
            $pr = 0; $rw = 0;
            foreach ($products as $product) {
                if ($variants = $this->products_model->getStockCountProductVariants($warehouse_id, $product->id)) {
                    foreach ($variants as $variant) {
                        $items[] = array(
                            'product_code' => $product->code,
                            'product_name' => $product->name,
                            'variant' => $variant->name,
                            'expected' => $variant->quantity,
                            'counted' => ''
                            );
                        $rw++;
                    }
                } else {
                    $items[] = array(
                        'product_code' => $product->code,
                        'product_name' => $product->name,
                        'variant' => '',
                        'expected' => $product->quantity,
                        'counted' => ''
                        );
                    $rw++;
                }
                $pr++;
            }
            if ( ! empty($items)) {
                $csv_file = fopen('./files/'.$name, 'w');
                fputcsv($csv_file, array(lang('product_code'), lang('product_name'), lang('variant'), lang('expected'), lang('counted')));
                foreach ($items as $item) {
                    fputcsv($csv_file, $item);
                }
                // file_put_contents('./files/'.$name, $csv_file);
                // fwrite($csv_file, $txt);
                fclose($csv_file);
            } else {
                $this->session->set_flashdata('error', lang('no_product_found'));
                redirect($_SERVER["HTTP_REFERER"]);
            }

            if ($this->Owner || $this->Admin) {
                $date = $this->sma->fld($this->input->post('date'));
            } else {
                $date = date('Y-m-d H:s:i');
            }
            $category_ids = '';
            $brand_ids = '';
            $category_names = '';
            $brand_names = '';
            if ($categories) {
                $r = 1; $s = sizeof($categories);
                foreach ($categories as $category_id) {
                    $category = $this->site->getCategoryByID($category_id);
                    if ($r == $s) {
                        $category_names .= $category->name;
                        $category_ids .= $category->id;
                    } else {
                        $category_names .= $category->name.', ';
                        $category_ids .= $category->id.', ';
                    }
                    $r++;
                }
            }
            if ($brands) {
                $r = 1; $s = sizeof($brands);
                foreach ($brands as $brand_id) {
                    $brand = $this->site->getBrandByID($brand_id);
                    if ($r == $s) {
                        $brand_names .= $brand->name;
                        $brand_ids .= $brand->id;
                    } else {
                        $brand_names .= $brand->name.', ';
                        $brand_ids .= $brand->id.', ';
                    }
                    $r++;
                }
            }
            $data = array(
                'date' => $date,
                'warehouse_id' => $warehouse_id,
                'reference_no' => $this->input->post('reference_no'),
                'type' => $type,
                'categories' => $category_ids,
                'category_names' => $category_names,
                'brands' => $brand_ids,
                'brand_names' => $brand_names,
                'initial_file' => $name,
                'products' => $pr,
                'rows' => $rw,
                'created_by' => $this->session->userdata('user_id'),
                'store_id' => $this->data['store_id']
            );

        }
        
        if ($this->form_validation->run() == true && $this->products_model->addStockCount($data)) {
            $this->session->set_flashdata('message', lang("stock_count_intiated"));
            admin_redirect('products/stock_counts');

        } else {

            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
            $this->data['warehouses'] = $this->site->getallWarehouses($this->data['store_id']);
            $this->data['categories'] = $this->site->getAllCategories($this->data['store_id']);
            $this->data['brands'] = $this->site->getAllBrands();
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => '#', 'page' => lang('count_stock')));
            $meta = array('page_title' => lang('count_stock'), 'bc' => $bc);
            $this->page_construct('products/count_stock', $meta, $this->data);

        }

    }

    function finalize_count($id)
    {
        $this->sma->checkPermissions('stock_count');
        $stock_count = $this->products_model->getStouckCountByID($id);
        if ( ! $stock_count || $stock_count->finalized) {
            $this->session->set_flashdata('error', lang("stock_count_finalized"));
            admin_redirect('products/stock_counts');
        }

        $this->form_validation->set_rules('count_id', lang("count_stock"), 'required');

        if ($this->form_validation->run() == true) {

            if ($_FILES['csv_file']['size'] > 0) {
                $note = $this->sma->clear_tags($this->input->post('note'));
                $data = array(
                    'updated_by' => $this->session->userdata('user_id'),
                    'updated_at' => date('Y-m-d H:s:i'),
                    'note' => $note
                );

                $this->load->library('upload');
                $config['upload_path'] = $this->digital_upload_path;
                $config['allowed_types'] = 'csv';
                $config['max_size'] = $this->allowed_file_size;
                $config['overwrite'] = false;
                $config['encrypt_name'] = true;
                $this->upload->initialize($config);
                if (!$this->upload->do_upload('csv_file')) {
                    $error = $this->upload->display_errors();
                    $this->session->set_flashdata('error', $error);
                    redirect($_SERVER["HTTP_REFERER"]);
                }

                $csv = $this->upload->file_name;

                $arrResult = array();
                $handle = fopen($this->digital_upload_path . $csv, "r");
                if ($handle) {
                    while (($row = fgetcsv($handle, 5000, ",")) !== FALSE) {
                        $arrResult[] = $row;
                    }
                    fclose($handle);
                }
                $titles = array_shift($arrResult);
                $keys = array('product_code', 'product_name', 'product_variant', 'expected', 'counted');
                $final = array();
                foreach ($arrResult as $key => $value) {
                    $final[] = array_combine($keys, $value);
                }
                // $this->sma->print_arrays($final);
                $rw = 2; $differences = 0; $matches = 0;
                foreach ($final as $pr) {
                    if ($product = $this->products_model->getProductByCode(trim($pr['product_code']))) {
                        $pr['counted'] = !empty($pr['counted']) ? $pr['counted'] : 0;
                        if ($pr['expected'] == $pr['counted']) {
                            $matches++;
                        } else {
                            $pr['stock_count_id'] = $id;
                            $pr['product_id'] = $product->id;
                            $pr['cost'] = $product->cost;
                            $pr['product_variant_id'] = empty($pr['product_variant']) ? NULL : $this->products_model->getProductVariantID($pr['product_id'], $pr['product_variant']);
                            $products[] = $pr;
                            $differences++;
                        }
                    } else {
                        $this->session->set_flashdata('error', lang('check_product_code') . ' (' . $pr['product_code'] . '). ' . lang('product_code_x_exist') . ' ' . lang('line_no') . ' ' . $rw);
                        admin_redirect('products/finalize_count/'.$id);
                    }
                    $rw++;
                }

                $data['final_file'] = $csv;
                $data['differences'] = $differences;
                $data['matches'] = $matches;
                $data['missing'] = $stock_count->rows-($rw-2);
                $data['finalized'] = 1;
            }

            // $this->sma->print_arrays($data, $products);
        }
        
        if ($this->form_validation->run() == true && $this->products_model->finalizeStockCount($id, $data, $products)) {
            $this->session->set_flashdata('message', lang("stock_count_finalized"));
            admin_redirect('products/stock_counts');
        } else {

            $this->data['error'] = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
            $this->data['stock_count'] = $stock_count;
            $this->data['warehouse'] = $this->site->getWarehouseByID($stock_count->warehouse_id);
            $bc = array(array('link' => base_url(), 'page' => lang('home')), array('link' => admin_url('products'), 'page' => lang('products')), array('link' => admin_url('products/stock_counts'), 'page' => lang('stock_counts')), array('link' => '#', 'page' => lang('finalize_count')));
            $meta = array('page_title' => lang('finalize_count'), 'bc' => $bc);
            $this->page_construct('products/finalize_count', $meta, $this->data);

        }

    }

}

Function Calls

defined 1

Variables

None

Stats

MD5 48b2522b94ef739224a96a2186e63332
Eval Count 0
Decode Time 643 ms