<?php

require_once("imp/_imp.php");

class Controllers {

//public vars
   public $smarty;
   public $hosturl;
   public $hosturlApi;
   public $controllname;
   public $shcontrollname;
   public $active;
   public $redirectLink;

// it will run in everytime with
// default requried
   public function __construct() {
      require_once("../public/aw_config.php");
      require_once("imp/_autho.php"); //general functions
      $this->smarty = $smarty;
      $this->hosturl = $hosturl;
      $this->hosturlApi = $hosturlApi;
      $this->redirectLink = $redirectLink;

//here name of controll to known
      $this->controllname = 'visits';
      $this->shcontrollname = 'Visits';
      $this->smarty->assign('controllname', $this->controllname);
      $this->smarty->assign('shcontrollname', $this->shcontrollname);

//breadcrumbs
      require_once("../../_library/plugins/Breadcrumbs/Breadcrumbs.php");
      $acty = filter_input(INPUT_GET, 'ac');
      $bc = new breadcrumbs($hosturl, '', '', $acty);
      $bc->crumbs();
      $breadcrumbs = $bc->breadcrumbs;
      $smarty->assign('breadcrumbs', $breadcrumbs);

# here show the active page in menu
// array called active[] with level of active element
      $active[0] = 'visits'; //controller name or tab name
      $active[1] = 'visits'; //controller name
// do name  // switch($do)
      switch ($acty) {
         case '':
            $active[2] = 'show';
            break;
         case 'show':
            $active[2] = 'show';
            break;
         default :
            $active[2] = 'show';
            break;
      }
      $this->active = $active;

      R::ext('xdispense', function ($type) {
         return R::getRedBean()->dispense($type);
      });

      require_once("visits_common.php"); //general functions
//here will call all php pages
      require_once("_header.php");
      require_once("_sidebar.php");
      require_once("_leftsidebar.php");
      require_once("_footer.php");
   }

   //here the frist page and
   //the frist action in this class
   public function index() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);

      date_default_timezone_set('Africa/Cairo');

      // date_default_timezone_set('Africa/Cairo');
      // all drugs will show in selectbox in add new drugs
      $this->patientdata();

      $patientid = filter_input(INPUT_GET, "patientid");
      $this->smarty->assign('patientid', $patientid);

      $deviceNo = filter_input(INPUT_GET, "deviceId");
      $patientNo = filter_input(INPUT_GET, 'patientNo');

      if ($patientNo > 0 && !($patientid > 0 )) {
         $patientid = getPatientId($patientNo);
      }

      if ($deviceNo > 0) {
         $deviceId = getDeviceId($deviceNo);
      }

      if ($deviceId > 0 && $patientid > 0) {
         saveTrackingRecord($patientid, $deviceId, 0, '', 'visits');
         $statusNo = R::getRow('select statusno  from patients where id = ?   ', [$patientid]);
         $this->smarty->assign('cardStatusNo', $statusNo['statusno']);

         R::exec('update visits set card_add = 1 , visittime = ? where  visitdate  =   ?    and deleted = ?      
                and    patientid = ? and (visittime is null || visittime = "" )      ', [date("H:i:s"), date('Y-m-d'), 0, $patientid]);
      } else {
         $this->smarty->assign('cardStatusNo', 0);
      }

      $allowEditVisit = 0;
      $btn3 = R::findOne('awrolebtn', ' role_id = ? and btn_id = 3  ', [$_SESSION['role_id']]);
      if (count($btn3) > 0) {
         $allowEditVisit = $btn3->checkval;
      }
      $this->smarty->assign('allowEditVisit', $allowEditVisit);

      $allowDeleteVisit = 0;
      $btn4 = R::findOne('awrolebtn', ' role_id = ? and btn_id = 4  ', [$_SESSION['role_id']]);
      if (count($btn4) > 0) {
         $allowDeleteVisit = $btn4->checkval;
      }
      $this->smarty->assign('allowDeleteVisit', $allowDeleteVisit);

      $found = 0;
      if (!empty($patientid)) {
         $date = date("Y/m/d");

         $data = R::find('visits', 'patientid = ? AND  visitdate = ? and deleted = ? ', [$patientid, $date, 0]);

         if (count($data) > 0) {
            $found = 1;
         }
      }

      $this->smarty->assign('found', $found);
      //Html files
      $programesetting = R::findOne('programesetting');
      $this->smarty->assign('programesetting', $programesetting);

      if ($programesetting->balance == 1) {
         $this->smarty->assign('balance', 0);
      }

      $visit_periods = R::findAll('visit_periods', 'deleted = 0');
      $this->smarty->assign('visit_periods', $visit_periods);

      $branches = R::findAll('branches');
      $this->smarty->assign('branches', $branches);

      $hasBranch = 0;
      if ($_SESSION['user_id'] > 0 && $programesetting->branches == 1) {
         $user = R::findOne('awusers', 'user_id = ?', [$_SESSION['user_id']]);
         if ($user->branch_id > 0) {
            $hasBranch = $user->branch_id;
         }
      }
      $this->smarty->assign('hasBranch', $hasBranch);

      header::headershow($this->smarty, $this->hosturl);
      sidebar::sidebarshow($this->smarty, $this->hosturl, $this->active);
      $this->smarty->display('visits/add.html');
      leftsidebar::leftsidebarshow($this->smarty, $this->hosturl);
      footer::footershow($this->smarty, $this->hosturl);
   }

   ## add new Visit

   public function getalldepts() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);
      $allDepts = R::findAll('detections');

      $this->smarty->assign('allDepts', $allDepts);
      header::headershow($this->smarty, $this->hosturl);
      sidebar::sidebarshow($this->smarty, $this->hosturl, $this->active);
      $this->smarty->display('visits/showdepts.html');
      leftsidebar::leftsidebarshow($this->smarty, $this->hosturl);
      footer::footershow($this->smarty, $this->hosturl);
   }

   public function emptydeptvisit() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);

      $deptId = filter_input(INPUT_POST, 'deptId');
      $query = "SELECT   patients.* , visits.visitdate  FROM patients
                                join  visits                on      patients.id = visits.patientid
                                where visits.detectionid = $deptId
                                and  visits.deleted = 0
                                ";
      //limit 0,50 ";

      $pResult = R::getAll($query);
      foreach ($pResult as $pat) {
         $endDates = R::getAll('select enddate from endvisitreports where patientid = ?  and enddate >= ?', [$pat['id'], $pat['visitdate']]);
         if (count($endDates) < 1) {    ## still open
            ## add end date to this visit
            $lastEnd = R::dispense('endvisitreports');
            $lastEnd->status = 0;
            $lastEnd->enddate = date('Y/m/d');
            $lastEnd->reason = '';
            $lastEnd->notes = '';
            $lastEnd->doctorid = $_SESSION['user_id'];
            $lastEnd->patientid = $pat['id'];
            R::store($lastEnd);
         }
      }
   }

   private function patientdata() {
//check authoize
      //autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);

      $allPatients = R::findAll('patients', 'deleted = ? and done = ?', [0, 1]);
      $allDetections = R::findAll('detections', 'del = 0');

      //Send Data to add.html to use it in insert new patient
      $this->smarty->assign('allPatients', $allPatients);
      $this->smarty->assign('today', date('Y/m/d'));
      $this->smarty->assign('allDetections', $allDetections);
   }

   function loadVisits($dateFrom, $dateTo, $patientId, $cardStatusNo) {
      $extraTime = R::findOne('programesetting');
      $user = R::findOne('awusers', 'user_id = ?', [$_SESSION['user_id']]);
      $branchSql = ' ';
      if ($extraTime->branches == 1 && $user->branch_id != -1) {
         $branchSql = '  and visits.branch_id =  ' . $user->branch_id;
      }

      //  print_r($branchSql);


      if ($patientId > 0) {
         $allvisit = $this->visitsFuture($patientId, $branchSql);
      } else {
         if ($dateFrom != '00-00-0000' && !empty($dateFrom)) {
            $dateFrom = date('Y/m/d', strtotime($dateFrom));
         } else {
            $dateFrom = '0000-00-00';
         }

         if ($dateTo != '00-00-0000' && !empty($dateTo)) {
            $dateTo = date('Y/m/d', strtotime($dateTo));
         } else {
            $dateTo = date('Y/m/d');
         }

         if ($cardStatusNo > 0) {
            $patientid = getPatientId($cardStatusNo);
         }



         if ($extraTime->visit_period == 1) {
            $allvisit = $this->visitsWithPeriod($dateFrom, $dateTo, $patientid, $branchSql);
         } else {
            $allvisit = $this->visitsWithoutPeriod($dateFrom, $dateTo, $patientid, $branchSql);
         }
      }
      $this->smarty->assign('withPeriod', $extraTime->visit_period);
      $this->smarty->assign('programview', $extraTime->programview);
      $this->smarty->assign('allvisit', $allvisit);
   }

   function visitsFuture($patientId, $branchSql) {
      $pro = R::findOne('programesetting');
      $date = date('Y/m/d');
      $visits = R::find('visits', '  visitdate  > ?    and deleted = ? and    patientid = ?   
                                                      ' . $branchSql . '   ORDER BY visittime ASC', [$date, 0, $patientId]);

      $allvisit = $this->visitCommon($visits);
      $this->smarty->assign('showPeriod', $pro->visit_period);
      return $allvisit;
   }

   function visitsWithoutPeriod($dateFrom, $dateTo, $patientId, $branchSql) {
      if ($patientId > 0) {
         $visits = R::find('visits', '  visitdate  between ? and ?    and deleted = ?  and    patientid = ?        
                    ' . $branchSql . '   ORDER BY visit_order , id ASC', [$dateFrom, $dateTo, 0, $patientId]);
      } else {
         $visits = R::find('visits', '  visitdate  between ? and ?    and deleted = ?     
                 ' . $branchSql . '   ORDER BY visit_order , id ASC', [$dateFrom, $dateTo, 0]);
      }

      $allvisit = $this->visitCommon($visits);
      return $allvisit;
   }

   function visitsWithPeriod($dateFrom, $dateTo, $patientid, $branchSql) {
      $result = array();

      $begin = new DateTime($dateFrom);
      $end = new DateTime($dateTo . ' +1 day');

      $interval = DateInterval::createFromDateString('1 day');
      $period = new DatePeriod($begin, $interval, $end);

      foreach ($period as $dt) {
         $dayDate = $dt->format("Y-m-d");

         $visit_periods = R::findAll('visit_periods', 'deleted = 0');

         if ($patientid > 0) {
            $dayVisitCount = R::count('visits', 'visitdate  = ?  and deleted = ? and    patientid = ?   ' . $branchSql . '    ', [$dayDate, 0, $patientid]);
         } else {
            $dayVisitCount = R::count('visits', 'visitdate  = ?  and deleted = ?   ' . $branchSql . '   ', [$dayDate, 0]);
         }

         $dayName = $this->getDayNameFnAr($dayDate);
         $dayDateAll = $dayName . ' : ' . $dayDate;

         if ($dayVisitCount > 0) {
            foreach ($visit_periods as $period) {
               $period->periodVisits = '';

               if ($patientid > 0) {
                  $visits = R::findAll('visits', ' visitdate  = ?  and deleted = ? and visit_period = ?   and    patientid = ?    
                     ' . $branchSql . '      ORDER BY visit_order , id ASC', [$dayDate, 0, $period->id, $patientid]);
               } else {
                  $visits = R::findAll('visits', ' visitdate  = ?  and deleted = ? and visit_period = ?   
                    ' . $branchSql . '       ORDER BY visit_order , id ASC', [$dayDate, 0, $period->id]);
               }

               $allvisit = $this->visitCommon($visits);
               $period->periodVisits = $allvisit;
//                $period->periodVisitsCount = count($allvisit);
               $period->dayName = $dayName;
            }

            $result[$dayDateAll] = $visit_periods;
         }
      }

      return $result;
   }

   function visitCommon($visits) {
      foreach ($visits as $visit) {
         $visit->visitdate = date("Y/m/d", strtotime($visit->visitdate));

         if ($visit->approx_time != '' && $visit->approx_time != null && !empty($visit->approx_time)) {
            $visit->approx_time = date("g:i A", strtotime($visit->approx_time));
         }

         if ($visit->visittime != '' && $visit->visittime != null && !empty($visit->visittime)) {
            $visit->visittime = date("H:i ", strtotime($visit->visittime));
         }

         $visit->createdate = date("Y/m/d", strtotime($visit->createdate));
         $patientName = R::getRow('SELECT * FROM patients WHERE id = "' . $visit->patientid . '"');
         $visit->patientName = $patientName['wifename'];
         $visit->patientstatusno = $patientName['statusno'];
         $visit->husbandname = $patientName['husdandname'];
         $visit->address = $patientName['address'];
         $visit->phone = $patientName['phone'];

         switch ($visit->detectionid) {
            case -99:
               $visit->detection = 'دفع قسط';
               break;

            case 9999:
               $originalVisit = R::load('visits', $visit->visitid);
               $detection = R::load('detections', $originalVisit->detectionid);
               $visit->detection = 'مرتجع العملاء';
               $visit->detection .= ' ( ' . $detection->title . ' ) ';
               break;

            case 999:
               $originalVisit = R::load('visits', $visit->visitid);
               $detection = R::load('detections', $originalVisit->detectionid);
               $visit->detection = 'دفع متبقى ';
               $visit->detection .= ' ( ' . $detection->title . ' ) ';
               break;

            default:
               $detection = R::getRow('SELECT * FROM detections WHERE id = "' . $visit->detectionid . '"');
               $visit->detection = $detection['title'];

               $payVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as paid_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as paid_visa  
                                                                  , COALESCE(SUM(discount),0)   as paid_discount 
                                                                 , 0 as paid   
                                    FROM visits   where  patientid = ?    
                               and deleted != ? and detectionid = 999 and visitid = ?   ', [$visit->patientid, 1, $visit->id]);

#               ## what pt paid after  creating visit 
               $payVisits['paid'] = $payVisits['paid_cash'] + $payVisits['paid_visa'];
               $visit->dept = $visit->restdetectionvalue - $payVisits['paid'] - $payVisits['paid_discount'];

               break;
         }

         $user = R::findOne('awusers', 'user_id = ?', [$visit->user_id]);
         $visit->user_name = $user->name;

         $p = R::load('visit_periods', $visit->visit_period);
         $visit->period_name = $p->name;
      }
      return $visits;
   }

   function reloadVisits() {

      //check login
      autho::checkautho($this->hosturl);

      $dateFrom = filter_input(INPUT_POST, "date_from");
      $dateTo = filter_input(INPUT_POST, "date_to");
      $patientId = filter_input(INPUT_POST, "patientId");
      $cardStatusNo = filter_input(INPUT_POST, "cardStatusNo");

      $allowEditVisit = 0;
      $btn3 = R::findOne('awrolebtn', ' role_id = ? and btn_id = 3  ', [$_SESSION['role_id']]);
      if (count($btn3) > 0) {
         $allowEditVisit = $btn3->checkval;
      }
      $this->smarty->assign('allowEditVisit', $allowEditVisit);

      $allowDeleteVisit = 0;
      $btn4 = R::findOne('awrolebtn', ' role_id = ? and btn_id = 4  ', [$_SESSION['role_id']]);
      if (count($btn4) > 0) {
         $allowDeleteVisit = $btn4->checkval;
      }
      $this->smarty->assign('allowDeleteVisit', $allowDeleteVisit);

      $this->loadVisits($dateFrom, $dateTo, $patientId, $cardStatusNo);
      $this->smarty->display('visits/visitdiv.html');
   }

   public function editVisit() {
      $visitId = filter_input(INPUT_POST, "visitId");
      $visit = R::load('visits', $visitId);
      $patient = R::load('patients', $visit->patientid);

      $visit->visitdate = date("Y/m/d", strtotime($visit->visitdate));

      $patientName = R::getRow("SELECT * FROM patients WHERE id = $visit->patientid");

      $visit->patientName = $patientName['wifename'];
      $visit->patientstatusno = $patientName['statusno'];

      if ($visit->detectionid == -99) {
         $visit->detectionType = 'دفع قسط';
      } else {
         $detection = R::getRow("SELECT * FROM detections WHERE id = $visit->detectionid");
         $visit->detectionType = $detection['title'];
      }





      $allDetections = R::getAll('select * from detections where del = 0');

      $programesetting = R::findOne('programesetting');

      $result = array(
          "visitdate" => date("Y/m/d", strtotime($visit->visitdate)),
          "patientid" => $visit->patientid,
          "detectionid" => $visit->detectionid,
          "payedflag" => $visit->payedflag,
          "urgent" => $visit->urgent,
          "visit_period" => $visit->visit_period,
          "patient_edit" => $visit->patient_edit,
          "detectionvalue_visa" => $visit->detectionvalue_visa,
          "detectionvalue_cash" => $visit->detectionvalue_cash,
          "totaldetectionvalue" => $visit->totaldetectionvalue,
          "discount" => $visit->discount,
          "restdetectionvalue" => $visit->restdetectionvalue,
          "setting" => $programesetting->visitsform,
          "notes" => $visit->notes,
          "approx_time" => date("H:i", strtotime($visit->approx_time)),
          "balancesetting" => $programesetting->balance
      );

      echo json_encode($result);
   }

#################################################

   public function getlastvisit() {

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

      $visit = R::findOne('visits', 'patientid = ? order by visitdate desc', [$patientId]);

      $result = array(
          "detectionId" => $visit->detectionid,
          "detectionValue" => $visit->detectionvalue
      );

      echo json_encode($result);
   }

   public function getlatestvisits() {
      //check login
      autho::checkautho($this->hosturl);

      $patientId = filter_input(INPUT_POST, "patientId");

      $lastVisits = R::getAll('SELECT  visits.id as visitid ,   detections.title as detect  
                                                    , visits.visitdate       , visits.detectionvalue_cash   , visits.detectionvalue_visa    
                                                  FROM visits  
                                                    left  join detections    on detections.id  =  visits.detectionid 
                                          where  patientid = ?    and deleted != ?      
                                          and visits.detectionid   != -99  and visits.detectionid   != 999 
                                           and visits.detectionid   != 9999
                                           order by visits.visitdate desc , visits.id desc   ', [$patientId, 1]);

      if (count($lastVisits) > 0) {

         $i = 0;
         foreach ($lastVisits as $data) {

## pay rest 
            $payVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as paid_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as paid_visa 
                                    FROM visits   where  patientid = ?    
                               and deleted != ? and detectionid = 999 and visitid = ?   ', [$patientId, 1, $data['visitid']]);

## refund 
            $refundVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as refund_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as refund_visa 
                                    FROM visits   where  patientid = ?    
                               and deleted != ? and detectionid = 9999 and visitid = ?   ', [$patientId, 1, $data['visitid']]);

## all  what pt paid 

            $paidAll = $payVisits['paid_cash'] + $data['detectionvalue_cash'] + $payVisits['paid_visa'] + $data['detectionvalue_visa'];
            $refundAll = $refundVisits['refund_cash'] + $refundVisits['refund_visa'];

            $lastVisits[$i]['paid_cash'] = $payVisits['paid_cash'] + $data['detectionvalue_cash'] - $refundVisits['refund_cash'];
            $lastVisits[$i]['paid_visa'] = $payVisits['paid_visa'] + $data['detectionvalue_visa'] - $refundVisits['refund_visa'];
            $lastVisits[$i]['total_paid'] = $paidAll - $refundAll;
            $lastVisits[$i]['paidAll'] = $paidAll;
            $lastVisits[$i]['refundAll'] = $refundAll;

            $i++;
         }






         $this->smarty->assign('lastVisits', $lastVisits);
         $this->smarty->display('visits/lastvisits.html');
      } else {
         echo -1;
      }
   }

   public function updatevisit() {
//check login
      autho::checkautho($this->hosturl);

      $visitId = filter_input(INPUT_POST, "mVisitId");
      $patientID = filter_input(INPUT_POST, 'patientid');
      $visitDate = filter_input(INPUT_POST, 'visitdate');
      $detectionID = filter_input(INPUT_POST, 'detectionid');
      $payVisit = (int) filter_input(INPUT_POST, 'payVisit');
      $detectionValue_cash = filter_input(INPUT_POST, 'detectionvalue_cash');
      $detectionValue_visa = filter_input(INPUT_POST, 'detectionvalue_visa');
      $totaldetectionvalue = filter_input(INPUT_POST, 'totaldetectionvalue');
      $discount = filter_input(INPUT_POST, 'discount');
      $restdetectionvalue = filter_input(INPUT_POST, 'restdetectionvalue');
      $visit_period = filter_input(INPUT_POST, 'visit_period');
      $new_date = date('Y/m/d', strtotime($visitDate));
      $urgent = (int) filter_input(INPUT_POST, 'urgent');
      $patient_edit = filter_input(INPUT_POST, "patient_edit");
      $notes = filter_input(INPUT_POST, "notes");
      $approx_time = filter_input(INPUT_POST, "approx_time");

      $oldVisit = R::load('visits', $visitId);
      $visit = R::load('visits', $visitId);

      $visit->patientid = $patientID;
      $visit->visitdate = $new_date;
      $visit->detectionid = $detectionID;
      $visit->detectionvalue_cash = $detectionValue_cash;
      $visit->detectionvalue_visa = $detectionValue_visa;
      $visit->totaldetectionvalue = $totaldetectionvalue;
      $visit->discount = $discount;
      $visit->restdetectionvalue = $restdetectionvalue;
      $visit->visit_period = $visit_period;
      $visit->payedflag = $payVisit;
      $visit->urgent = $urgent;
      $visit->patient_edit = $patient_edit;
      $visit->notes = $notes;
      $visit->approx_time = $approx_time;             //date("H:i:s");

      if ($visit->visitdate != $oldVisit->visitdate) {
         //  $visit->visit_order = $this->getVisitOrder($new_date);
      }

      if ($detectionValue_cash > 0 && $visit->printserial == 0) {
         $visit->printserial = $this->printSerial('last_serial');
      }

      R::store($visit);
      $this->reserveOldVisit($oldVisit);
      //   $this->erpSellbillUpdate($visit);

      echo $visitId;
   }

   function reserveOldVisit($oldVisit) {
//check login
      autho::checkautho($this->hosturl);

      date_default_timezone_set('Africa/Cairo');

      $edit = R::xdispense('visits_updates');
      $colums = R::getAll('DESCRIBE visits');

      foreach ($colums as $col) {
         $colName = $col['Field'];
         if ($colName != id) {
            $edit->$colName = $oldVisit->$colName;
         }
      }

      $edit->userid_edit = $_SESSION['user_id'];
      $edit->date_edit = date('Y-m-d H:i:s'); //$this->today;
      $edit->patientid_edit = $oldVisit->id;
      R::store($edit);
   }

   public function restorevisit() {
      $visitId = filter_input(INPUT_POST, "visitId");
      $visit = R::load('visits', $visitId);
      $patientName = R::getRow("SELECT * FROM patients WHERE id = $visit->patientid");
      $detection = R::getRow("SELECT * FROM detections WHERE id = $visit->detectionid");
      $result = array(
          "husbandName" => $patientName['husdandname'],
          "address" => $patientName['address'],
          "detectionType" => $detection['title']
      );

      echo json_encode($result);
   }

   ##fatma

   public function payvisit() {
      $visitId = filter_input(INPUT_POST, "visitId");
      $visit = R::load('visits', $visitId);
      if ($visit->payedflag != 1) {
         $visit->payedflag = 1;
         R::store($visit);
         //now patient pay make bills in erp
         $this->erpSellbill($visit);
         echo $visit->mobileappvisit;
      }
   }

#################################################

   function sendVisitSms($patientId, $visit) {
      $programesetting = R::findOne('programesetting');
      if ($programesetting->visit_sms == 1 && $patientId > 0) {
         $patient = R::load('patients', $patientId);
         $visit = generateRecID($visit);
         $redirect = getRedirect($visit->enc_id, $visit->id, 'visit');
         $fullLink = $this->redirectLink . '?redirect=' . $redirect;

         $message = '';
         $message .= ' أ  /  ' . $patient->wifename;
         $message .= ' تم حجز زيارة بتاريخ     ' . $visit->visitdate;
         $message .= '  للمتابعة  ' . $fullLink;
         sendItSmsApi($patientId, $message, $this->hosturlApi);
      }
   }

   public function add() {

      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);

      $this->addVisitDetails($_SESSION['user_id'], 0, 1);
   }

   public function addFromApi() {
      $allowAdd = $this->chechDuplicate();
      if ($allowAdd == 1) {
         $this->addVisitDetails(0, 1, 1);
      } else {
         echo -1;
      }
   }

   function chechDuplicate() {
      $patientID = filter_input(INPUT_POST, 'patientid');
      $visitDate = filter_input(INPUT_POST, 'visitdate');
      $detectionID = filter_input(INPUT_POST, 'detectionid');

      $visits = R::findAll('visits', ' patientid = ? and visitdate = ? and detectionid = ?  and deleted = 0  ', [$patientID, $visitDate, $detectionID]);

      if (count($visits) > 0) {
         return -1;
      } else {
         return 1;
      }
   }

   public function addVisitDetails($user_id, $mobileappvisit, $new_version) {

      date_default_timezone_set('Africa/Cairo');

      //prepar wife data insert
      $patientID = filter_input(INPUT_POST, 'patientid');
      $visitDate = filter_input(INPUT_POST, 'visitdate');
      $detectionID = filter_input(INPUT_POST, 'detectionid');
      $payVisit = (int) filter_input(INPUT_POST, 'payVisit');

      $detectionValue_cash = filter_input(INPUT_POST, 'detectionvalue_cash');
      $detectionValue_visa = filter_input(INPUT_POST, 'detectionvalue_visa');
      $totaldetectionvalue = filter_input(INPUT_POST, 'totaldetectionvalue');
      $restdetectionvalue = filter_input(INPUT_POST, 'restdetectionvalue');
      $discount = filter_input(INPUT_POST, 'discount');
      $visit_period = filter_input(INPUT_POST, 'visit_period');
      $urgent = (int) filter_input(INPUT_POST, 'urgent');
      $notes = filter_input(INPUT_POST, "notes");
      $approx_time = filter_input(INPUT_POST, "approx_time");
      $branchId = filter_input(INPUT_POST, "branchId");
      $bloodPressure = filter_input(INPUT_POST, "bloodPressure");

      $new_date = date('Y/m/d', strtotime($visitDate));

      $cardStatusNo = filter_input(INPUT_POST, "cardStatusNo");
      if ($cardStatusNo > 0) {
         $cardpatientid = getPatientId($cardStatusNo);
      }

      //check if there
//        $patientthere = R::count('visits', 'patientid = ? and visitdate = ? and deleted = 0', [$patientID, $new_date]);
      $insertnew = 1;
//        if ($patientthere > 0) {
//            $insertnew = 0;
//        }

      $newOrder = 1;
      $data = R::getRow("SELECT MAX(enterordered) as last_order   FROM visits ");
      if ($data['last_order'] >= 1) {
         $newOrder = $data['last_order'] + 1;
      }

      session_start();

      $insertDataVisits = R::dispense('visits');
      $insertDataVisits->patientid = $patientID;
      $insertDataVisits->visitdate = $new_date;
      $insertDataVisits->detectionid = $detectionID;
      $insertDataVisits->detectionvalue_cash = $detectionValue_cash;
      $insertDataVisits->detectionvalue_visa = $detectionValue_visa;
      $insertDataVisits->totaldetectionvalue = $totaldetectionvalue;
      $insertDataVisits->discount = $discount;
      $insertDataVisits->restdetectionvalue = $restdetectionvalue;
      $insertDataVisits->visit_period = $visit_period;
      $insertDataVisits->mobileappvisit = $mobileappvisit;
      $insertDataVisits->payedflag = $payVisit;
      $insertDataVisits->urgent = $urgent;
      $insertDataVisits->enterordered = $newOrder;
      $insertDataVisits->visitorder = 0;
      $insertDataVisits->createdate = date('Y-m-d H:i:s');
      $insertDataVisits->user_id = $user_id;
      $insertDataVisits->notes = $notes;
      $insertDataVisits->visit_order = $this->getVisitOrder($new_date);
      $insertDataVisits->new_version = $new_version;
      $userBranch = 0;
      if ($user_id > 0) {
         $user = R::findOne('awusers', 'user_id = ?', [$user_id]);
         if ($user->branch_id > 0) {
            $userBranch = $user->branch_id;
         }
      }


      if ($userBranch == 0 && $branchId > 0) {
         $userBranch = $branchId;
      }


      $insertDataVisits->branch_id = $userBranch;

      if ($detectionValue_cash > 0) {
         $insertDataVisits->printserial = $this->printSerial('last_serial');
      } else {
         $insertDataVisits->printserial = 0;
      }


      if ($cardpatientid > 0 && $cardpatientid == $patientID && $insertDataVisits->visitdate == date('Y/m/d')) {
         $insertDataVisits->visittime = date("H:i:s");
         $insertDataVisits->card_add = 1;
      }

      $insertDataVisits->approx_time = $approx_time;             //date("H:i:s");

      try {
         if ($insertnew == 1) {
            $insert = R::store($insertDataVisits);
            $this->addBloodPresure($bloodPressure, $patientID);
            $this->sendVisitSms($patientID, $insertDataVisits);
            if ($insertDataVisits->payedflag) {//only payed visits make bills in erp
               $this->erpSellbill($insertDataVisits);
            }
         } else {
            $insert = 0;
         }

         echo $insert;
      } catch (Exception $ex) {
         echo -1;
      }
   }

   function addBloodPresure($bP, $patientId) {
      if ($bP && $bP != '') {
         $exmination_obj = R::dispense('examination');
         $exmination_obj->patientid = $patientId;
         $exmination_obj->doctorid = $_SESSION['user_id'];
         $exmination_obj->sysdate = date('Y-m-d');
         $exmination_obj->examinationdate = date('Y-m-d');
         $exmination_obj->weight = '';
         $exmination_obj->height = '';
         $exmination_obj->bmi = '';
         $exmination_obj->b_p = $bP;
         $exmination_obj->pulse = '';
         $exmination_obj->headandneck = '';
         $exmination_obj->chestandheart = '';
         $exmination_obj->abdomen = '';
         $exmination_obj->pelvis = '';
         $exmination_obj->extremitis = '';
         $exmination_obj->del = 0;

         R::store($exmination_obj);
      }
   }

   function getVisitOrder($visitDate) {
      $data = R::getRow('SELECT MAX(visit_order) as last_order
                 FROM visits  where visitdate = ? ', [$visitDate]);
      $last_order = $data['last_order'];
      $visit_order = $last_order + 1;
      return $visit_order;
   }

   function arrangeVisitOrder($visitId, $visitDate) {
      if ($visitId > 0) {
         $visit = R::load('visits', $visitId);
         $data = R::getRow('SELECT MAX(visit_order) as last_order
                 FROM visits  where visitdate = ? ', [$visitDate]);
         $last_order = $data['last_order'];
         $visit->visit_order = $last_order + 1;
         R::store($visit);
      }
   }

   function sendSmsTo() {
      $patientId = 1;
      sendSms($patientId);
   }

   public function show() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);
      $allVisits = R::findAll('visits');

      foreach ($allVisits as $sngVisit) {

         // GET PAIRNTDATA TO SHOW IN VISIT

         $ptData = R::getRow('SELECT * FROM patients WHERE id="' . $sngVisit->patientid . '"');
         $sngVisit->patientdata = $ptData;
         //GET DETECTION TYPE
         //$detectionType = R::findOne('detections', 'id = ?', [$sngVisit->detectionid]);
         $detectionType = R::getRow('SELECT * FROM detections WHERE id = "' . $sngVisit->detectionid . '"');
         $sngVisit->detection = $detectionType['title'];
      }

      $this->smarty->assign('allVisits', $allVisits);
      header::headershow($this->smarty, $this->hosturl);
      sidebar::sidebarshow($this->smarty, $this->hosturl, $this->active);
      $this->smarty->display('visits/show.html');
      leftsidebar::leftsidebarshow($this->smarty, $this->hosturl);
      footer::footershow($this->smarty, $this->hosturl);
   }

   function updatedetection() {
      $id = filter_input(INPUT_POST, 'id');
      $dttitle = filter_input(INPUT_POST, 'title');
      $dtvalue = filter_input(INPUT_POST, 'value');

      $updatedt = R::load('detections', $id);
      $updatedt->title = $dttitle;
      $updatedt->detectionval = $dtvalue;
      try {
         R::store($updatedt);
         $this->erpProduct($updatedt);
      } catch (Exception $ex) {
         
      }
   }

   function loadalldtselected() {
      $allDetection = R::findAll('detections', 'del = 0');
      $this->smarty->assign('allDetection', $allDetection);
      $this->smarty->display('visits/loadalldtselected.html');
   }

   function adddetection() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);
      $detetion = filter_input(INPUT_POST, 'detection');
      $dtvalue = filter_input(INPUT_POST, 'dtvalue');

      $insertDataDetection = R::dispense('detections');
      $insertDataDetection->title = $detetion;
      $insertDataDetection->detectionval = $dtvalue;
      $insertDataDetection->del = 0;
      $inserted = 0;
      try {
         $inserted = R::store($insertDataDetection);
         $insertDataDetection->id = $inserted;
         $this->erpProduct($insertDataDetection);
         echo $inserted;
      } catch (Exception $ex) {
         
      }
   }

   public function adddetectionpop() {
      $detectiontype = filter_input(INPUT_POST, 'detectiontype');
      $detectionvalue = filter_input(INPUT_POST, 'detectionvl');
      $addfrmpopdetection = R::dispense('detections');
      $addfrmpopdetection->title = $detectiontype;
      $addfrmpopdetection->detectionval = $detectionvalue;
      $addfrmpopdetection->del = 0;
      $added = 0;
      try {
         $inserted = R::store($addfrmpopdetection);
         $addfrmpopdetection->id = $inserted;
         $this->erpProduct($addfrmpopdetection);
         //echo $added = 1;
         $alldetectionget = R::findAll('detections', 'del = 0');
         $this->smarty->assign('alldetectionget', $alldetectionget);
         $this->smarty->display('visits/detectiontype.html');
      } catch (Exception $ex) {
         
      }
   }

   public function clean($string) {
      return $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
   }

   function search() {
      $wifeName = filter_input(INPUT_POST, "search");
      $husName = filter_input(INPUT_POST, "searchhus");
      $dateFrom = filter_input(INPUT_POST, "searchvisitdatefrom");
      $dateTo = filter_input(INPUT_POST, "searchvisitdateto");

      if ($dateFrom != '00-00-0000' && !empty($dateFrom)) {
         $dateFrom = date('Y/m/d', strtotime($dateFrom));
      } else {
         $dateFrom = '0000-00-00';
      }

      if ($dateTo != '00-00-0000' && !empty($dateTo)) {
         $dateTo = date('Y/m/d', strtotime($dateTo));
      } else {
         $dateTo = date('Y/m/d');
      }


      $query = '';

      if (!empty($wifeName)) {
         $query .= "AND  wifename LIKE '%$wifeName%'";
      }
      if (!empty($husName)) {
         $query .= "AND husdandname LIKE '%$husName%' ";
      }
      if (!empty($dateFrom) && !empty($dateTo)) {
         $query .= 'AND visitdate  between "' . $dateFrom . '"  AND  "' . $dateTo . '"';
      }

      $queryString = R::getAll("SELECT visits.* , patients.*
                                        FROM `visits`
                                        INNER JOIN patients          ON  visits.patientid  = patients.id
                                        WHERE
                                        patients.deleted = 0
                                        and visits.deleted = 0
                                        $query
                                        order by  visits.visitdate
                                        limit 0,50 ");

      foreach ($queryString as $data) {
         $data['visitdate'] = date("Y/m/d", strtotime($data['visitdate']));
      }
      $this->smarty->assign('patientResult', $queryString);
      $this->smarty->display('searchresultvisit.html');
   }

   public function getdtprice() {
      $dtid = filter_input(INPUT_POST, 'dtID');
      $getprice = R::getRow('SELECT detectionval FROM detections WHERE id ="' . $dtid . '"');
      echo $getprice['detectionval'];
   }

   public function getalldetections() {
      $alldtforview = R::findAll('detections', 'del = 0');
      $this->smarty->assign('alldtforview', $alldtforview);
      $this->smarty->display('visits/alldetectionview.html');
   }

   function visitviewed() {
      $id = filter_input(INPUT_POST, 'id');
      $data = R::getRow("SELECT MAX(enterordered)  FROM `visits`");
      $lastEnter = $data['MAX(enterordered)'];

      $visitview = R::load('visits', $id);
      $visitview->view = 1;
      $visitview->visitorder = 0;
      $visitview->enterordered = $lastEnter + 1;
      try {
         R::store($visitview);
      } catch (Exception $ex) {
         
      }
   }

   public function checkvisipatient() {
      //check login
      //  autho::checkautho($this->hosturl);
//check authoize
      //   autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);
      $visitpatientid = filter_input(INPUT_POST, 'visitid');
      $date = filter_input(INPUT_POST, 'date');

      $date = date("Y/m/d", strtotime($date));

      $data = R::find('visits', 'patientid = ? AND  visitdate = ? and deleted = ? ', [$visitpatientid, $date, 0]);

      if (count($data) == 0) {
         $found = 0;
      } else {
         $found = 1;
      }
      echo $found;
   }

   public function edit() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);

      $id = filter_input(INPUT_GET, 'id');

      $allPatients = R::findAll('patients');
      $allDetections = R::findAll('detections', 'del = 0');
      $editVisit = R::findOne('visits', 'id = ?', [$id]);

      $this->smarty->assign('editvisit', $editVisit);
      $this->smarty->assign('allPatients', $allPatients);
      $this->smarty->assign('allDetections', $allDetections);
      header::headershow($this->smarty, $this->hosturl);
      sidebar::sidebarshow($this->smarty, $this->hosturl, $this->active);
      $this->smarty->display('visits/edit.html');
      leftsidebar::leftsidebarshow($this->smarty, $this->hosturl);
      footer::footershow($this->smarty, $this->hosturl);
   }

   public function update() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);

      $vId = filter_input(INPUT_POST, 'vId');
      $patientid = filter_input(INPUT_POST, 'patientid');
      $visitDate = filter_input(INPUT_POST, 'visitdate');
      $detectionID = filter_input(INPUT_POST, 'detectionid');
      $detectionValue = filter_input(INPUT_POST, 'detectionvalue');
      echo $vId;

      $visitLoad = R::load('visits', $vId);
      $visitLoad->patientid = $patientid;
      $visitLoad->visitdate = $visitDate;
      $visitLoad->detectionid = $detectionID;
      $visitLoad->detectionvalue = $detectionValue;
      try {
         R::store($visitLoad);
         header('Location:' . $this->hosturl . '/controllers/visits.php?ac=show');
      } catch (Exception $ex) {
         
      }
   }

   public function del() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);
      $id = filter_input(INPUT_POST, 'id');
      try {
         $refunds = R::findAll('visits', ' detectionid = 9999 and visitid = ? and deleted != 1  ', [$id]);
         if (count($refunds) > 0) {
            echo -1;
         } else {
            $patientDelete = R::load('visits', $id);
            $patientDelete->deleted = 1;
            R::store($patientDelete);
            $this->erpSellbillDel($patientDelete);
            echo 1;
         }
      } catch (Exception $ex) {
         echo $ex;
      }
   }

   public function updateWaiting() {
      //check login
      autho::checkautho($this->hosturl);

      $id = filter_input(INPUT_POST, 'id');
      $date = filter_input(INPUT_POST, 'date');

      try {
         $visit = R::load('visits', $id);

         if ($date == 1) {
            $visit->visitdate = date('Y/m/d');
         } else {
            $visit->urgent = 0;
            $visit->deleted = 1;
         }

         R::store($visit);

         echo 1;
      } catch (Exception $ex) {
         echo $ex;
      }
   }

   public function deldetection() {
      $id = filter_input(INPUT_POST, 'id');
      $detectionDelete = R::load('detections', $id);
      try {
         $detectionDelete->del = 1;
         R::store($detectionDelete);
         $this->erpProductDel($detectionDelete);
         $alldetections = R::findAll('detections', 'del = 0');
         $this->smarty->assign('alldetections', $alldetections);
         $this->smarty->display('visits/loadalldetections.html');
      } catch (Exception $ex) {
         
      }
   }

   public function visitselected() {
      $alldetections = R::findAll('detections', 'del = 0');
      $this->smarty->assign('alldetections', $alldetections);
      $this->smarty->display('visits/loadalldetectionsselected.html');
   }

   public function delv() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);
      $id = filter_input(INPUT_GET, 'id');
      $patientDelete = R::load('visits', $id);

      try {
         R::trash($patientDelete);
         header('Location:' . $this->hosturl . '/controllers/visits.php');
      } catch (Exception $ex) {
         header('Location:' . $this->hosturl . '/controllers/error?ac=notadd&id=' . $this->controllname);
      }
   }

   //////////////////////////edit select
   public function editselect() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);

      $tableName = filter_input(INPUT_POST, "tableName");
      $patientid = filter_input(INPUT_POST, "patientid");
      $colName = filter_input(INPUT_POST, "colName");
      $mainId = filter_input(INPUT_POST, "mainId");

      $alldata = R::findAll($tableName, 'del = 0');

      $this->smarty->assign('alldata', $alldata);
      $this->smarty->assign('patientid', $patientid);
      $this->smarty->assign('colName', $colName);
      $this->smarty->assign('mainId', $mainId);
      $this->smarty->assign('maintableName', $tableName);

      $programesetting = R::findOne('programesetting');
      $this->smarty->assign('programesetting', $programesetting);

      $this->smarty->display('visits/detectionmodel.html');
   }

   //////////adddetectionRow
   function adddetectionRow() {
      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);

      $insertDataDetection = R::dispense('detections');
      $insertDataDetection->del = 0;
      $inserted = 0;
      try {
         $inserted = R::store($insertDataDetection);
         $insertDataDetection->id = $inserted;
         $this->erpProduct($insertDataDetection);
         echo $inserted;
      } catch (Exception $ex) {
         
      }
   }

   public function searchpatient() {
      //check login
      autho::checkautho($this->hosturl);

      $statusNo = (!filter_input(INPUT_POST, "search")) ? "" : filter_input(INPUT_POST, "search");

      ## wife name or id entered
      if (!empty($statusNo)) {
         $query = 'SELECT patients.id   FROM `patients`
                                        WHERE
                                        patients.done = 1
                                        AND patients.deleted = 0 
                                        AND   statusno  = ?   ';

//            print_r($query);
         $patient = R::getRow($query, [$statusNo]);
         echo $patient['id'];
      } else {
         echo -1;
      }


      #################################################################################################################
   }

   ################################# visit control  ################################

   public function gettotalbalance() {

      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      // autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);
      //vars here
      try {
         $patientId = filter_input(INPUT_POST, 'patientId');

         $balance = R::getRow('select sum(balance) as totalbalance  from totalbalance
                where deleted = 0 and  patientid = ' . $patientId);

         $paidBalance = R::getRow('select  
                COALESCE(SUM(detectionvalue_cash),0)   as paid_cash 
               , COALESCE(SUM(detectionvalue_visa),0)   as paid_visa 
                , COALESCE(SUM(discount),0)   as discount    
                from visits
                where deleted = 0 and detectionid = -99 and  patientid = ' . $patientId);

         $rest = $balance['totalbalance'] - $paidBalance['paid_cash'] - $paidBalance['paid_visa'] - $paidBalance['discount'];

         echo $rest;
      } catch (Exception $ex) {
         echo -1;
      }
   }

   public function addbalance() {

      //check login
      autho::checkautho($this->hosturl);
      //check authoize
      // autho::checkauthoize($this->controllname, $this->hosturl, $_SESSION['role_id']);
      //vars here
      try {
         $patientId = filter_input(INPUT_POST, 'patientId');
         $newBalance = filter_input(INPUT_POST, 'newBalance');

         $row = r::dispense('totalbalance');
         $row->patientid = $patientId;
         $row->balance = $newBalance;
         $row->userid = $_SESSION['user_id'];
         $row->adddate = date('Y/m/d');
         $row->deleted = 0;

         r::store($row);

         $balance = R::getRow('select sum(balance) as totalbalance  from totalbalance
                where deleted = 0 and  patientid = ' . $patientId);

         $paidBalance = R::getRow('select  
                COALESCE(SUM(detectionvalue_cash),0)   as paid_cash 
               , COALESCE(SUM(detectionvalue_visa),0)   as paid_visa 
                , COALESCE(SUM(discount),0)   as discount    
                from visits
                where deleted = 0 and detectionid = -99 and  patientid = ' . $patientId);

         $rest = $balance['totalbalance'] - $paidBalance['paid_cash'] - $paidBalance['paid_visa'] - $paidBalance['discount'];

         echo $rest;
      } catch (Exception $ex) {
         echo 0;
      }
   }

   ##fatma

   public function addAllDetectionToERP() {
      $programesetting = R::load('programesetting', 1);
      if (!empty($programesetting->erpdb)) {//if exist addDatabase erpDB
         try {
            R::addDatabase('erpDB', 'mysql:host=' . DB_HOST . ';dbname=' . $programesetting->erpdb . '', DB_USER, DB_PASS);
            $count = 0;
            $start = 0;
            $limit = 30;
            $end = $start + $limit;
            R::selectDatabase('default');
            $detectionsCount = R::getRow('select count(id) as id from detections');
            $count = $detectionsCount["id"];
            for ($i = $start; $i <= $count; $i += $limit) {
               R::selectDatabase('default');
               $allDetections = R::findAll("detections", " order by id asc limit $start,$end ");
               R::selectDatabase('erpDB');
               if (R::testConnection()) {
                  foreach ($allDetections as $detection) {
                     $productData = R::getRow('select productId from product where obygyDetectionId = ' . $detection->id);
                     if (empty($productData['productId'])) {
                        //here use NULL for new insert
                        //better to add client using erp files it self so use  curl "it is like post requist but in php"
                        $this->curlAddProduct($detection, $programesetting->erpdb);
                     } else {
                        //here use id to update
                        $this->curlupdateProduct($detection, $programesetting->erpdb, $productData['productId']);
                     }
                  }
               } else {
                  throw new Exception('Unable to connect to erpDB,make sure database name is ok and connected or clear its name in setup');
               }
               //
               $start += $limit;
               $end += $limit;
            }
            echo 1;
         } catch (Exception $exc) {
            echo -1;
            //header('Location:' . $this->hosturl . '/controllers/' . $this->controllname . '.php?ac=show');
         }
         R::selectDatabase('default');
      }
   }

   public function erpProduct($detection) {//detections
      $programesetting = R::load('programesetting', 1);
      if (!empty($programesetting->erpdb)) {//if exist addDatabase erpDB
         R::addDatabase('erpDB', 'mysql:host=' . DB_HOST . ';dbname=' . $programesetting->erpdb . '', DB_USER, DB_PASS);
         R::selectDatabase('erpDB');
         if (R::testConnection()) {
            $productData = R::getRow('select productId from product where obygyDetectionId = ' . $detection->id);
            if (empty($productData['productId'])) {
               //here use NULL for new insert
               //better to add client using erp files it self so use  curl "it is like post requist but in php"
               $this->curlAddProduct($detection, $programesetting->erpdb);
            } else {
               //here use id to update
               $this->curlupdateProduct($detection, $programesetting->erpdb, $productData['productId']);
            }
         } else {
            throw new Exception('Unable to connect to erpDB,make sure database name is ok and connected or clear its name in setup');
         }
         R::selectDatabase('default');
      }
   }

   public function erpProductDel($detection) {//detections
      $programesetting = R::load('programesetting', 1);
      if (!empty($programesetting->erpdb)) {//if exist addDatabase erpDB
         R::addDatabase('erpDB', 'mysql:host=' . DB_HOST . ';dbname=' . $programesetting->erpdb . '', DB_USER, DB_PASS);
         R::selectDatabase('erpDB');
         if (R::testConnection()) {
            $productData = R::getRow('select productId from product where obygyDetectionId = ' . $detection->id);
            $this->curlDelProduct($programesetting->erpdb, $productData['productId']);
         } else {
            throw new Exception('Unable to connect to erpDB,make sure database name is ok and connected or clear its name in setup');
         }
         R::selectDatabase('default');
      }
   }

   //better to add client using erp files it self so use  curl "it is like post requist but in php"
   public function curlAddProduct($detection, $erpDB) {
      // set post fields
      $post = [
          'erpDB' => $erpDB,
          'detection_id' => $detection->id,
          'new_cat_id' => 'obygy',
          'level' => 'obygy',
          'new_productName' => $detection->title,
          'new_parcode' => '',
          'new_productBuyPrice' => $detection->detectionval,
          'new_productbuypricereal' => $detection->detectionval,
          'new_buypricereal_precentage1' => 0,
          'new_productSellAllPrice' => $detection->detectionval,
          'new_buytotal_precentage1' => 0,
          'new_productSellHalfPrice' => $detection->detectionval,
          'new_buyhalf_precentage1' => 0,
          'new_productSellUnitPrice' => $detection->detectionval,
          'new_buypart_precentage1' => 0,
          'new_productquantity' => 0,
          'new_isservice1' => 1,
          'inMenu1' => 1,
          'type1' => 0,
          'new_productDate' => date('Y-m-d'),
          'expireDate' => 0,
          'productunit1' => 1,
          'productnumber1' => 1,
          'unitsItr' => 1,
      ];
      $ch = curl_init(HOST_URL_ERP . '/controllers/buyBillControllerAjax.php?do=temp&itr=1&tabIndex=-1&billnameid=1');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

      // execute!
      $response = curl_exec($ch);

      // close the connection, release resources used
      curl_close($ch);

      // do anything you want with your response
//        var_dump($response);
   }

   public function curlupdateProduct($detection, $erpDB, $productId) {
      // set post fields
      $post = [
          'erpDB' => $erpDB,
          'detection_id' => $detection->id,
          'productId' => $productId,
          'productCatId' => 'obygy',
          'level' => 'obygy',
          'productName1' => $detection->title,
          'parcode1' => '',
          'productBuyPrice1' => $detection->detectionval,
          'productbuypricereal' => $detection->detectionval,
          'buypricereal_precentage1' => 0,
          'productSellAllPrice1' => $detection->detectionval,
          'buytotal_precentage1' => 0,
          'productSellHalfPrice1' => $detection->detectionval,
          'buyhalf_precentage1' => 0,
          'productSellUnitPrice1' => $detection->detectionval,
          'buypart_precentage1' => 0,
          'productquantity1' => 0,
          'isservice1' => 1,
          'inMenu1' => 1,
          'manufacture' => 0,
          'productDate1' => date('Y-m-d'),
          'expireDate1' => 0,
          'productunit1' => 1,
          'productnumber1' => 1,
          'unitsItr1' => 1,
      ];
      $ch = curl_init(HOST_URL_ERP . '/controllers/productControllerAjax.php?do=update');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

      // execute!
      $response = curl_exec($ch);

      // close the connection, release resources used
      curl_close($ch);

      // do anything you want with your response
//        var_dump($response);
   }

   public function curlDelProduct($erpDB, $productId) {
      // set post fields
      $post = [
          'erpDB' => $erpDB,
          'productId' => $productId,
      ];
      $ch = curl_init(HOST_URL_ERP . '/controllers/productControllerAjax.php?do=deleteFinaly');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

      // execute!
      $response = curl_exec($ch);

      // close the connection, release resources used
      curl_close($ch);

      // do anything you want with your response
//        var_dump($response);
   }

   public function erpSellbill($visit) {
      $programesetting = R::load('programesetting', 1);
      if (!empty($programesetting->erpdb)) {//if exist addDatabase erpDB
         R::addDatabase('erpDB', 'mysql:host=' . DB_HOST . ';dbname=' . $programesetting->erpdb . '', DB_USER, DB_PASS);
         R::selectDatabase('erpDB');
         if (R::testConnection()) {
            $clientData = R::getRow('select clientid from client where obygyPatientId = ' . $visit->patientid);
         } else {
            throw new Exception('Unable to connect to erpDB,make sure database name is ok and connected or clear its name in setup');
         }
         R::selectDatabase('default');
      }

      // set post fields
      $post = [
          'erpDB' => $programesetting->erpdb,
          'saveid' => $programesetting->erpdbsave,
          'supplier' => $clientData['clientid'],
          'bn' => $visit->visitdate,
          'totalBill_hidden' => $visit->detectionvalue,
          'netBill_hidden' => $visit->detectionvalue,
          'productid' => $visit->detectionid,
          'visitId' => $visit->id,
      ];
      $ch = curl_init(HOST_URL_ERP . '/controllers/sellbillController.php?do=addObgyVisit');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

      // execute!
      $response = curl_exec($ch);

      // close the connection, release resources used
      curl_close($ch);

      // do anything you want with your response
//        var_dump($response);
   }

   public function erpSellbillUpdate($visit) {
      $programesetting = R::load('programesetting', 1);
      if (!empty($programesetting->erpdb)) {//if exist addDatabase erpDB
         R::addDatabase('erpDB', 'mysql:host=' . DB_HOST . ';dbname=' . $programesetting->erpdb . '', DB_USER, DB_PASS);
         R::selectDatabase('erpDB');
         if (R::testConnection()) {
            $clientData = R::getRow('select clientid from client where obygyPatientId = ' . $visit->patientid);
            $sellData = R::getRow('select sellbillid from sellbill where conditions = 0 and obygyVisitId = ' . $visit->id);
         } else {
            throw new Exception('Unable to connect to erpDB,make sure database name is ok and connected or clear its name in setup');
         }
         R::selectDatabase('default');
      }

      // set post fields
      $post = [
          'erpDB' => $programesetting->erpdb,
          'saveid' => $programesetting->erpdbsave,
          'supplier' => $clientData['clientid'],
          'bn' => $visit->visitdate,
          'totalBill_hidden' => $visit->detectionvalue,
          'netBill_hidden' => $visit->detectionvalue,
          'productid' => $visit->detectionid,
          'visitId' => $visit->id,
          'sellbillId' => $sellData["sellbillid"],
      ];
      $ch = curl_init(HOST_URL_ERP . '/controllers/sellbillController.php?do=updateObgyVisit');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

      // execute!
      $response = curl_exec($ch);

      // close the connection, release resources used
      curl_close($ch);

      // do anything you want with your response
//        var_dump($response);
   }

   public function erpSellbillDel($visit) {
      $programesetting = R::load('programesetting', 1);
      if (!empty($programesetting->erpdb)) {//if exist addDatabase erpDB
         R::addDatabase('erpDB', 'mysql:host=' . DB_HOST . ';dbname=' . $programesetting->erpdb . '', DB_USER, DB_PASS);
         R::selectDatabase('erpDB');
         if (R::testConnection()) {
            $sellData = R::getRow('select sellbillid from sellbill where conditions = 0 and obygyVisitId = ' . $visit->id);
         } else {
            throw new Exception('Unable to connect to erpDB,make sure database name is ok and connected or clear its name in setup');
         }
         R::selectDatabase('default');
      }

      // set post fields
      $post = [
          'erpDB' => $programesetting->erpdb,
          'sellbillId' => $sellData["sellbillid"],
      ];

      $ch = curl_init(HOST_URL_ERP . '/controllers/sellbillController.php?do=delObgyVisit');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

      // execute!
      $response = curl_exec($ch);

      // close the connection, release resources used
      curl_close($ch);

      // do anything you want with your response
//        var_dump($response);
   }

   #####################################################

   public function visitPeriodEdit() {

      $alldata = R::getAll(' select *  from  visit_periods   where deleted  != 1 ');

      $this->smarty->assign('alldata', $alldata);
      $this->smarty->display('visits/periodeditmodel.html');
   }

   public function addNewRow() {
      //check login
      autho::checkautho($this->hosturl);

      //vars here
      $tableName = filter_input(INPUT_POST, 'tableName');
      $colName = filter_input(INPUT_POST, 'colName');

      ### insert into table
      $newtable = R::xdispense($tableName);
      $newtable->$colName = "";

      $insertid = R::store($newtable);

      echo $insertid;
   }

   public function updateAjax() {

      //check login
      autho::checkautho($this->hosturl);

      $id = filter_input(INPUT_POST, "id");
      $tablename = filter_input(INPUT_POST, "tableName");
      $colname = filter_input(INPUT_POST, "colName");
      $value = filter_input(INPUT_POST, "value");

      try {
         $obj = R::load($tablename, $id);
         $obj->$colname = $value;
         R::store($obj);
         echo 1;
      } catch (Exception $ex) {
         echo -1;
      }
   }

   public function patPerPeriod() {
      //check login
      autho::checkautho($this->hosturl);

      $periodId = filter_input(INPUT_POST, "periodId");
      $visitDate = filter_input(INPUT_POST, 'visitdate');

      $visits = R::count('visits', 'deleted = 0 and visit_period = ? and visitdate = ?  ', [$periodId, $visitDate]);

      echo $visits;
   }

   public function waitingList() {
      $setting = R::findOne('programesetting');
      $today = date('Y/m/d');
      $visits = R::findAll('visits', 'visitdate > ? and deleted = ?  and urgent = ? ', [$today, 0, 1]);
      $allvisit = $this->visitCommon($visits);

      $this->smarty->assign('programview', $setting->programview);
      $this->smarty->assign('allvisit', $allvisit);
      $this->smarty->display('visits/waiting_list.html');
   }

   #################################################

   public function getrestvalues() {
//check login
      autho::checkautho($this->hosturl);

      $patientId = filter_input(INPUT_POST, "patientId");

      $visits = array();

      $lastVisit = R::getAll('SELECT id as visitid , restdetectionvalue as rest , visitdate    FROM visits   
                                                    where  patientid = ?   and  restdetectionvalue >0
                                                               and deleted != ?   ', [$patientId, 1]);
      $i = 0;
      foreach ($lastVisit as $data) {
         $payVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as paid_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as paid_visa  
                                                                  , COALESCE(SUM(discount),0)   as paid_discount 
                                                                 , 0 as paid   
                                    FROM visits   where  patientid = ?    
                               and deleted != ? and detectionid = 999 and visitid = ?   ', [$patientId, 1, $data['visitid']]);

#               ## what pt paid after  creating visit 
         $payVisits['paid'] = $payVisits['paid_cash'] + $payVisits['paid_visa'];
//   $payVisits['paid'] = $payVisits['paid_cash'] + $payVisits['paid_visa'] - $refundVisits['refund_cash'] - $refundVisits['refund_visa'];

         if ($data['rest'] > ($payVisits['paid'] + $payVisits['paid_discount'])) {

            $v['visitdate'] = $data['visitdate'];
            $v['dept'] = $data['rest'] - $payVisits['paid'] - $payVisits['paid_discount'];
            $v['visitid'] = $data['visitid'];

            array_push($visits, $v);
         }
      }


      if (count($visits) > 0) {
         $this->smarty->assign('visits', $visits);
         $this->smarty->display('visits/rest.html');
      } else {
         echo -1;
      }
   }

   public function payval() {
//check login
      autho::checkautho($this->hosturl);

      $visitId = filter_input(INPUT_POST, "visitId");
      $paid_cash = filter_input(INPUT_POST, "paid_cash");
      $paid_visa = filter_input(INPUT_POST, "paid_visa");
      $patientId = filter_input(INPUT_POST, "patientId");
      $restDiscount = filter_input(INPUT_POST, "restDiscount");
      $restNotes = filter_input(INPUT_POST, "restNotes");

      $insertDataVisits = R::dispense('visits');
      $insertDataVisits->patientid = $patientId;
      $insertDataVisits->visitdate = date("Y/m/d");
      $insertDataVisits->visittime = date("H:i:s");
      $insertDataVisits->detectionid = 999;
      $insertDataVisits->detectionvalue_cash = $paid_cash;
      $insertDataVisits->detectionvalue_visa = $paid_visa;
      $insertDataVisits->totaldetectionvalue = 0;
      $insertDataVisits->restdetectionvalue = 0;
      $insertDataVisits->discount = $restDiscount;
      $insertDataVisits->user_id = $_SESSION['user_id'];
      $insertDataVisits->visitid = $visitId;
      $insertDataVisits->notes = $restNotes;

      if ($paid_cash > 0) {
         $insertDataVisits->printserial = $this->printSerial('last_serial');
      } else {
         $insertDataVisits->printserial = 0;
      }

      $insert = R::store($insertDataVisits);

      if (count($insert) > 0) {
         if ($paid_cash > 0) {
            $this->printrecept($insert);
         }
      } else {
         echo -1;
      }
   }

   public function refund() {
//check login
      autho::checkautho($this->hosturl);

      $visitId = filter_input(INPUT_POST, "visitId");
      $refund_cash = filter_input(INPUT_POST, "refund_cash");
      $refund_visa = filter_input(INPUT_POST, "refund_visa");
      $patientId = filter_input(INPUT_POST, "patientId");
      $notes = filter_input(INPUT_POST, "notes");

      $visit = R::load('visits', $visitId);

## pay rest 
      $payVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as paid_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as paid_visa 
                                    FROM visits   where  patientid = ?    
                               and deleted != ? and detectionid = 999 and visitid = ?   ', [$patientId, 1, $visitId]);

## refund 
      $refundVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as refund_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as refund_visa 
                                    FROM visits   where  patientid = ?    
                               and deleted != ? and detectionid = 9999 and visitid = ?   ', [$patientId, 1, $visitId]);

## all  what pt paid 

      $paid_cash = $payVisits['paid_cash'] + $visit->detectionvalue_cash - $refundVisits['refund_cash'];
      $paid_visa = $payVisits['paid_visa'] + $visit->detectionvalue_visa - $refundVisits['refund_visa'];
      $total_paid = $paid_cash + $paid_visa;

      if ($total_paid < ($refund_cash + $refund_visa)) {
         echo -3;
      } else {
         $insertDataVisits = R::dispense('visits');
         $insertDataVisits->patientid = $patientId;
         $insertDataVisits->visitdate = date("Y/m/d");
         $insertDataVisits->visittime = date("H:i:s");
         $insertDataVisits->detectionid = 9999;
         $insertDataVisits->detectionvalue_cash = $refund_cash;
         $insertDataVisits->detectionvalue_visa = $refund_visa;
         $insertDataVisits->totaldetectionvalue = 0;
         $insertDataVisits->restdetectionvalue = 0;
         $insertDataVisits->discount = 0;
         $insertDataVisits->user_id = $_SESSION['user_id'];
         $insertDataVisits->visitid = $visitId;
         $insertDataVisits->notes = $notes;

         if ($refund_cash > 0) {
            $insertDataVisits->printserial = $this->printSerial('last_refund_serial');
         } else {
            $insertDataVisits->printserial = 0;
         }

         try {
            $insert = R::store($insertDataVisits);
            if ($refund_cash > 0) {
               $this->printrecept($insert);
            }
         } catch (Exception $ex) {
            echo $ex;
         }
      }
   }

   public function editrefundvisit() {

//check login
      autho::checkautho($this->hosturl);

      $visitId = filter_input(INPUT_POST, "visitId");

      $visit = R::load('visits', $visitId);

      if (count($visit) > 0) {

         $result = array(
             "visitdate" => date("Y/m/d", strtotime($visit->visitdate)),
             "detectionvalue_visa" => $visit->detectionvalue_visa,
             "detectionvalue_cash" => $visit->detectionvalue_cash,
             "notes" => $visit->notes
         );

         echo json_encode($result);
      } else {
         echo -1;
      }
   }

   public function updatefundvisit() {
//check login
      autho::checkautho($this->hosturl);

      $fundVisitId = filter_input(INPUT_POST, "visitId");
      $refund_cash = filter_input(INPUT_POST, 'detectionvalue_cash');
      $refund_visa = filter_input(INPUT_POST, 'detectionvalue_visa');
      try {

         $fundVisit = R::load('visits', $fundVisitId);
         $patientId = $fundVisit->patientid;
         $originalVisitId = $fundVisit->visitid;

         $originalVisit = R::load('visits', $fundVisit->visitid);

## pay rest 
         $payVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as paid_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as paid_visa 
                                    FROM visits   where  patientid = ?    
                               and deleted != ? and detectionid = 999 and visitid = ?   ', [$patientId, 1, $originalVisitId]);

## refund 
         $refundVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as refund_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as refund_visa 
                                    FROM visits   where  patientid = ?   and id != ?  
                               and deleted != ? and detectionid = 9999 and visitid = ?   ', [$patientId, $fundVisitId, 1, $originalVisitId]);

         $paid_cash = $payVisits['paid_cash'] + $originalVisit->detectionvalue_cash - $refundVisits['refund_cash'];
         $paid_visa = $payVisits['paid_visa'] + $originalVisit->detectionvalue_visa - $refundVisits['refund_visa'];
         $total_paid = $paid_cash + $paid_visa;

         if ($total_paid < ($refund_cash + $refund_visa)) {
            echo -3;
         } else {
            $visitDate = filter_input(INPUT_POST, 'visitdate');
            $notes = filter_input(INPUT_POST, 'notes');
            $new_date = date('Y/m/d', strtotime($visitDate));

            $fundVisit->visitdate = $new_date;
            $fundVisit->detectionvalue_cash = $refund_cash;
            $fundVisit->detectionvalue_visa = $refund_visa;
            $fundVisit->notes = $notes;

            if ($refund_cash > 0 && $fundVisit->printserial == 0) {
               $fundVisit->printserial = $this->printSerial('last_refund_serial');
            }

            R::store($fundVisit);
            echo 1;
         }
      } catch (Exception $ex) {
         echo $ex;
      }
   }

   public function editpayvalvisit() {

//check login
      autho::checkautho($this->hosturl);

      $visitId = filter_input(INPUT_POST, "visitId");

      $visit = R::load('visits', $visitId);

      if (count($visit) > 0) {

         $result = array(
             "visitdate" => date("Y/m/d", strtotime($visit->visitdate)),
             "detectionvalue_visa" => $visit->detectionvalue_visa,
             "detectionvalue_cash" => $visit->detectionvalue_cash,
             "discount" => $visit->discount,
             "notes" => $visit->notes
         );

         echo json_encode($result);
      } else {
         echo -1;
      }
   }

   public function updatepayvalvisit() {
//check login
      autho::checkautho($this->hosturl);

      $visitId = filter_input(INPUT_POST, "visitId");
      $cash = filter_input(INPUT_POST, 'detectionvalue_cash');
      $visa = filter_input(INPUT_POST, 'detectionvalue_visa');
      $discount = filter_input(INPUT_POST, 'discount');
      try {

         $visit = R::load('visits', $visitId);
         $patientId = $visit->patientid;
         $originalVisitId = $visit->visitid;

         $originalVisit = R::load('visits', $visit->visitid);

## pay rest 
         $payVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as paid_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as paid_visa  
                                                                  , COALESCE(SUM(discount),0)   as paid_discount   
                                    FROM visits   where  patientid = ?    and id != ?   
                               and deleted != ? and detectionid = 999 and visitid = ?   ', [$patientId, $visitId, 1, $originalVisitId]);

## refund 
         $refundVisits = R::getRow('SELECT COALESCE(SUM(detectionvalue_cash),0)   as refund_cash 
                                                                 , COALESCE(SUM(detectionvalue_visa),0)   as refund_visa 
                                    FROM visits   where  patientid = ?   
                               and deleted != ? and detectionid = 9999 and visitid = ?   ', [$patientId, 1, $originalVisitId]);

         $paid_cash = $payVisits['paid_cash'] - $refundVisits['refund_cash'];
         $paid_visa = $payVisits['paid_visa'] - $refundVisits['refund_visa'];
         $total_paid = $paid_cash + $paid_visa;

         $rest = $originalVisit->restdetectionvalue - $total_paid - $payVisits['paid_discount'];
         $new_paid = $cash + $visa - $discount;

         if ($rest < $new_paid) {
            echo -3;
         } else {
            $visitDate = filter_input(INPUT_POST, 'visitdate');
            $notes = filter_input(INPUT_POST, 'notes');
            $new_date = date('Y/m/d', strtotime($visitDate));

            $visit->visitdate = $new_date;
            $visit->detectionvalue_cash = $cash;
            $visit->detectionvalue_visa = $visa;
            $visit->discount = $discount;
            $visit->notes = $notes;

            R::store($visit);
            $this->erpSellbillUpdate($visit);
            echo 1;
         }
      } catch (Exception $ex) {
         echo $ex;
      }
   }

   #############################################

   public function fixOldVisits() {

      $oldVisits = R::findAll('old_visits', ' id > ?  and id  <=  ?  ', [0, 1000]);
      foreach ($oldVisits as $oldVisit) {
         $visit = R::load('visits', $oldVisit->id);
         $visit->totaldetectionvalue = $oldVisit->detectionvalue;
         $visit->detectionvalue_cash = $oldVisit->detectionvalue;
         r::store($visit);
         print_r($visit->id . '  -  ');
      }

      $oldVisits = R::findAll('old_visits', ' id > ?  and id  <=  ?  ', [1000, 2000]);
      foreach ($oldVisits as $oldVisit) {
         $visit = R::load('visits', $oldVisit->id);
         $visit->totaldetectionvalue = $oldVisit->detectionvalue;
         $visit->detectionvalue_cash = $oldVisit->detectionvalue;
         r::store($visit);
         print_r($visit->id . '  -  ');
      }


      $oldVisits = R::findAll('old_visits', ' id > ?  and id  <=  ?  ', [2000, 3000]);
      foreach ($oldVisits as $oldVisit) {
         $visit = R::load('visits', $oldVisit->id);
         $visit->totaldetectionvalue = $oldVisit->detectionvalue;
         $visit->detectionvalue_cash = $oldVisit->detectionvalue;
         r::store($visit);
         print_r($visit->id . '  -  ');
      }


      $oldVisits = R::findAll('old_visits', ' id > ?  and id  <=  ?  ', [3000, 4000]);
      foreach ($oldVisits as $oldVisit) {
         $visit = R::load('visits', $oldVisit->id);
         $visit->totaldetectionvalue = $oldVisit->detectionvalue;
         $visit->detectionvalue_cash = $oldVisit->detectionvalue;
         r::store($visit);
         print_r($visit->id . '  -  ');
      }


      $oldVisits = R::findAll('old_visits', ' id > ?  and id  <=  ?  ', [4000, 5000]);
      foreach ($oldVisits as $oldVisit) {
         $visit = R::load('visits', $oldVisit->id);
         $visit->totaldetectionvalue = $oldVisit->detectionvalue;
         $visit->detectionvalue_cash = $oldVisit->detectionvalue;
         r::store($visit);
         print_r($visit->id . '  -  ');
      }


      $oldVisits = R::findAll('old_visits', ' id > ?  and id  <=  ?  ', [5000, 6000]);
      foreach ($oldVisits as $oldVisit) {
         $visit = R::load('visits', $oldVisit->id);
         $visit->totaldetectionvalue = $oldVisit->detectionvalue;
         $visit->detectionvalue_cash = $oldVisit->detectionvalue;
         r::store($visit);
         print_r($visit->id . '  -  ');
      }


      $oldVisits = R::findAll('old_visits', ' id > ?  and id  <=  ?  ', [6000, 7000]);
      foreach ($oldVisits as $oldVisit) {
         $visit = R::load('visits', $oldVisit->id);
         $visit->totaldetectionvalue = $oldVisit->detectionvalue;
         $visit->detectionvalue_cash = $oldVisit->detectionvalue;
         r::store($visit);
         print_r($visit->id . '  -  ');
      }


      $oldVisits = R::findAll('old_visits', ' id > ?  and id  <=  ?  ', [7000, 8000]);
      foreach ($oldVisits as $oldVisit) {
         $visit = R::load('visits', $oldVisit->id);
         $visit->totaldetectionvalue = $oldVisit->detectionvalue;
         $visit->detectionvalue_cash = $oldVisit->detectionvalue;
         r::store($visit);
         print_r($visit->id . '  -  ');
      }


      $oldVisits = R::findAll('old_visits', ' id > ?  and id  <=  ?  ', [8000, 9092]);
      foreach ($oldVisits as $oldVisit) {
         $visit = R::load('visits', $oldVisit->id);
         $visit->totaldetectionvalue = $oldVisit->detectionvalue;
         $visit->detectionvalue_cash = $oldVisit->detectionvalue;
         r::store($visit);
         print_r($visit->id . '  -  ');
      }
   }

   private function getDayNameFnAr($date) {
      $timestamp = strtotime($date);

      $day = date('w', $timestamp);

      switch ($day) {
         case 0:
            $name = 'الأحد  ';
            break;
         case 1:
            $name = ' الإثنين';
            break;
         case 2:
            $name = ' الثلاثاء';
            break;
         case 3:
            $name = 'الأربعاء ';
            break;
         case 4:
            $name = 'الخميس  ';
            break;
         case 5:
            $name = 'الجمعة ';
            break;
         case 6:
            $name = 'السبت ';
            break;
      }

      return $name;
   }

   public function getnames() {
//check login
      autho::checkautho($this->hosturl);

      $name = filter_input(INPUT_GET, "term");
      $limit = intval(filter_input(INPUT_GET, "page_limit"));

      $allPatients = R::getAll('SELECT id , CONCAT(COALESCE(wifename,""), " -  ", COALESCE(husdandname,"")) AS name 
            FROM patients    WHERE deleted = ? and done = ? 
                 and (wifename  LIKE "%' . $name . '%"  || husdandname  LIKE "%' . $name . '%"  )  limit 0,50  ', [0, 1]);
//        echo $name . ' - ';
      echo json_encode($allPatients);
   }

   public function getnameswithstatus() {
//check login
      autho::checkautho($this->hosturl);

      $statusNo = filter_input(INPUT_POST, "statusNo");

      if ($statusNo != '' && !empty($statusNo)) {
         $allPatients = R::getRow('SELECT id , CONCAT(COALESCE(wifename,""), " -  ", COALESCE(husdandname,"")) AS name  
                 , wifename    ,   husdandname
            FROM patients    WHERE deleted = ? and done = ?    and   statusno  = ?     limit 0,50  ', [0, 1, $statusNo]);
      }

      echo json_encode($allPatients);
   }

   ###################################################

   function printvisitrecept() {
//check login
      //     autho::checkautho($this->hosturl);

      $visitId = filter_input(INPUT_POST, "visitId");

      $this->printrecept($visitId);
   }

   public function printrecept($visitId) {

      try {
         $visit = R::load('visits', $visitId);
         $this->smarty->assign('visitdate', date("Y/m/d", strtotime($visit->visitdate)));
         $this->smarty->assign('detectionvalue_cash', $visit->detectionvalue_cash);
         $this->smarty->assign('detectionvalue_visa', $visit->detectionvalue_visa);
         $this->smarty->assign('for_husband', $visit->for_husband);
         $this->smarty->assign('printserial', $visit->printserial);

         $patient = R::load('patients', $visit->patientid);
         $this->smarty->assign('wifename', $patient->wifename);
         $this->smarty->assign('husdandname', $patient->husdandname);
         $this->smarty->assign('statusno', $patient->statusno);

         if ($visit->detectionid == 999) {
            $originalVisit = R::load('visits', $visit->visitid);
            $detection = R::load('detections', $originalVisit->detectionid);
            $det = 'دفع متبقى ';
            $det .= ' ( ' . $detection->title . ' ) ';
            $this->smarty->assign('detection', $det);
         } else if ($visit->detectionid == 9999) {
            $originalVisit = R::load('visits', $visit->visitid);
            $detection = R::load('detections', $originalVisit->detectionid);
            $det = 'مرتجع العملاء';
            $det .= ' ( ' . $detection->title . ' ) ';
            $this->smarty->assign('detection', $det);
         } else {
            $detection = R::load('detections', $visit->detectionid);
            $this->smarty->assign('detection', $detection->title);
         }

         if ($visit->for_husband == 1) {
            $pat_name = $patient->husdandname;
         }
//            ##
//            elseif ($visit->for_husband == 2) {
//                $child = R::load('patients_childs', $visit->child);
//
//                if (is_null($child->child_name) || $child->child_name == '') {
//                    if ($child->gender == 1) {
//                        $pat_name = 'الطفل / ' . $patient->wifename;
//                    } else {
//                        $pat_name = 'الطفلة / ' . $patient->wifename;
//                    }
//                } else {
//                    $pat_name = $child->child_name . '  /  ' . $patient->wifename;
//                }
//            }
         ##
         else {
            $pat_name = $patient->wifename;
         }


         $this->smarty->assign('notes', $visit->notes);
         $this->smarty->assign('detectionId', $visit->detectionid);
         $this->smarty->assign('pat_name', $pat_name);

         $user = R::findOne('awusers', 'user_id = ?', [$visit->user_id]);
         $this->smarty->assign('user_name', $user->name);

         $this->smarty->display('visits/print.html');
#################################
      } catch (Exception $ex) {
         echo '-1';
      }
   }

   function printSerial($serialCol) {

      $currentMonth = date('Y-m');
      $programesetting = R::findOne('programesetting');

      if ($programesetting->serial_month == $currentMonth) {
         $printserial = $programesetting->$serialCol + 1;
         $programesetting->$serialCol = $printserial;
      } else {
         $programesetting->serial_month = $currentMonth;
         $printserial = 1;
         $programesetting->last_serial = $printserial;
         $programesetting->last_refund_serial = $printserial;
      }

      r::store($programesetting);

      return $printserial;
   }

// at the end of class call
   public function __destruct() {
//close connection
      R::close();
   }
}
