public function shipmentTrackingSave(\Praxigento\Odoo\Api\Data\SaleOrder\Shipment\Tracking $data)
 {
     $result = false;
     /* replicate all data in one transaction */
     $def = $this->_manTrans->begin();
     try {
         $orderIdMage = $data->getSaleOrderIdMage();
         $trackNumber = $data->getData('shipment/trackingInfo/trackingNumber');
         $shippingMethodCode = $data->getData('shipment/trackingInfo/shippingCode');
         $this->_shipmentLoader->setOrderId($orderIdMage);
         /** @var \Magento\Sales\Model\Order\Shipment $shipment */
         $shipment = $this->_shipmentLoader->load();
         if ($shipment) {
             $carrierCode = $this->_manBusCodes->getMagCodeForCarrier($shippingMethodCode);
             $title = $this->_manBusCodes->getTitleForCarrier($shippingMethodCode);
             $track = $this->_manObj->create(\Magento\Sales\Model\Order\Shipment\Track::class);
             $track->setNumber($trackNumber);
             $track->setCarrierCode($carrierCode);
             $track->setTitle($title);
             $shipment->addTrack($track);
             $shipment->register();
             $shipment->save();
             $order = $shipment->getOrder();
             $invoice = $this->_manInvoice->prepareInvoice($order);
             $invoice->register();
             $invoice->save();
             $order->save();
             $this->_manTrans->commit($def);
             $result = true;
         }
     } catch (\Exception $e) {
         $msg = 'Product replication from Odoo is failed. Error: ' . $e->getMessage();
         $this->_logger->emergency($msg);
         $traceStr = $e->getTraceAsString();
         $this->_logger->emergency($traceStr);
         throw $e;
     } finally {
         // transaction will be rolled back if commit is not done (otherwise - do nothing)
         $this->_manTrans->end($def);
     }
     return $result;
 }
 /**
  * @param \Magento\Sales\Api\Data\OrderInterface $mageOrder
  * @return \Praxigento\Odoo\Data\Odoo\SaleOrder\Shipping
  */
 public function getSaleOrderShipping(\Magento\Sales\Api\Data\OrderInterface $mageOrder)
 {
     $result = $this->_manObj->create(\Praxigento\Odoo\Data\Odoo\SaleOrder\Shipping::class);
     /* collect data */
     $code = $this->_manBusinessCodes->getBusCodeForShippingMethod($mageOrder);
     $priceAmount = $mageOrder->getBaseShippingAmount();
     $priceAmount = $this->_manFormat->toNumber($priceAmount);
     $priceDiscount = $mageOrder->getBaseShippingDiscountAmount();
     $priceDiscount = $this->_manFormat->toNumber($priceDiscount);
     $priceTaxAmount = $mageOrder->getBaseShippingTaxAmount();
     $priceTaxAmount = $this->_manFormat->toNumber($priceTaxAmount);
     $priceTaxPercent = $priceTaxAmount / ($priceAmount - $priceDiscount);
     $priceTaxPercent = $this->_manFormat->toNumber($priceTaxPercent, Cfg::ODOO_API_PERCENT_ROUND);
     $priceAmountTotal = ($priceAmount - $priceDiscount) * (1 + $priceTaxPercent);
     $priceAmountTotal = $this->_manFormat->toNumber($priceAmountTotal);
     /* populate Odoo Data Object */
     $result->setCode($code);
     $result->setPriceAmount($priceAmount);
     $result->setPriceDiscount($priceDiscount);
     $result->setPriceTaxPercent($priceTaxPercent);
     $result->setPriceTaxAmount($priceTaxAmount);
     $result->setPriceAmountTotal($priceAmountTotal);
     return $result;
 }