ok

Mini Shell

Direktori : /home2/selectio/www/mm-tailor-billing/app/controllers/
Upload File :
Current File : /home2/selectio/www/mm-tailor-billing/app/controllers/Pos.php

<?php
if (!defined('BASEPATH')) {
    exit('No direct script access allowed');
}

class Pos extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();

        if (!$this->loggedIn) {
            redirect('login');
        }
        $this->load->helper('pos');
        $this->load->model('pos_model');
        $this->load->library('form_validation');
    }

    public function ajaxproducts($category_id = null, $return = null)
    {
        if ($this->input->get('category_id')) {
            $category_id = $this->input->get('category_id');
        } elseif (!$category_id) {
            $category_id = $this->Settings->default_category;
        }
        if ($this->input->get('per_page') == 'n') {
            $page = 0;
        } else {
            $page = $this->input->get('per_page');
        }
        if ($this->input->get('tcp') == 1) {
            $tcp = true;
        } else {
            $tcp = false;
        }

        $products = $this->pos_model->fetch_products($category_id, $this->Settings->pro_limit, $page);
        $pro      = 1;
        $prods    = '<div>';
        if ($products) {
            if ($this->Settings->bsty == 1) {
                foreach ($products as $product) {
                    $count = $product->id;
                    if ($count < 10) {
                        $count = '0' . ($count / 100) * 100;
                    }
                    if ($category_id < 10) {
                        $category_id = '0' . ($category_id / 100) * 100;
                    }
                    $prods .= '<button type="button" data-name="' . $product->name . '" id="product-' . $category_id . $count . "\" type=\"button\" value='" . $product->code . "' class=\"btn btn-name btn-default btn-flat product\">" . $product->name . '</button>';
                    $pro++;
                }
            } elseif ($this->Settings->bsty == 2) {
                foreach ($products as $product) {
                    $count = $product->id;
                    if ($count < 10) {
                        $count = '0' . ($count / 100) * 100;
                    }
                    if ($category_id < 10) {
                        $category_id = '0' . ($category_id / 100) * 100;
                    }
                    $prods .= '<button type="button" data-name="' . $product->name . '" id="product-' . $category_id . $count . "\" type=\"button\" value='" . $product->code . "' class=\"btn btn-img btn-flat product\"><img src=\"" . base_url() . 'uploads/thumbs/' . $product->image . '" alt="' . $product->name . '" style="width: 110px; height: 110px;"></button>';
                    $pro++;
                }
            } elseif ($this->Settings->bsty == 3) {
                foreach ($products as $product) {
                    $count = $product->id;
                    if ($count < 10) {
                        $count = '0' . ($count / 100) * 100;
                    }
                    if ($category_id < 10) {
                        $category_id = '0' . ($category_id / 100) * 100;
                    }
                    $prods .= '<button type="button" data-name="' . $product->name . '" id="product-' . $category_id . $count . "\" type=\"button\" value='" . $product->code . "' class=\"btn btn-both btn-flat product\"><span class=\"bg-img\"><img src=\"" . base_url() . 'uploads/thumbs/' . $product->image . '" alt="' . $product->name . '" style="width: 100px; height: 100px;"></span><span><span>' . $product->name . '</span></span></button>';
                    $pro++;
                }
            }
        } else {
            $prods .= '<h4 class="text-center text-info" style="margin-top:50px;">' . lang('category_is_empty') . '</h4>';
        }

        $prods .= '</div>';

        if (!$return) {
            if (!$tcp) {
                echo $prods;
            } else {
                $category_products = $this->pos_model->products_count($category_id);
                header('Content-Type: application/json');
                echo json_encode(['products' => $prods, 'tcp' => $category_products]);
            }
        } else {
            return $prods;
        }
    }

    public function close_register($user_id = null)
    {
        if (!$this->Admin) {
            $user_id = $this->session->userdata('user_id');
        }
        $this->form_validation->set_rules('total_cash', lang('total_cash'), 'trim|required|numeric');
        $this->form_validation->set_rules('total_cheques', lang('total_cheques'), 'trim|required|numeric');
        $this->form_validation->set_rules('total_cc_slips', lang('total_cc_slips'), 'trim|required|numeric');

        if ($this->form_validation->run() == true) {
            if ($this->Admin) {
                $user_register      = $user_id ? $this->pos_model->registerData($user_id) : null;
                $rid                = $user_register ? $user_register->id : $this->session->userdata('register_id');
                $user_id            = $user_register ? $user_register->user_id : $this->session->userdata('user_id');
                $register_open_time = $user_register ? $user_register->date : $this->session->userdata('register_open_time');
                $cash_in_hand       = $user_register ? $user_register->cash_in_hand : $this->session->userdata('cash_in_hand');
                $ccsales            = $this->pos_model->getRegisterCCSales($register_open_time, $user_id);
                $cashsales          = $this->pos_model->getRegisterCashSales($register_open_time, $user_id);
                $expenses           = $this->pos_model->getRegisterExpenses($register_open_time, $user_id);
                $chsales            = $this->pos_model->getRegisterChSales($register_open_time, $user_id);
                $total_cash         = ($cashsales->paid ? ($cashsales->paid + $cash_in_hand) : $cash_in_hand);
                $total_cash -= ($expenses->total ? $expenses->total : 0);
            } else {
                $rid                = $this->session->userdata('register_id');
                $user_id            = $this->session->userdata('user_id');
                $register_open_time = $this->session->userdata('register_open_time');
                $cash_in_hand       = $this->session->userdata('cash_in_hand');
                $ccsales            = $this->pos_model->getRegisterCCSales($register_open_time);
                $cashsales          = $this->pos_model->getRegisterCashSales($register_open_time);
                $expenses           = $this->pos_model->getRegisterExpenses($register_open_time);
                $chsales            = $this->pos_model->getRegisterChSales($register_open_time);
                $total_cash         = ($cashsales->paid ? ($cashsales->paid + $cash_in_hand) : $cash_in_hand);
                $total_cash -= ($expenses->total ? $expenses->total : 0);
            }

            $data = ['closed_at'           => date('Y-m-d H:i:s'),
                'total_cash'               => $total_cash,
                'total_cheques'            => $chsales->total_cheques,
                'total_cc_slips'           => $ccsales->total_cc_slips,
                'total_cash_submitted'     => $this->input->post('total_cash_submitted'),
                'total_cheques_submitted'  => $this->input->post('total_cheques_submitted'),
                'total_cc_slips_submitted' => $this->input->post('total_cc_slips_submitted'),
                'note'                     => $this->input->post('note'),
                'status'                   => 'close',
                'transfer_opened_bills'    => $this->input->post('transfer_opened_bills'),
                'closed_by'                => $this->session->userdata('user_id'),
            ];

        // $this->tec->print_arrays($data);
        } elseif ($this->input->post('close_register')) {
            $this->session->set_flashdata('error', (validation_errors() ? validation_errors() : $this->session->flashdata('error')));
            redirect('pos');
        }

        if ($this->form_validation->run() == true && $this->pos_model->closeRegister($rid, $user_id, $data)) {
            $this->session->unset_userdata('register_id');
            $this->session->unset_userdata('cash_in_hand');
            $this->session->unset_userdata('register_open_time');
            $this->session->set_flashdata('message', lang('register_closed'));
            redirect('welcome');
        } else {
            if ($this->Admin) {
                $user_register                    = $user_id ? $this->pos_model->registerData($user_id) : null;
                $register_open_time               = $user_register ? $user_register->date : $this->session->userdata('register_open_time');
                $this->data['cash_in_hand']       = $user_register ? $user_register->cash_in_hand : null;
                $this->data['register_open_time'] = $user_register ? $register_open_time : null;
            } else {
                $register_open_time               = $this->session->userdata('register_open_time');
                $this->data['cash_in_hand']       = null;
                $this->data['register_open_time'] = null;
            }
            $this->data['error']           = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
            $this->data['ccsales']         = $this->pos_model->getRegisterCCSales($register_open_time, $user_id);
            $this->data['cashsales']       = $this->pos_model->getRegisterCashSales($register_open_time, $user_id);
            $this->data['chsales']         = $this->pos_model->getRegisterChSales($register_open_time, $user_id);
            $this->data['other_sales']     = $this->pos_model->getRegisterOtherSales($register_open_time, $user_id);
            $this->data['gcsales']         = $this->pos_model->getRegisterGCSales($register_open_time, $user_id);
            $this->data['stripesales']     = $this->pos_model->getRegisterStripeSales($register_open_time, $user_id);
            $this->data['totalsales']      = $this->pos_model->getRegisterSales($register_open_time, $user_id);
            $this->data['expenses']        = $this->pos_model->getRegisterExpenses($register_open_time);
            $this->data['users']           = $this->tec->getUsers($user_id);
            $this->data['suspended_bills'] = $this->pos_model->getSuspendedsales($user_id);
            $this->data['user_id']         = $user_id;
            $this->load->view($this->theme . 'pos/close_register', $this->data);
        }
    }

    public function email_receipt($sale_id = null, $to = null)
    {
        if ($this->input->post('id')) {
            $sale_id = $this->input->post('id');
        }
        if ($this->input->post('email')) {
            $to = $this->input->post('email');
        }
        if (!$sale_id || !$to) {
            die();
        }

        $this->data['error']   = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
        $this->data['message'] = $this->session->flashdata('message');
        $inv                   = $this->pos_model->getSaleByID($sale_id);
        $this->tec->view_rights($inv->created_by);
        $this->load->helper('text');
        $this->data['rows']       = $this->pos_model->getAllSaleItems($sale_id);
        $this->data['customer']   = $this->pos_model->getCustomerByID($inv->customer_id);
        $this->data['inv']        = $inv;
        $this->data['sid']        = $sale_id;
        $this->data['noprint']    = null;
        $this->data['page_title'] = lang('invoice');
        $this->data['modal']      = false;
        $this->data['payments']   = $this->pos_model->getAllSalePayments($sale_id);
        $this->data['created_by'] = $this->site->getUser($inv->created_by);

        $receipt = $this->load->view($this->theme . 'pos/view', $this->data, true);
        $message = preg_replace('#\<!-- start -->(.+)\<!-- end -->#Usi', '', $receipt);
        $subject = lang('email_subject') . ' - ' . $this->Settings->site_name;

        try {
            if ($this->tec->send_email($to, $subject, $message)) {
                echo json_encode(['msg' => lang('email_success')]);
            } else {
                echo json_encode(['msg' => lang('email_failed')]);
            }
        } catch (Exception $e) {
            echo json_encode(['msg' => $e->getMessage()]);
        }
    }

    public function get_product($code = null)
    {
        if ($this->input->get('code')) {
            $code = $this->input->get('code');
        }
        $combo_items = false;
        if ($product = $this->pos_model->getProductByCode($code)) {
            unset($product->cost, $product->details);
            
            error_log('Unit Names:'.$product->unit_name);
            $product->qty             = 1;
            $product->comment         = '';
            $product->discount        = '0';
            $product->unit_name        = '0';
            $product->price           = $product->store_price > 0 ? $product->store_price : $product->price;
            $product->real_unit_price = $product->price;
            $product->unit_price      = $product->tax ? ($product->price + (($product->price * $product->tax) / 100)) : $product->price;
            if ($product->type == 'combo') {
                $combo_items = $this->pos_model->getComboItemsByPID($product->id);
            }
            echo json_encode(['id' => str_replace('.', '', microtime(true)), 'item_id' => $product->id, 'label' => $product->name . ' (' . $product->code . ')', 'row' => $product, 'combo_items' => $combo_items]);
        } else {
            echo null;
        }
    }

    public function index($sid = null, $eid = null)
    {
        if (!$this->Settings->multi_store) {
            $this->session->set_userdata('store_id', 1);
        }
        if (!$this->session->userdata('store_id')) {
            $this->session->set_flashdata('warning', lang('please_select_store'));
            redirect($this->Settings->multi_store ? 'stores' : 'welcome');
        }
        if ($this->input->get('hold')) {
            $sid = $this->input->get('hold');
        }
        if ($this->input->get('edit')) {
            $eid = $this->input->get('edit');
        }
        if ($this->input->post('eid')) {
            $eid = $this->input->post('eid');
        }
        if ($this->input->post('did')) {
            $did = $this->input->post('did');
        } else {
            $did = null;
        }
        if ($eid && !$this->Admin) {
            $this->session->set_flashdata('error', lang('access_denied'));
            redirect($_SERVER['HTTP_REFERER'] ?? 'pos');
        }
        if (!$this->Settings->default_customer) {
            $this->session->set_flashdata('warning', lang('please_update_settings'));
            redirect('settings');
        }
        if (!$this->session->userdata('register_id')) {
            if ($register = $this->pos_model->registerData($this->session->userdata('user_id'))) {
                $register_data = ['register_id' => $register->id, 'cash_in_hand' => $register->cash_in_hand, 'register_open_time' => $register->date];
                $this->session->set_userdata($register_data);
            } else {
                $this->session->set_flashdata('error', lang('register_not_open'));
                redirect('pos/open_register');
            }
        }

        $suspend = $this->input->post('suspend') ? true : false;

        $this->form_validation->set_rules('customer', lang('customer'), 'trim|required');

        if ($this->form_validation->run() == true) {
            $quantity  = 'quantity';
            $product   = 'product';
            $unit_cost = 'unit_cost';
            $tax_rate  = 'tax_rate';

            $date             = $eid ? $this->input->post('date') : date('Y-m-d H:i:s');
            $payment_date     = $this->input->post('payment_date');
            $customer_id      = $this->input->post('customer_id');
            $customer_details = $this->pos_model->getCustomerByID($customer_id);
            $customer         = $customer_details->name;
            // Customer Phone Number
            $customer_phone   = $customer_details->phone;
            $note             = $this->tec->clear_tags($this->input->post('spos_note'));

            $total            = 0;
            $product_tax      = 0;
            $order_tax        = 0;
            $product_discount = 0;
            $order_discount   = 0;
            $percentage       = '%';
            $i                = isset($_POST['product_id']) ? sizeof($_POST['product_id']) : 0;
            for ($r = 0; $r < $i; $r++) {
                $item_id         = $_POST['product_id'][$r];
                $real_unit_price = $this->tec->formatDecimal($_POST['real_unit_price'][$r]);
                $item_quantity   = $_POST['quantity'][$r];
                $item_comment    = $_POST['item_comment'][$r];
                $item_discount   = $_POST['product_discount'][$r] ?? '0';

                if (isset($item_id) && isset($real_unit_price) && isset($item_quantity)) {
                    $product_details = $this->site->getProductByID($item_id);
                    if ($product_details) {
                        $product_name = $product_details->name;
                        $product_code = $product_details->code;
                        $product_cost = $product_details->cost;
                        $product_type = $product_details->type;
                    } else {
                        $product_name = $_POST['product_name'][$r];
                        $product_code = $_POST['product_code'][$r];
                        $product_type = $_POST['product_type'][$r];
                        $product_cost = 0;
                    }
                    if (!$this->Settings->overselling) {
                        if ($product_details->type == 'standard') {
                            if ($product_details->quantity < $item_quantity) {
                                $this->session->set_flashdata('error', lang('quantity_low') . ' (' .
                                    lang('name') . ': ' . $product_details->name . ' | ' .
                                    lang('ordered') . ': ' . $item_quantity . ' | ' .
                                    lang('available') . ': ' . $product_details->quantity .
                                    ')');
                                redirect('pos');
                            }
                        } elseif ($product_details->type == 'combo') {
                            $combo_items = $this->pos_model->getComboItemsByPID($product->id);
                            foreach ($combo_items as $combo_item) {
                                $cpr = $this->site->getProductByID($combo_item->id);
                                if ($cpr->quantity < $item_quantity) {
                                    $this->session->set_flashdata('error', lang('quantity_low') . ' (' .
                                        lang('name') . ': ' . $cpr->name . ' | ' .
                                        lang('ordered') . ': ' . $item_quantity . ' x ' . $combo_item->qty . ' = ' . $item_quantity * $combo_item->qty . ' | ' .
                                        lang('available') . ': ' . $cpr->quantity .
                                        ') ' . $product_details->name);
                                    redirect('pos');
                                }
                            }
                        }
                    }
                    $unit_price = $real_unit_price;

                    $pr_discount = 0;
                    if (isset($item_discount)) {
                        $discount = $item_discount;
                        $dpos     = strpos($discount, $percentage);
                        if ($dpos !== false) {
                            $pds         = explode('%', $discount);
                            $pr_discount = $this->tec->formatDecimal((($unit_price * (Float)($pds[0])) / 100), 4);
                        } else {
                            $pr_discount = $this->tec->formatDecimal($discount);
                        }
                    }
                    $unit_price       = $this->tec->formatDecimal(($unit_price - $pr_discount), 4);
                    $item_net_price   = $unit_price;
                    $pr_item_discount = $this->tec->formatDecimal(($pr_discount * $item_quantity), 4);
                    $product_discount += $pr_item_discount;

                    $pr_item_tax = 0;
                    $item_tax    = 0;
                    $tax         = '';
                    if (isset($product_details->tax) && $product_details->tax != 0) {
                        if ($product_details && $product_details->tax_method == 1) {
                            $item_tax = $this->tec->exlusiveTax($unit_price, $product_details->tax);
                            $tax      = $product_details->tax . '%';
                        } else {
                            $item_tax = $this->tec->inclusiveTax($unit_price, $product_details->tax);
                            $tax      = $product_details->tax . '%';
                            $item_net_price -= $item_tax;
                        }

                        $pr_item_tax = $this->tec->formatDecimal(($item_tax * $item_quantity), 4);
                    }

                    $product_tax += $pr_item_tax;
                    $subtotal = $this->tec->formatDecimal((($item_net_price * $item_quantity) + $pr_item_tax), 4);

                    $products[] = [
                        'product_id'      => $item_id,
                        'quantity'        => $item_quantity,
                        'unit_price'      => $unit_price,
                        'net_unit_price'  => $item_net_price,
                        'discount'        => $item_discount,
                        'comment'         => $item_comment,
                        'item_discount'   => $pr_item_discount,
                        'tax'             => $tax,
                        'item_tax'        => $pr_item_tax,
                        'subtotal'        => $subtotal,
                        'real_unit_price' => $real_unit_price,
                        'cost'            => $product_cost,
                        'product_code'    => $product_code,
                        'product_name'    => $product_name,
                        'product_type'    => $product_type,
                    ];


                    $sale_work_products[] = [
                        'product_id'      => $item_id,
                        'quantity'        => $item_quantity,
                        'product_code'    => $product_code,
                        'product_name'    => $product_name,
                    ];
                    
                    $total += $this->tec->formatDecimal(($item_net_price * $item_quantity), 4);
                }
            }
            if (empty($products)) {
                $this->form_validation->set_rules('product', lang('order_items'), 'required');
            } else {
                krsort($products);
            }

            if ($this->input->post('order_discount')) {
                $order_discount_id = $this->input->post('order_discount');
                $opos              = strpos($order_discount_id, $percentage);
                if ($opos !== false) {
                    $ods            = explode('%', $order_discount_id);
                    $order_discount = $this->tec->formatDecimal(((($total + $product_tax) * (Float)($ods[0])) / 100), 4);
                } else {
                    $order_discount = $this->tec->formatDecimal($order_discount_id);
                }
            } else {
                $order_discount_id = null;
            }
            $total_discount = $this->tec->formatDecimal(($order_discount + $product_discount), 4);

            if ($this->input->post('order_tax')) {
                $order_tax_id = $this->input->post('order_tax');
                $opos         = strpos($order_tax_id, $percentage);
                if ($opos !== false) {
                    $ots       = explode('%', $order_tax_id);
                    $order_tax = $this->tec->formatDecimal(((($total + $product_tax - $order_discount) * (Float)($ots[0])) / 100), 4);
                } else {
                    $order_tax = $this->tec->formatDecimal($order_tax_id);
                }
            } else {
                $order_tax_id = null;
                $order_tax    = 0;
            }

            $total_tax   = $this->tec->formatDecimal(($product_tax + $order_tax), 4);
            $grand_total = $this->tec->formatDecimal(($total + $total_tax - $order_discount), 4);
            $paid        = $this->input->post('amount') ? $this->input->post('amount') : 0;
            $round_total = $this->tec->roundNumber($grand_total, $this->Settings->rounding);
            $rounding    = $this->tec->formatDecimal(($round_total - $grand_total));
            if (!$suspend && $customer_details->id == 1 && $this->tec->formatDecimal($paid) < $this->tec->formatDecimal($round_total)) {
                $this->session->set_flashdata('error', lang('select_customer_for_due'));
                redirect($_SERVER['HTTP_REFERER']);
            }
            if (!$eid) {
                $status = 'due';
                if ($this->tec->formatDecimal($round_total) <= $this->tec->formatDecimal($paid)) {
                    $status = 'paid';
                } elseif ($this->tec->formatDecimal($round_total) > $this->tec->formatDecimal($paid) && $paid > 0) {
                    $status = 'partial';
                }
            }
            
            //Extra Option Starts Here
            $extra_option_shirt_add = implode(",", $this->input->post('shirt_ext'));
            $extra_option_pant_add = implode(",", $this->input->post('pant_ext'));
            //Extra option Ends Here
        
            $phmeasure_add=array();
            $phmeasure_add[]=array(
                'pf1'=> $this->input->post('pf1'),
                'pf2'=> $this->input->post('pf2'),
                'pf3'=> $this->input->post('pf3'),
                'pf4'=> $this->input->post('pf4'),
                'pf5'=> $this->input->post('pf5'),
                'pf6'=> $this->input->post('pf6'),
                'pf7'=> $this->input->post('pf7'),
                'pf8'=> $this->input->post('pf8'),
                'ps1'=> $this->input->post('ps1'),
                'ps2'=> $this->input->post('ps2'),
                'ps3'=> $this->input->post('ps3'),
                'ps4'=> $this->input->post('ps4'),
                'ps5'=> $this->input->post('ps5'),
                'ps6'=> $this->input->post('ps6'),
                'ps7'=> $this->input->post('ps7'),
                'ps8'=> $this->input->post('ps8'),
                'pt1'=> $this->input->post('pt1')
            );
            $phmeasure_add= json_encode($phmeasure_add);
            
            $shmeasure_add=array();
            $shmeasure_add[]=array(
                'sf1'=> $this->input->post('sf1'),
                'sf2'=> $this->input->post('sf2'),
                'sf3'=> $this->input->post('sf3'),
                'sf4'=> $this->input->post('sf4'),
                'sf5'=> $this->input->post('sf5'),
                'sf6'=> $this->input->post('sf6'),
                'sf7'=> $this->input->post('sf7'),
                'sf8'=> $this->input->post('sf8'),
                'sf9'=> $this->input->post('sf9'),
                'sf10'=> $this->input->post('sf10'),
                'sf11'=> $this->input->post('sf11'),
                'ss1'=> $this->input->post('ss1'),
                'ss2'=> $this->input->post('ss2'),
                'ss3'=> $this->input->post('ss3'),
                'ss4'=> $this->input->post('ss4'),
                'ss5'=> $this->input->post('ss5'),
                'ss6'=> $this->input->post('ss6'),
                'ss7'=> $this->input->post('ss7'),
                'ss8'=> $this->input->post('ss8'),
                'ss9'=> $this->input->post('ss9'),
                'ss10'=> $this->input->post('ss10'),
                'ss11'=> $this->input->post('ss11'),
                'st1'=> $this->input->post('st1'),
                'fhf1'=> $this->input->post('fhf1'),
                'fhf2'=> $this->input->post('fhf2'),
                'fhf3'=> $this->input->post('fhf3'),
                'fhs1'=> $this->input->post('fhs1'),
                'fhs2'=> $this->input->post('fhs2'),
                'fhs3'=> $this->input->post('fhs3'),
            );
            $shmeasure_add= json_encode($shmeasure_add);

            // Another Pant and Extra Measurements Starts Here
            $another_pant_add=array();
            $another_pant_add[]=array(
                'pf1'=> $this->input->post('extra_pf1'),
                'pf2'=> $this->input->post('extra_pf2'),
                'pf3'=> $this->input->post('extra_pf3'),
                'pf4'=> $this->input->post('extra_pf4'),
                'pf5'=> $this->input->post('extra_pf5'),
                'pf6'=> $this->input->post('extra_pf6'),
                'pf7'=> $this->input->post('extra_pf7'),
                'pf8'=> $this->input->post('extra_pf8'),
                'ps1'=> $this->input->post('extra_ps1'),
                'ps2'=> $this->input->post('extra_ps2'),
                'ps3'=> $this->input->post('extra_ps3'),
                'ps4'=> $this->input->post('extra_ps4'),
                'ps5'=> $this->input->post('extra_ps5'),
                'ps6'=> $this->input->post('extra_ps6'),
                'ps7'=> $this->input->post('extra_ps7'),
                'ps8'=> $this->input->post('extra_ps8'),
                'pt1'=> $this->input->post('extra_pt1')
            );
            $another_pant_add = json_encode($another_pant_add);
            
            $another_shirt_add=array();
            $another_shirt_add[]=array(
                'sf1'=> $this->input->post('extra_sf1'),
                'sf2'=> $this->input->post('extra_sf2'),
                'sf3'=> $this->input->post('extra_sf3'),
                'sf4'=> $this->input->post('extra_sf4'),
                'sf5'=> $this->input->post('extra_sf5'),
                'sf6'=> $this->input->post('extra_sf6'),
                'sf7'=> $this->input->post('extra_sf7'),
                'sf8'=> $this->input->post('extra_sf8'),
                'sf9'=> $this->input->post('extra_sf9'),
                'sf10'=> $this->input->post('extra_sf10'),
                'sf11'=> $this->input->post('extra_sf11'),
                'ss1'=> $this->input->post('extra_ss1'),
                'ss2'=> $this->input->post('extra_ss2'),
                'ss3'=> $this->input->post('extra_ss3'),
                'ss4'=> $this->input->post('extra_ss4'),
                'ss5'=> $this->input->post('extra_ss5'),
                'ss6'=> $this->input->post('extra_ss6'),
                'ss7'=> $this->input->post('extra_ss7'),
                'ss8'=> $this->input->post('extra_ss8'),
                'ss9'=> $this->input->post('extra_ss9'),
                'ss10'=> $this->input->post('extra_ss10'),
                'ss11'=> $this->input->post('extra_ss11'),
                'st1'=> $this->input->post('extra_st1'),
                'fhf1'=> $this->input->post('extra_fhf1'),
                'fhf2'=> $this->input->post('extra_fhf2'),
                'fhf3'=> $this->input->post('extra_fhf3'),
                'fhs1'=> $this->input->post('extra_fhs1'),
                'fhs2'=> $this->input->post('extra_fhs2'),
                'fhs3'=> $this->input->post('extra_fhs3'),
            );
            $another_shirt_add = json_encode($another_shirt_add);
            // Another Pant and Extra Measurements Ends Here

            $data = ['date'         => $date,
                'customer_id'       => $customer_id,
                'customer_name'     => $customer,
                // Customer Phone Number
                'customer_phone_no'  => $customer_phone,
                'sells'             => $this->input->post('sells'),
                'total'             => $this->tec->formatDecimal($total, 4),
                'product_discount'  => $this->tec->formatDecimal($product_discount, 4),
                'order_discount_id' => $order_discount_id,
                'order_discount'    => $order_discount,
                'total_discount'    => $total_discount,
                'product_tax'       => $this->tec->formatDecimal($product_tax, 4),
                'order_tax_id'      => $order_tax_id,
                'order_tax'         => $order_tax,
                'total_tax'         => $total_tax,
                'grand_total'       => $grand_total,
                'total_items'       => $this->input->post('total_items'),
                'total_quantity'    => $this->input->post('total_quantity'),
                'rounding'          => $rounding,
                'paid'              => $paid,
                'status'            => $status,
                'created_by'        => $this->session->userdata('user_id'),
                'note'              => $this->input->post('snote'),
                'hold_ref'          => $this->input->post('hold_ref'),
		'reference_no'      => $this->input->post('reference_no'),
                'due_date'          => $this->input->post('due_date'),
                'pant_measure'      => $phmeasure_add,
                'shirt_measure'     => $shmeasure_add,
                'shirt_extra'       => $extra_option_shirt_add,
                'pant_extra'        => $extra_option_pant_add,
                'shirt_text'        => $this->input->post('shirt_text'),
                'pant_text'        => $this->input->post('pant_text'),
                'another_pant_measure' => $another_pant_add,
                'another_shirt_measure' => $another_shirt_add,
                'sale_date'        => $this->input->post('sale_date')
                 
            ];

            if (!$eid) {
                $data['store_id'] = $this->session->userdata('store_id');
            }

            if (!$eid && !$suspend && $paid) {
                if ($this->input->post('paying_gift_card_no')) {
                    $gc = $this->pos_model->getGiftCardByNO($this->input->post('paying_gift_card_no'));
                    if (!$gc || $gc->balance < $amount) {
                        $this->session->set_flashdata('error', lang('incorrect_gift_card'));
                        redirect('pos');
                    }
                }
                $amount  = $this->tec->formatDecimal(($paid > $grand_total ? ($paid - $this->input->post('balance_amount')) : $paid), 4);
                
                /*'date'        => $this->input->post('payment_date'),*/
                    /*'date'        => $date,*/
                    
                $payment = [
                    'date'        => $this->input->post('payment_date'),
                    'amount'      => $amount,
                    'customer_id' => $customer_id,
                    'paid_by'     => $this->input->post('paid_by'),
                    'cheque_no'   => $this->input->post('cheque_no'),
                    'cc_no'       => $this->input->post('cc_no'),
                    'gpay'        => $this->input->post('gpay'),
                    'net_banking' => $this->input->post('net_banking'),
                    'gc_no'       => $this->input->post('paying_gift_card_no'),
                    'cc_holder'   => $this->input->post('cc_holder'),
                    'cc_month'    => $this->input->post('cc_month'),
                    'cc_year'     => $this->input->post('cc_year'),
                    'cc_type'     => $this->input->post('cc_type'),
                    'cc_cvv2'     => $this->input->post('cc_cvv2'),
                    'created_by'  => $this->session->userdata('user_id'),
                    'store_id'    => $this->session->userdata('store_id'),
                    'note'        => $this->input->post('payment_note'),
                    'pos_paid'    => $this->tec->formatDecimal($this->input->post('amount'), 4),
                    'pos_balance' => $this->tec->formatDecimal($this->input->post('balance_amount'), 4),
                ];
                $data['paid'] = $amount;
            } else {
                $payment = [];
            }

            // $this->tec->print_arrays($data, $products, $payment);
        }

        if ($this->form_validation->run() == true && !empty($products)) {
            if ($suspend) {
                unset($data['status'], $data['rounding']);
                if ($this->pos_model->suspendSale($data, $products, $did)) {
                    $this->session->set_userdata('rmspos', 1);
                    $this->session->set_flashdata('message', lang('sale_saved_to_opened_bill'));
                    redirect('pos');
                } else {
                    $this->session->set_flashdata('error', lang('action_failed'));
                    redirect('pos/' . $did);
                }
            } elseif ($eid) {
                unset($data['status'], $data['paid']);
                if (!$this->Admin) {
                    unset($data['date']);
                }
                $data['updated_at'] = date('Y-m-d H:i:s');
                $data['updated_by'] = $this->session->userdata('user_id');
                if ($this->pos_model->updateSale($eid, $data, $products)) {
                    $this->session->set_userdata('rmspos', 1);
                    $this->session->set_flashdata('message', lang('sale_updated'));
                    redirect('sales');
                } else {
                    $this->session->set_flashdata('error', lang('action_failed'));
                    redirect('pos/?edit=' . $eid);
                }
            } else {
                if ($sale = $this->pos_model->addSale($data, $products, $payment, $did, $sale_work_products)) {
                    //$this->pos_model->addSaleWorks($sale_work_products);
                    $this->session->set_userdata('rmspos', 1);
                    $msg = lang('sale_added');
                    if (!empty($sale['message'])) {
                        foreach ($sale['message'] as $m) {
                            $msg .= '<br>' . $m;
                        }
                    }
                    $this->session->set_flashdata('message', $msg);
                    //$redirect_to = $this->Settings->after_sale_page ? 'pos' : 'pos/view/' . $sale['sale_id'];
                    $redirect_to = $this->Settings->after_sale_page ? 'pos' : 'pos/';
                    if ($this->Settings->auto_print) {
                        if (!$this->Settings->remote_printing) {
                            $this->print_receipt($sale['sale_id'], true);
                        } elseif ($this->Settings->remote_printing == 2) {
                            $redirect_to .= '?print=' . $sale['sale_id'];
                        }
                    }
                    redirect($redirect_to);
                } else {
                    $this->session->set_flashdata('error', lang('action_failed'));
                    redirect('pos');
                }
            }
        } else {
            if (isset($sid) && !empty($sid)) {
                $suspended_sale = $this->pos_model->getSuspendedSaleByID($sid);
                $inv_items      = $this->pos_model->getSuspendedSaleItems($sid);
                krsort($inv_items);
                $c = rand(100000, 9999999);
                foreach ($inv_items as $item) {
                    $row = $this->site->getProductByID($item->product_id);
                    if (!$row) {
                        $row       = json_decode('{}');
                        $row->id   = 0;
                        $row->code = $item->product_code;
                        $row->name = $item->product_name;
                        $row->tax  = 0;
                    }
                    $row->price           = $item->net_unit_price + ($item->item_discount / $item->quantity);
                    $row->unit_price      = $item->unit_price     + ($item->item_discount / $item->quantity)     + ($item->item_tax / $item->quantity);
                    $row->real_unit_price = $item->real_unit_price;
                    $row->discount        = $item->discount;
                    $row->qty             = $item->quantity;
                    $row->comment         = $item->comment;
                    $row->ordered         = $item->quantity;
                    $combo_items          = false;
                    $ri                   = $this->Settings->item_addition ? $row->id : $c;
                    $pr[$ri]              = ['id' => $c, 'item_id' => $row->id, 'label' => $row->name . ' (' . $row->code . ')', 'row' => $row, 'combo_items' => $combo_items];
                    $c++;
                }
                $this->data['items']        = json_encode($pr);
                $this->data['sid']          = $sid;
                $this->data['suspend_sale'] = $suspended_sale;
                $this->data['message']      = lang('suspended_sale_loaded');
            }

            if (isset($eid) && !empty($eid)) {
                $sale      = $this->pos_model->getSaleByID($eid);
                $inv_items = $this->pos_model->getAllSaleItems($eid);
                krsort($inv_items);
                $c = rand(100000, 9999999);
                foreach ($inv_items as $item) {
                    $row = $this->site->getProductByID($item->product_id);
                    if (!$row) {
                        $row = json_decode('{}');
                    }
                    $row->price           = $item->net_unit_price;
                    $row->unit_price      = $item->unit_price;
                    $row->real_unit_price = $item->real_unit_price;
                    $row->discount        = $item->discount;
                    $row->qty             = $item->quantity;
                    $row->comment         = $item->comment;
                    $combo_items          = false;
                    $row->quantity += $item->quantity;
                    if ($row->type == 'combo') {
                        $combo_items = $this->pos_model->getComboItemsByPID($row->id);
                        foreach ($combo_items as $combo_item) {
                            $combo_item->quantity += ($combo_item->qty * $item->quantity);
                        }
                    }
                    $ri      = $this->Settings->item_addition ? $row->id : $c;
                    $pr[$ri] = ['id' => $c, 'item_id' => $row->id, 'label' => $row->name . ' (' . $row->code . ')', 'row' => $row, 'combo_items' => $combo_items];
                    $c++;
                }
                $this->data['items']   = json_encode($pr);
                $this->data['eid']     = $eid;
                $this->data['sale']    = $sale;
                $this->data['message'] = lang('sale_loaded');
            }
            $this->data['error']           = (validation_errors()) ? validation_errors() : $this->session->flashdata('error');
            $this->data['reference_note']  = isset($sid) && !empty($sid) ? $suspended_sale->hold_ref : (isset($eid) && !empty($eid) ? $sale->hold_ref : null);
	    $this->data['mm_no']  = isset($sid) && !empty($sid) ? $suspended_sale->reference_no : (isset($eid) && !empty($eid) ? $sale->reference_no : null);
            $this->data['sid']             = isset($sid) && !empty($sid) ? $sid : 0;
            $this->data['eid']             = isset($eid) && !empty($eid) ? $eid : 0;
            $this->data['customers']       = $this->site->getAllCustomers();
            // Extra Option
            //$this->data['extra_option']       = $this->site->getAllExtraOption();
            $this->data['shirt_extra_option']   = $this->site->getExtraoptionCategory(1);
            $this->data['pant_extra_option']    = $this->site->getExtraoptionCategory(2);
            $this->data['tcp']             = $this->pos_model->products_count($this->Settings->default_category);
            $this->data['products']        = $this->ajaxproducts($this->Settings->default_category, 1);
            $this->data['categories']      = $this->site->getAllCategories();
            $this->data['message']         = $this->session->flashdata('message');
            $this->data['suspended_sales'] = $this->site->getUserSuspenedSales();

            $this->data['printer'] = $this->site->getPrinterByID($this->Settings->printer);
            $printers              = [];
            if (!empty($order_printers = json_decode($this->Settings->order_printers))) {
                foreach ($order_printers as $printer_id) {
                    $printers[] = $this->site->getPrinterByID($printer_id);
                }
            }
            $this->data['order_printers'] = $printers;

            if ($saleid = $this->input->get('print', true)) {
                if ($inv = $this->pos_model->getSaleByID($saleid)) {
                    if ($this->session->userdata('store_id') != $inv->store_id) {
                        $this->session->set_flashdata('error', lang('access_denied'));
                        redirect('pos');
                    }
                    $this->tec->view_rights($inv->created_by, false, 'pos');
                    $this->load->helper('text');
                    $this->data['rows']       = $this->pos_model->getAllSaleItems($saleid);
                    $this->data['customer']   = $this->pos_model->getCustomerByID($inv->customer_id);
                    $this->data['store']      = $this->site->getStoreByID($inv->store_id);
                    $this->data['inv']        = $inv;
                    $this->data['print']      = $saleid;
                    $this->data['payments']   = $this->pos_model->getAllSalePayments($saleid);
                    $this->data['created_by'] = $this->site->getUser($inv->created_by);
                }
            }

            $this->data['page_title'] = lang('pos');
            $bc                       = [['link' => '#', 'page' => lang('pos')]];
            $meta                     = ['page_title' => lang('pos'), 'bc' => $bc];
            $this->load->view($this->theme . 'pos/index', $this->data, $meta);
        }
    }

    public function language($lang = false)
    {
        if ($this->input->get('lang')) {
            $lang = $this->input->get('lang');
        }
        //$this->load->helper('cookie');
        $folder        = 'app/language/';
        $languagefiles = scandir($folder);
        if (in_array($lang, $languagefiles)) {
            $cookie = [
                'name'   => 'language',
                'value'  => $lang,
                'expire' => '31536000',
                'prefix' => 'spos_',
                'secure' => false,
            ];

            $this->input->set_cookie($cookie);
        }
        redirect($_SERVER['HTTP_REFERER']);
    }

    public function open_drawer()
    {
        $printer = $this->site->getPrinterByID($this->Settings->printer);
        $this->load->library('escpos');
        $this->escpos->load($printer);
        $this->escpos->open_drawer();
    }

    public function open_register()
    {
        if (!$this->session->userdata('store_id')) {
            $this->session->set_flashdata('warning', lang('please_select_store'));
            redirect('stores');
        }
        $this->form_validation->set_rules('cash_in_hand', lang('cash_in_hand'), 'trim|required|numeric');

        if ($this->form_validation->run() == true) {
            $data = ['date'    => date('Y-m-d H:i:s'),
                'cash_in_hand' => $this->input->post('cash_in_hand'),
                'user_id'      => $this->session->userdata('user_id'),
                'store_id'     => $this->session->userdata('store_id'),
                'status'       => 'open',
            ];
        }
        if ($this->form_validation->run() == true && $this->pos_model->openRegister($data)) {
            $this->session->set_flashdata('message', lang('welcome_to_pos'));
            redirect('pos');
        } else {
            $this->data['error'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('error');

            $bc   = [['link' => base_url(), 'page' => lang('home')], ['link' => '#', 'page' => lang('open_register')]];
            $meta = ['page_title' => lang('open_register'), 'bc' => $bc];
            $this->page_construct('pos/open_register', $this->data, $meta);
        }
    }
    
    // Check DC Number Starts Here 
    function get_dc_check()
    {
        $dc_number = $this->input->get('dc_number');
        $dc_number_details = $this->pos_model->getDcNumberBySales($dc_number);
        
        echo json_encode($dc_number_details);
    }
    // Check DC Number Ends Here 
    public function p($bo = 'order')
    {
        $date             = date('Y-m-d H:i:s');
        $payment_date     = $this->input->post('payment_date');
        $customer_id      = $this->input->post('customer_id');
        $due_date         = $this->input->post('due_date');
        $customer_details = $this->pos_model->getCustomerByID($customer_id);
        $customer         = $customer_details->name;
        // Customer Phone Number
        $customer_phone   = $customer_details->phone;
        $note             = $this->tec->clear_tags($this->input->post('spos_note'));

        $total            = 0;
        $product_tax      = 0;
        $order_tax        = 0;
        $product_discount = 0;
        $order_discount   = 0;
        $percentage       = '%';
        
        $i                = isset($_POST['product_id']) ? sizeof($_POST['product_id']) : 0;
        for ($r = 0; $r < $i; $r++) {
            $item_id         = $_POST['product_id'][$r];
            $real_unit_price = $this->tec->formatDecimal($_POST['real_unit_price'][$r]);
            $item_quantity   = $_POST['quantity'][$r];
            $item_comment    = $_POST['item_comment'][$r];
            $item_ordered    = $_POST['item_was_ordered'][$r];
            $item_discount   = $_POST['product_discount'][$r] ?? '0';

            if (isset($item_id) && isset($real_unit_price) && isset($item_quantity)) {
                $product_details = $this->site->getProductByID($item_id);
                if ($product_details) {
                    $product_name = $product_details->name;
                    $product_code = $product_details->code;
                    $product_cost = $product_details->cost;
                    $product_type = $product_details->type;
                } else {
                    $product_name = $_POST['product_name'][$r];
                    $product_code = $_POST['product_code'][$r];
                    $product_type = $_POST['product_type'][$r];
                    $product_cost = 0;
                }
                if (!$this->Settings->overselling) {
                    if ($product_details->type == 'standard') {
                        if ($product_details->quantity < $item_quantity) {
                            $this->session->set_flashdata('error', lang('quantity_low') . ' (' .
                                lang('name') . ': ' . $product_details->name . ' | ' .
                                lang('ordered') . ': ' . $item_quantity . ' | ' .
                                lang('available') . ': ' . $product_details->quantity .
                                ')');
                            redirect('pos');
                        }
                    } elseif ($product_details->type == 'combo') {
                        $combo_items = $this->pos_model->getComboItemsByPID($product->id);
                        foreach ($combo_items as $combo_item) {
                            $cpr = $this->site->getProductByID($combo_item->id);
                            if ($cpr->quantity < $item_quantity) {
                                $this->session->set_flashdata('error', lang('quantity_low') . ' (' .
                                    lang('name') . ': ' . $cpr->name . ' | ' .
                                    lang('ordered') . ': ' . $item_quantity . ' x ' . $combo_item->qty . ' = ' . $item_quantity * $combo_item->qty . ' | ' .
                                    lang('available') . ': ' . $cpr->quantity .
                                    ') ' . $product_details->name);
                                redirect('pos');
                            }
                        }
                    }
                }
                $unit_price = $real_unit_price;

                $pr_discount = 0;
                if (isset($item_discount)) {
                    $discount = $item_discount;
                    $dpos     = strpos($discount, $percentage);
                    if ($dpos !== false) {
                        $pds         = explode('%', $discount);
                        $pr_discount = $this->tec->formatDecimal((($unit_price * (Float)($pds[0])) / 100), 4);
                    } else {
                        $pr_discount = $this->tec->formatDecimal($discount);
                    }
                }
                $unit_price       = $this->tec->formatDecimal(($unit_price - $pr_discount), 4);
                $item_net_price   = $unit_price;
                $pr_item_discount = $this->tec->formatDecimal(($pr_discount * $item_quantity), 4);
                $product_discount += $pr_item_discount;

                $pr_item_tax = 0;
                $item_tax    = 0;
                $tax         = '';
                if (isset($product_details->tax) && $product_details->tax != 0) {
                    if ($product_details && $product_details->tax_method == 1) {
                        $item_tax = $this->tec->formatDecimal(((($unit_price) * $product_details->tax) / 100), 4);
                        $tax      = $product_details->tax . '%';
                    } else {
                        $item_tax = $this->tec->formatDecimal(((($unit_price) * $product_details->tax) / (100 + $product_details->tax)), 4);
                        $tax      = $product_details->tax . '%';
                        $item_net_price -= $item_tax;
                    }

                    $pr_item_tax = $this->tec->formatDecimal(($item_tax * $item_quantity), 4);
                }

                $product_tax += $pr_item_tax;
                $subtotal = (($item_net_price * $item_quantity) + $pr_item_tax);

                $products[] = (object) [
                    'product_id'      => $item_id,
                    'quantity'        => $item_quantity,
                    'unit_price'      => $unit_price,
                    'net_unit_price'  => $item_net_price,
                    'discount'        => $item_discount,
                    'comment'         => $item_comment,
                    'item_discount'   => $pr_item_discount,
                    'tax'             => $tax,
                    'item_tax'        => $pr_item_tax,
                    'subtotal'        => $subtotal,
                    'real_unit_price' => $real_unit_price,
                    'cost'            => $product_cost,
                    'product_code'    => $product_code,
                    'product_name'    => $product_name,
                    'product_type'    => $product_type,
                    'ordered'         => $item_ordered,
                ];

                $total += $item_net_price * $item_quantity;
            }
        }
        if (empty($products)) {
            $this->form_validation->set_rules('product', lang('order_items'), 'required');
        } else {
            krsort($products);
        }

        if ($this->input->post('order_discount')) {
            $order_discount_id = $this->input->post('order_discount');
            $opos              = strpos($order_discount_id, $percentage);
            if ($opos !== false) {
                $ods            = explode('%', $order_discount_id);
                $order_discount = $this->tec->formatDecimal(((($total + $product_tax) * (Float)($ods[0])) / 100), 4);
            } else {
                $order_discount = $this->tec->formatDecimal($order_discount_id);
            }
        } else {
            $order_discount_id = null;
        }
        $total_discount = $this->tec->formatDecimal(($order_discount + $product_discount), 4);

        if ($this->input->post('order_tax')) {
            $order_tax_id = $this->input->post('order_tax');
            $opos         = strpos($order_tax_id, $percentage);
            if ($opos !== false) {
                $ots       = explode('%', $order_tax_id);
                $order_tax = $this->tec->formatDecimal(((($total + $product_tax - $order_discount) * (Float)($ots[0])) / 100), 4);
            } else {
                $order_tax = $this->tec->formatDecimal($order_tax_id);
            }
        } else {
            $order_tax_id = null;
            $order_tax    = 0;
        }

        $total_tax   = $this->tec->formatDecimal(($product_tax + $order_tax), 4);
        $grand_total = $this->tec->formatDecimal(($this->tec->formatDecimal($total) + $total_tax - $order_discount), 4);
        $paid        = 0;
        $round_total = $this->tec->roundNumber($grand_total, $this->Settings->rounding);
        $rounding    = $this->tec->formatDecimal(($round_total - $grand_total));

        //Extra Option Starts Here
        $extra_option_shirt_add = implode(",", $this->input->post('shirt_ext'));
        $extra_option_pant_add = implode(",", $this->input->post('pant_ext'));
        //Extra option Ends Here

        $phmeasure_add=array();
        $phmeasure_add[]=array(
            'pf1'=> $this->input->post('pf1'),
            'pf2'=> $this->input->post('pf2'),
            'pf3'=> $this->input->post('pf3'),
            'pf4'=> $this->input->post('pf4'),
            'pf5'=> $this->input->post('pf5'),
            'pf6'=> $this->input->post('pf6'),
            'pf7'=> $this->input->post('pf7'),
            'pf8'=> $this->input->post('pf8'),
            'ps1'=> $this->input->post('ps1'),
            'ps2'=> $this->input->post('ps2'),
            'ps3'=> $this->input->post('ps3'),
            'ps4'=> $this->input->post('ps4'),
            'ps5'=> $this->input->post('ps5'),
            'ps6'=> $this->input->post('ps6'),
            'ps7'=> $this->input->post('ps7'),
            'ps8'=> $this->input->post('ps8'),
            'pt1'=> $this->input->post('pt1')
        );
        $phmeasure_add= json_encode($phmeasure_add);
        
        $shmeasure_add=array();
        $shmeasure_add[]=array(
            'sf1'=> $this->input->post('sf1'),
            'sf2'=> $this->input->post('sf2'),
            'sf3'=> $this->input->post('sf3'),
            'sf4'=> $this->input->post('sf4'),
            'sf5'=> $this->input->post('sf5'),
            'sf6'=> $this->input->post('sf6'),
            'sf7'=> $this->input->post('sf7'),
            'sf8'=> $this->input->post('sf8'),
            'sf9'=> $this->input->post('sf9'),
            'sf10'=> $this->input->post('sf10'),
            'sf11'=> $this->input->post('sf11'),
            'ss1'=> $this->input->post('ss1'),
            'ss2'=> $this->input->post('ss2'),
            'ss3'=> $this->input->post('ss3'),
            'ss4'=> $this->input->post('ss4'),
            'ss5'=> $this->input->post('ss5'),
            'ss6'=> $this->input->post('ss6'),
            'ss7'=> $this->input->post('ss7'),
            'ss8'=> $this->input->post('ss8'),
            'ss9'=> $this->input->post('ss9'),
            'ss10'=> $this->input->post('ss10'),
            'ss11'=> $this->input->post('ss11'),
            'st1'=> $this->input->post('st1'),
            'fhf1'=> $this->input->post('fhf1'),
            'fhf2'=> $this->input->post('fhf2'),
            'fhf3'=> $this->input->post('fhf3'),
            'fhs1'=> $this->input->post('fhs1'),
            'fhs2'=> $this->input->post('fhs2'),
            'fhs3'=> $this->input->post('fhs3'),
        );
        $shmeasure_add= json_encode($shmeasure_add);
        
        

        $data = (object) ['date' => $date,
            'customer_id'        => $customer_id,
            'customer_name'      => $customer,
            // Customer Phone Number
            'customer_phone_no'  => $customer_phone,
            'sells'             => $this->input->post('sells'),
            'total'              => $this->tec->formatDecimal($total),
            'product_discount'   => $this->tec->formatDecimal($product_discount, 4),
            'order_discount_id'  => $order_discount_id,
            'order_discount'     => $order_discount,
            'total_discount'     => $total_discount,
            'product_tax'        => $this->tec->formatDecimal($product_tax, 4),
            'order_tax_id'       => $order_tax_id,
            'order_tax'          => $order_tax,
            'total_tax'          => $total_tax,
            'grand_total'        => $grand_total,
            'total_items'        => $this->input->post('total_items'),
            'total_quantity'     => $this->input->post('total_quantity'),
            'rounding'           => $rounding,
            'paid'               => $paid,
            'created_by'         => $this->session->userdata('user_id'),
            'note'               => $this->input->post('snote'),
            'hold_ref'           => $this->input->post('hold_ref'),
            'due_date'           => $this->input->post('due_date'),
            'pant_measure'       => $phmeasure_add,
            'shirt_measure'      => $shmeasure_add,
            'shirt_extra'        => $extra_option_shirt_add,
            'pant_extra'         => $extra_option_pant_add,
            'shirt_text'        => $this->input->post('shirt_text'),
            'pant_text'        => $this->input->post('pant_text'),
            'another_pant_measure' => $another_pant_add,
            'another_shirt_measure' => $another_shirt_add,
            'sale_date'        => $this->input->post('sale_date')
        ];

        // $this->tec->print_arrays($data, $products);
        $store      = $this->site->getStoreByID($this->session->userdata('store_id'));
        $created_by = $this->site->getUser($this->session->userdata('user_id'));

        if ($bo == 'bill') {
            $printer = $this->site->getPrinterByID($this->Settings->printer);
            $this->load->library('escpos');
            $this->escpos->load($printer);
            $this->escpos->print_receipt($store, $data, $products, false, $created_by, false, true);
        } else {
            $order_printers = json_decode($this->Settings->order_printers);
            $this->load->library('escpos');
            foreach ($order_printers as $printer_id) {
                $printer = $this->site->getPrinterByID($printer_id);
                $this->escpos->load($printer);
                $this->escpos->print_order($store, $data, $products, $created_by);
            }
        }
    }

    public function print_receipt($id, $open_drawer = false)
    {
        $sale       = $this->pos_model->getSaleByID($id);
        $items      = $this->pos_model->getAllSaleItems($id);
        $payments   = $this->pos_model->getAllSalePayments($id);
        $store      = $this->site->getStoreByID($sale->store_id);
        $created_by = $this->site->getUser($sale->created_by);
        $printer    = $this->site->getPrinterByID($this->Settings->printer);
        $this->load->library('escpos');
        $this->escpos->load($printer);
        $this->escpos->print_receipt($store, $sale, $items, $payments, $created_by, $open_drawer);
    }

    public function print_register($re = null)
    {
        if ($this->session->userdata('register_id')) {
            $register    = $this->pos_model->registerData();
            $ccsales     = $this->pos_model->getRegisterCCSales();
            $cashsales   = $this->pos_model->getRegisterCashSales();
            $chsales     = $this->pos_model->getRegisterChSales();
            $other_sales = $this->pos_model->getRegisterOtherSales();
            $gcsales     = $this->pos_model->getRegisterGCSales();
            $stripesales = $this->pos_model->getRegisterStripeSales();
            $totalsales  = $this->pos_model->getRegisterSales();
            $expenses    = $this->pos_model->getRegisterExpenses();
            $user        = $this->site->getUser();

            $total_cash = $cashsales->paid ? ($cashsales->paid + $register->cash_in_hand) : $register->cash_in_hand;
            $total_cash -= ($expenses->total ? $expenses->total : 0);
            $info = [
                (object) ['label' => lang('opened_at'), 'value' => $this->tec->hrld($register->date)],
                (object) ['label' => lang('cash_in_hand'), 'value' => $register->cash_in_hand],
                (object) ['label' => lang('user'), 'value' => $user->first_name . ' ' . $user->last_name . ' (' . $user->email . ')'],
                (object) ['label' => lang('printed_at'),  'value' => $this->tec->hrld(date('Y-m-d H:i:s'))],
            ];

            $reg_totals = [
                (object) ['label' => lang('cash_sale'), 'value' => $this->tec->formatMoney($cashsales->paid ? $cashsales->paid : '0.00') . ' (' . $this->tec->formatMoney($cashsales->total ? $cashsales->total : '0.00') . ')'],
                (object) ['label' => lang('ch_sale'), 'value' => $this->tec->formatMoney($chsales->paid ? $chsales->paid : '0.00') . ' (' . $this->tec->formatMoney($chsales->total ? $chsales->total : '0.00') . ')'],
                (object) ['label' => lang('gc_sale'),  'value' => $this->tec->formatMoney($gcsales->paid ? $gcsales->paid : '0.00') . ' (' . $this->tec->formatMoney($gcsales->total ? $gcsales->total : '0.00') . ')'],
                (object) ['label' => lang('cc_sale'),  'value' => $this->tec->formatMoney($ccsales->paid ? $ccsales->paid : '0.00') . ' (' . $this->tec->formatMoney($ccsales->total ? $ccsales->total : '0.00') . ')'],
                (object) ['label' => lang('stripe'),  'value' => $this->tec->formatMoney($stripesales->paid ? $stripesales->paid : '0.00') . ' (' . $this->tec->formatMoney($stripesales->total ? $stripesales->total : '0.00') . ')'],
                (object) ['label' => lang('other_sale'),  'value' => $this->tec->formatMoney($other_sales->paid ? $other_sales->paid : '0.00') . ' (' . $this->tec->formatMoney($other_sales->total ? $other_sales->total : '0.00') . ')'],
                (object) ['label' => 'line',  'value' => ''],
                (object) ['label' => lang('total_sales'),  'value' => $this->tec->formatMoney($totalsales->paid ? $totalsales->paid : '0.00') . ' (' . $this->tec->formatMoney($totalsales->total ? $totalsales->total : '0.00') . ')'],
                (object) ['label' => lang('cash_in_hand'),  'value' => $this->tec->formatMoney($register->cash_in_hand)],
                (object) ['label' => lang('expenses'),  'value' => $this->tec->formatMoney($expenses->total ? $expenses->total : '0.00')],
                (object) ['label' => 'line',  'value' => ''],
                (object) ['label' => lang('total_cash'),  'value' => $this->tec->formatMoney($total_cash)],
            ];

            $data = (object) [
                'printer' => $this->Settings->local_printers ? '' : json_encode($printer),
                'logo'    => !empty($store->logo) ? base_url('uploads/' . $store->logo) : '',
                'heading' => lang('register_details'),
                'info'    => $info,
                'totals'  => $reg_totals,
            ];

            // $this->tec->print_arrays($data);
            if ($re == 1) {
                return $data;
            } elseif ($re == 2) {
                echo json_encode($data);
            } else {
                $printer = $this->site->getPrinterByID($this->Settings->printer);
                $this->load->library('escpos');
                $this->escpos->load($printer);
                $this->escpos->print_data($data);
                echo json_encode(true);
            }
        } else {
            echo json_encode(false);
        }
    }

    public function promotions()
    {
        $this->load->view($this->theme . 'promotions', $this->data);
    }

    public function receipt_img()
    {
        $data     = $this->input->post('img', true);
        $filename = date('Y-m-d-H-i-s-') . uniqid() . '.png';
        $cd       = !empty($this->input->post('cd')) ? true : false;
        $imgData  = str_replace(' ', '+', $data);
        $imgData  = base64_decode($imgData);
        file_put_contents('files/receipts/' . $filename, $imgData);
        $printer = $this->site->getPrinterByID($this->Settings->printer);
        $this->load->library('escpos');
        $this->escpos->load($printer);
        $this->escpos->print_img($filename, $cd);
        echo 'Printed Image  files/receipts/' . $filename;
        exit;
    }

    public function register_details()
    {
        $register_open_time        = $this->session->userdata('register_open_time');
        $this->data['error']       = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
        $this->data['ccsales']     = $this->pos_model->getRegisterCCSales($register_open_time);
        $this->data['cashsales']   = $this->pos_model->getRegisterCashSales($register_open_time);
        $this->data['chsales']     = $this->pos_model->getRegisterChSales($register_open_time);
        $this->data['other_sales'] = $this->pos_model->getRegisterOtherSales($register_open_time);
        $this->data['gcsales']     = $this->pos_model->getRegisterGCSales($register_open_time);
        $this->data['stripesales'] = $this->pos_model->getRegisterStripeSales($register_open_time);
        $this->data['totalsales']  = $this->pos_model->getRegisterSales($register_open_time);
        $this->data['expenses']    = $this->pos_model->getRegisterExpenses($register_open_time);
        $this->load->view($this->theme . 'pos/register_details', $this->data);
    }

    public function registers()
    {
        $this->data['error']     = (validation_errors()) ? validation_errors() : $this->session->flashdata('error');
        $this->data['registers'] = $this->pos_model->getOpenRegisters();
        $bc                      = [['link' => base_url(), 'page' => lang('home')], ['link' => site_url('pos'), 'page' => lang('pos')], ['link' => '#', 'page' => lang('open_registers')]];
        $meta                    = ['page_title' => lang('open_registers'), 'bc' => $bc];
        $this->page_construct('pos/registers', $this->data, $meta);
    }

    public function shortcuts()
    {
        $this->load->view($this->theme . 'pos/shortcuts', $this->data);
    }

    public function stripe_balance()
    {
        if (!$this->Owner) {
            return false;
        }
        $this->load->model('stripe_payments');
        return $this->stripe_payments->get_balance();
    }
    
    // New Clone Details
    function customerInfo()
    {
        $customer_id = $this->input->get('customer_cus_id');
        $customer_details = $this->pos_model->getSaleByCusID($customer_id);
        $customer_measurement = $this->pos_model->getCusMeasurement($customer_id);
        
        $phmeasurement = json_decode($this->pos_model->getCusMeasurement($customer_id), true);
        //$phmeasurement=json_decode($sale->pant_measure, true);
        
        echo json_encode($customer_details);
        echo json_decode($customer_measurement);
    }
    // Sales Clone - Sales ID Starts Here
    function cloneSaleDetails()
    {
        $sale_id = $this->input->get('sale_id');
        $sale_details = $this->pos_model->getSalesBySaleID($sale_id);
        
        echo json_encode($sale_details);
    }
    
    function saleHistoryByCustomers()
    {
        $customer_id = $this->input->get('customer_id');
        $customer_sale_details = $this->pos_model->getSalesByCustomerID($customer_id);
        
        echo json_encode($customer_sale_details);
    }
    public function get_all_sale_items()
    {
        $customers_id = $this->input->get('customer_id');
        $data = $this->pos_model->getSalesByCustomerID($customers_id);
        $content='';
        if($data){
            $content='<table style="width: 100%;border: 1px solid black;">
                    <tr>
                        <th class="history_table">DC Number</th>
                        <th class="history_table">Pant Count</th>
                        <th class="history_table">Shirt Count</th>
                        <th class="history_table">DC Status</th>
                        <th class="history_table">Balance</th>
                        <th class="history_table">Clone</th>
                        <th class="history_table">Date</th>
                    </tr>';
            foreach($data as $d){
                
                if($d->unit_process_status==1){$status="<div class='text-center'><span class='upsale_status label label-info'>Measurement Collected</span></div>";}
                if($d->unit_process_status==2){$status="<div class='text-center'><span class='upsale_status label label-danger'>Cutting Unit (Partial Assigned)";}
                if($d->unit_process_status==3){$status="<div class='text-center'><span class='upsale_status label label-warning'>Cutting Unit (Fully Assigned)</span></div>";}
                if($d->unit_process_status==4){$status="<div class='text-center'><span class='upsale_status label label-danger'>Stitching Unit (Partial Assigned)</span></div>";}
                if($d->unit_process_status==5){$status="<div class='text-center'><span class='upsale_status label label-warning'>Stitching Unit (Fully Assigned)</span></div>";}
                if($d->unit_process_status==6){$status="<div class='text-center'><span class='upsale_status label label-warning'>Ready to Delivery (Partial)</span></div>";}
                if($d->unit_process_status==7){$status="<div class='text-center'><span class='upsale_status label label-primary'>Ready to Delivery</span></div>";}
                if($d->unit_process_status==8){$status="<div class='text-center'><span class='upsale_status label label-warning'>Order Delivered (Partial)</span></div>";}
                if($d->unit_process_status==9){$status="<div class='text-center'><span class='upsale_status label label-success'>Order Delivered</span></div>";}
                
                $balance=($d->grand_total)-($d->paid+$d->discount);
                $date = date("Y-m-d", $d->date);
                
                $content.='<tr>';
                $content.='<td class="history_table">'.$d->hold_ref.'</td>';
                
                 $content.='<td class="history_table">'.$d->shirt_count.'</td>';
                  $content.='<td class="history_table">'.$d->pant_count.'</td>';
                $content.='<td class="history_table">'.$status.'</td>';
                
                if($balance==0)
                {
                    $content.='<td class="history_table">
                            <a class=""><b>NULL<b></a>
                            </td>';
                }
                else
                {
                    $content.='<td class="history_table">
                            <a class="btn btn-danger btn-xs"><i class="fa fa-inr"></i> '.number_format($balance,2).'</a>
                            </td>';
                }
                           
                $content.='<td class="history_table"><a class="btn btn-warning btn-xs" href="pos/?clone='.$d->id.'">CLONE</a></td>';
                $content.='<td class="history_table">'.date("d-m-Y", strtotime($d->sale_date)).'</td>';
                $content.='</tr>';
                
                $content.='<style>
                                .history_table {
                                  border: 1px solid #dddddd;
                                  text-align: center;
                                  padding: 7px;
                                }
                            </style>';
                
                
            }
            $content.='</table>';
        }else{
            $content.='<center><b>No Data Available</b></center>';
        }
        echo $content;
        
    }
    // Sales Clone - Sales ID Ends Here
    
    public function suggestions()
    {
        $term = $this->tec->parse_scale_barcode($this->input->get('term', true));
        if (is_array($term)) {
            $bqty   = $term['weight'] ?? null;
            $bprice = $term['price']  ?? null;
            $term   = $term['item_code'];
            $rows   = $this->pos_model->getProductNames($term, null, true);
        }
        if (!$rows) {
            $bqty   = null;
            $bprice = null;
            $term   = $this->input->get('term', true);
            $rows   = $this->pos_model->getProductNames($term);
        }
        if ($rows) {
            foreach ($rows as $row) {
                unset($row->cost, $row->details);
                $row->qty             = $bqty ?: ($bprice ? $bprice / $row->price : 1);
                $row->comment         = '';
                $row->discount        = '0';
                $row->price           = $row->store_price > 0 ? $row->store_price : $row->price;
                $row->real_unit_price = $row->price;
                $row->unit_price      = $row->tax ? ($row->price + (($row->price * $row->tax) / 100)) : $row->price;
                $combo_items          = false;
                if ($row->type == 'combo') {
                    $combo_items = $this->pos_model->getComboItemsByPID($row->id);
                }
                $pr[] = ['id' => str_replace('.', '', microtime(true)), 'item_id' => $row->id, 'label' => $row->name . ' (' . $row->code . ')', 'row' => $row, 'combo_items' => $combo_items];
            }
            echo json_encode($pr);
        } else {
            echo json_encode([['id' => 0, 'label' => lang('no_match_found'), 'value' => $term]]);
        }
    }

    public function today_sale()
    {
        if (!$this->Admin) {
            $this->session->set_flashdata('error', lang('access_denied'));
            redirect($_SERVER['HTTP_REFERER']);
        }

        $this->data['error']       = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
        $this->data['ccsales']     = $this->pos_model->getTodayCCSales();
        $this->data['cashsales']   = $this->pos_model->getTodayCashSales();
        $this->data['chsales']     = $this->pos_model->getTodayChSales();
        $this->data['other_sales'] = $this->pos_model->getTodayOtherSales();
        $this->data['gcsales']     = $this->pos_model->getTodayGCSales();
        $this->data['stripesales'] = $this->pos_model->getTodayStripeSales();
        $this->data['totalsales']  = $this->pos_model->getTodaySales();
        // $this->data['expenses'] = $this->pos_model->getTodayExpenses();
        $this->load->view($this->theme . 'pos/today_sale', $this->data);
    }

    public function validate_gift_card($no)
    {
        if ($gc = $this->pos_model->getGiftCardByNO(urldecode($no))) {
            if ($gc->expiry) {
                if ($gc->expiry >= date('Y-m-d')) {
                    echo json_encode($gc);
                } else {
                    echo json_encode(false);
                }
            } else {
                echo json_encode($gc);
            }
        } else {
            echo json_encode(false);
        }
    }

    public function view($sale_id = null, $noprint = null)
    {
        if ($this->input->get('id')) {
            $sale_id = $this->input->get('id');
        }
        $this->data['error']   = (validation_errors() ? validation_errors() : $this->session->flashdata('error'));
        $this->data['message'] = $this->session->flashdata('message');
        $inv                   = $this->pos_model->getSaleByID($sale_id);
        if (!$this->session->userdata('store_id')) {
            $this->session->set_flashdata('warning', lang('please_select_store'));
            redirect('stores');
        } elseif ($this->session->userdata('store_id') != $inv->store_id) {
            $this->session->set_flashdata('error', lang('access_denied'));
            redirect('welcome');
        }
        $this->tec->view_rights($inv->created_by);
        $this->load->helper('text');
        $this->data['rows']       = $this->pos_model->getAllSaleItems($sale_id);
        $this->data['customer']   = $this->pos_model->getCustomerByID($inv->customer_id);
        $this->data['store']      = $this->site->getStoreByID($inv->store_id);
        $this->data['inv']        = $inv;
        $this->data['sid']        = $sale_id;
        $this->data['noprint']    = $noprint;
        $this->data['modal']      = $noprint ? true : false;
        $this->data['payments']   = $this->pos_model->getAllSalePayments($sale_id);
        $this->data['created_by'] = $this->site->getUser($inv->created_by);
        $this->data['printer']    = $this->site->getPrinterByID($this->Settings->printer);
        $this->data['store']      = $this->site->getStoreByID($inv->store_id);
        $this->data['page_title'] = lang('invoice');
        $this->load->view($this->theme . 'pos/' . ($this->Settings->remote_printing != 1 && $this->Settings->print_img ? 'eview' : 'view'), $this->data);
    }

    public function view_bill()
    {
        $this->load->view($this->theme . 'pos/view_bill', $this->data);
    }
}

Zerion Mini Shell 1.0