<?php

//the global file operation
session_start();
ob_start();
//global varable
global $showoutside;

//to check if the page from .htacess
//$showoutside = $_GET['sn'];
// get the config file
include_once("../public/config.php");
include_once("dailyentryfun.php");

//here the db files that include in the file
include("../public/include_dao.php");

//User
require_once('../models/dao/UserDAO.class.php');
require_once('../models/dto/User.class.php');
require_once('../models/mysql/UserMySqlDAO.class.php');
require_once('../models/mysql/ext/UserMySqlExtDAO.class.php');
//Buybill
require_once('../models/dao/BuybillDAO.class.php');
require_once('../models/dto/Buybill.class.php');
require_once('../models/mysql/BuybillMySqlDAO.class.php');
require_once('../models/mysql/ext/BuybillMySqlExtDAO.class.php');
//Buybilldetail
require_once('../models/dao/BuybilldetailDAO.class.php');
require_once('../models/dto/Buybilldetail.class.php');
require_once('../models/mysql/BuybilldetailMySqlDAO.class.php');
require_once('../models/mysql/ext/BuybilldetailMySqlExtDAO.class.php');
//Product
require_once('../models/dao/ProductDAO.class.php');
require_once('../models/dto/Product.class.php');
require_once('../models/mysql/ProductMySqlDAO.class.php');
require_once('../models/mysql/ext/ProductMySqlExtDAO.class.php');
//Productcat
require_once('../models/dao/ProductcatDAO.class.php');
require_once('../models/dto/Productcat.class.php');
require_once('../models/mysql/ProductcatMySqlDAO.class.php');
require_once('../models/mysql/ext/ProductcatMySqlExtDAO.class.php');
//Supplier
require_once('../models/dao/SupplierDAO.class.php');
require_once('../models/dto/Supplier.class.php');
require_once('../models/mysql/SupplierMySqlDAO.class.php');
require_once('../models/mysql/ext/SupplierMySqlExtDAO.class.php');
//Store
require_once('../models/dao/StoreDAO.class.php');
require_once('../models/dto/Store.class.php');
require_once('../models/mysql/StoreMySqlDAO.class.php');
require_once('../models/mysql/ext/StoreMySqlExtDAO.class.php');
//Programsetting
require_once('../models/dao/ProgramsettingsDAO.class.php');
require_once('../models/dto/Programsetting.class.php');
require_once('../models/mysql/ProgramsettingsMySqlDAO.class.php');
require_once('../models/mysql/ext/ProgramsettingsMySqlExtDAO.class.php');
//Productunit
require_once('../models/dao/ProductunitDAO.class.php');
require_once('../models/dto/Productunit.class.php');
require_once('../models/mysql/ProductunitMySqlDAO.class.php');
require_once('../models/mysql/ext/ProductunitMySqlExtDAO.class.php');
//Unit
require_once('../models/dao/UnitDAO.class.php');
require_once('../models/dto/Unit.class.php');
require_once('../models/mysql/UnitMySqlDAO.class.php');
require_once('../models/mysql/ext/UnitMySqlExtDAO.class.php');
//Billsetting
require_once('../models/dao/BillsettingsDAO.class.php');
require_once('../models/dto/Billsetting.class.php');
require_once('../models/mysql/BillsettingsMySqlDAO.class.php');
require_once('../models/mysql/ext/BillsettingsMySqlExtDAO.class.php');
//Storedetail
require_once('../models/dao/StoredetailDAO.class.php');
require_once('../models/dto/Storedetail.class.php');
require_once('../models/mysql/StoredetailMySqlDAO.class.php');
require_once('../models/mysql/ext/StoredetailMySqlExtDAO.class.php');
//Storereport
require_once('../models/dao/StorereportDAO.class.php');
require_once('../models/dto/Storereport.class.php');
require_once('../models/mysql/StorereportMySqlDAO.class.php');
require_once('../models/mysql/ext/StorereportMySqlExtDAO.class.php');
//Productserial
require_once('../models/dao/ProductserialDAO.class.php');
require_once('../models/dto/Productserial.class.php');
require_once('../models/mysql/ProductserialMySqlDAO.class.php');
require_once('../models/mysql/ext/ProductserialMySqlExtDAO.class.php');
//Buyandruternbilldetail
require_once('../models/dao/BuyandruternbilldetailDAO.class.php');
require_once('../models/dto/Buyandruternbilldetail.class.php');
require_once('../models/mysql/BuyandruternbilldetailMySqlDAO.class.php');
require_once('../models/mysql/ext/BuyandruternbilldetailMySqlExtDAO.class.php');
//
require_once('../models/dao/SizecolorDAO.class.php');
require_once('../models/dto/Sizecolor.class.php');
require_once('../models/mysql/SizecolorMySqlDAO.class.php');
require_once('../models/mysql/ext/SizecolorMySqlExtDAO.class.php');
//
require_once('../models/dao/SizecolorstoredetailDAO.class.php');
require_once('../models/dto/Sizecolorstoredetail.class.php');
require_once('../models/mysql/SizecolorstoredetailMySqlDAO.class.php');
require_once('../models/mysql/ext/SizecolorstoredetailMySqlExtDAO.class.php');
//Billname
require_once('../models/dao/BillnameDAO.class.php');
require_once('../models/dto/Billname.class.php');
require_once('../models/mysql/BillnameMySqlDAO.class.php');
require_once('../models/mysql/ext/BillnameMySqlExtDAO.class.php');
//Availableparcode
require_once('../models/dao/AvailableparcodeDAO.class.php');
require_once('../models/dto/Availableparcode.class.php');
require_once('../models/mysql/AvailableparcodeMySqlDAO.class.php');
require_once('../models/mysql/ext/AvailableparcodeMySqlExtDAO.class.php');
//get the do the action
$do = isset($_GET['do']) ? $_GET['do'] : '';

/* ======================

  Controller Name :- buyBillController

  OPERTATION in Controller

  1- add buy bill
  2-  تقرير لمورد معين

  ======================== */

//here goes the instances and general variables
//Buybill
$buyBill = new Buybill();
$buyBillDAO = new BuybillMySqlDAO();
$buyBillExt = new BuybillMySqlExtDAO();
//Buybilldetail
$buyBillDetail = new Buybilldetail();
$buyBillDetailDAO = new BuybilldetailMySqlDAO();
$buyBillDetailExt = new BuybilldetailMySqlExtDAO();
//Product
$product = new Product();
$productDAO = new ProductMySqlDAO();
$productExt = new ProductMySqlExtDAO();
//Productcat
$productCatDAO = new ProductcatMySqlDAO();
$productCatExt = new ProductcatMySqlExtDAO();
//Supplier
$supplierDAO = new SupplierMySqlDAO();
$supplierExt = new SupplierMySqlExtDAO();
//Store
$storeDAO = new StoreMySqlDAO();
$storeExt = new StoreMySqlExtDAO();
//Programsetting
$programSettingExt = new ProgramsettingsMySqlExtDAO();
//Productunit
$productUnitExt = new ProductunitMySqlExtDAO();
$productUnit = new Productunit();
$productUnitDAO = new ProductunitMySqlDAO();
//Unit
$unitDAO = new UnitMySqlDAO();
$unitExt = new UnitMySqlExtDAO();
//Billsetting
$billSettingExt = new BillsettingsMySqlExtDAO();
//Storedetail
$storeDetail = new Storedetail();
$storeDetailDAO = new StoredetailMySqlDAO();
$storeDetailExt = new StoredetailMySqlExtDAO();
//Storereport
$storeReport = new Storereport();
$storeReportDAO = new StorereportMySqlDAO();
$storeReportExt = new StorereportMySqlExtDAO();

//Productserial
$Productserial = new Productserial();
$ProductserialDAO = new ProductserialMySqlDAO();
$ProductserialEX = new ProductserialMySqlExtDAO();


//Dailyentry
$dailyEntry = new Dailyentry();
$dailyEntryDAO = new DailyentryMySqlDAO();
$dailyEntryEX = new DailyentryMySqlExtDAO();

//Dailyentrycreditor دائن
$dailyEntryCreditor = new Dailyentrycreditor();
$dailyEntryCreditorDAO = new DailyentrycreditorMySqlDAO();
$dailyEntryCreditorEX = new DailyentrycreditorMySqlExtDAO();

//Dailyentrydebtor مدين
$dailyEntryDebtor = new Dailyentrydebtor();
$dailyEntryDebtorDAO = new DailyentrydebtorMySqlDAO();
$dailyEntryDebtorEX = new DailyentrydebtorMySqlExtDAO();

//Programsetting
$ProgramsettingDAO = new ProgramsettingsMySqlDAO();
$programSettingExt = new ProgramsettingsMySqlExtDAO();
//Buyandruternbilldetail
$buyAndReturnBillDetail = new Buyandruternbilldetail();
$buyAndReturnBillDetailDAO = new BuyandruternbilldetailMySqlDAO();
$buyAndReturnBillDetailExt = new BuyandruternbilldetailMySqlExtDAO();

//User
$user = new User();
$userDAO = new UserMySqlDAO();
$userEX = new UserMySqlExtDAO();
//
$sizeColor = new Sizecolor();
$sizeColorDAO = new SizecolorMySqlDAO();
$sizeColorEX = new SizecolorMySqlExtDAO();
//
$sizeColorStoreDetail = new Sizecolorstoredetail();
$sizeColorStoreDetailDAO = new SizecolorstoredetailMySqlDAO();
$sizeColorStoreDetailEX = new SizecolorstoredetailMySqlExtDAO();
//Billname
$billNameDAO = new BillnameMySqlDAO();
$billNameEX = new BillnameMySqlExtDAO();
//Usergroup
$Usergroup = new Usergroup();
$UsergroupDAO = new UsergroupMySqlDAO();
$UsergroupEX = new UsergroupMySqlExtDAO();
//Availableparcode
$availableParcode = new Availableparcode();
$availableParcodeDAO = new AvailableparcodeMySqlDAO();
$availableParcodeEX = new AvailableparcodeMySqlExtDAO();

$serialArray = array();


$today = date("Y-m-d");

$do = isset($_GET['do']) ? $_GET['do'] : '';
$billnameid = isset($_GET['billnameid']) ? $_GET['billnameid'] : '';
$supplierId = isset($_GET['supplierid']) ? $_GET['supplierid'] : '';
$productId = isset($_GET['productid']) ? $_GET['productid'] : '';
$itr = isset($_GET['itrs']) ? $_GET['itrs'] : '';
$tabindex = isset($_GET['tabindex']) ? $_GET['tabindex'] : '';
$return = isset($_GET['return']) ? $_GET['return'] : '';

$Programsettingdata = $ProgramsettingDAO->load(1);
$smarty->assign("Programsettingdata", $Programsettingdata);
$noOfDecimalPlaces = 2; //($Programsettingdata->roundnumbers == 0) ? 0 : (int) $Programsettingdata->noOfDecimalPlaces;

if (empty($do)) {
    if (!empty($supplierId) && $supplierId != "-1") {
        try {
            $rawmaterialssupplierdebt = getSupplierDebt();
            echo $rawmaterialssupplierdebt;
        } catch (Exception $e) {
        }
    } elseif (!empty($productId) && $productId != "-1" && $productId != "0" && (!empty($return) || $return == 0)) {
        try {
            $productPriceData = getBuyPrice();
            $itr = $productPriceData[0];
            $tabindex = $productPriceData[1];
            $productprice = $productPriceData[2];
            if ($return == 0) {
                echo '<input name="proprice' . $itr . '" id="proprice' . $itr . '"  value="0" class="getprototal  txt-nonraduis  numberclic enteraction numberinput" type="text"  tabindex="' . $tabindex . '"/>';
            } else {
                echo '<input name="proprice_re' . $itr . '" id="proprice_re' . $itr . '"  value="0" class="getprototal  txt-nonraduis  numberclic enteraction numberinput" type="text"  tabindex="' . $tabindex . '" />';
            }
        } catch (Exception $e) {
        }
    }
} elseif ($do == "units") {
    getProductUnits();
} elseif ($do == "unitPrice") {
    calculateUnitBuyPrice();
} elseif ($do == "parcode") {
    getProductByParcode();
} elseif ($do == "addplnew") {
    $detailid = $_REQUEST['detailid'];
    $buybilldetailpl = R::dispense('buybilldetailpl');
    $buybilldetailpl->buybilldetailid = $detailid;
    $buybilldetailpl->text1 = '';
    $buybilldetailpl->text2 = 0;
    $buybilldetailpl->text3 = '';
    $id = R::store($buybilldetailpl);
    $smarty->assign('id', $id);
    $smarty->assign('detailid', $detailid);
    $smarty->display("buyBillview/addplr.html");
} elseif ($do == "autosave") {
    $name = filter_input(INPUT_POST, 'name');
    $detailid = filter_input(INPUT_POST, 'detailid');
    $id = filter_input(INPUT_POST, 'id');
    $values = filter_input(INPUT_POST, 'values');
    R::exec("UPDATE `buybilldetailpl` SET $name = '$values', buybilldetailid = $detailid WHERE id = '" . $id . "' ");
} elseif ($do == "removepl") {
    $detailid = filter_input(INPUT_POST, 'detailid');
    $id = filter_input(INPUT_POST, 'id');
    R::exec("DELETE FROM `buybilldetailpl` WHERE id = '" . $id . "' ");
} elseif ($do == "printaddpl") {

    $buyBill_Id = $_GET['id'];


    $buybill = R::getRow("SELECT * FROM buybill where buybillid = ? ", [$buyBill_Id]);
    $supplier = R::getRow("SELECT * FROM supplier where supplierid = ? ", [$buybill['buybillsupplierid']]);
    $store = R::getRow("SELECT * FROM store where storeId = ? ", [$buybill['buybillstoreid']]);

    $buybilldetails = R::getAll("SELECT * FROM buybilldetail where buybillid = ? ", [$buyBill_Id]);


    $allitem = array();
    foreach ($buybilldetails as $buybilldetail) {
        $product = R::getRow("SELECT * FROM product where productId = ? ", [$buybilldetail['buybilldetailproductid']]);
        $unit = R::getRow("SELECT * FROM unit where unitId = ? ", [$buybilldetail['productunitid']]);
        $buybilldetailpls = R::getAll("SELECT * FROM buybilldetailpl where buybilldetailid = ? ", [$buybilldetail['buybilldetailid']]);
        $stayquantity = R::getcell("SELECT sum(text2) FROM buybilldetailpl where buybilldetailid = ? ", [$buybilldetail['buybilldetailid']]);
        $item = array(
            'buybilldetailid' => $buybilldetail['buybilldetailid'],
            'unitName' => $unit['unitName'],
            'buybilldetailquantity' => $buybilldetail['buybilldetailquantity'],
            'stayquantity' => $stayquantity,
            'productName' => $product['productName'],
            'weight' => $product['weight'],
            'origin' => $product['origin'],
            'hscode' => $product['hscode'],
            'buybilldetailpls' => $buybilldetailpls
        );
        array_push($allitem, $item);
    }


    $smarty->assign('buybill', $buybill);
    $smarty->assign('supplier', $supplier);
    $smarty->assign('store', $store);
    $smarty->assign('buybilldetails', $allitem);


    $smarty->display("buyBillview/printaddpl.html");
} elseif ($do == "temp") {
    if (!isset($_POST["erpDB"]) || empty($_POST["erpDB"])) {
        $billSettingsData = loadBillProperties($billnameid);
        $smarty->assign("billSettingsData", $billSettingsData);
    }

    try {
        insertTempProduct();
    } catch (Exception $e) {
    }
} elseif ($do == "editProduct") {
    editProduct();
} elseif ($do == "updateProduct") {
    $billSettingsData = loadBillProperties($billnameid);
    $smarty->assign("billSettingsData", $billSettingsData);

    try {
        updateProduct();
    } catch (Exception $e) {
    }
} elseif ($do == "getProducts") {
    $productsData = getProducts(); //undeleted products
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getProductsnoservice") { //products that is not collective products"has no ingridients"
    $productsData = getProductsnoservice(); //undeleted products
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getProductsnotcollective") { //products that is not collective products"has no ingridients"
    $productsData = getProductsnotcollective(); //undeleted products
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getProductsQueryString") {
    $productsData = getProductsQueryString(); //undeleted products
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getProductsQueryStringnoservice") {
    $productsData = getProductsQueryStringnoservice(); //undeleted products
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getserail") {

    $generatedParcode = getserail();
    echo $generatedParcode;
} elseif ($do == "productAddModal") {
    ##التصنيفات
    $catDataReport = getCategoryChilds();
    $smarty->assign("catDataReport", $catDataReport[1]);

    //get product categories
    $categoriesData = getProductCatParents();
    $smarty->assign("categoriesData", $categoriesData);

    //get units
    $unitsData = getUnits();
    $smarty->assign("unitsData", $unitsData);

    $today = date("Y-m-d");
    $smarty->assign("today", $today);

    $generatedParcode = ''; //generateParcode();
    $smarty->assign("generatedParcode", $generatedParcode);

    //
    $allSizeColor = $sizeColorDAO->queryAll();
    $smarty->assign("allSizeColor", $allSizeColor);

    $smarty->display("buyBillview/addProduct.html");
} elseif ($do == "productData") {
    getProductData();
} elseif ($do == "getProPriceUpdateModalData") {
    $productId = $_GET['id'];
    if (strpos($productId, "hasSizeColor") !== false) {
        $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
        $productId = $productIdComplex[0];
        $sizeId = $productIdComplex[1];
        $colorId = $productIdComplex[2];
    }
    $_GET['id'] = $productId;
    $newBuyPrice = (float) $_GET['newBuyPrice'];
    $smarty->assign("newBuyPrice", $newBuyPrice);


    $productsData = $productExt->loadExt($productId);
    $productsData->sumProductQuantity = (int) $productsData->sumProductQuantity;
    $smarty->assign("productsData", $productsData);

    if (count($productsData) > 0) {
        $productUnitsData = $productUnitData = $productUnitExt->queryByProductidExt($productsData->productId);
        $smarty->assign("productUnitsData", $productUnitsData);
        $smarty->assign("countProductUnits", count($productUnitsData));
    }

    //get units
    $unitsData = $unitDAO->queryByCondition(0);
    $smarty->assign("unitsData", $unitsData);

    $smarty->display("buyBillview/updateProPrices.html");
} elseif ($do == "updateProPriceOnlyFromModal") {
    $productId = (int) $_POST['productIdForPrices'];
    $productBuyPrice = $_POST['productBuyPrice1'];
    $productSellAllPrice = $_POST['productSellAllPrice1'];
    $productSellHalfPrice = $_POST['productSellHalfPrice1'];
    $productSellUnitPrice = $_POST['productSellUnitPrice1'];
    $productbuypricereal = $_POST['productbuypricereal1'];

    $productBuyPrice = round($productBuyPrice, $noOfDecimalPlaces);
    $productSellAllPrice = round($productSellAllPrice, $noOfDecimalPlaces);
    $productSellHalfPrice = round($productSellHalfPrice, $noOfDecimalPlaces);
    $productSellUnitPrice = round($productSellUnitPrice, $noOfDecimalPlaces);
    $productbuypricereal = round($productbuypricereal, $noOfDecimalPlaces);

    $productbuypricereal = $_POST['productbuypricereal1'];
    $buypricereal_precentage = $_POST['buypricereal_precentage1'];
    $buytotal_precentage = $_POST['buytotal_precentage1'];
    $buyhalf_precentage = $_POST['buyhalf_precentage1'];
    $buypart_precentage = $_POST['buypart_precentage1'];

    $productbuypricereal = round($productbuypricereal, $noOfDecimalPlaces);
    $buypricereal_precentage = round($buypricereal_precentage, $noOfDecimalPlaces);
    $buytotal_precentage = round($buytotal_precentage, $noOfDecimalPlaces);
    $buyhalf_precentage = round($buyhalf_precentage, $noOfDecimalPlaces);
    $buypart_precentage = round($buypart_precentage, $noOfDecimalPlaces);

    if (!empty($productId)) {
        $product = $productDAO->load($productId);
        //update product
        $product->productSellAllPrice = $productSellAllPrice;
        $product->productSellHalfPrice = $productSellHalfPrice;
        $product->productSellUnitPrice = $productSellUnitPrice;
        $product->productbuypricereal = $productbuypricereal;
        $product->buypricereal_precentage = $buypricereal_precentage;
        $product->buytotal_precentage = $buytotal_precentage;
        $product->buyhalf_precentage = $buyhalf_precentage;
        $product->buypart_precentage = $buypart_precentage;
        $product->userId = $_SESSION['userid'];
        if ($productBuyPrice != $product->productBuyPrice) {
            //
            $meanbuyprice = ($product->meanbuyprice + $productBuyPrice) / 2;
            $meanbuyprice_withDiscount = ($product->meanbuyprice_withDiscount + $productBuyPrice) / 2;
            //
            $product->meanbuyprice = round($meanbuyprice, $noOfDecimalPlaces);
            $product->meanbuyprice_withDiscount = round($meanbuyprice_withDiscount, $noOfDecimalPlaces);
            //            $product->lastbuyprice_withTax = round($lastbuyprice_withTax, $noOfDecimalPlaces);
            //            $product->meanbuyprice_withTax = round($meanbuyprice_withTax, $noOfDecimalPlaces);
        }

        #############
        $unitsItr = $_POST['unitsItr1'];
        for ($j = 1; $j <= $unitsItr; $j++) {
            $productunit = $_POST['productunit1' . $j];
            $productnumber = $_POST['productnumber1' . $j];
            $productunitid = (int) $_POST['productunitid' . $j];
            $proUnitParcode = $_POST['proUnitParcode1' . $j];
            $proUnitSellAllPrice = (float) $_POST['proUnitSellAllPrice1' . $j];
            $proUnitSellHalfPrice = (float) $_POST['proUnitSellHalfPrice1' . $j];
            $proUnitSellUnitPrice = (float) $_POST['proUnitSellUnitPrice1' . $j];
            $proUnitBuyPrice = (float) $_POST['proUnitBuyPrice1' . $j];

            if (!empty($productunitid)) {
                if (empty($proUnitSellAllPrice))
                    $proUnitSellAllPrice = $product->productSellAllPrice * $productnumber;

                if (empty($proUnitSellHalfPrice))
                    $proUnitSellHalfPrice = $product->productSellHalfPrice * $productnumber;

                if (empty($proUnitSellUnitPrice))
                    $proUnitSellUnitPrice = $product->productSellUnitPrice * $productnumber;

                if (empty($proUnitBuyPrice))
                    $proUnitBuyPrice = $product->productBuyPrice * $productnumber;

                //insert into productunit tbl
                $productUnit = $productUnitDAO->load($productunitid);
                $productUnit->userid = $_SESSION['userid'];
                $productUnit->proUnitSellAllPrice = $proUnitSellAllPrice;
                $productUnit->proUnitSellHalfPrice = $proUnitSellHalfPrice;
                $productUnit->proUnitSellUnitPrice = $proUnitSellUnitPrice;
                $productUnit->proUnitBuyPrice = $proUnitBuyPrice;
                $productUnitDAO->update($productUnit);
            }
        }


        $product->productBuyPrice = $productBuyPrice;
        $productDAO->update($product);
    }
}

/* ===============================
  function in this CONTROLLER
  ================================ */

function generateParcode_old($length = 5)
{
    global $productDAO;

    $characters = '0123456789';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }

    //check if this parcode already exists
    $data = $productDAO->queryByParcode($randomString);
    if (count($data) > 0) {
        generateParcode();
    }

    return $randomString;
}

function generateParcode()
{
    global $availableParcodeEX;
    $parcode = $availableParcodeEX->getAvailableParcodeValue();
    //check if this parcode already exists
    $data = checkbarcode($parcode);
    if ($data != 2) {
        $parcode = generateParcode();
    }
    return $parcode;
}

function checkbarcode($parcode)
{
    global $productDAO;
    global $Programsettingdata;
    global $availableParcodeDAO;
    $flag = 1;
    if ($Programsettingdata->usedParcode == 0) {
        if (!isset($Programsettingdata->parcodeDigits) || empty($Programsettingdata->parcodeDigits)) {
            $Programsettingdata->parcodeDigits = 5;
        }

        $biggestParcode = '';
        for ($i = 1; $i <= (int) $Programsettingdata->parcodeDigits; $i++) {
            $biggestParcode .= '9';
        }
        $biggestParcode = (int) $biggestParcode;



        if ($parcode <= $biggestParcode) {
            $parcodeResult = $availableParcodeDAO->queryByValue($parcode);
            if (isset($parcodeResult) && count($parcodeResult) > 0) {
                //if value in the table it is not repeated
                $flag = 2;
                return $flag;
            }
        }
    }


    //check if this parcode already exists in db
    $data = $productDAO->queryByParcode($parcode);
    $flag2;
    if (count($data) > 0) { //> 1 as now i check for barcode after in
        $flag2 = 1;
    } else {
        $flag2 = 2;
    }

    $flagToreturn = 1;
    if ($flag == 2 || $flag2 == 2) {
        $flagToreturn = 2;
    }


    return $flagToreturn;
}

function removeParcodeFromTable($barcodeToRemove, $barcodeToAdd = '')
{
    global $Programsettingdata;
    global $availableParcodeDAO;
    if ($Programsettingdata->usedParcode == 0) {
        if (!isset($Programsettingdata->parcodeDigits) || empty($Programsettingdata->parcodeDigits)) {
            $Programsettingdata->parcodeDigits = 5;
        }

        $biggestParcode = '';
        for ($i = 1; $i <= (int) $Programsettingdata->parcodeDigits; $i++) {
            $biggestParcode .= '9';
        }
        $biggestParcode = (int) $biggestParcode;

        if ($barcodeToRemove <= $biggestParcode) {
            $availableParcodeDAO->deleteByValue($barcodeToRemove);
            if (!empty($barcodeToAdd)) {
                $availableParcode = new stdClass();
                $availableParcode->value = $barcodeToAdd;
                $availableParcodeDAO->insert($availableParcode);
            }
        }
    }
}

function loadBillProperties($billnameid)
{
    global $billSettingExt;

    // select all data from Billname
    $billSettingsData = $billSettingExt->queryWithBillnameId($billnameid);

    return $billSettingsData;
}

// get supplierdebt from supplier tbl
function getSupplierDebt()
{
    global $supplierDAO;

    $supplierId = $_GET['supplierid'];

    // get supplierdebt by supplierid
    $supplierData = $supplierDAO->load($supplierId);
    if ($supplierData->sullpierCurrencyid == 1) {
        $supplierdebt = $supplierData->suppliercurrentDebt;
    } else {
        $supplierdebt = $supplierData->suppliercurrentDebtInCurrency;
    }

    return $supplierdebt;
}

// get productprice from product tbl
function getBuyPrice()
{
    global $productDAO;
    global $productExt;
    global $productCatDAO;
    global $sizeColorStoreDetailEX;
    global $Programsettingdata;

    $productId = $_GET['productid'];
    $productunitid = (int) $_GET['productunitid'];
    $itr = $_GET['itrs'];
    $tabindex = $_GET['tabindex'];

    //for product hassizecolor
    if (!empty($productId)) {
        if (strpos($productId, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
            $productId = $productIdComplex[0];
        }
    }

    if ($productunitid > 0) {
        $productprice = getBuyPriceFromUnitExt($productId, $productunitid);
    } else {
        $productprice = getBuyPriceExt($productId);
    }


    $price = $productprice;
    if ($Programsettingdata->useListPrice == 1) {
        $pData = $productExt->loadByProductId($productId);
        $listPercentage = $pData->buypricereal;
        $price = $price + (($price * $listPercentage) / 100);
        $productprice = $price;
    }
    return array($itr, $tabindex, $productprice);
}

function getBuyPriceExt($productId)
{
    global $productDAO;
    global $productExt;
    global $productCatDAO;
    global $sizeColorStoreDetailEX;

    $productId = $_GET['productid'];

    //for product hassizecolor
    if (!empty($productId)) {
        if (strpos($productId, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
            $productId = $productIdComplex[0];
        }
    }

    $productprice;
    //$buydiscount;
    //$discounttype;
    // get productprice by productid
    //$productData = $productDAO->load($productId);
    $productprice = $productExt->getProductBuyPriceById($productId);
    //		if(count($productData) > 0)
    //		{
    //			$productprice = $productData->productBuyPrice;
    //			$productCatId = $productData->productCatId;
    //
    //			/*** حساب خصم التصنيف من سعر المنتج ***/
    //			//get productCat data to get buydiscount and discounttype
    //			$catData = $productCatDAO->load($productCatId);
    //			if(count($catData) > 0)
    //			{
    //				$buydiscount = $catData->buydiscount;
    //				$discounttype = $catData->discounttype;
    //
    //				//
    //				if($discounttype == 0)//خصم مباشر
    //				{
    //					$productprice = $productprice - $buydiscount;
    //				}
    //				else //خصم نسبة
    //				{
    //					$productprice = $productprice - (($buydiscount / 100) * $productprice);
    //				}
    //			}
    /*     * *********************************** */
    //		}
    return $productprice;
}

function getBuyPriceFromUnitExt($productId, $productunitid)
{
    global $productUnitDAO;
    global $productDAO;
    global $productExt;
    global $productCatDAO;
    global $sizeColorStoreDetailEX;

    $productId = $_GET['productid'];

    //for product hassizecolor
    if (!empty($productId)) {
        if (strpos($productId, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
            $productId = $productIdComplex[0];
        }
    }

    //$productprice = $productExt->getProductBuyPriceById($productId);
    $productUnit = $productUnitDAO->load($productunitid);
    $productprice = $productUnit->proUnitBuyPrice;
    return $productprice;
}

function getProductUnits()
{
    global $productUnitExt;
    global $unitString;
    global $priceString;
    global $tabindex;
    global $productDAO;
    global $sizeColorStoreDetailEX;
    global $billNameDAO;
    global $Programsettingdata;

    $productId = $_GET['productid'];
    $itr = $_GET['itrs'];
    $return = $_GET['return'];
    $supplier_id = (int) $_GET['supplier']; // this cast is needed as supplier now may not exist
    $billnameid = $_GET['billnameid'];
    $comingproserial = (int) $_GET['comingproserial']; //means user selct product by serial  from "productserial" table and we need parcode as it is
    $parcode = $_GET['parcode'];

    //for product hassizecolor
    $sizeColor;
    if (!empty($productId)) {
        if (strpos($productId, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
            $productId = $productIdComplex[0];
            $sizeId = $productIdComplex[1];
            $colorId = $productIdComplex[2];
            $sizeColor = $sizeColorStoreDetailEX->getParcodeByProductSizeAndColorEX($productId, $sizeId, $colorId);
        }
    }


    if (!empty($productId) && !empty($itr) && empty($return)) {
        $productUnitData = $productUnitExt->queryWithProductIdAndCondition($productId);

        $unitString .= '<select name="unitId' . $itr . '" id="unitId' . $itr . '" onchange="getUnitPrice(' . $itr . ');"  data-placeholder="اختر" class="select2_unit' . $itr . ' aw_m1" >';
        $i = 0;
        foreach ($productUnitData as $unit) {
            $unitString .= '<option value="' . $unit->productunitid . '">' . $unit->unitName . '</option>';
            if ($i == 0) { //get buy price for the first unit only
                //buy price
                try {
                    // $buybilldetailData = getProductPriceFromBuyBill($productId, $supplier_id, $unit->productunitid);
                    // if (count($buybilldetailData[0]) > 0) {
                    //     $priceAfterUnit = $buybilldetailData[1];
                    //     //$priceString = '<input name="proprice' . $itr . '" id="proprice' . $itr . '"   value="' . $buybilldetailData[1] . '" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text"   tabindex="' . $tabindex . '"/>';
                    //     $priceString = '<input name="proprice' . $itr . '" id="proprice' . $itr . '"   value="' . $priceAfterUnit . '" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text"   tabindex="' . $tabindex . '"/>';
                    //     $priceString .= '<input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "1" size = "7" readonly />';
                    // } else {

                    $productQty = getProductUnitQuantity($unit->productunitid);
                    $productPriceData = getBuyPrice();
                    $buyPriceBeforeUnit = $productPriceData[2];

                    $priceAfterUnit = $productQty * $buyPriceBeforeUnit; //عدد المنتجات في وحدة القياس * سعر شراء المنتج الواحد

                    $priceString = '<input name="proprice' . $itr . '" id="proprice' . $itr . '"   value="' . $priceAfterUnit . '" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text"   tabindex="' . $tabindex . '"/>';
                    $priceString .= '<input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "0" size = "7" readonly />';
                    // }
                } catch (Exception $e) {
                    $priceString .= '<input name="proprice' . $itr . '" id="proprice' . $itr . '"  value="0" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text"  tabindex="' . $tabindex . '"/>
                            <input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "0" size = "7" readonly />';
                }
            }
            $i++;
        }
        $unitString .= ' </select>';
    } elseif (!empty($productId) && !empty($itr) && !empty($return)) {
        $productUnitData = $productUnitExt->queryWithProductIdAndCondition($productId);

        $unitString .= '<select name="unitId_re' . $itr . '" id="unitId_re' . $itr . '" onchange="return_getUnitPrice(' . $itr . ');"  data-placeholder="اختر" class="select2_unit_re' . $itr . ' aw_m1" >';
        $i = 0;
        foreach ($productUnitData as $unit) {
            $unitString .= '<option value="' . $unit->productunitid . '">' . $unit->unitName . '</option>';
            if ($i == 0) { //get buy price for the first unit only
                //buy price
                try {
                    $buybilldetailData = getProductPriceFromBuyBill($productId, $supplier_id, $unit->productunitid);
                    if (count($buybilldetailData[0]) > 0) {
                        $priceAfterUnit = $buybilldetailData[1];
                        //$priceString = '<input name="proprice' . $itr . '" id="proprice' . $itr . '"   value="' . $buybilldetailData[1] . '" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text"   tabindex="' . $tabindex . '"/>';
                        $priceString = '<input name="proprice' . $itr . '" id="proprice' . $itr . '"   value="' . $priceAfterUnit . '" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text"   tabindex="' . $tabindex . '"/>';
                        $priceString .= '<input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "1" size = "7" readonly />';
                    } else {
                        $productQty = getProductUnitQuantity($unit->productunitid);

                        $productPriceData = getBuyPrice();
                        $buyPriceBeforeUnit = $productPriceData[2];

                        $priceAfterUnit = $productQty * $buyPriceBeforeUnit; //عدد المنتجات في وحدة القياس * سعر شراء المنتج الواحد
                    }
                    if ($return == 1) {
                        //$buybilldetailData = getProductPriceFromBuyBill($productId, $supplier_id, $unit->productunitid);
                        $priceString = '<input name="proprice_re' . $itr . '" id="proprice_re' . $itr . '"   value="' . $priceAfterUnit . '" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text"   tabindex="' . $tabindex . '"/>';
                        //                        if (count($buybilldetailData[0]) > 0) {
                        //                            $priceString .= '<input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "1" size = "7" readonly />';
                        //                        } else {
                        $priceString .= '<input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "0" size = "7" readonly />';
                        //                        }
                    }
                } catch (Exception $e) {
                    $priceString .= '<input name="proprice_re' . $itr . '" id="proprice_re' . $itr . '"   value="0" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text"  tabindex="' . $tabindex . '"/>
                             <input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "0" size = "7" readonly />';
                }
            }
            $i++;
        }
        $unitString .= ' </select>';
    }

    $productData = $productDAO->load($productId);
    $buypricereal_precentage = $productData->buypricereal_precentage;
    if ($comingproserial == 1) {
        $parcodeString = $parcode;
    } else {
        if (!is_null($sizeColor->id) && !empty($sizeColor->id)) {
            $parcodeString = $sizeColor->parcode;
        } else {
            $billnameData = $billNameDAO->load($billnameid);
            if ($billnameData->billnameid > 0 && (int) $billnameData->parcodeType == 1) {
                $parcodeString = useSpecializedParcodeDigits($productData->parcode, $productData->productId, $Programsettingdata->specializedParcodeDigits);
            } else {
                $parcodeString = $productData->parcode;
            }
        }
    }

    ////******************************************************///
    //get buy price

    $data = array('unitString' => $unitString, 'priceString' => $priceString, 'buypricereal_precentage' => $buypricereal_precentage, 'parcodeString' => $parcodeString);

    echo json_encode($data);
}

function calculateUnitBuyPrice()
{
    $productunitid = $_GET['productunitid'];
    $productId = $_GET['productid'];
    $itr = $_GET['itrs'];
    $tabindex = $_GET['tabindex'];
    $return = $_GET['return'];
    $supplier_id = $_GET['supplier'];

    //print($productunitid."<br/>");

    if ($productunitid != '-1' && !empty($productunitid)) {
        try {

            if (empty($return)) {
                $buybilldetailData = getProductPriceFromBuyBill($productId, $supplier_id, $productunitid);

                if (count($buybilldetailData[0]) > 0) {
                    $priceAfterUnit = $buybilldetailData[1];
                    echo '<input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "1" size = "7" readonly />';
                } else {
                    $productQty = getProductUnitQuantity($productunitid);

                    $productPriceData = getBuyPrice();
                    $buyPriceBeforeUnit = $productPriceData[2];

                    //$priceAfterUnit = $productQty * $buyPriceBeforeUnit; //عدد المنتجات في وحدة القياس * سعر شراء المنتج الواحد
                    $priceAfterUnit = $buyPriceBeforeUnit; //it is now prounitbuyprice  "price in each unit no need to do *$productQty "
                    echo '<input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "0" size = "7" readonly />';
                }

                echo '<input name="proprice' . $itr . '" id="proprice' . $itr . '"   value="' . $priceAfterUnit . '" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text"  tabindex="' . $tabindex . '"/>';
            } elseif ($return == 1) {

                $productQty = getProductUnitQuantity($productunitid);

                $productPriceData = getBuyPrice();
                $buyPriceBeforeUnit = $productPriceData[2];

                //$priceAfterUnit = $productQty * $buyPriceBeforeUnit; //عدد المنتجات في وحدة القياس * سعر شراء المنتج الواحد
                $priceAfterUnit = $buyPriceBeforeUnit; //it is now prounitbuyprice  "price in each unit no need to do *$productQty "

                echo '<input name="proprice_re' . $itr . '" id="proprice_re' . $itr . '"   value="' . $priceAfterUnit . '" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text" tabindex="' . $tabindex . '" />';
            }
        } catch (Exception $e) {
            if (empty($return)) {
                echo '<input name="proprice' . $itr . '" id="proprice' . $itr . '"  value="0" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text" tabindex="' . $tabindex . '"/>';
            } elseif ($return == 1) {
                echo '<input name="proprice_re' . $itr . '" id="proprice_re' . $itr . '"   value="0" class="getprototal form-control txt-nonraduis  numberclic enteraction numberinput" type="text" tabindex="' . $tabindex . '"/>';
            }
        }
    }
}

function getProductUnitQuantity($productunitid)
{
    global $productUnitDAO;
    $productQty = 1;
    if ($productunitid != '-1' && !empty($productunitid)) {
        $pUnitData = $productUnitDAO->load($productunitid);
        $productQty = $pUnitData->productnumber;
    }
    return $productQty;
}

function getProductByParcode()
{
    global $productDAO;
    global $productExt;
    global $productCatDAO;
    global $storeDetailExt;
    global $sizeColorStoreDetailEX;
    global $ProductserialDAO;
    global $ProductserialEX;
    global $storeReportExt;
    global $Programsettingdata;
    $arr = array();
    $number = $_GET['parcode']; //It could be serial or parcode
    $storeid = (int) $_GET['store']; //It could be serial or parcode

    $productId = 0;

    // get productprice by productid
    //$productData = $productExt->queryWithSerialnumber($number);
    //print_r($productData);
    //if(count($productData) == 0)
    //{
    if ($number[0] == 'i' && $Programsettingdata->usedParcode == 1) { //usedParcode == 1 it is id coming after i
        $number = str_replace("i", "", $number);
        $productData = $productExt->loadProduct((int) $number);
    } else {
        $productData = $productExt->queryWithParcode($number);
    }
    //print_r($productData);
    if (count($productData) > 0 && $productData->hasSizeAndColor == 0) {
        $productId = $productData->productId;
        //pass variables as something that select2 can understand
        $arr['id'] = $productData->productId;
        $arr['text'] = $productData->productCatName . "/" . $productData->productName;
        if ($storeid > 0) {
            $storedetails = $storeDetailExt->getProductQuantity($productData->productId, $storeid);
            $arr['quantity'] = $storedetails->productquantity;
            ///////////تاريخ آخر عملية إعادة جرد
            $lastDate = $storeReportExt->getLastInventoryDateByProductIdAndStoreId($productData->productId, $storeid, '');
            $arr['lastInventoryDate'] = $lastDate;
        }
    } else { //There is no products for this parcode
        //so check if it is producthassizecolor
        $sizeColor = $sizeColorStoreDetailEX->queryByParcodeEX($number);
        if ($sizeColor->id > 0) {
            $arr['id'] = "hasSizeColor" . $sizeColor->productid . "-" . $sizeColor->sizeid . "-" . $sizeColor->colorid;
            $arr['text'] = $sizeColor->productName . "/" . $sizeColor->productCatName . "/" . $sizeColor->sizeName . "/" . $sizeColor->colorName;
            if ($storeid > 0) {
                $storedetails = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX2($sizeColor->productid, $storeid, $sizeColor->sizeid, $sizeColor->colorid);
                $arr['quantity'] = $storedetails->quantity;
                ///////////تاريخ آخر عملية إعادة جرد
                $lastDate = $storeReportExt->getLastInventoryDateByProductIdAndStoreId($sizeColor->productid, $storeid, " AND sizeid = $sizeColor->sizeid And colorid = $sizeColor->colorid ");
                $arr['lastInventoryDate'] = $lastDate;
            }
        } else {
            $productData = $productExt->queryWithProUnitParcode($_GET['parcode']);
            if (count($productData) > 0) {
                $productId = $productData->productId;
                //pass variables as something that select2 can understand
                $arr['id'] = $productData->productId;
                $arr['text'] = $productData->productCatName . "/" . $productData->productName;
                $arr['isProUnitParcode'] = 1; //parcode is ProUnitParcode
                $arr['productunitid'] = $productData->productunitid;
                $arr['unitid'] = $productData->unitid;
                $arr['proUnitBuyPrice'] = $productData->proUnitBuyPrice;
            } else {
                $productData = $productExt->queryWithSerialnumberEvenIfNotAvailable($_GET['parcode']); //Ex->queryLastWithProductIdAndSerial($sizeColor->productid,$parcode," and sizeid=$sizeColor->sizeid and colorid= $sizeColor->colorid ");
                if (count($productData) > 0 && $productData->hasSizeAndColor == 0) {
                    $productId = $productData->productId;
                    //pass variables as something that select2 can understand
                    $arr['id'] = $productData->productId;
                    $arr['text'] = $productData->productCatName . "/" . $productData->productName;
                } else {
                    $productData = $productExt->queryWithParcodeExcel($_GET['parcode']);
                    if (count($productData) > 0 && $productData->hasSizeAndColor == 0) {
                        $productId = $productData->productId;
                        //pass variables as something that select2 can understand
                        $arr['id'] = $productData->productId;
                        $arr['text'] = $productData->productCatName . "/" . $productData->productName;
                    } else {
                        $arr['id'] = 0;
                        $arr['text'] = 0;
                    }
                }
            }
        }
    }
    //}
    //		else
    //		{
    //				$productId = $productData->productId;
    //				//pass variables as something that select2 can understand
    //				$arr['id'] = $productData->productId;
    //				$arr['text'] = $productData->productName;
    //		}

    echo json_encode($arr);
}

function insertTempProduct()
{
    global $product;
    global $productDAO;
    global $productExt;
    global $productUnit;
    global $productUnitDAO;
    global $productUnitExt;
    global $storeDetail;
    global $storeDetailDAO;
    global $storeReport;
    global $storeReportDAO;
    global $productCatDAO;
    global $UsergroupDAO;
    global $today;

    //Dailyentry
    global $dailyEntry;
    global $dailyEntryDAO;

    //Dailyentrycreditor دائن
    global $dailyEntryCreditor;
    global $dailyEntryCreditorDAO;

    //Dailyentrydebtor مدين
    global $dailyEntryDebtor;
    global $dailyEntryDebtorDAO;

    global $sizeColorStoreDetailEX;
    global $billSettingExt;


    global $smarty;

    global $Programsettingdata;
    global $noOfDecimalPlaces;

    try {
        $itr = $_GET['itr'];
        $level = (int) $_POST['level'];
        $cat_id = $_POST['new_cat_id'];

        if ($level > 1) {
            $level = $level - 1;
            $cat_id = $_POST['productCatId' . $level . ''];
        }
        $productName = $_POST['new_productName'];
        ###############################
        $erpDB = $_POST["erpDB"];
        $detection_id = $_POST["detection_id"];
        $investigation_id = $_POST["investigation_id"];
        $sessionDBName = ConnectionProperty::getDatabase();
        if (isset($_SESSION['dbname']) && !empty($_SESSION['dbname'])) {
            $sessionDBName = $_SESSION['dbname'];
        }
        //choose erpDB user has choosen in obygy_app
        if (isset($erpDB) && !empty($erpDB)) {
            $_SESSION['dbname'] = $erpDB;
            $_SESSION['userid'] = 1; //tempppppppppppppppp
            if (empty($productName)) {
                $productName = 'obj_app_detection';
            }
            //$cat_id
            if (!isset($_POST['new_cat_id']) || empty($_POST['new_cat_id']) || $_POST['new_cat_id'] == "obygy") {
                $catName = $_POST['obygy_cat_name'];
                if (empty($catName)) {
                    $catName = 'Services'; //'obygy services';
                }

                $catData = $productCatDAO->queryByProductCatName($catName);

                if (count($catData) > 0) {
                    $cat_id = $catData[0]->productCatId;
                } else {
                    $cat_id = addCatByNameOnly($catName);
                }
            }
        }
        #################################
        $hasSizeAndColor = (int) $_POST['hasSizeAndColor' . $i];


        $parcode = $_POST['new_parcode'];
        $productBuyPrice = $_POST['new_productBuyPrice'];
        $productSellAllPrice = $_POST['new_productSellAllPrice'];
        $productSellHalfPrice = $_POST['new_productSellHalfPrice'];
        $productSellUnitPrice = $_POST['new_productSellUnitPrice'];

        $catData = $productCatDAO->load($cat_id);
        $listPrice = $productBuyPrice;
        if ($Programsettingdata->useListPrice == 1) {
            $listDiscountPer = $catData->buypricereal;
            $listPrice = $productBuyPrice + (($productBuyPrice * $listDiscountPer) / 100);
        }

        $productquantity = $_POST['new_productquantity'];
        $productDate = $_POST['new_productDate'];
        $tabIndex = $_GET['tabIndex'];
        $type1 = $_REQUEST["type1"];
        $expireDate = $_REQUEST["expireDate"];

        $productBuyPrice = round($productBuyPrice, $noOfDecimalPlaces);
        $productSellAllPrice = round($productSellAllPrice, $noOfDecimalPlaces);
        $productSellHalfPrice = round($productSellHalfPrice, $noOfDecimalPlaces);
        $productSellUnitPrice = round($productSellUnitPrice, $noOfDecimalPlaces);

        $productbuypricereal = $_POST['new_productbuypricereal'];
        $buypricereal_precentage = $_POST['new_buypricereal_precentage1'];
        $buytotal_precentage = $_POST['new_buytotal_precentage1'];
        $buyhalf_precentage = $_POST['new_buyhalf_precentage1'];
        $buypart_precentage = $_POST['new_buypart_precentage1'];
        $isservice = $_POST['new_isservice1'];

        $productbuypricereal = round($productbuypricereal, $noOfDecimalPlaces);
        $buypricereal_precentage = round($buypricereal_precentage, $noOfDecimalPlaces);
        $buytotal_precentage = round($buytotal_precentage, $noOfDecimalPlaces);
        $buyhalf_precentage = round($buyhalf_precentage, $noOfDecimalPlaces);
        $buypart_precentage = round($buypart_precentage, $noOfDecimalPlaces);
        ###################################################################
        ##prcode if not empty check and use it ==> as checkbarcode must be used before insert if user write his own parcode
        if (!empty($parcode)) {
            $parcode = addPreDigitsToNum($parcode);
            ##check for barcode
            $flag = checkbarcode($parcode);
            if ($flag == 1) {
                //parcode is repeated get another one
                $parcode = generateParcode();
            }
            removeParcodeFromTable($parcode);
        } else {
            //will do it after insert use parcode from pro id comming now
        }
        ###################################################################
        //echo "cat_id: ".$cat_id." productName: ".$productName;
        //insert into producttemp tbl
        $product->productbuypricereal = $productbuypricereal;
        $product->buypricereal_precentage = $buypricereal_precentage;
        $product->buytotal_precentage = $buytotal_precentage;
        $product->buyhalf_precentage = $buyhalf_precentage;
        $product->buypart_precentage = $buypart_precentage;
        $product->conditions = 0;
        $product->expireDate = $expireDate;
        $product->parcode = $parcode;
        $product->productBuyPrice = $productBuyPrice;
        $product->lastbuyprice = $listPrice; //$productBuyPrice;
        $product->lastbuyprice_withDiscount = $listPrice; //$productBuyPrice;
        $product->meanbuyprice = $listPrice; //$productBuyPrice;
        $product->meanbuyprice_withDiscount = $listPrice; //$productBuyPrice;
        $product->lastbuyprice_withTax = $listPrice; //$productBuyPrice;
        $product->meanbuyprice_withTax = $listPrice; //$productBuyPrice;
        $product->productCatId = $cat_id;
        $product->productDate = $productDate;
        $product->productName = $productName;
        $product->productSellAllPrice = $productSellAllPrice;
        $product->productSellHalfPrice = $productSellHalfPrice;
        $product->productSellUnitPrice = $productSellUnitPrice;
        $product->userId = $_SESSION['userid'];
        $product->limitamount = 1;
        $product->productDescription = '';
        $product->type = $type1;
        $product->dailyentryId = 0;
        $product->isService = $isservice;
        $product->isOptic = 0;
        $product->inMenu = 0;
        $product->obygyDetectionId = $detection_id;
        $product->obygyInvestigationId = $investigation_id;
        $product->hasSizeAndColor = $hasSizeAndColor;

        $productId = $productDAO->insert($product);
        onlineTempProductFunc($productId, 1);
        ################################################################
        ##this is prcode if empty
        if (empty($parcode)) {
            $parcode = addPreDigitsToNum($productId);

            ##check for barcode
            $flag = checkbarcode($parcode);
            if ($flag == 1) {
                //parcode is repeated get another one
                $parcode = generateParcode();
            }
            removeParcodeFromTable($parcode);
            $product->parcode = $parcode;
            $productDAO->update($product);
        }
        ##############################################################
        //echo "<br>";
        if (!empty($productId)) {
            $unitsItr = $_POST['unitsItr'];
            $Unitdone = 0;
            for ($i = 1; $i <= $unitsItr; $i++) {
                $productunit = $_POST['productunit' . $i];
                $productnumber = $_POST['productnumber' . $i];
                $proUnitParcode = $_POST['proUnitParcode' . $i];
                $proUnitSellAllPrice = (float) $_POST['proUnitSellAllPrice' . $i];
                $proUnitSellHalfPrice = (float) $_POST['proUnitSellHalfPrice' . $i];
                $proUnitSellUnitPrice = (float) $_POST['proUnitSellUnitPrice' . $i];
                $proUnitBuyPrice = (float) $_POST['proUnitBuyPrice' . $i];
                if (!empty($productunit) && $productunit != '-1' && !empty($productnumber)) {
                    if (empty($proUnitParcode))
                        $proUnitParcode = addPreDigitsToNum2($productId, 5) . addPreDigitsToNum2($productunit, 2);

                    if (empty($proUnitSellAllPrice))
                        $proUnitSellAllPrice = $product->productSellAllPrice * $productnumber;

                    if (empty($proUnitSellHalfPrice))
                        $proUnitSellHalfPrice = $product->productSellHalfPrice * $productnumber;

                    if (empty($proUnitSellUnitPrice))
                        $proUnitSellUnitPrice = $product->productSellUnitPrice * $productnumber;

                    if (empty($proUnitBuyPrice))
                        $proUnitBuyPrice = $product->productBuyPrice * $productnumber;

                    //insert into producttempunit tbl
                    $productUnit->conditions = 0;
                    $productUnit->productnumber = $productnumber;
                    $productUnit->productid = $productId;
                    $productUnit->productunitdate = date("Y-m-d");
                    $productUnit->unitid = $productunit;
                    $productUnit->userid = $_SESSION['userid'];
                    $productUnit->proUnitParcode = $proUnitParcode;
                    $productUnit->proUnitSellAllPrice = $proUnitSellAllPrice;
                    $productUnit->proUnitSellHalfPrice = $proUnitSellHalfPrice;
                    $productUnit->proUnitSellUnitPrice = $proUnitSellUnitPrice;
                    $productUnit->proUnitBuyPrice = $proUnitBuyPrice;

                    $productUnitDAO->insert($productUnit);
                    $Unitdone = 1;
                }
            }

            if ($Unitdone == 0) {


                //insert into producttempunit tbl
                $productUnit->conditions = 0;
                $productUnit->productnumber = 1;
                $productUnit->productid = $productId;
                $productUnit->productunitdate = date("Y-m-d");
                $productUnit->unitid = 1;
                $productUnit->userid = $_SESSION['userid'];
                $productUnit->proUnitParcode = addPreDigitsToNum2($productId, 5) . addPreDigitsToNum2($productUnit->unitid, 2);
                $productUnit->proUnitSellAllPrice = $product->productSellAllPrice;
                $productUnit->proUnitSellHalfPrice = $product->productSellHalfPrice;
                $productUnit->proUnitSellUnitPrice = $product->productSellUnitPrice;
                $productUnit->proUnitBuyPrice = $product->productBuyPrice;

                $productUnitDAO->insert($productUnit);
            }

            //insert into storedetail tbl
            $storeDetail->productid = $productId;
            $storeDetail->productquantity = $productquantity;
            $storeDetail->storedetaildate = $today;
            $storeDetail->storeid = 1;
            $storeDetail->userid = $_SESSION['userid'];

            $storeDetailDAO->insert($storeDetail);

            //insert into storereport tbl
            $storeReport->processname = "إضافة منتج";
            $storeReport->productafter = $productquantity;
            $storeReport->productbefore = 0;
            $storeReport->productquantity = $productquantity;
            $storeReport->storeid = 1;
            $storeReport->storereportdate = $today;
            $storeReport->storereportmodelid = $productId;
            $storeReport->storereporttype = 0;
            $storeReport->tablename = "productController.php";
            $storeReport->userid = $_SESSION['userid'];
            $storeReport->productid = $productId;

            $storeReportDAO->insert($storeReport);
            onlineTempStoreReportFunc($storeReport);

            $productsData = $productExt->queryAllExt();
            $smarty->assign("productsData", $productsData);

            if ($product->hasSizeAndColor == 1) { //منتج بمقاسات و الوان
                addProductSizeAndColor($productId, $productBuyPrice, $productSellUnitPrice);
            }

            //get units associated with this producttempid
            $unitsData = $productUnitExt->queryWithProductIdAndCondition($productId);
            $smarty->assign("unitsData", $unitsData);

            //get Buy price
            $productprice = getBuyPriceExt($productId);
        }

        if ($product->hasSizeAndColor == 1) { //منتج بمقاسات و الوان
            //change data to get first size color
            $sizeColor = $sizeColorStoreDetailEX->queryByProductidEX($productId);
            if (count($sizeColor) > 0) {
                $productId = "hasSizeColor" . $sizeColor[0]->productid . "-" . $sizeColor[0]->sizeid . "-" . $sizeColor[0]->colorid;
                $parcode = $sizeColor[0]->parcode;
                if (!is_null($sizeColor[0]->sizeName) && !empty($pro->sizeName)) {
                    $productName .= '/' . $sizeColor[0]->sizeName;
                }
                if (!is_null($sizeColor[0]->colorName) && !empty($pro->colorName)) {
                    $productName .= '/' . $sizeColor[0]->colorName;
                }
            }
        }


        //write in the xml file
        //createXMLFile();

        $usergroup = $UsergroupDAO->load($_SESSION['usergroupid']);
        $smarty->assign("usergroup", $usergroup);

        $billnameid = (int) $_GET['billnameid'];
        $billsettingsData = $billSettingExt->queryWithBillnameId($billnameid);
        $smarty->assign("billsettingsData", $billsettingsData);

        $smarty->assign("productId", $productId);

        $smarty->assign("productId", $productId);
        $smarty->assign("parcode", $parcode);
        $smarty->assign("productBuyPrice", $productprice);
        $smarty->assign("productName", $productName);
        $smarty->assign("cat_id", $cat_id);
        $smarty->assign("itr", $itr);
        $smarty->assign("tabIndex", $tabIndex);
        $smarty->assign("proprice", $productBuyPrice);
        $smarty->assign("hasSizeColor", $product->hasSizeAndColor);

        if (!isset($_POST["erpDB"]) || empty($_POST["erpDB"])) {
            $smarty->display("buyBillview/product.html");
        }
    } catch (Exception $e) {
        echo $e;
        echo "1";
    }

    //////////////////////////Imsert in daily entry
    $dailyEntry->dDateTime = date('Y-m-d H:i:s');
    $dailyEntry->entryComment = 'إضافة منتج ' . $productName . ' الكمية ' . $productquantity;

    $dailyEntryDebtorArray = array();
    $dailyEntryCreditorArray = array();

    $dailyEntryDebtor->accountstreeid = 382;
    $dailyEntryDebtor->value = $productBuyPrice * $productquantity;

    $dailyEntryCreditor->accountstreeid = 121;
    $dailyEntryCreditor->value = $productBuyPrice * $productquantity;

    array_push($dailyEntryCreditorArray, $dailyEntryCreditor);
    array_push($dailyEntryDebtorArray, $dailyEntryDebtor);

    insertEntery($dailyEntry, $dailyEntryDebtorArray, $dailyEntryCreditorArray);

    //go back to your db
    if (isset($erpDB) && !empty($erpDB)) {
        $_SESSION['dbname'] = $sessionDBName;
        unset($_SESSION['userid']); //tempppppppppppppppp
    }
}

function createXMLFile()
{
    global $productDAO;

    $productsData = $productDAO->queryByConditions(0);
    if (count($productsData) > 0) {
        //*************** write in xml files **************//
        $newTags = '<?xml version="1.0" encoding="utf-8"?>';
        $newTags .= '<document>';

        foreach ($productsData as $pro) {
            $parentId = $pro->productCatId;
            //names of product's parents
            $pathString = fetch_recursive($parentId, $categories);

            $pathString = $pathString . '/' . $pro->productName;

            //emptying xml files
            $productXMLFile = @fopen("productXML.xml", "r+");
            if ($productXMLFile !== false) {
                ftruncate($productXMLFile, 0);
                fclose($productXMLFile);
            }

            //replace something in the file string
            $newTags .= "\n<product>
							 <id>" . $pro->productId . "</id>
							 <title> " . $pro->productName . " </title>
							 <path>" . $pathString . "</path>
							 <buyPrice>" . $pro->productBuyPrice . "</buyPrice>
							 </product>";

            //write in sitemap.xml
            file_put_contents('productXML.xml', $newTags);
        }

        $newTags .= '</document>';
        //*******************************************************//
    }
}

function editProduct()
{
    global $product;
    global $productDAO;
    global $productExt;
    global $productUnit;
    global $productUnitDAO;
    global $productUnitExt;
    global $smarty;
    $productprice;

    $productId = $_GET['id'];
    $itr = $_GET['itr'];
    $tabIndex = $_GET['tabIndex'];

    if (!empty($productId) && $productId != '-1') {
        $productData = $productExt->loadProductExt($productId);
        if (count($productData) > 0) {
            $smarty->assign("productData", $productData);

            //get product categories
            $categoriesData = getProductCatParents();
            $smarty->assign("categoriesData", $categoriesData);

            //get units
            $unitsData = getUnits();
            $smarty->assign("unitsData", $unitsData);

            //get product units
            $productUnitsData = getProductUnitsById($productId);
            $smarty->assign("productUnitsData", $productUnitsData);
            $unitsItr = count($productUnitsData);

            $smarty->assign("itr", $itr);
            $smarty->assign("tabIndex", $tabIndex);
            $smarty->assign("unitsItr", $unitsItr);

            $smarty->display("buyBillview/editProduct.html");
        } else {
            echo "1"; //ERROR: البرنامج لم يستطع الوصول لبيانات المنتج ... الرجاء المحاولة مرة أخرى
        }
        //print_r($productData);
    }
    //print_r($productData);
}

function updateProduct()
{
    global $product;
    global $productDAO;
    global $productExt;
    global $productUnit;
    global $productUnitDAO;
    global $productUnitExt;
    global $smarty;
    global $storeDetail;
    global $storeDetailDAO;
    global $storeDetailExt;
    global $storeReport;
    global $storeReportDAO;

    try {
        $itr = $_GET['itr'];
        $productId = $_POST['productId'];
        $cat_id = $_POST['new_cat_id'];
        $productName = $_POST['new_productName'];
        $parcode = $_POST['new_parcode'];
        $productBuyPrice = $_POST['new_productBuyPrice'];
        $productSellAllPrice = $_POST['new_productSellAllPrice'];
        $productSellHalfPrice = $_POST['new_productSellHalfPrice'];
        $productSellUnitPrice = $_POST['new_productSellUnitPrice'];
        $productquantity = $_POST['new_productquantity'];
        $productDate = $_POST['new_productDate'];
        $tabIndex = $_GET['tabIndex'];
        $storedetailid = $_POST['storedetailid'];
        $product_qty_before = $_POST['product_qty_before'];
        $storeid = $_POST['storeid'];

        $product = $productDAO->load($productId);
        ##check for barcode
        $flag = checkbarcode($parcode);
        if ($flag == 1) {
            //parcode is repeated get another one
            $parcode = generateParcode();
        }
        removeParcodeFromTable($parcode, $product->parcode);
        //echo "cat_id: ".$cat_id." productName: ".$productName;
        //insert into producttemp tbl
        $product->conditions = 0;
        $product->parcode = $parcode;
        $product->productBuyPrice = $productBuyPrice;
        $product->productCatId = $cat_id;
        $product->productDate = $productDate;
        $product->productName = $productName;
        $product->productSellAllPrice = $productSellAllPrice;
        $product->productSellHalfPrice = $productSellHalfPrice;
        $product->productSellUnitPrice = $productSellUnitPrice;
        $product->userId = $_SESSION['userid'];
        $product->limitamount = 1;
        $product->productDescription = '';
        $product->productId = $productId;
        //$product->productquantity = $productquantity;
        $product->inMenu = 0;
        $productDAO->update($product);

        if (!empty($productId)) {
            //delete product units
            $productUnitDAO->deleteByProductid($productId);

            $unitsItr = $_POST['unitsItr'];
            for ($i = 1; $i <= $unitsItr; $i++) {
                $productunit = $_POST['productunit' . $i];
                $productnumber = $_POST['productnumber' . $i];
                if (!empty($productunit) && $productunit != '-1' && !empty($productnumber)) {
                    //insert into producttempunit tbl
                    $productUnit->conditions = 0;
                    $productUnit->productnumber = $productnumber;
                    $productUnit->productid = $productId;
                    $productUnit->productunitdate = date("Y-m-d");
                    $productUnit->unitid = $productunit;
                    $productUnit->userid = $_SESSION['userid'];

                    $productUnitDAO->insert($productUnit);
                }
            }

            //update quantity in storedetail tbl
            $storeDetail->productquantity = $productquantity;
            $storeDetail->userid = $_SESSION['userid'];
            $storeDetail->storedetailid = $storedetailid;
            $storeDetail->storedetaildate = date("Y-m-d");

            $storeDetailExt->updateProductquantity($storeDetail);

            //insert into storereport tbl
            if ($product_qty_before > $productquantity) {
                $storeReport->storereporttype = 1; //minus
                $storeReport->productquantity = $product_qty_before - $productquantity;
            } else {
                $storeReport->storereporttype = 0; //plus
                $storeReport->productquantity = $productquantity - $product_qty_before;
            }
            $storeReport->processname = "تعدبل منتج في فاتورة الشراء";
            $storeReport->productafter = $productquantity;
            $storeReport->productbefore = $product_qty_before;
            $storeReport->productid = $productId;

            $storeReport->storeid = $storeid;
            $storeReport->storereportdate = date("Y-m-d");
            $storeReport->storereportmodelid = $productId;
            $storeReport->tablename = "productController.php";
            $storeReport->userid = $_SESSION['userid'];

            $storeReportDAO->insert($storeReport);

            $productsData = $productExt->queryAllExt();
            $smarty->assign("productsData", $productsData);

            //get units associated with this producttempid
            $unitsData = $productUnitExt->queryWithProductIdAndCondition($productId);
            $smarty->assign("unitsData", $unitsData);

            //get Buy price
            $productprice = getBuyPriceExt($productId);
        }
        $smarty->assign("productId", $productId);
        $smarty->assign("parcode", $parcode);
        $smarty->assign("productBuyPrice", $productprice);
        $smarty->assign("productName", $productName);
        $smarty->assign("cat_id", $cat_id);
        $smarty->assign("itr", $itr);
        $smarty->assign("tabIndex", $tabIndex);

        $smarty->display("buyBillview/product.html");
    } catch (Exception $e) {
        echo "1"; //Error
    }
}

function getProductCatParents()
{
    global $productCatExt;
    global $productExt;

    $allParents = $productExt->queryAllCategories();
    return $allParents;
}

function getUnits()
{
    global $unitDAO;

    $unitsData = $unitDAO->queryByCondition(0);
    return $unitsData;
}

function getProductUnitsById($productId)
{
    global $productUnitDAO;
    global $productUnitExt;
    global $unitDAO;

    $productUnitData = $productUnitExt->queryByProductidExt($productId);
    return $productUnitData;
}

function getProducts()
{
    global $productExt;
    global $productCatDAO;
    global $productDAO;
    global $smarty;
    global $Programsettingdata;

    $categories;
    $row_array = array();
    $return_arr = array();

    $name = $_GET['term']; //It could be product name or category name
    $limit = $Programsettingdata->searchlimit; //(int)$_GET['page_limit'];
    if (empty($limit)) {
        $limit = 30;
    }

    /* 		if (file_exists('productXML.xml')) {
      $xml = simplexml_load_file('productXML.xml');
      ////			print("<pre>");
      ////			print_r($xml);
      ////			print("</pre>");
      $product = $xml->product;
      for($i=0; $i <= count($xml); $i++)
      {
      $productPath = $product[$i]->path;
      if(strpos($productPath, $name) !== false)
      {
      //send product id and product name as something that select2 expects.
      $row_array['id'] = (string)$product[$i]->id;
      $row_array['text'] = (string)$product[$i]->path;

      array_push($return_arr,$row_array);
      }
      }

      }
     */

    $productsData = $productExt->queryByNameExtWithoutLimit($name, '', 1, ' limit ' . $limit);
    if (count($productsData) > 0) {
        foreach ($productsData as $pro) {
            $parentId = $pro->productCatId;
            //names of product's parents
            $pathArr = fetch_recursive($parentId, $categories);

            //send product id and product name as something that select2 expects.
            $row_array['id'] = $pro->productId;
            $row_array['text'] = $pro->productName . '/' . $pathArr;

            array_push($return_arr, $row_array);
        }
    }

    //		print("<pre>");
    //		print_r($return_arr);
    //		print("</pre>");
    echo json_encode($return_arr);
}

function getProductsnoservice()
{ //products that is not collective products"has no ingridients"
    global $productExt;
    global $productCatDAO;
    global $productDAO;
    global $userDAO;
    global $Programsettingdata;
    global $smarty;

    $categories;
    $row_array = array();
    $return_arr = array();

    $name = $_GET['term']; //It could be product name or category name
    $limit = $Programsettingdata->searchlimit; //(int)$_GET['page_limit'];
    if (empty($limit)) {
        $limit = 30;
    }
    $controlNameSearch = (int) $_REQUEST["searchWithCatAndProductNameOnly"]; //0 search catname,proname only //1 search sizename,colorname too

    /* 		if (file_exists('productXML.xml')) {
      $xml = simplexml_load_file('productXML.xml');
      ////			print("<pre>");
      ////			print_r($xml);
      ////			print("</pre>");
      $product = $xml->product;
      for($i=0; $i <= count($xml); $i++)
      {
      $productPath = $product[$i]->path;
      if(strpos($productPath, $name) !== false)
      {
      //send product id and product name as something that select2 expects.
      $row_array['id'] = (string)$product[$i]->id;
      $row_array['text'] = (string)$product[$i]->path;

      array_push($return_arr,$row_array);
      }
      }

      }
     */
    $storeid = $_GET['storeid'];

    $storeidQSJoin = '';
    if (((int) $storeid) > 0)
        $storeidQSJoin = ' and storedetail.storeid= ' . ((int) $storeid);
    $stopStoreSearch = (int) $_GET['stopStoreSearch'];
    if ($stopStoreSearch == 0) {
        if (!isset($storeid) || empty($storeid)) {
            $userData = $userDAO->load($_SESSION['userid']);
            $storeid = $userData->userstoreid;
        }

        $storeidQS = '';
        if (!empty($storeid)) {
            $storeidQS = " and storedetail.storeid=" . $storeid . " ";
        }
    } else {
        $storeidQS = ''; //search in all stores
    }
    //$productsData = $productExt->queryByNameExtWithoutLimitNoService($name, $storeidQS);
    //products without production rate,means no collective products
    $productsData = $productExt->queryByNameExtWithoutLimitNoServiceNotCollective($name, $storeidQS, $storeidQSJoin, $controlNameSearch, ' limit ' . $limit);
    if (count($productsData) > 0) {
        foreach ($productsData as $pro) {
            $parentId = $pro->productCatId;
            //names of product's parents
            $pathArr = fetch_recursive($parentId, $categories);

            $price = $pro->productBuyPrice;
            if ($Programsettingdata->useListPrice == 1) {
                $listPercentage = $pro->buypricereal;
                $price = $price + (($price * $listPercentage) / 100);
            }

            //send product id and product name as something that select2 expects.
            if (!is_null($pro->sizecolorstoredetailid) && $pro->sizecolorstoredetailid > 0) { //has size and color
                $row_array['id'] = "hasSizeColor" . $pro->productId . "-" . $pro->sizeid . "-" . $pro->colorid;
            } else { //without size and color
                $row_array['id'] = $pro->productId;
            }
            //$row_array['sizecolorstoredetailid'] = $pro->sizecolorstoredetailid;
            $row_array['text'] = $pro->productName . '/' . $pathArr;
            if (!is_null($pro->sizeName) && !empty($pro->sizeName)) {
                $row_array['text'] .= '/' . $pro->sizeName;
            }
            if (!is_null($pro->colorName) && !empty($pro->colorName)) {
                $row_array['text'] .= '/' . $pro->colorName;
            }
            $row_array['price'] = $price; //$pro->productBuyPrice;
            $row_array['productquantity'] = (float) $pro->productquantity;

            $row_array['sizeid'] = $pro->sizeid;
            $row_array['colorid'] = $pro->colorid;

            array_push($return_arr, $row_array);
        }
    }

    //		print("<pre>");
    //		print_r($return_arr);
    //		print("</pre>");
    echo json_encode($return_arr);
}

function getProductsnotcollective()
{ //products that is not collective products"has no ingridients"
    global $productExt;
    global $productCatDAO;
    global $productDAO;
    global $userDAO;
    global $Programsettingdata;
    global $smarty;

    $categories;
    $row_array = array();
    $return_arr = array();

    $name = $_GET['term']; //It could be product name or category name
    $limit = $Programsettingdata->searchlimit; //(int)$_GET['page_limit'];
    if (empty($limit)) {
        $limit = 30;
    }
    $controlNameSearch = (int) $_REQUEST["searchWithCatAndProductNameOnly"]; //0 search catname,proname only //1 search sizename,colorname too


    $storeid = $_GET['storeid'];

    $storeidQSJoin = '';
    if (((int) $storeid) > 0)
        $storeidQSJoin = ' and storedetail.storeid= ' . ((int) $storeid);
    $stopStoreSearch = (int) $_GET['stopStoreSearch'];
    if ($stopStoreSearch == 0) {
        if (!isset($storeid) || empty($storeid)) {
            $userData = $userDAO->load($_SESSION['userid']);
            $storeid = $userData->userstoreid;
        }

        $storeidQS = '';
        if (!empty($storeid)) {
            $storeidQS = " and storedetail.storeid=" . $storeid . " ";
        }
    } else {
        $storeidQS = ''; //search in all stores
    }
    //$productsData = $productExt->queryByNameExtWithoutLimitNoService($name, $storeidQS);
    //products without production rate,means no collective products
    $productsData = $productExt->queryByNameExtWithoutLimitNotCollective($name, $storeidQS, $storeidQSJoin, $controlNameSearch, ' limit ' . $limit);
    if (count($productsData) > 0) {
        foreach ($productsData as $pro) {
            $parentId = $pro->productCatId;
            //names of product's parents
            $pathArr = fetch_recursive($parentId, $categories);

            $price = $pro->productBuyPrice;
            if ($Programsettingdata->useListPrice == 1) {
                $listPercentage = $pro->buypricereal;
                $price = $price + (($price * $listPercentage) / 100);
            }

            //send product id and product name as something that select2 expects.
            if (!is_null($pro->sizecolorstoredetailid) && $pro->sizecolorstoredetailid > 0) { //has size and color
                $row_array['id'] = "hasSizeColor" . $pro->productId . "-" . $pro->sizeid . "-" . $pro->colorid;
            } else { //without size and color
                $row_array['id'] = $pro->productId;
            }
            //$row_array['sizecolorstoredetailid'] = $pro->sizecolorstoredetailid;
            $row_array['text'] = $pro->productName . '/' . $pathArr;
            if (!is_null($pro->sizeName) && !empty($pro->sizeName)) {
                $row_array['text'] .= '/' . $pro->sizeName;
            }
            if (!is_null($pro->colorName) && !empty($pro->colorName)) {
                $row_array['text'] .= '/' . $pro->colorName;
            }
            $row_array['price'] = $price; //$pro->productBuyPrice;
            $row_array['productquantity'] = (float) $pro->productquantity;

            $row_array['sizeid'] = $pro->sizeid;
            $row_array['colorid'] = $pro->colorid;

            array_push($return_arr, $row_array);
        }
    }

    //		print("<pre>");
    //		print_r($return_arr);
    //		print("</pre>");
    echo json_encode($return_arr);
}

function getProductsQueryString()
{
    global $storeDetailExt;
    global $productExt;
    global $productCatDAO;
    global $productDAO;
    global $smarty;
    global $Programsettingdata;

    $categories;
    $row_array = array();
    $return_arr = array();

    $storeId = $_GET['storeid'];
    $productId = $_GET['productid'];
    $catId = $_GET['catid'];

    $name = $_GET['term']; //It could be product name or category name
    $limit = $Programsettingdata->searchlimit; //(int)$_GET['page_limit'];
    if (empty($limit)) {
        $limit = 30;
    }

    $queryString = ' WHERE';

    if (isset($storeId) && !empty($storeId) && $storeId != '-1') {
        //get product in this store
        $queryString .= ' storedetail.storeId = ' . $storeId . ' AND';
    }
    if (isset($catId) && !empty($catId) && $catId != '-1') {
        //get products in this category
        $queryString .= ' productcat.productCatId = ' . $catId . ' AND';
    }
    if (isset($productId) && !empty($productId) && $productId != '-1') {
        //get product by id
        $queryString .= ' storedetail.productid = ' . $productId . ' AND';
    }

    //explode string on space character to remove last AND occurence
    $arr = explode(' ', $queryString);
    //print_r($arr);
    if (isset($arr) && count($arr) > 0) {
        $lastWord = end($arr);
        if ($lastWord == 'AND') { //remove it
            array_pop($arr);
            //form the string again
            $queryString = implode(' ', $arr);
        } else if ($lastWord == 'WHERE') { //remove it
            array_pop($arr);
            $queryString = ' ';
        }
        //print("<br>".$queryString."<br>");
    }



    $productsData = $storeDetailExt->queryProductsInInventoryExt2($queryString, ' limit ' . $limit);

    if (count($productsData) > 0) {
        foreach ($productsData as $pro) {
            $parentId = $pro->productCatId;
            //names of product's parents
            $pathArr = fetch_recursive($parentId, $categories);

            //send product id and product name as something that select2 expects.
            $row_array['id'] = $pro->productId;
            $row_array['text'] = $pro->productName . '/' . $pathArr;

            array_push($return_arr, $row_array);
        }
    }


    echo json_encode($return_arr);
}

function getProductsQueryStringnoservice()
{
    global $storeDetailExt;
    global $productExt;
    global $productCatDAO;
    global $productDAO;
    global $smarty;
    global $Programsettingdata;

    $categories;
    $row_array = array();
    $return_arr = array();

    $storeId = $_GET['storeid'];
    $productId = $_GET['productid'];
    $catId = $_GET['catid'];

    $name = $_GET['term']; //It could be product name or category name
    $limit = $Programsettingdata->searchlimit; //(int)$_GET['page_limit'];
    if (empty($limit)) {
        $limit = 30;
    }

    $queryString = ' WHERE';

    if (isset($storeId) && !empty($storeId) && $storeId != '-1') {
        //get product in this store
        $queryString .= ' storedetail.storeId = ' . $storeId . ' AND';
    }
    if (isset($catId) && !empty($catId) && $catId != '-1') {
        //get products in this category
        // or statment is for optic product that has size or color
        $queryString .= ' (productcat.productCatId = ' . $catId . ' || productcat.productCatId in (select productCatId from productcat where productCatParent = ' . $catId . ')) AND';
    }
    if (isset($productId) && !empty($productId) && $productId != '-1') {
        //get product by id
        $queryString .= ' storedetail.productid = ' . $productId . ' AND';
    }
    if (isset($name) && !empty($name)) {
        //get product by id
        $queryString .= ' CONCAT(product.productName, "/",  productcat.productCatName) LIKE "%' . $name . '%" AND';
    }

    //explode string on space character to remove last AND occurence
    $arr = explode(' ', $queryString);
    //print_r($arr);
    if (isset($arr) && count($arr) > 0) {
        $lastWord = end($arr);
        if ($lastWord == 'AND') { //remove it
            array_pop($arr);
            //form the string again
            $queryString = implode(' ', $arr);
        } else if ($lastWord == 'WHERE') { //remove it
            array_pop($arr);
            $queryString = ' ';
        }
        //print("<br>".$queryString."<br>");
    }



    $productsData = $storeDetailExt->queryProductsInInventoryExt2NoService($queryString, ' limit ' . $limit);

    if (count($productsData) > 0) {
        foreach ($productsData as $pro) {
            $parentId = $pro->productCatId;
            //names of product's parents
            $pathArr = fetch_recursive($parentId, $categories);

            //send product id and product name as something that select2 expects.
            if (!is_null($pro->sizecolorstoredetailid) && $pro->sizecolorstoredetailid > 0) { //has size and color
                $row_array['id'] = "hasSizeColor" . $pro->productid . "-" . $pro->sizeid . "-" . $pro->colorid;
            } else { //without size and color
                $row_array['id'] = $pro->productid;
            }
            //$row_array['sizecolorstoredetailid'] = $pro->sizecolorstoredetailid;
            $row_array['text'] = $pro->productName . '/' . $pathArr;
            if (!is_null($pro->sizeName) && !empty($pro->sizeName)) {
                $row_array['text'] .= '/' . $pro->sizeName;
            }
            if (!is_null($pro->colorName) && !empty($pro->colorName)) {
                $row_array['text'] .= '/' . $pro->colorName;
            }

            $row_array['sizeid'] = $pro->sizeid;
            $row_array['colorid'] = $pro->colorid;

            array_push($return_arr, $row_array);
        }
    }


    echo json_encode($return_arr);
}

function fetch_recursive($parentid, $categories)
{
    global $productCatExt;
    //print($parentid."<br>");
    $catData = $productCatExt->getCategoryAndParentByCatId($parentid);
    //print_r($catData);
    if (count($catData) > 0) {
        $categories .= $catData->productCatName . '/';
        $newParentId = $catData->productCatParent;

        //if($newParentId != 0 && isset($newParentId))
        {
            //$newParentName = $catData->parentName;
            //$categories .= $newParentName.'/';
            return fetch_recursive($newParentId, $categories);
        }
    }
    $categories = substr($categories, 0, strlen($categories) - 1);
    return $categories;
}

function getProductData()
{
    global $productDAO;
    global $sizeColorStoreDetailEX;
    $row_array = array();
    $id = $_GET['id'];

    if (!empty($id) && $id != '-1') {
        $sizeColor;
        if (strpos($id, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $id));
            $productId = $productIdComplex[0];
            $sizeId = $productIdComplex[1];
            $colorId = $productIdComplex[2];
            $sizeColor = $sizeColorStoreDetailEX->getParcodeByProductSizeAndColorEX($productId, $sizeId, $colorId);

            $productData = $productDAO->load($productId);
        } else {
            $productData = $productDAO->load($id);
        }
        ##fatma
        $parentId = $productData->productCatId;
        //names of product's parents
        $pathString = fetch_recursive($parentId, $categories);
        ##
        $row_array['id'] = $id;
        $row_array['text'] = $pathString . '/' . $productData->productName;
        if (!is_null($sizeColor->sizeName) && !empty($sizeColor->sizeName)) {
            $row_array['text'] .= '/' . $sizeColor->sizeName;
        }
        if (!is_null($sizeColor->colorName) && !empty($sizeColor->colorName)) {
            $row_array['text'] .= '/' . $sizeColor->colorName;
        }
    }
    echo json_encode($row_array);
}

function getserail($length = 6)
{
    global $Productserial;
    global $ProductserialEX;
    global $ProductserialDAO;

    //global $serialArray;

    $serialArray = $_SESSION["serialarray"];

    //print_r($serialArray);

    $productid = $_REQUEST["productid"];
    $characters = '0123456789';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, (strlen($characters) - 1))];
    }

    //print_r('randomString'.$randomString."<br>");
    //check if this parcode already exists
    $data = $ProductserialEX->queryAllbyserialandproductid($randomString, $productid);
    if (count($data) > 0) {

        //print_r('in if <br>');
        getserail();
    } elseif (in_array($randomString, $serialArray)) {
        //print_r('in elseif <br>');
        getserail();
    }

    /* if(in_array($randomString, $_SESSION["serialarray"]))
      {
      generateParcode();
      } */

    $serialArray[] = $randomString;
    $_SESSION["serialarray"] = $serialArray;

    return $randomString;
}

function getCategoryChilds($parentid = 0)
{
    global $productCatExt;
    global $productCatDAO;
    //load cat
    $parentobject = $productCatDAO->load($parentid);
    $childsArray = $productCatExt->getChilds($parentid);

    return array($parentobject, $childsArray);
}

function getProductPriceFromBuyBill($ProductId, $supplier_id, $productunitid)
{
    //to use the variable out side the funcion
    global $buyBillDetailExt;
    global $buyAndReturnBillDetailExt;

    $sellbilldetailPrice;
    $detailData = array();

    // get rawmaterialprice by rawmaterialid
    $sellbilldetailData = $buyBillDetailExt->queryPriceWithProductIdAndClientIdAndUnit($ProductId, $supplier_id, $productunitid);

    $sellandruternbilldetailData = $buyAndReturnBillDetailExt->queryPriceWithProductIdAndClientIdAndUnit($ProductId, $supplier_id, $productunitid, 0);

    if (count($sellbilldetailData) > 0 && count($sellandruternbilldetailData) > 0) {
        //number of days
        $dayNum = round(abs(strtotime($sellbilldetailData->buybilldate) - strtotime($sellandruternbilldetailData->buybilldate)));

        if ($dayNum >= 0) {
            $sellbilldetailPrice = $sellbilldetailData->buybilldetailprice;
            $detailData = $sellbilldetailData;
        } else {
            $sellbilldetailPrice = $sellandruternbilldetailData->buybilldetailprice;
            $detailData = $sellandruternbilldetailData;
        }
    } elseif (count($sellbilldetailData) > 0 && count($sellandruternbilldetailData) <= 0) {
        $detailData = $sellbilldetailData;
        $sellbilldetailPrice = $sellbilldetailData->buybilldetailprice;
    } elseif (count($sellbilldetailData) <= 0 && count($sellandruternbilldetailData) > 0) {
        $detailData = $sellandruternbilldetailData;

        $sellbilldetailPrice = $sellandruternbilldetailData->buybilldetailprice;
    } else {
        $detailData = array();
    }




    return array($detailData, $sellbilldetailPrice);
}

function addCatByNameOnly($catName)
{
    global $productCatDAO;
    global $productCat;
    global $catUnit;
    global $catUnitDAO;
    $today = date('Y-m-d');
    $productCat->productCatName = $catName;
    $productCat->productCatDate = $today;
    $productCat->productCatDescription = '';
    $productCat->productCatParent = 0;
    $productCat->userId = $_SESSION['userid'];
    $productCat->conditions = 0;
    $productCat->selldiscount = 0;
    $productCat->buydiscount = 0;
    $productCat->discounttype = -1;
    $productCat->isOptic = 0;
    $productCat->inMenu = 0;
    $productCat->buytotal = 0;
    $productCat->buyhalf = 0;
    $productCat->buypart = 0;
    $productCat->buypricereal = 0;
    $productCat->opticServices = '';
    $productCat->logo = '';
    $productCatId = $productCatDAO->insert($productCat);
    onlineTempCategoryFunc($productCatId, 1);

    //    if (!empty($productCatId)) {
    //        $cat_unitsItr = $_POST['cat_unitsItr'];
    //        //print("cat_unitsItr: ".$cat_unitsItr);
    //        for ($j = 1; $j <= $cat_unitsItr; $j++) {
    //            $productunit = $_POST['productcatunit' . $j];
    //            $cat_productnumber = $_POST['cat_productnumber' . $j];
    //            //print("<br>productunit: ".$productunit."<br>cat_productnumber: ".$cat_productnumber);
    //            if (!empty($productunit) && $productunit != '-1' && !empty($cat_productnumber)) {
    //                //insert into productunit tbl
    //                $catUnit->conditions = 0;
    //                $catUnit->productcatid = $productCatId;
    //                $catUnit->productnumber = $cat_productnumber;
    //                $catUnit->productcatunitdate = $today;
    //                $catUnit->unitid = $productunit;
    //                $catUnit->userid = $_SESSION['userid'];
    //
    //                $catUnitDAO->insert($catUnit);
    //            }
    //        }
    //    }
    return $productCatId;
}

function addPreDigitsToNum($num)
{
    global $Programsettingdata;

    if (!isset($Programsettingdata->parcodeDigits) || empty($Programsettingdata->parcodeDigits)) {
        $Programsettingdata->parcodeDigits = 5;
    }
    $length = $Programsettingdata->parcodeDigits;


    $preDigits = '';
    if (strlen($num) != $length) {
        $noDigitsLeft = $length - strlen($num);
        for ($j = 0; $j < $noDigitsLeft; $j++) {
            $preDigits .= '0';
        }
    }
    return $preDigits . $num;
}

/////////////////////////////////////////////////////////////////
##for product and size color
function addProductSizeAndColor($productId, $buyprice, $sellunitprice)
{
    global $sizeColorStoreDetail;
    global $sizeColorStoreDetailDAO;
    global $storeReportDAO;

    $sizeColorItr = (int) $_POST["sizeColorItr"];
    for ($i = 1; $i <= $sizeColorItr; $i++) {
        $size = (int) $_POST['size_detail' . $i];
        $color = (int) $_POST['color_detail' . $i];
        $parcode = (int) $_POST['parcode_detail' . $i];
        $quantity = (int) $_POST['quantity_detail' . $i];

        if (!empty($size) && !empty($color)) {
            $sizeColorStoreDetail->storeid = 1;
            $sizeColorStoreDetail->productid = $productId;
            $sizeColorStoreDetail->sizeid = $size;
            $sizeColorStoreDetail->colorid = $color;
            $sizeColorStoreDetail->buyprice = $buyprice;
            $sizeColorStoreDetail->sellunitprice = $sellunitprice;
            $sizeColorStoreDetail->quantity = $quantity;
            $sizeColorStoreDetail->parcode = addPreDigitsToNum($productId) . addPreDigitsToNum($size) . addPreDigitsToNum($color);
            $sizeColorStoreDetail->userid = $_SESSION['userid'];
            $sizeColorStoreDetail->sysdate = date("Y-m-d H:i:s");

            $id = $sizeColorStoreDetailDAO->insert($sizeColorStoreDetail);

            //insert into storereport tbl
            $storeReport->processname = "إضافة منتج بمقاسات و الوان";
            $storeReport->productafter = $quantity;
            $storeReport->productbefore = 0;
            $storeReport->productquantity = $quantity;
            $storeReport->storeid = 1;
            $storeReport->storereportdate = date("Y-m-d");
            $storeReport->storereportmodelid = $productId;
            $storeReport->storereporttype = 0;
            $storeReport->tablename = "productController.php";
            $storeReport->userid = $_SESSION['userid'];
            $storeReport->productid = $productId;

            $storeReportDAO->insert($storeReport);
        }
    }
}

function useSpecializedParcodeDigits($parcode, $productId, $specializedParcodeDigits)
{
    $preDigits = '';
    if (strlen($productId) != $specializedParcodeDigits) {
        $noDigitsLeft = $specializedParcodeDigits - strlen($productId);
        for ($j = 0; $j < $noDigitsLeft; $j++) {
            $preDigits .= '0';
        }
    }
    $newParcode = 'i' . $preDigits . $productId;
    return $newParcode;
}

################################################################################
//this we pass length we need

function addPreDigitsToNum2($num, $length = 2)
{
    global $Programsettingdata;

    $preDigits = '';
    if (strlen($num) != $length) {
        $noDigitsLeft = $length - strlen($num);
        for ($j = 0; $j < $noDigitsLeft; $j++) {
            $preDigits .= '0';
        }
    }
    return $preDigits . $num;
}
