/** * Add a product to shopping basket */ public function addProduct(Product $product, $count = 1, $ignoreAvailability = false, Shipment $shipment = null) { if (0 >= $count) { $this->removeProduct($product); } else { if (!$product->isAvailable() && !$ignoreAvailability) { throw new ApplicationException('Product is not available (' . $product->getID() . ')'); } $count = $this->validateCount($product, $count); $item = OrderedItem::getNewInstance($this, $product, $count); $this->orderedItems[] = $item; if (!$this->isFinalized->get() || !$this->shipments || !$this->shipments->size()) { if ($shipment) { $shipment->addItem($item); } } else { if (!$shipment) { $shipment = $this->shipments->get(0); } $shipment->addItem($item); } } $this->resetShipments(); if (isset($item)) { return $item; } }
private function save(OrderedItem $item, Shipment $shipment, $existingItem = false) { $validator = $this->createOrderedItemValidator(); if ($validator->isValid()) { if ($count = (int) $this->request->get('count') && !(int) $this->request->get('downloadable')) { $item->count->set($count); } $shipment->loadItems(); if (!$existingItem) { $shipment->addItem($item); } if ($shipment->getShippingService()) { $shipmentRates = $shipment->getDeliveryZone()->getShippingRates($shipment); $shipment->setAvailableRates($shipmentRates); $shipment->setRateId($shipment->getShippingService()->getID()); } $shipment->recalculateAmounts(); $shipment->save(); return array('item' => array('ID' => $item->getID(), 'Product' => $item->getProduct()->toArray(), 'Shipment' => array('ID' => $shipment->getID(), 'amount' => (double) $shipment->amount->get(), 'shippingAmount' => (double) $shipment->shippingAmount->get(), 'taxAmount' => (double) $shipment->taxAmount->get(), 'total' => (double) $shipment->shippingAmount->get() + (double) $shipment->amount->get() + (double) $shipment->taxAmount->get(), 'prefix' => $shipment->getCurrency()->pricePrefix->get(), 'suffix' => $shipment->getCurrency()->priceSuffix->get(), 'Order' => $shipment->order->get()->toFlatArray()), 'count' => $item->count->get(), 'price' => $item->price->get(), 'priceCurrencyID' => $item->getCurrency()->getID(), 'isExisting' => $existingItem, 'variations' => $item->getProduct()->getParent()->getVariationData($this->application))); } else { return array('errors' => $validator->getErrorList()); //return new JSONResponse(array('errors' => $validator->getErrorList()), 'failure', $this->translate('_unable_to_update_items_quantity')); } }