Really good link, But its Always better to share the code:
$productA = Mage::getModel('catalog/product')->load(Mage::app()->getRequest()->getParam('a_id'));
$productB = Mage::getModel('catalog/product')->load(Mage::app()->getRequest()->getParam('b_id'));
$productA_price = ($productA->getPackageprice() > 0 ? $productA->getPackagePrice() : $productA->getFinalPrice());
$productB_price = ($productB->getPackageprice() > 0 ? $productB->getPackagePrice() : $productB->getFinalPrice());
2) Check if package product already exists, if not create it!
Now load the package product based on the SKU that I know I’m going to make, if it doesn’t exist I will create the product and save.
Mage::getModel('catalog/product')->loadByAttribute('sku',$productA->getSku().'__'.$productB->getSku());
if (!$package_product) { 4
$package_product = Mage::getModel('catalog/product');
$package_product
->setTypeId(Mage_Catalog_Model_Product_Type::TYPE_SIMPLE)
->setWebsiteIds(array(1, 2))
->setWeight(1)
->setStoreId(Mage::app()->getStore()->getId())
->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED)
->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE)
->setTaxClassId(2)
->setAttributeSetId(15)
->setSku($productA->getSku().'__'.$productB->getSku())
->setName("PACKAGE DEAL: ".$productA->getName().' & '.$productB->getName())
->setPrice($productA_price + $productB_price)
->save();
3) Set stock data for package product
$stockItem = Mage::getModel('cataloginventory/stock_item');
$stockItem->assignProduct($package_product);
$stockItem->setData('is_in_stock', 1);
$stockItem->setData('stock_id', 1);
$stockItem->setData('store_id', 1);
$stockItem->setData('manage_stock', 0);
$stockItem->setData('use_config_manage_stock', 0);
$stockItem->setData('min_sale_qty', 0);
$stockItem->setData('use_config_min_sale_qty', 1);
$stockItem->setData('max_sale_qty', 1000);
$stockItem->setData('use_config_max_sale_qty', 1);
$stockItem->save();
4) If package does exists, update the price
} else {
$package_product->setStoreId(Mage::app()->getStore()->getId());
$package_product->setPrice($productA_price + $productB_price)->save();
5) Add package product to cart
$cart = Mage::getModel('checkout/cart')->init();
$cart->addProduct($package_product, array('qty' => 1));
$cart->save();
Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
$this->_redirect('checkout/cart');
6) Decrease individual product stock
class Creare_Productpackages_Model_Observer
{
public function packageDecreaseStock($observer) {
$order = $observer['order'];
$items = $order->getAllVisibleItems();
foreach ($items as $itemid => $item){
$product = Mage::getModel('catalog/product')->load($item->getProductId());
if ($product->getAttributeSetId() == 15)
{
$qty = $item->getQtyToInvoice();
$skus = explode('__', $product->getSku());
foreach ($skus as $sku)
{
$_product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);
$stocklevel = (int)Mage::getModel('cataloginventory/stock_item')->loadByProduct($_product)->getQty();
$newlevel = $stocklevel-($qty);
if ($newlevel > 0) { $instock = 1; } else { $instock = 0; }
$stockItem = Mage::getModel('cataloginventory/stock_item')->assignProduct($_product);
$stockItem->setData('is_in_stock', $instock);
$stockItem->setData('qty', $newlevel);
$stockItem->save();
}
}
}
}
}