public function handle() { require_once PATH_CORE . DS . 'components' . DS . 'com_storefront' . DS . 'models' . DS . 'Memberships.php'; $ms = new \Components\Storefront\Models\Memberships(); /* NEW $subscription = StorefrontModelMemberships::getSubscriptionObject($this->type, $this->pId, $this->uId); // Get the expiration for the current subscription (if any) $currentExpiration = $subscription->getExpiration(); */ // Get current registration $membership = $ms->getMembershipInfo($this->crtId, $this->item['info']->pId); $expiration = $membership['crtmExpires']; /* Add the user to the corresponding user access group (pull access group ID from the meta) */ try { // Get user ID for the cart require_once dirname(dirname(dirname(__DIR__))) . DS . 'models' . DS . 'Cart.php'; $userId = \Components\Cart\Models\Cart::getCartUser($this->crtId); // Get the user group ID to set the user to (from meta) require_once PATH_CORE . DS . 'components' . DS . 'com_storefront' . DS . 'models' . DS . 'Product.php'; $userGId = \Components\Storefront\Models\Product::getMetaValue($this->item['info']->pId, 'userGroupId'); $add = \JUserHelper::addUserToGroup($userId, $userGId); if ($add instanceof \Exception) { mail(Config::get('mailfrom'), 'Error adding to the group', $add->getMessage() . ' Cart #' . $this->crtId); } $table = \JTable::getInstance('User', 'JTable', array()); $table->load($userId); // Trigger the onAftereStoreUser event Event::trigger('onUserAfterSave', array($table->getProperties(), false, true, null)); } catch (Exception $e) { // Error return false; } }
/** * Main handler. Does all the checks * * @param void * @return void */ public function audit() { /* Membership may have a limit on when it can be extended */ /* If no user, some checks may be skipped... */ // Get user $jUser = User::getInstance(); if (!$jUser->get('guest')) { // Check if there is a limitation on when the subscription can be extended $subscriptionMaxLen = Product::getMetaValue($this->pId, 'subscriptionMaxLen'); if ($subscriptionMaxLen) { /* Check if the current user has the existing subscription and how much is left on it i.e. figure out if he may extend his current subscription */ /* * This is not working very well for multiple SKUs with multiple subscriptionMaxLen's * at this point code doesn't know what SKU will be added, * so for one SKU subscriptionMaxLen should * be set to time less than actual membership length, ie if membership is sold for 1 year and * cannot be renewed more than 6 month before it expires the subscriptionMaxLen must be set to 6 MONTH * if it cannot be renewed more than 3 month before it expires the subscriptionMaxLen must be set to 3 MONTH * * so subscriptionMaxLen = XX is actually "let renew XX time before expiration" */ // Get the proper product type subscription object reference $subscription = Memberships::getSubscriptionObject($this->type, $this->pId, $this->uId); // Get the expiration for the current subscription (if any) $currentExpiration = $subscription->getExpiration(); if ($currentExpiration && $currentExpiration['crtmActive']) { // Do the check $currentExpirationTime = $currentExpiration['crtmExpires']; // See if current expiration is later than max allowed time from now (max allowed time + now) if (strtotime('+' . $subscriptionMaxLen) < strtotime($currentExpirationTime)) { // Expiration is not allowed -- the current expiration is too far in the future $this->setResponseStatus('error'); $this->setResponseNotice('You already have an active subscription to this item. Subscription extension is not available at this time.'); $this->setResponseError(': you already have an active subscription. Subscription extension is not available at this time.'); } } } } return $this->getResponse(); }
/** * Populate transaction items and required steps -- cart must be synced. * * @param void * @return void */ private function populateTransaction() { // Get all cart items $cartItems = $this->cart->items; // Add cart items to transaction $sqlValues = ''; // Initialize required steps, split it into logical parts $preSteps = array(); $postSteps = array(); $warehouse = $this->warehouse; $transactionSubtotalAmount = 0; //print_r($cartItems); die; foreach ($cartItems as $sId => $skuInfo) { if ($sqlValues) { $sqlValues .= ', '; } $sqlValues .= "({$this->cart->tId}, {$sId}, {$skuInfo['cartInfo']->qty}, {$skuInfo['info']->sPrice})"; $transactionSubtotalAmount += $skuInfo['info']->sPrice * $skuInfo['cartInfo']->qty; /* Steps */ // EULA: for software, license agreement may be needed, if so, add the step for each product // get product type $productInfo = $warehouse->getProductInfo($skuInfo['info']->pId); // if soft, check if EULA is needed if ($productInfo->ptModel == 'software') { $eulaRequired = Product::getMetaValue($skuInfo['info']->pId, 'eulaRequired'); // If EULA is needed, add step, note the EULA required for each SKU, so for multiple SKUs of the same product, multiple EULA will be required if ($eulaRequired) { $step = new \stdClass(); $step->name = 'eula'; $step->meta = $sId; $preSteps[] = $step; } } // shipping: if any of the products require shipping, add the shipping step if ($skuInfo['info']->ptId == 1 && !in_array('shipping', $postSteps)) { $step = new \stdClass(); $step->name = 'shipping'; $postSteps[] = $step; } // Reserve/lock items require_once PATH_CORE . DS . 'components' . DS . 'com_storefront' . DS . 'models' . DS . 'Sku.php'; $sku = \Components\Storefront\Models\Sku::getInstance($sId); //print_r($sku); die; $sku->reserveInventory($skuInfo['cartInfo']->qty); } // add commnets/notes step $step = new \stdClass(); $step->name = 'notes'; $postSteps[] = $step; // populate items $sql = "INSERT INTO `#__cart_transaction_items` (`tId`, `sId`, `tiQty`, `tiPrice`) VALUES {$sqlValues}"; $this->_db->setQuery($sql); $this->_db->query(); // merge pre- and post- steps to ensure the correct order $steps = array_merge($preSteps, $postSteps); // populate steps foreach ($steps as $step) { if (empty($step->meta)) { $step->meta = ''; } $sql = "INSERT INTO `#__cart_transaction_steps` (`tId`, `tsStep`, `tsMeta`)\n\t\t\t\t\tVALUES ({$this->cart->tId}, '{$step->name}', '{$step->meta}')"; $this->_db->setQuery($sql); $this->_db->query(); } // get perks $perks = $this->getCouponPerks(); $perksTotalDiscount = $perks['info']->discountsTotal; // get memberships $membershipInfo = $this->getMembershipInfo(); // Initialize Meta container for all related serialized info $meta['membershipInfo'] = $membershipInfo; // Update transaction info $sql = "UPDATE `#__cart_transaction_info`\n\t\t\t\tSET\n\t\t\t\t`tiPerks` = " . $this->_db->quote(serialize($perks)) . ",\n\t\t\t\t`tiMeta` = " . $this->_db->quote(serialize($meta)) . ",\n\t\t\t\t`tiItems` = " . $this->_db->quote(serialize($cartItems)) . ",\n\t\t\t\t`tiSubtotal` = " . $this->_db->quote($transactionSubtotalAmount) . ",\n\t\t\t\t`tiDiscounts` = " . $this->_db->quote($perksTotalDiscount) . "\n\t\t\t\tWHERE `tId` = " . $this->_db->quote($this->cart->tId); $this->_db->setQuery($sql); $this->_db->query(); }
/** * Main handler. Does all the checks * * @param void * @return void */ public function audit() { /* If no user, some checks may be skipped... */ // Get user $jUser = User::getInstance(); // User specific checks if (!$jUser->get('guest')) { if ($sId = $this->getSku()) { // Check if the current user reached the max count of downloads for this SKU $sku = Sku::getInstance($sId); $skuDownloadLimit = $sku->getMeta('downloadLimit'); if ($skuDownloadLimit > 0) { // Get SKU download count $skuDownloadCount = CartDownload::countUserSkuDownloads($this->sId, $this->uId); // Check if the limit is reached if ($skuDownloadCount >= $skuDownloadLimit) { $this->setResponseStatus('error'); $this->setResponseNotice('You have reached the maximum number of allowed downloads for this product.'); $this->setResponseError(': you have reached the maximum number of allowed downloads for this product.'); } } return $this->getResponse(); } } // Check SKU-related stuff if this is a SKU if ($sId = $this->getSku()) { // Check if SKU is reached the download max count $sku = Sku::getInstance($sId); $skuDownloadLimit = $sku->getMeta('globalDownloadLimit'); if ($skuDownloadLimit > 0) { // Get SKU download count $skuDownloadCount = CartDownload::countSkuDownloads($this->sId); // Check if the limit is reached if ($skuDownloadCount >= $skuDownloadLimit) { $this->setResponseStatus('error'); $this->setResponseNotice('This product has reached the maximum number of allowed downloads and cannot be downloaded.'); $this->setResponseError(': this product has reached the maximum number of allowed downloads and cannot be downloaded.'); } } return $this->getResponse(); } // Get product download limit $productDownloadLimit = Product::getMetaValue($this->pId, 'globalDownloadLimit'); // Get product downloads count if ($productDownloadLimit > 0) { $productDownloadCount = CartDownload::countProductDownloads($this->pId); // Check if the limit is reached if ($productDownloadCount >= $productDownloadLimit) { $this->setResponseStatus('error'); $this->setResponseNotice('This product has reached the maximum number of allowed downloads and cannot be downloaded.'); $this->setResponseError(': this product has reached the maximum number of allowed downloads and cannot be downloaded.'); } } return $this->getResponse(); }
/** * User agreement acceptance * * @return void */ public function eulaTask() { $cart = new CurrentCart(); $errors = array(); $transaction = $cart->liftTransaction(); if (!$transaction) { // Redirect to cart if transaction cannot be lifted $cart->redirect('home'); } $nextStep = $cart->getNextCheckoutStep(); // Double check that the current step is indeed EULA, redirect if needed if ($nextStep->step != 'eula') { $cart->redirect($nextStep->step); } // Get the SKU id of the item being displayed (from meta) $sId = $nextStep->meta; // Get the eula text for the product or EULA (EULAs are assigned to products, and if needed, SKUS) $warehouse = new Warehouse(); $skuInfo = $warehouse->getSkuInfo($sId); $this->view->productInfo = $skuInfo['info']; // Check if there is SKU EULA set if (!empty($skuInfo['meta']['eula'])) { $productEula = $skuInfo['meta']['eula']; } else { // Get product id $pId = $skuInfo['info']->pId; // Get EULA $productEula = Product::getMetaValue($pId, 'eula'); } $this->view->productEula = $productEula; $eulaSubmitted = Request::getVar('submitEula', false, 'post'); if ($eulaSubmitted) { // check if agreed $eulaAccepted = Request::getVar('acceptEula', false, 'post'); if (!$eulaAccepted) { $errors[] = array(Lang::txt('COM_CART_MUST_ACCEPT_EULA'), 'error'); } else { // Save item's meta $itemMeta = new \stdClass(); $itemMeta->eulaAccepted = true; //$itemMeta->machinesInstalled = 'n/a'; $cart->setTransactionItemMeta($sId, json_encode($itemMeta)); // Mark this step as completed $cart->setStepStatus('eula', $sId); // All good, continue $nextStep = $cart->getNextCheckoutStep()->step; $cart->redirect($nextStep); } } if (!empty($errors)) { $this->view->notifications = $errors; } if (Pathway::count() <= 0) { Pathway::append(Lang::txt(strtoupper($this->_option)), 'index.php?option=' . $this->_option); } if ($this->_task) { Pathway::append(Lang::txt('EULA')); } $this->view->display(); }