/**
  * Create new warehouse data for the product in Magento.
  *
  * @param int $prodId
  * @param int $stockId
  * @param double $price
  * @param double $pv
  * @return StockItemInterface
  */
 public function createWarehouseData($prodId, $stockId, $price, $pv)
 {
     /** @var StockItemInterface $result */
     $result = $this->_manObj->create(StockItemInterface::class);
     $result->setProductId($prodId);
     $result->setStockId($stockId);
     $result->setIsInStock(true);
     $result->setManageStock(true);
     $result = $this->_mageRepoStockItem->save($result);
     $stockItemId = $result->getItemId();
     /* register warehouse price */
     $bind = [EntityWarehouseStockItem::ATTR_STOCK_ITEM_REF => $stockItemId, EntityWarehouseStockItem::ATTR_PRICE => $price];
     $this->_repoWarehouseEntityStockItem->create($bind);
     /* register warehouse PV */
     $bind = [EntityPvStockItem::ATTR_STOCK_ITEM_REF => $stockItemId, EntityPvStockItem::ATTR_PV => $pv];
     $this->_repoPvStockItem->create($bind);
     return $result;
 }
 /**
  * Save PV data on sale order save.
  *
  * @param Request\Save $req
  *
  * @return Response\Save
  */
 public function save(Request\Save $req)
 {
     $result = new Response\Save();
     $orderId = $req->getSaleOrderId();
     $datePaid = $req->getSaleOrderDatePaid();
     $items = $req->getOrderItems();
     $this->_logger->info("Save PV attributes for sale order #{$orderId}.");
     $def = $this->_manTrans->begin();
     try {
         /* for all items get PV data by warehouse */
         $orderTotal = 0;
         foreach ($items as $item) {
             $prodId = $item->getProductId();
             $stockId = $item->getStockId();
             $itemId = $item->getItemId();
             $pv = $this->_repoStockItem->getPvByProductAndStock($prodId, $stockId);
             $qty = $item->getQuantity();
             $total = $pv * $qty;
             $eItem = new \Praxigento\Pv\Data\Entity\Sale\Item();
             $eItem->setSaleItemId($itemId);
             $eItem->setSubtotal($total);
             $eItem->setDiscount(0);
             $eItem->setTotal($total);
             $this->_repoSaleItem->replace($eItem);
             $orderTotal += $total;
         }
         /* save order data */
         $eOrder = new \Praxigento\Pv\Data\Entity\Sale();
         $eOrder->setSaleId($orderId);
         $eOrder->setSubtotal($orderTotal);
         $eOrder->setDiscount(0);
         $eOrder->setTotal($orderTotal);
         $eOrder->setDatePaid($datePaid);
         $this->_repoSale->replace($eOrder);
         $this->_manTrans->commit($def);
         $result->markSucceed();
         $this->_logger->info("PV attributes for sale order #{$orderId} are saved.");
     } finally {
         $this->_manTrans->end($def);
     }
     return $result;
 }
 public function updateWarehousePv($stockItemMageId, $pv)
 {
     $bind = [EntityPvStockItem::ATTR_STOCK_ITEM_REF => $stockItemMageId, EntityPvStockItem::ATTR_PV => $pv];
     $where = EntityPvStockItem::ATTR_STOCK_ITEM_REF . '=' . (int) $stockItemMageId;
     $this->_repoPvStockItem->update($bind, $where);
 }