/** * @param $listingSID * @param $userSID */ public function deleteCheckoutedListingFromShopCart($listingSID, $userSID) { $listingInfoCheckout = SJB_DB::query("SELECT `sid`,`product_info` FROM `listings` WHERE `sid` = ?n AND `checkouted` = 0 AND `complete` = 1", $listingSID); $listingProductInfo = unserialize($listingInfoCheckout[0]['product_info']); $shopCartProducts = SJB_ShoppingCart::getProductsInfoFromCartByProductSID($listingProductInfo['product_sid'], $userSID); if ($listingProductInfo['pricing_type'] == 'fixed') { $countCheckoutedListings = SJB_ListingDBManager::getNumberOfCheckoutedListingsByProductSID($listingProductInfo['product_sid'], $userSID); if (count($shopCartProducts) * $listingProductInfo['number_of_listings'] - ($countCheckoutedListings - 1) >= $listingProductInfo['number_of_listings']) { SJB_ShoppingCart::deleteItemFromCartBySID($shopCartProducts[0]['sid'], $userSID); } } if (isset($listingProductInfo['pricing_type']) && $listingProductInfo['pricing_type'] == 'volume_based') { $shopCartSIDMinNumberOfListings = ''; $minNumberOfListings = ''; foreach ($shopCartProducts as $shopCartProduct) { $shopCartProductInfo = unserialize($shopCartProduct['product_info']); if (empty($minNumberOfListings) || $minNumberOfListings > $shopCartProductInfo['number_of_listings']) { $minNumberOfListings = $shopCartProductInfo['number_of_listings']; $shopCartSIDMinNumberOfListings = $shopCartProduct['sid']; } } if ($minNumberOfListings == 1) { SJB_ShoppingCart::deleteItemFromCartBySID($shopCartSIDMinNumberOfListings, $userSID); } else { $shopCartProductInfo['number_of_listings'] = $minNumberOfListings - 1; SJB_ShoppingCart::updateItemBySID($shopCartSIDMinNumberOfListings, $shopCartProductInfo); } } }
/** * @param $itemSID * @param $userSID */ public function findCheckoutedListingsByProduct($itemSID, $userSID) { $shopCartProduct = SJB_DB::query("SELECT `product_info` FROM `shopping_cart` WHERE `sid` = ?n", $itemSID); if (!empty($shopCartProduct)) { $productInfo = unserialize($shopCartProduct[0]['product_info']); $countCheckoutedListings = SJB_ListingDBManager::getNumberOfCheckoutedListingsByProductSID($productInfo['sid'], $userSID); if ($countCheckoutedListings != 0) { $serializedProductSIDForShopCart = '"sid";s:' . strlen($productInfo['sid']) . ':"' . $productInfo['sid'] . '";'; $countOfOtherShopCartProducts = SJB_DB::queryValue("SELECT COUNT(`sid`) FROM `shopping_cart` WHERE `sid` != ?n AND `user_sid` = ?n AND `product_info` REGEXP '({$serializedProductSIDForShopCart})' ORDER BY `sid` ASC", $itemSID, $userSID); if ($productInfo['product_type'] == 'mixed_product' || isset($productInfo['pricing_type']) && $productInfo['pricing_type'] == 'fixed') { $limitCheckoutedListingsToDelete = $countCheckoutedListings - $countOfOtherShopCartProducts * $productInfo['number_of_listings']; if ($limitCheckoutedListingsToDelete > 0) { $this->deleteCheckoutedListingsByProduct($userSID, $productInfo['sid'], $limitCheckoutedListingsToDelete); } } if (isset($productInfo['pricing_type']) && $productInfo['pricing_type'] == 'volume_based') { $maxAvailableListings = end($productInfo['volume_based_pricing']['listings_range_to']); $shopCartProductsToUpdate = SJB_DB::query("SELECT `sid`,`product_info` FROM `shopping_cart` WHERE `sid` != ?n AND `user_sid` = ?n AND `product_info` REGEXP '({$serializedProductSIDForShopCart})' ORDER BY `sid` ASC", $itemSID, $userSID); $limitCheckoutedListingsToDelete = $countCheckoutedListings - $countOfOtherShopCartProducts * $maxAvailableListings; if ($limitCheckoutedListingsToDelete >= 0) { foreach ($shopCartProductsToUpdate as $shopCartProductToUpdate) { $shopCartProductInfo = unserialize($shopCartProductToUpdate['product_info']); $shopCartProductInfo['number_of_listings'] = $maxAvailableListings; SJB_ShoppingCart::updateItemBySID($shopCartProductToUpdate['sid'], $shopCartProductInfo); } if ($limitCheckoutedListingsToDelete > 0) { $this->deleteCheckoutedListingsByProduct($userSID, $productInfo['sid'], $limitCheckoutedListingsToDelete); } } else { foreach ($shopCartProductsToUpdate as $shopCartProductToUpdate) { $shopCartProductInfo = unserialize($shopCartProductToUpdate['product_info']); if ($limitCheckoutedListingsToDelete > end($shopCartProductInfo['volume_based_pricing']['listings_range_to'])) { $limitCheckoutedListingsToDelete -= end($shopCartProductInfo['volume_based_pricing']['listings_range_to']); $shopCartProductInfo['number_of_listings'] = $maxAvailableListings; } else { $shopCartProductInfo['number_of_listings'] = $limitCheckoutedListingsToDelete; } SJB_ShoppingCart::updateItemBySID($shopCartProductToUpdate['sid'], $shopCartProductInfo); } } } } } }
/** * @param int $currentUserID * @param int $productSID * @return bool|int|mixed */ public function proceedToCheckout($currentUserID, $productSID) { $errors = array(); $productInfo = SJB_ProductsManager::getProductInfoBySID($productSID); if (SJB_UserManager::isUserLoggedIn()) { $numberOfListings = SJB_ListingDBManager::getNumberOfCheckoutedListingsByProductSID($productSID, $currentUserID); $extraInfo = SJB_ProductsManager::getProductExtraInfoBySID($productSID); $shoppingCartProducts = SJB_ShoppingCart::getProductsInfoFromCartByProductSID($productSID, $currentUserID); if (!empty($shoppingCartProducts)) { if ($productInfo['product_type'] == 'mixed_product' || isset($productInfo['pricing_type']) && $productInfo['pricing_type'] == 'fixed') { if ($numberOfListings / (count($shoppingCartProducts) * $productInfo['number_of_listings']) > 1) { SJB_ShoppingCart::addToShoppingCart($productInfo, $currentUserID); } } if (isset($productInfo['pricing_type']) && $productInfo['pricing_type'] == 'volume_based') { if ($numberOfListings / (count($shoppingCartProducts) * end($productInfo['volume_based_pricing']['listings_range_to'])) > 1) { $productInfo['number_of_listings'] = 1; $productObj = new SJB_Product($productInfo, $productInfo['product_type']); $productObj->setNumberOfListings($productInfo['number_of_listings']); $productInfo['price'] = $productObj->getPrice(); SJB_ShoppingCart::addToShoppingCart($productInfo, $currentUserID); } else { foreach ($shoppingCartProducts as $shoppingCartProduct) { $unserializedProductInfoFromShopCart = unserialize($shoppingCartProduct['product_info']); if ($unserializedProductInfoFromShopCart['number_of_listings'] < end($unserializedProductInfoFromShopCart['volume_based_pricing']['listings_range_to'])) { $unserializedProductInfoFromShopCart['number_of_listings'] += 1; SJB_ShoppingCart::updateItemBySID($shoppingCartProduct['sid'], $unserializedProductInfoFromShopCart); break; } } } } } else { if (!empty($extraInfo['pricing_type']) && $extraInfo['pricing_type'] == 'volume_based') { $productInfo['number_of_listings'] = 1; $productObj = new SJB_Product($productInfo, $productInfo['product_type']); $productObj->setNumberOfListings($productInfo['number_of_listings']); $productInfo['price'] = $productObj->getPrice(); } SJB_ShoppingCart::addToShoppingCart($productInfo, $currentUserID); } } else { $products = SJB_Session::getValue('products'); if (isset($products)) { foreach ($products as $addedProduct) { $addedProductInfo = unserialize($addedProduct['product_info']); if ($addedProductInfo['user_group_sid'] != $productInfo['user_group_sid']) { $errors[] = 'You are trying to add products of different User Groups in your Shopping Cart. You сan add only products belonging to one User Group. If you want to add this product in the Shopping Cart please go back to the Shopping Cart and remove products of other User Groups.'; break; } } } if (!$errors) { $id = time(); $products[$id]['product_info'] = serialize($productInfo); $products[$id]['sid'] = $id; $products[$id]['user_sid'] = 0; SJB_Session::setValue('products', $products); } } if (!$errors) { SJB_HelperFunctions::redirect(SJB_System::getSystemsettings('SITE_URL') . '/shopping-cart/'); } }