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;
 }
コード例 #2
0
 /**
  * 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;
 }
コード例 #3
0
 /**
  * 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();
         }
     }
 }
コード例 #4
0
 /**
  * @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;
                     }
                 }
             }
         }
     }
 }
コード例 #5
0
 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;
 }