public static function addSubscriptions(Order $objOrder, $arrTokens) { $strEmail = $objOrder->getBillingAddress()->email; $objAddress = $objOrder->getShippingAddress() ?: $objOrder->getBillingAddress(); $arrItems = $objOrder->getItems(); $objSession = \Session::getInstance(); if (!($intModule = $objSession->get('isotopeCheckoutModuleIdSubscriptions'))) { return true; } $objSession->remove('isotopeCheckoutModuleIdSubscriptions'); $objModule = \ModuleModel::findByPk($intModule); foreach ($arrItems as $item) { switch ($objModule->iso_direct_checkout_product_mode) { case 'product_type': $objFieldpalette = FieldPaletteModel::findBy('iso_direct_checkout_product_type', Standard::findAvailableByIdOrAlias($item->product_id)->type); break; default: $objFieldpalette = FieldPaletteModel::findBy('iso_direct_checkout_product', $item->product_id); break; } if ($objFieldpalette !== null && $objFieldpalette->iso_addSubscription) { if ($objFieldpalette->iso_subscriptionArchive && (!$objFieldpalette->iso_addSubscriptionCheckbox || \Input::post('subscribeToProduct_' . $item->product_id))) { $objSubscription = Subscription::findOneBy(array('email=?', 'pid=?', 'activation!=?', 'disable=?'), array($strEmail, $objFieldpalette->iso_subscriptionArchive, '', 1)); if (!$objSubscription) { $objSubscription = new Subscription(); } if ($objFieldpalette->iso_addActivation) { $strToken = md5(uniqid(mt_rand(), true)); $objSubscription->disable = true; $objSubscription->activation = $strToken; if (($objNotification = Notification::findByPk($objFieldpalette->iso_activationNotification)) !== null) { if ($objFieldpalette->iso_activationJumpTo && ($objPageRedirect = \PageModel::findByPk($objFieldpalette->iso_activationJumpTo)) !== null) { $arrTokens['link'] = \Environment::get('url') . '/' . \Controller::generateFrontendUrl($objPageRedirect->row()) . '?token=' . $strToken; } $objNotification->send($arrTokens, $GLOBALS['TL_LANGUAGE']); } } $arrAddressFields = \Config::get('iso_addressFields'); if ($arrAddressFields === null) { $arrAddressFields = serialize(array_keys(static::getIsotopeAddressFields())); } foreach (deserialize($arrAddressFields, true) as $strName) { $objSubscription->{$strName} = $objAddress->{$strName}; } $objSubscription->email = $strEmail; $objSubscription->pid = $objFieldpalette->iso_subscriptionArchive; $objSubscription->tstamp = $objSubscription->dateAdded = time(); $objSubscription->quantity = \Input::post('quantity'); $objSubscription->order_id = $objOrder->id; $objSubscription->save(); } } } return true; }
/** * Process checkout */ public function checkAbo(Order $objOrder, $arrTokens) { foreach ($objOrder->getItems() as $objItem) { $objProduct = $objItem->getProduct(); if ($objProduct->aboId && $objProduct->expiretime && $objOrder->member) { // set Abo $objAbo = new \Abo(); $objAbo->setAbo($objProduct->aboId); $objCurrentAbo = Database::getInstance()->prepare("SELECT * FROM tl_abo_order WHERE memberId = ? AND aboId = ?")->execute($objOrder->member, $objProduct->aboId); if (!$objCurrentAbo->numRows) { $objAbo->setMember($objOrder->member); $objAbo->start($objProduct->expiretime); } else { $objAbo->setMember($objOrder->member); $objAbo->renew($objProduct->expiretime); } } } return true; }
/** * Updates the counts on all bought products * @param Isotope\Model\ProductCollection * @param \stdClass * @param string * @param integer * @param mixed */ public function updateProductCount(\Isotope\Model\ProductCollection\Order $objOrder) { if (empty($objOrder->id)) { return false; } foreach ($objOrder->getItems() as $objItem) { $objProduct = NULL; $objProduct = $objItem->getProduct(true); if (!empty($objProduct->simple_erp_count) && $objProduct->simple_erp_count > 0) { // decrease available quantity $objProduct->simple_erp_count = $objProduct->simple_erp_count - $objItem->quantity; // set product suppressed if there is no quantity left and the option is checked if ($objProduct->simple_erp_disable_on_zero && $objProduct->simple_erp_count <= 0) { $objProduct->simple_erp_count = 0; $objProduct->published = 0; } // update product $objProduct->save(); } } }
/** * @category ISO_HOOKS: postCheckout * * @param ProductCollection\Order $order * @param array $tokens * */ public function updateStockPostCheckout(ProductCollection\Order $order, array $tokens) { foreach ($order->getItems() as $item) { /** @var Product|\Model $product */ $product = $item->getProduct(); $productType = $product->getRelated('type'); if ($productType->stockmanagement_active) { // Book stock change /** @var Stock|\Model $stockChange */ $stockChange = new Stock(); $stockChange->tstamp = time(); $stockChange->pid = $product->id; $stockChange->product_collection_id = $order->id; $stockChange->quantity = -1 * (int) $item->quantity; $stockChange->source = Stock::STOCKMANAGEMENT_SOURCE_ORDER; $stockChange->save(); // Fetch current stock $stock = Stock::getStockForProduct($product->id); // Disable product if necessary if ($productType->stockmanagement_disableProduct && false !== $stock && $stock < 1) { $product->published = ''; $product->save(); } // Send stock change notifications if ($productType->stockmanagement_notification) { $notifications = deserialize($productType->stockmanagement_notifications); foreach ($notifications as $notification) { if ($stock <= $notification['threshold']) { /** @noinspection PhpUndefinedMethodInspection */ /** @var Notification $notificationCenter */ $notificationCenter = Notification::findByPk($notification['nc_id']); if (null !== $notificationCenter) { $notificationCenter->send(self::createStockChangeNotifictionTokens($product, $order)); } // Do not send multiple notifications break; } } } } } }
public static function updateStock(Order $objOrder, $objNewStatus) { // atm only for backend if (TL_MODE != 'BE') { return false; } // the order's config is used! $objConfig = Isotope::getConfig(); $arrStockIncreaseOrderStates = deserialize($objConfig->stockIncreaseOrderStates, true); // e.g. new -> cancelled => increase the stock based on the order item's setQuantity-values (no validation required, of course) if (!in_array($objOrder->order_status, $arrStockIncreaseOrderStates) && in_array($objNewStatus->id, $arrStockIncreaseOrderStates)) { foreach ($objOrder->getItems() as $objItem) { if (($objProduct = $objItem->getProduct()) !== null) { $intTotalQuantity = static::getTotalStockQuantity($objItem->quantity, $objProduct, null, $objItem->setQuantity); if ($intTotalQuantity) { $objProduct->stock += $intTotalQuantity; $objProduct->save(); } } } } elseif (in_array($objOrder->order_status, $arrStockIncreaseOrderStates) && !in_array($objNewStatus->id, $arrStockIncreaseOrderStates)) { foreach ($objOrder->getItems() as $objItem) { if (($objProduct = $objItem->getProduct()) !== null) { $blnSkipValidation = static::getOverridableStockProperty('skipStockValidation', $objProduct); // watch out: also in backend the current set quantity is used for validation! if (!$blnSkipValidation && !static::validateQuantity($objProduct, $objItem->quantity)) { // if the validation breaks for only one product collection item -> cancel the order status transition return true; } } } foreach ($objOrder->getItems() as $objItem) { if (($objProduct = $objItem->getProduct()) !== null) { $intTotalQuantity = static::getTotalStockQuantity($objItem->quantity, $objProduct); if ($intTotalQuantity) { $objProduct->stock -= $intTotalQuantity; if ($objProduct->stock <= 0 && !static::getOverridableStockProperty('skipExemptionFromShippingWhenStockEmpty', $objProduct)) { $objProduct->shipping_exempt = true; } $objProduct->save(); } } } } // don't cancel return false; }