<?php

/////////////////////    سداد ديون مورد معين
//the global file operation
include("../public/impOpreation.php");
include_once("initiateStaticSessionCommingWithCurl.php");
//global varable
global $showoutside;

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


//here the db files that include in the file
include("../public/include_dao.php");
include("../library/uploadImages.php");
include '../library/Classes/PHPExcel/IOFactory.php';

require_once('../models/dao/CostcenterDAO.class.php');
require_once('../models/dto/Costcenter.class.php');
require_once('../models/mysql/CostcenterMySqlDAO.class.php');
require_once('../models/mysql/ext/CostcenterMySqlExtDAO.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');


//Supplier
require_once('../models/dao/SupplierDAO.class.php');
require_once('../models/dto/Supplier.class.php');
require_once('../models/mysql/SupplierMySqlDAO.class.php');
require_once('../models/mysql/ext/SupplierMySqlExtDAO.class.php');
//Supplierdebtchange
require_once('../models/dao/SupplierdebtchangeDAO.class.php');
require_once('../models/dto/Supplierdebtchange.class.php');
require_once('../models/mysql/SupplierdebtchangeMySqlDAO.class.php');
require_once('../models/mysql/ext/SupplierdebtchangeMySqlExtDAO.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');

//User
require_once('../models/dao/UserDAO.class.php');
require_once('../models/dto/User.class.php');
require_once('../models/mysql/UserMySqlDAO.class.php');
require_once('../models/mysql/ext/UserMySqlExtDAO.class.php');

//Currency
require_once('../models/dao/CurrencyDAO.class.php');
require_once('../models/dto/Currency.class.php');
require_once('../models/mysql/CurrencyMySqlDAO.class.php');
require_once('../models/mysql/ext/CurrencyMySqlExtDAO.class.php');
//
require_once('../models/dao/BankDAO.class.php');
require_once('../models/dto/Bank.class.php');
require_once('../models/mysql/BankMySqlDAO.class.php');
require_once('../models/mysql/ext/BankMySqlExtDAO.class.php');

//get the do the action
$do = isset($_GET['do']) ? $_GET['do'] : '';

$langs = $_SESSION['erp_lang'];
include_once("../views/languages/$langs/success.php");
include_once("../views/languages/$langs/error.php");
/* ======================

  Controller Name :- supplierPayedDeptController

  OPERTATION in Controller

  1- display add form
  2- add row in supplierdebtchange tbl
  3- update supplier dept in supplier tbl
  ======================== */
if ($_POST['curlpost'] != 1) {
    //here the global templates
    $smarty->display("header.html");
}

//here goes the instances and general variables

$Costcenter = new Costcenter();
$CostcenterDAO = new CostcenterMySqlDAO();
$CostcenterEX = new CostcenterMySqlExtDAO();


//Client
$client = new Client();
$clientDAO = new ClientMySqlDAO();
$clientExt = new ClientMySqlExtDAO();
//Clientdebtchange
$clientDeptChange = new Clientdebtchange();
$clientDeptChangeDAO = new ClientdebtchangeMySqlDAO();
$clientDeptChangeExt = new ClientdebtchangeMySqlExtDAO();

//Supplier
$supplier = new Supplier();
$supplierDAO = new SupplierMySqlDAO();
$supplierExt = new SupplierMySqlExtDAO();
//Supplierdebtchange
$supplierDeptChange = new Supplierdebtchange();
$supplierDeptChangeDAO = new SupplierdebtchangeMySqlDAO();
$supplierDeptChangeExt = new SupplierdebtchangeMySqlExtDAO();
//save
$Save = new Save();
$SaveDAO = new SaveMySqlDAO();
$SaveExt = new SaveMySqlExtDAO();

$mySave = new Save();
$mySaveRecord = new SaveMySqlDAO();

//savedaily
$Savedaily = new Savedaily();
$SavedailyDAO = new SavedailyMySqlDAO();

//Accountstree
$accountsTree = new Accountstree();
$accountsTreeDAO = new AccountstreeMySqlDAO();
$accountsTreeEX = new AccountstreeMySqlExtDAO();

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

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

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

//User
$myUser = new User();
$myUserRecord = new UserMySqlDAO();
$myUserEx = new UserMySqlExtDAO();
//Currency
$currency = new Currency();
$currencyDAO = new CurrencyMySqlDAO();
$currencyEX = new CurrencyMySqlExtDAO();
eval(base64_decode("ZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCkgewogICAgJGhvc3RuYW1lID0gZXhwbG9kZSgnY29udHJvbGxlcnMnLCAkX1NFUlZFUlsnU0NSSVBUX1VSSSddKVswXTsgLy9nZXRob3N0bmFtZSgpOwogICAgJGhvc3RuYW1lID0gc3RyX3JlcGxhY2UoYXJyYXkoImh0dHA6Ly8iLCAiaHR0cHM6Ly8iKSwgIiIsICRob3N0bmFtZSk7CgogICAgLy8gR2VuZXJhdGUgYW4gTUQ1IGhhc2ggb2YgdGhlIGlucHV0CiAgICAkZGF0YSA9IG1kNSgkaG9zdG5hbWUpOwogICAgLy8gRm9ybWF0IHRoZSBoYXNoIGFzIGEgVVVJRAogICAgJHV1aWQgPSBzcHJpbnRmKAogICAgICAgICAgICAnJTA4cy0lMDRzLSUwNHgtJTA0eC0lMTJzJywKICAgICAgICAgICAgc3Vic3RyKCRkYXRhLCAwLCA4KSwKICAgICAgICAgICAgc3Vic3RyKCRkYXRhLCA4LCA0KSwKICAgICAgICAgICAgKGhleGRlYyhzdWJzdHIoJGRhdGEsIDEyLCA0KSkgJiAweDBmZmYpIHwgMHg0MDAwLAogICAgICAgICAgICAoaGV4ZGVjKHN1YnN0cigkZGF0YSwgMTYsIDQpKSAmIDB4M2ZmZikgfCAweDgwMDAsCiAgICAgICAgICAgIHN1YnN0cigkZGF0YSwgMjAsIDEyKQogICAgKTsKICAgICR1dWlkID0gc3RyX3JlcGxhY2UoYXJyYXkoJy0nKSwgJycsICR1dWlkKTsKICAgIHJldHVybiAkdXVpZDsKfQ=="));
eval(base64_decode("ZnVuY3Rpb24gc2VyaWFsY2hlY2soKSB7CiAgICBpZiAoc3RydG91cHBlcihzdWJzdHIoUEhQX09TLCAwLCAzKSkgPT09ICdXSU4nKSB7CiAgICAgICAgLy91dWlkIG9mIHdpbmRvd3MKICAgICAgICBleGVjKCdDOlxXaW5kb3dzXFN5c3RlbTMyXHdiZW1cd21pYyBjc3Byb2R1Y3QgZ2V0ICJVVUlEIicsICRtYWNhZGRyZXNzLCAkaXNFeGVjdXRlZCk7CiAgICAgICAgJG1hY2FkZHJlc3MgPSAkbWFjYWRkcmVzc1sxXTsKICAgICAgICAkbWFjID0gc3RyX3JlcGxhY2UoYXJyYXkoJy0nKSwgJycsICRtYWNhZGRyZXNzKTsKICAgIH0gZWxzZSB7Ly9ub3Qgd2luZG93cyB1c2UgbGludXggbWFjCiAgICAgICAgJG1hYyA9IGdlbmVyYXRlVVVJRCgpOwogICAgfQoKICAgICRyYW5kb21fc2FsdCA9IGhhc2goJ3NoYTUxMicsICcxMzA1Jyk7CiAgICAvLyBDcmVhdGUgc2FsdGVkIHBhc3N3b3JkCiAgICAkaGFzaGVkTWFjID0gaGFzaCgnc2hhNTEyJywgJG1hYyAuICRyYW5kb21fc2FsdCk7CiAgICByZXR1cm4gJGhhc2hlZE1hYzsKfQ=="));
eval(base64_decode("JHNlcmlhbENhbCA9IHNlcmlhbGNoZWNrKCk7CmlmICgoJHByb2ctPnNlcmlhbCAhPSAkc2VyaWFsQ2FsICYmICRwcm9nLT5zZXJpYWwyICE9ICRzZXJpYWxDYWwgJiYgJHByb2ctPnNlcmlhbDMgIT0gJHNlcmlhbENhbCkgfHwgJF9TRVNTSU9OWydsaWNfZGF0ZXRvJ10gPCBkYXRlKCdZLW0tZCcpKSB7CiAgICAvL3NlbmQgdGhlIHVzZXIgdG8gdGhlIGxvZ291dCBwYWdlCiAgICBoZWFkZXIoImxvY2F0aW9uOmxvZ291dC5waHAiKTsKICAgIGV4aXQoKTsKfQ=="));

//bank
$bankDAO = new BankMySqlDAO;
$bank = new Bank;
$bankExtDAO = new BankMySqlExtDAO;

//Programsetting
$ProgramsettingDAO = new ProgramsettingsMySqlDAO();

$today = date("Y-m-d H:i:s");

//check and use the condition that suite this action
$Programsettingdata = $ProgramsettingDAO->load(1);
$smarty->assign("Programsettingdata", $Programsettingdata);
eval(base64_decode("aWYgKCFmdW5jdGlvbl9leGlzdHMoJ3NlcmlhbGNoZWNrJykpIHsKICAgIENVUkxfSVQyKGFycmF5KCksICdzZWxsYmlsbEFqYXhDb250cm9sbGVyLnBocD9kbz1jYXRjaCcpOwogICAgaGVhZGVyKCJsb2NhdGlvbjpsb2dvdXQucGhwIik7Cn0="));
if (empty($do) || $do == "getmoney") {
    //here the permssion check
    include_once("../public/authentication.php");
    $clientsData = getClients(); //undeleted clients
    $smarty->assign("clientsData", $clientsData);
    $smarty->assign("do", $do);

    $allCostcenter = $CostcenterEX->queryAllnotdel();
    $smarty->assign("allCostcenter", $allCostcenter);

    $sellers = $myUserEx->queryWithGroupId(2);
    $smarty->assign("sellers", $sellers);

    $suppliersData = getSuppliers(); //undeleted suppliers
    $smarty->assign("suppliersData", $suppliersData);
    $smarty->assign("today", $today);

    $loaddata = $supplierDeptChangeExt->getlastInGeneral();
    $todayx = (int) $load_last_row->supplierdebtchangemodelid;
    $todayx = $todayx + 1;

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



    $userData = $myUserRecord->load($_SESSION['userid']);
    $smarty->assign("userData", $userData);
    $allSave = $SaveExt->queryAllEX2();
    $smarty->assign("allSave", $allSave);

    $allCurrency = $currencyDAO->queryByConditions(0);
    $smarty->assign("allCurrency", $allCurrency);


    $bank = $bankExtDAO->queryAllExt();
    $smarty->assign("bank", $bank);

    $paySerialNo = (int) R::getCell('SELECT MAX(paySerialNo) FROM supplierdebtchange') + 1;
    $smarty->assign("paySerialNo", $paySerialNo);


    $allTags = R::getAll('select * from associatedtags where conditions = 0');
    $smarty->assign('allTags', $allTags);

    $smarty->assign("suplliernegative", $_SESSION['suplliernegative']);
    //here the smarty templates
    $smarty->assign("customdepositcheck", 1);
    $smarty->assign("customSupplierPayedDept", 1);
    $smarty->display("supplierPayedDeptview/add.html");
} elseif ($do == "show") {
    header("location:supplierReportsController.php");
} elseif ($do == "add") {
    // include_once("../public/authentication.php");
    //    add();
    try {
        $data_arr = add();
        if ($_POST['curlpost'] == 1) {
            echo (int) $data_arr[1];
        } else {
            if ($data_arr[0] == '0' || $_POST['clientorsupplier'] == 2) {
                header("location:?do=sucess");
            } else {
                header("location:supplierReportsController.php?do=editprint&id=" . $data_arr[1] . "");
            }
        }
    } catch (Exception $e) {
        header("location:?do=error");
    }
} elseif ($do == "editprint") {
    include_once("../public/authentication.php");

    $supplierdebtchangeId = $_GET['id'];

    $supplierdebtchangeData = edit($supplierdebtchangeId);
    $smarty->assign("supplierdebtchangeData", $supplierdebtchangeData);

    $suppliersData = getSuppliers(); //undeleted suppliers
    $smarty->assign("suppliersData", $suppliersData);

    $smarty->display("supplierPayedDeptview/editprint.html");

    $smarty->assign("customPrint", 1);
} elseif ($do == "addexcel") {
    //here the permssion check
    include_once("../public/authentication.php");

    //get suppliers who have debt
    $suppliersData = $supplierExt->queryAllsupWithDebt();
    //empty excel file
    //start excel
    $inputFileName = 'preformatted_excel/suppliers_for_pay_debt.xlsx';
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);

    $objPHPExcel = $objReader->load($inputFileName);
    //  Get worksheet dimensions
    $sheet = $objPHPExcel->getSheet(0);
    $highestRow = $sheet->getHighestRow();
    $highestColumn = $sheet->getHighestColumn();

    $number_rows = $sheet->getHighestRow() - 4; // number of rows count
    if ($sheet != NULL) {
        if ($sheet->removeRow(4, $number_rows)) {
        }
    }
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $inputFileType);
    $objWriter->save($inputFileName);
    //end empty  excel file
    //start excel
    $inputFileName = 'preformatted_excel/suppliers_for_pay_debt.xlsx';
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);

    $objPHPExcel = $objReader->load($inputFileName);

    $RowStartTitles = 3;
    $col = 0;

    ## Auto size columns for active sheet
    $RowStartSupplier = 4;

    foreach ($suppliersData as $supData) {
        $col = 0;
        $objPHPExcel->getActiveSheet()
            ->setCellValueByColumnAndRow($col++, $RowStartSupplier, $supData->suppliername);
        $objPHPExcel->getActiveSheet()
            ->setCellValueByColumnAndRow($col++, $RowStartSupplier, $supData->supplierphone);
        $objPHPExcel->getActiveSheet()
            ->setCellValueByColumnAndRow($col++, $RowStartSupplier, $supData->suppliercode);
        $objPHPExcel->getActiveSheet()
            ->setCellValueByColumnAndRow($col++, $RowStartSupplier, $supData->suppliercurrentDebt);
        $col++;
        $RowStartSupplier++;
    }

    foreach (range('A', 'Z') as $columnID) {
        $objPHPExcel->getActiveSheet()
            ->getColumnDimension($columnID)->setWidth(17.1); //->setAutoSize(true);
    }

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $inputFileType);
    $objWriter->save($inputFileName);
    //Clearing a Workbook from memory
    $objPHPExcel->disconnectWorksheets();
    unset($objPHPExcel);

    //here the smarty templates
    $smarty->display("supplierPayedDeptview/uploadexcel.html");
} elseif ($do == "addfromexcel") {
    include_once("../public/authentication.php");
    try {
        addFromExcel();
        header("location:?do=sucess");
    } catch (Exception $e) {
        header("location:?do=error");
    }
} elseif ($do == "sucess") {
    //here the smarty templates
    $smarty->display("succes.html");
} elseif ($do == "error") {
    //here the smarty templates
    $smarty->display("error.html");
}
//here the global templates
$smarty->assign("customValidation", 1);
if ($_POST['curlpost'] != 1) {
    $smarty->display("footer.html");
}
/* ===============================
  function in this CONTROLLER
  ================================ */

function getSuppliers()
{
    global $supplierDAO;
    $suppliersData = $supplierDAO->queryByCondition(0);
    return $suppliersData;
}

// add in supplierdebtchange tbl
function add()
{
    global $supplierExt;
    global $supplierDAO;
    global $supplier;
    global $supplierDeptChange;
    global $supplierDeptChangeDAO;
    global $currencyEX;
    global $today;

    global $mySave;
    global $mySaveRecord;


    //Dailyentry
    global $dailyEntry;

    //Dailyentrycreditor دائن
    global $dailyEntryCreditor;

    //Dailyentrydebtor مدين
    global $dailyEntryDebtor;

    global $accountsTreeDAO;
    global $accountsTree;


    //Transaction
    $mytransactions = new Transaction();

    try {
        $do = $_POST["do"]; //empty or getmoney
        $supplierid = $_POST["supplierid"];
        $costcenterid = $_POST["Costcenterid"];
        $payedDept = $_POST["payedDept"];
        $comment = $_POST["comment"];
        $currentDate = $_POST["currentDate"];
        $saveid = (int) $_POST['saveid'];
        $paySerialNo = (int) $_POST["paySerialNo"];
        $tagids = filter_input(INPUT_POST, 'tagids', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);

        $saveorbank = (int) $_POST['saveorbank'];
        if (empty($saveorbank)) {
            $saveorbank = 1;
        }
        $clientorsupplier = $_POST['clientorsupplier'];
        $currencyId = (isset($_POST['currencyId']) && !empty($_POST['currencyId'])) ? (int) $_POST['currencyId'] : 1;
        $cFactor = (isset($_POST['cFactor']) && !empty($_POST['cFactor'])) ? (float) $_POST['cFactor'] : 1;
        $payedDeptCurr = (isset($_POST['payedDeptCurr']) && !empty($_POST['payedDeptCurr'])) ? (float) $_POST['payedDeptCurr'] : $payedDept;
        if (isset($saveid) && !empty($saveid) && $saveorbank == 1) {
            //
            $dataSave = $mySaveRecord->load($saveid);

            if ($clientorsupplier == 2) {
                $clientid = (int) filter_input(INPUT_POST, 'clientid');
                if (isset($clientid) && $clientid > 1) {
                    $clientdata = R::getRow('SELECT * FROM client WHERE clientid = ?', array($clientid));
                    $last_Clientdebtchangeid = (int) R::getCell('SELECT clientdebtchangeid FROM clientdebtchange order by clientdebtchangeid desc limit 1');
                    $data_arr = array(
                        'clientid' => $clientid,
                        'payedDept' => $payedDept,
                        'comment' => "ايصال دفع لعميل",
                        'saveid' => $saveid,
                        'currentDate' => date('Y-m-d H:i:s'),
                        'clientorsupplier' => 2,
                        'debtBefore' => $clientdata['clientdebt'],
                        'payedDeptCurr' => $payedDept,
                        'debtAfter' => ($clientdata['clientdebt'] + $payedDept),
                        'voucher' => $last_Clientdebtchangeid + 1,
                    );
                    addClientData($data_arr);
                    // CURL_IT2($data_arr,'clientPayedDeptController.php?do=add');
                    // CURL_Request($data_arr, 'clientPayedDeptController.php?do=add',  0,  1, '', 'POST') ;
                }
            } else {

                $supplierdata = getSupplierDataFromSupplierInUseSP($supplierid);
                //$supplierdata = $supplierDAO->load($supplierid);
                $debtBefore = $supplierdata->suppliercurrentDebt;

                $debtAfter = $debtBefore - $payedDept;
                $processname = "ايصال دفع لمورد";
                $texts = "ايصال دفع لمورد";
                $supplierdebtchangetype = 1;

                $supplierdebtchangemodelid = $_POST['voucher'];

                //insert into supplierdeptchange tbl
                $supplierDeptChange->comment = $comment;
                $supplierDeptChange->processname = $processname;
                $supplierDeptChange->supplierdebtchangeafter = $debtAfter;
                $supplierDeptChange->supplierdebtchangeamount = $payedDept;
                $supplierDeptChange->supplierdebtchangebefore = $debtBefore;
                $supplierDeptChange->supplierdebtchangedate = $currentDate; //date("Y-m-d H:i:s");
                $supplierDeptChange->supplierdebtchangemodelid = $supplierdebtchangemodelid;
                $supplierDeptChange->supplierdebtchangetype = $supplierdebtchangetype;
                $supplierDeptChange->tablename = "supplierPayedDeptController.php";
                $supplierDeptChange->userid = $_SESSION['userid'];
                $supplierDeptChange->supplierid = $supplierid;
                $supplierDeptChange->dailyentryid = 0;
                $supplierDeptChange->saveid = $saveid;
                $supplierDeptChange->costcenterid = $costcenterid;
                $supplierDeptChange->currencyId = $currencyId;
                $supplierDeptChange->conversionFactor = $cFactor;
                $supplierDeptChange->payedInCurrency = $payedDeptCurr;
                $supplierDeptChange->paySerialNo = $paySerialNo;

                if (isset($tagids)) {
                    if (in_array("0", $tagids)) {
                        $supplierDeptChange->tagids = '0';
                    } else {
                        $supplierDeptChange->tagids = implode(",", $tagids);
                    }
                }

                //Insert
                $supplierDeptChangeId = $supplierDeptChangeDAO->insert($supplierDeptChange);
                $saveConversionFactor = 0;
                if (isset($supplierDeptChangeId)) {
                    $suppData = $supplierDAO->load($supplierid);
                    //update current dept in supplier tbl
                    $supplier->suppliercurrentDebt = $debtAfter;
                    $supplier->suppliercurrentDebtInCurrency = $debtAfter;


                    $payedInSuppCurr = $payedDept;
                    // $payedInSuppCurr = $debtAfter;
                    if ($suppData->sullpierCurrencyid > 1) {
                        if ($currencyId == $suppData->sullpierCurrencyid) {
                            $payedInSuppCurr = $payedDeptCurr;
                        } else {
                            $conversionFactorSupp = R::getCell('select conversionFactor from currency where id=' . $suppData->sullpierCurrencyid);
                            $payedInSuppCurr = $payedDept / $conversionFactorSupp;
                            // $payedInSuppCurr = $debtAfter / $conversionFactorSupp;
                        }

                        if ($clientorsupplier == 2) {
                            $supplier->suppliercurrentDebtInCurrency = $suppData->suppliercurrentDebtInCurrency + $payedInSuppCurr;
                        } else {
                            $supplier->suppliercurrentDebtInCurrency = $suppData->suppliercurrentDebtInCurrency - $payedInSuppCurr;
                        }
                    }
                    $supplierDeptChange->debtchangbeforeInSupplierCurrency = $suppData->suppliercurrentDebtInCurrency;
                    $supplierDeptChange->debtchangamountInSupplierCurrency = $payedInSuppCurr;
                    $supplierDeptChange->debtchangafterInSupplierCurrency = $supplier->suppliercurrentDebtInCurrency;
                    $supplierDeptChangeDAO->update($supplierDeptChange);


                    $supplier->userid = $_SESSION['userid'];
                    $supplier->supplierdate = $today;
                    $supplier->supplierid = $supplierid;

                    $supplierExt->updatedept($supplier);
                    markSupplierAsNOTInUse($supplierid);

                    //update save's current value
                    if ($do == "getmoney" || $clientorsupplier == 2) {
                        $valueData = getSaveValueAndPlus($payedDept, $saveid, $saveConversionFactor);
                        $changeType = 0;
                    } else {
                        $valueData = getSaveValueAndMins($payedDept, $saveid, $saveConversionFactor);
                        $changeType = 1;
                    }

                    $saveId = $valueData[0];
                    $saveValuebefore = $valueData[1];
                    $saveValueafter = $valueData[2];
                    $payedDeptAmountCurr = $valueData[3]; //needed because of currency
                    $saveConversionFactor = $valueData[4]; //needed because of currency
                    //update save value after payedDept
                    updateSave($saveId, $saveValueafter);
                    //insert into savedaily tbl
                    insertSavedaily($saveValuebefore, $payedDeptAmountCurr, $changeType, $saveId, $texts, $supplierDeptChangeId, $saveValueafter, "supplierPayedDeptController.php");
                }

                //update currency conversionfactor
                if ($currencyId > 1 && $currencyId == $dataSave->currencyId) {
                    $currencyEX->updateConversionFactor($cFactor, $currencyId);
                }

                $supName = $supplierdata->suppliername;
                $dailyEntry->entryComment = $texts . ' ( ' . $supName . ' ) ';
                $dailyEntry->fromFlag = 1;

                // start 7saaab L da2noon
                $dailyEntryDebtorArray = array();
                $dailyEntryDebtor->value = $payedDept;
                $oldSupplier = $supplierDAO->load($supplierid);

                if ($oldSupplier->treeId > 0) {
                    $treeId = $oldSupplier->treeId;
                } else {
                    $supplierTypeForTree = 0;
                    if ($supplierTypeForTree == 0)
                        $parent = 81;
                    elseif ($supplierTypeForTree == 1)
                        $parent = 87;

                    $treeId = addTreeElement($oldSupplier->suppliername, $parent, 1, 0, 1, '', $oldSupplier->suppliercurrentDebt, 0);
                }
                $dailyEntryDebtor->accountstreeid = $treeId;


                /// end 7saaab L da2noon
                //start Save
                $dailyEntryCreditorArray = array();
                $dailyEntryCreditor->value = $payedDept;

                //$dataSave = $mySaveRecord->load($saveid);

                if ($dataSave->treeId > 0) {
                    $idTreeSave = $dataSave->treeId;
                } else {
                    $idTreeSave = addTreeElement($dataSave->savename, 40, 3, 0, 1, '', $dataSave->savecurrentvalue, 0);
                }
                $dailyEntryCreditor->accountstreeid = $idTreeSave;
                /// end Save

                if ($do == "getmoney" || $clientorsupplier == 2) {
                    //swap accounts ids of debtor , creditor
                    $tempDebtor = $dailyEntryDebtor->accountstreeid;
                    $tempCreditor = $dailyEntryCreditor->accountstreeid;

                    $dailyEntryDebtor->accountstreeid = $tempCreditor;
                    $dailyEntryCreditor->accountstreeid = $tempDebtor;
                }

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

                $returnedData = insertEntery($dailyEntry, $dailyEntryDebtorArray, $dailyEntryCreditorArray, 1, $supplierDeptChangeId, "supplierReportsController.php?do=show&id=$supplierDeptChangeId");
                $did = $returnedData[1];
                $rowData = $supplierDeptChangeDAO->load($supplierDeptChangeId);

                $rowData->dailyentryid = $did;
                $rowData->saveConversionFactor = $saveConversionFactor;

                $supplierDeptChangeDAO->update($rowData);

                $add_print = $_POST['add_print'];
                $data_arr = array($add_print, $supplierDeptChangeId);
            }
        }
        $mytransactions->commit();
    } catch (Exception $ex) {
        $mytransactions->rollback($ex);
        markSupplierAsNOTInUse($_POST["supplierid"]);
    }
    return $data_arr;
}

function edit($supplierDeptChangeId)
{
    global $supplierDeptChangeDAO;

    $supplierdebtchangeData = $supplierDeptChangeDAO->load($supplierDeptChangeId);
    if (empty($supplierdebtchangeData->tagids)) {
        $supplierdebtchangeData->tagids = 0;
    }

    $tagNames = R::getCol('select tagname from associatedtags where id in (' . $supplierdebtchangeData->tagids . ')');
    $tagNamesData = "";
    foreach ($tagNames as $name) {
        $tagNamesData .= $name . ', ';
    }
    $supplierdebtchangeData->tagids = rtrim($tagNamesData, ', ');

    return $supplierdebtchangeData;
}

// get savecurrentvalue and mins from save tbl
function getSaveValueAndMins($savevaluechanged, $saveid, $saveConversionFactor = 0)
{
    global $Save;
    global $SaveExt;

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

    if ($saveConversionFactor == 0) { // if not given conversion factor use conversion factor of save
        $saveConversionFactor = $saveData->conversionFactor;
    }

    $savevaluechanged = round(($savevaluechanged * $saveConversionFactor), 4); //convert from main curr
    $saveValueafter = $saveValuebefore - $savevaluechanged;

    return array($saveId, $saveValuebefore, $saveValueafter, $savevaluechanged, $saveConversionFactor);
}

function getSaveValueAndMinus($savevaluechanged, $saveid, $saveConversionFactor = 0)
{
    global $Save;
    global $SaveExt;

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

    if ($saveConversionFactor == 0) { // if not given conversion factor use conversion factor of save
        $saveConversionFactor = $saveData->conversionFactor;
    }

    $savevaluechanged = round(($savevaluechanged * $saveConversionFactor), 4); //convert from main curr
    $saveValueafter = $saveValuebefore - $savevaluechanged;

    return array($saveId, $saveValuebefore, $saveValueafter, $savevaluechanged, $saveConversionFactor);
}

// update Save tbl
function updateSave($saveid, $savevalueafter)
{
    global $Save;
    global $SaveExt;

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

    $SaveExt->updateSaveValue($Save);
}

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

    //to use the variable out side the funcion
    global $Savedaily;
    global $SavedailyDAO;

    //insert in Savedaily tbl
    $Savedaily->savedailydate = date("Y-m-d H:i:s");
    $Savedaily->userid = $_SESSION['userid'];
    $Savedaily->savedailysavebefore = $savedailysavebefore;
    $Savedaily->savedailychangeamount = $savedailychangeamount;
    $Savedaily->savedailychangetype = $savedailychangetype;
    $Savedaily->saveid = $saveid;
    $Savedaily->processname = $processname;
    $Savedaily->savedailymodelid = $savedailymodelid;
    $Savedaily->savedailysaveafter = $savedailysaveafter;
    $Savedaily->tablename = $tablename;

    $SavedailyDAO->insert($Savedaily);
}

function getClients()
{
    global $clientDAO;
    $clientsData = $clientDAO->queryByCondition(0);
    return $clientsData;
}

function getSupplierDataFromSupplierInUseSP($supplier)
{
    global $supplierExt;
    global $supplierDAO;
    if ($supplier == 1) {
        $supplier_data = $supplierDAO->load($supplier);
    } elseif ($supplier > 1) {
        $noOfTries = 0;
        $supplier_data = $supplierExt->callSupplierInUseSP($supplier);
        while ($supplier_data->suppliercurrentDebt == '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 supplier=$supplier with redbean");
                R::exec('UPDATE supplier SET  inUse = 0 where supplierid = ' . $supplier);
            }
            $supplier_data = $supplierExt->callSupplierInUseSP($supplier);
        }
    }
    return $supplier_data;
}

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

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

function CURL_IT2($data_arr, $url)
{
    ##preparing session data
    //$projectURL = 'http://' . $_SERVER['HTTP_HOST'] . explode('controllers', $_SERVER['REQUEST_URI'])[0] . 'controllers/';
    $url = 'http://' . $_SERVER['HTTP_HOST'] . explode('controllers', $_SERVER['REQUEST_URI'])[0] . 'controllers/' . $url;

    ##appending necessary data
    $data_arr['curlpost'] = '1';
    $data_arr['sessionlist'] = json_encode($_SESSION);


    // set post fields
    //    $post = [
    //        'data_arr' => json_encode($data_arr), //encode it as it is array
    //    ];
    $post = $data_arr;
    $ch = curl_init($url);
    //
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //
    //Disable CURLOPT_SSL_VERIFYHOST and CURLOPT_SSL_VERIFYPEER by
    //setting them to false.
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    //curl_setopt($ch, CURLOPT_TIMEOUT, 10); //
    // execute!
    $response = curl_exec($ch);
    if ($response === false) {
        //echo 'Error : ' . curl_error($ch);
    }

    // close the connection, release resources used
    curl_close($ch);
    // do anything you want with your response
    //var_dump($response);
    //print_r($response);
    return $response;
}

function addFromExcel()
{
    global $supplierDAO;
    global $supplierDeptChangeExt;

    ## upload file temporarely
    $handle = new upload($_FILES['supplierssheet']);
    $excelfileName = uploadfile($handle, "../upload/supplierPayedDebt");
    $inputFileName = "../upload/supplierPayedDebt/" . $excelfileName;

    //Transaction
    $mytransactions = new Transaction();
    try {
        $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
        $objReader = PHPExcel_IOFactory::createReader($inputFileType);

        $objPHPExcel = $objReader->load($inputFileName);



        //  Get worksheet dimensions
        $sheet = $objPHPExcel->getSheet(0);
        $highestRow = $sheet->getHighestRow();
        $highestColumn = $sheet->getHighestColumn();

        for ($row = 4; $row <= $highestRow; $row++) {
            //  Read a row of data into an array
            $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
            $rowData = $rowData[0];

            $col = 0;
            $suppliername = $rowData[$col]; //$_POST["txtName"];
            $col++;
            $supplierphone = $rowData[$col]; //$_POST["txtPhone"];
            $col++;
            $suppliercode = $rowData[$col]; //$_POST["textDetails"];
            $col++;
            $suppliercurrentDebt = $rowData[$col]; //$_POST["txtDebt"];
            $col++;
            $payedAmount = $rowData[$col]; //$_POST["textDetails"];
            $col++;

            if ($payedAmount > 0) {
                $supplierData = $supplierDAO->queryBySuppliername($suppliername);

                $_POST["supplierid"] = $supplierData[0]->supplierid;
                $_POST["payedDept"] = $payedAmount;
                $_POST["comment"] = '';
                $_POST["currentDate"] = date('Y-m-d H:i:s');
                $_POST['saveid'] = $_SESSION['saveid'];
                $_POST['clientorsupplier'] = 1;
                $_POST['debtBefore'] = $supplierData[0]->suppliercurrentDebt;
                $_POST['payedDeptCurr'] = $payedAmount;
                $_POST['debtAfter'] = ($supplierData[0]->suppliercurrentDebt - $payedAmount);

                $last_supplierdebtchangeid = (int) R::getCell('SELECT supplierdebtchangeid FROM supplierdebtchange order by supplierdebtchangeid desc limit 1');
                $_POST['voucher'] = $last_supplierdebtchangeid + 1;
                add();
            }
        }
        unlink($inputFileName);
        $mytransactions->commit();
    } catch (Exception $e) {
        $mytransactions->rollback($e);
        //die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME) . '": ' . $e->getMessage());
    }
}

function addClientData($data)
{
    global $saveDAO;
    global $clientDeptChange;
    global $clientDeptChangeDAO;
    global $client;
    global $clientDAO;
    global $clientExt;
    global $currencyEX;
    //Dailyentry
    global $dailyEntry;
    //Dailyentrycreditor دائن
    global $dailyEntryCreditor;
    //Dailyentrydebtor مدين
    global $dailyEntryDebtor;


    $today = date("Y-m-d H:i:s");

    $clientid = $data['clientid'];
    $payedDept = $data['payedDept'];
    $comment = $data['comment'];
    $saveid = $data['saveid'];
    $currentDate = $data['currentDate'];
    $clientorsupplier = ['clientorsupplier'];
    $payedDeptCurr = $data['payedDeptCurr'];
    $currencyId = (isset($_POST['currencyId']) && !empty($_POST['currencyId'])) ? (int) $_POST['currencyId'] : 1;
    $cFactor = (isset($_POST['cFactor']) && !empty($_POST['cFactor'])) ? (float) $_POST['cFactor'] : 1;
    $voucher = $data['voucher'];
    $seller = $data['seller'];
    $costcenterid = $data['Costcenterid'];
    // $handle = new upload($_FILES['file']);
    // $file = uploadfile($handle, '../upload/clientPayedDebtFile');

    $saveorbank = 2;
    //Transaction
    $mytransactions = new Transaction();
    try {
        if (isset($saveid) && !empty($saveid) && $saveorbank == 2) {
            //
            $dataSave = $saveDAO->load($saveid);


            $clientdataSP = getClientDataFromClientInUseSP($clientid);
            $client = $clientDAO->load($clientid);

            $debtBefore = $clientdataSP->clientdebt;
            $debtAfter = $debtBefore + $payedDept;
            $processname = "ايصال دفع لعميل";
            $texts = "ايصال دفع لعميل";
            $clientdebtchangetype = 0;

            $client->clientdebt = $debtAfter;
            $client->userid = $_SESSION['userid'];
            $client->clientdate = $today;
            $client->clientid = $clientid;

            $clientExt->updatedept($client);
            markClientAsNOTInUse($clientid);



            $clientdebtchangemodelid = $voucher;

            //insert into supplierdeptchange tbl
            $clientDeptChange->comment = $comment;
            $clientDeptChange->processname = $processname;
            $clientDeptChange->clientdebtchangeafter = $debtAfter;
            $clientDeptChange->clientdebtchangeamount = $payedDept;
            $clientDeptChange->totalOperationCost = $payedDept;
            $clientDeptChange->clientdebtchangebefore = $debtBefore;
            $clientDeptChange->clientdebtchangedate = $today; //$currentDate
            $clientDeptChange->clientdebtchangemodelid = $voucher;
            $clientDeptChange->paySerialNo = $voucher;
            $clientDeptChange->clientdebtchangetype = $clientdebtchangetype;
            $clientDeptChange->tablename = "clientPayedDeptController.php";
            $clientDeptChange->userid = $_SESSION['userid'];
            $clientDeptChange->clientid = $clientid;
            $clientDeptChange->seller = $seller;
            $clientDeptChange->dailyentryid = 0;
            //$clientDeptChange->discountearlyRepayment = $earlyRepayment;//null
            $clientDeptChange->costcenterid = $costcenterid;
            $clientDeptChange->currencyId = $currencyId;
            $clientDeptChange->conversionFactor = $cFactor;
            $clientDeptChange->payedInCurrency = $payedDeptCurr;
            $clientDeptChange->totalpayments = 0;
            $clientDeptChange->file = '';

            if (isset($tagids)) {
                if (in_array("0", $tagids)) {
                    $clientDeptChange->tagids = '0';
                } else {
                    $clientDeptChange->tagids = implode(",", $tagids);
                }
            }

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

            //update currency conversionfactor
            if ($currencyId > 1 && $currencyId == $dataSave->currencyId) {
                $currencyEX->updateConversionFactor($cFactor, $currencyId);
            }

            $saveConversionFactor = 0;
            //update save's current value
            $valueData = getSaveValueAndMinus($payedDept, $saveid, $saveConversionFactor);
            $changeType = 1;

            $saveId = $valueData[0];
            $saveValuebefore = $valueData[1];
            $saveValueafter = $valueData[2];
            $payedDeptAmountCurr = $valueData[3]; //needed because of currency
            $saveConversionFactor = $valueData[4]; //needed because of currency
            //update save value after payedDept
            updateSave($saveId, $saveValueafter);
            //insert into savedaily tbl
            insertSavedaily($saveValuebefore, $payedDeptAmountCurr, $changeType, $saveId, $texts, $clientdebtchangeId, $saveValueafter, "clientPayedDeptController.php", $clientid);

            


            $dailyEntry->entryComment = $texts . ' ( ' . $client->clientname . ' ) ';
            $dailyEntry->fromFlag = 1;

            
            //
            /// start L 7sab L da2non
            $dailyEntryDebtorArray = array();
            $dailyEntryDebtor->value = $payedDept;
            
            $oldClient = $clientDAO->load($clientid);
            $treeId = $oldClient->treeId;
            if ($treeId < 1) {
                $clientTypeForTree = 0;
                if ($clientTypeForTree == 0)
                    $parent = 58;
                elseif ($clientTypeForTree == 1)
                    $parent = 60;
                $treeId = addTreeElement($oldClient->clientname, $parent, 3, 0, 1, '', 0, $oldClient->clientdebt);
            }
            // print_r($treeId . 'aaaaaaaaaaaaa');
            $dailyEntryDebtor->accountstreeid = $treeId;
            /// end L 7sab L da2non

            // start save
            $dailyEntryCreditorArray = array();
            $dailyEntryCreditor->value = $payedDept;

            //$dataSave = $SaveDAO->load($saveid);

            $idTreeSave = $dataSave->treeId;
    
            if ($idTreeSave < 1) {
                $idTreeSave = addTreeElement($dataSave->savename, 40, 3, 0, 1, '', '', $dataSave->savecurrentvalue, 0);
            }
            $dailyEntryCreditor->accountstreeid = $idTreeSave;
            /// end save


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

            $returnedData = insertEntery($dailyEntry, $dailyEntryDebtorArray, $dailyEntryCreditorArray, 1, $clientdebtchangeId, "clientPayedDeptController.php?do=show&id=$clientdebtchangeId");
            $did = $returnedData[1];
            //
            $rowData = $clientDeptChangeDAO->load($clientdebtchangeId);
            $rowData->dailyentryid = $did;
            $rowData->saveConversionFactor = $saveConversionFactor;
            $clientDeptChangeDAO->update($clientDeptChange);
        }

        $mytransactions->commit();
    } catch (Exception $ex) {
        $mytransactions->rollback($ex);
        markClientAsNOTInUse($_POST["clientid"]);
    }
}
function getClientDataFromClientInUseSP($clientid)
{
    global $clientExt;
    global $clientDAO;
    if ($clientid == 1) {
        $client_data = $clientDAO->load($clientid);
    } elseif ($clientid > 1) {
        $noOfTries = 0;
        $client_data = $clientExt->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 = $clientExt->callClientInUseSP($clientid);
        }
    }
    return $client_data;
}

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