/**
  * Insert transaction item records
  * @return bool
  */
 private function insertTransactionItems()
 {
     $itemsMdl = new SaleItemsModel();
     //$stockMdl = new StockModel();
     $wposStock = new WposAdminStock();
     foreach ($this->jsonobj->items as $key => $item) {
         if (!($res = $itemsMdl->create($this->id, $item->sitemid, $item->ref, $item->qty, $item->name, $item->desc, $item->taxid, $item->tax, $item->unit, $item->price))) {
             $this->itemErr = $itemsMdl->errorInfo;
             return false;
         }
         // decrement stock level
         if ($item->sitemid > 0) {
             /*$stockMdl->incrementStockLevel($item->sitemid, $this->jsonobj->locid, $item->qty, true);*/
             $wposStock->incrementStockLevel($item->sitemid, $this->jsonobj->locid, $item->qty, true);
         }
         $this->jsonobj->items[$key]->id = $res;
     }
     return true;
 }
 public function removeItem($result)
 {
     // validate json
     if (!isset($this->data->id) || !isset($this->data->itemid)) {
         $result['error'] = "Sale & item id must be provided";
         return $result;
     }
     // update item record
     $itemMdl = new SaleItemsModel();
     if ($itemMdl->removeById($this->data->itemid) === false) {
         $result['error'] = "Could not remove item record: " . $itemMdl->errorInfo;
         return $result;
     }
     // delete item in json
     foreach ($this->invoice->items as $key => $item) {
         if ($this->data->itemid == $item->id) {
             $this->data->sitemid = $item->sitemid;
             $this->data->qty = $item->qty;
             unset($this->invoice->items[$key]);
             $this->invoice->items = array_values($this->invoice->items);
             break;
         }
     }
     // Update invoice totals
     $this->calculateInvoice();
     // update invoice data
     if ($this->saveInvoiceData() === false) {
         $result['error'] = "Could not commit invoice data: " . $this->invMdl->errorInfo;
         return $result;
     } else {
         // increment stock
         if ($this->data->sitemid > 0) {
             $wposStock = new WposAdminStock();
             $wposStock->incrementStockLevel($this->data->sitemid, 0, $this->data->qty, false);
         }
         // Create transaction history record
         WposTransactions::addTransactionHistory($this->id, $_SESSION['userId'], "Modified", "Item Removed");
         // log data
         Logger::write("Invoice item removed for invoice id: " . $this->id, "INVOICE", json_encode($this->data));
     }
     $result['data'] = $this->invoice;
     return $result;
 }
 /**
  * Retract a void or refund using the sale id and void/refund processdt
  * @param $result
  * @return mixed
  */
 public function removeVoidRecord($result)
 {
     $jsonval = new JsonValidate($this->data, '{"id":1, "processdt":1}');
     if (($errors = $jsonval->validate()) !== true) {
         $result['error'] = $errors;
         return $result;
     }
     // find entry and delete
     $salesMdl = new SalesModel();
     $voidMdl = new SaleVoidsModel();
     $refitems = [];
     // retrive the sales record
     if (($sale = $salesMdl->getById($this->data->id)) !== false) {
         // Decode JSON and remove the refund/void
         $jsondata = json_decode($sale[0]['data']);
         $recfound = false;
         $foundrecord = null;
         $foundtype = null;
         // check if the void record is a match
         if ($jsondata->voiddata->processdt == $this->data->processdt) {
             $foundrecord = $jsondata->voiddata;
             unset($jsondata->voiddata);
             $recfound = true;
             $foundtype = 'void';
         } else {
             // no void record found with that timestamp, try refunds
             if ($jsondata->refunddata != null) {
                 foreach ($jsondata->refunddata as $key => $refund) {
                     if ($refund->processdt == $this->data->processdt) {
                         // add the items to the array so we can remove them from qty refunded
                         $refitems = $jsondata->refunddata[$key]->items;
                         // unset the array value, this outputs objects so we need to reformat as array
                         $foundrecord = $jsondata->refunddata[$key];
                         unset($jsondata->refunddata[$key]);
                         $jsondata->refunddata = array_values($jsondata->refunddata);
                         if (sizeof($jsondata->refunddata) == 0) {
                             unset($jsondata->refunddata);
                         }
                         $recfound = true;
                         $foundtype = 'refund';
                         break;
                     }
                 }
             }
         }
         // calculate updated status
         $status = isset($jsondata->voiddata) ? 3 : (isset($jsondata->refunddata) ? 2 : 1);
         if ($recfound) {
             // remove the void db record
             if ($voidMdl->removeBySale($this->data->id, $this->data->processdt)) {
                 if (sizeof($refitems) > 0) {
                     // if its a refund, remove qty refunded
                     $saleItemsMdl = new SaleItemsModel();
                     // Decrement refunded quantities in the sale_items table
                     foreach ($refitems as $item) {
                         $saleItemsMdl->incrementQtyRefunded($this->data->id, $item->id, $item->numreturned, false);
                     }
                 }
                 if (!$salesMdl->edit($this->data->id, null, json_encode($jsondata), $status)) {
                     $result["error"] = "Could not update sales table. Error:" . $salesMdl->errorInfo;
                 } else {
                     $result['data'] = $jsondata;
                     // if sale has been unvoided, remove item stock from the location where created
                     if ($foundtype == 'void' && $status != 3 && sizeof($jsondata->items) > 0) {
                         $wposStock = new WposAdminStock();
                         foreach ($jsondata->items as $item) {
                             if ($item->sitemid > 0) {
                                 $wposStock->incrementStockLevel($item->sitemid, $jsondata->locid, $item->qty, true);
                             }
                         }
                     }
                     // Create transaction history record
                     WposTransactions::addTransactionHistory($this->data->id, $_SESSION['userId'], "Retract", "Transaction Void/Refund Retracted");
                     // Success; log data
                     Logger::write("Retracted void/refund from:" . $jsondata->ref, "RETRACT", json_encode($foundrecord));
                 }
             } else {
                 $result["error"] = "Could not remove void record. Error:" . $voidMdl->errorInfo;
             }
         } else {
             $result["error"] = "Could not find the record in the JSON data: " . print_r($jsondata);
         }
     } else {
         $result["error"] = "Could not fetch the sales record. Error:" . $salesMdl->errorInfo;
     }
     return $result;
 }