I've done this for importing group prices with SOAPv2 for Magento CE 1.7.0.2 some time ago and wrote a a (german) blogpost about this (Google translate might help).
I added the important parts with an english explanation here and hope this helps you getting started.
Basically you need to rewrite the catalog/product_api_v2
model and extend the _prepareDataForSave
method.
Create a new module
In my example it's Avoe_Catalog:
In Avoe/Catalog/etc/config.xml
rewrite the Product API:
<config>
<modules>
<Avoe_Catalog>
<version>0.0.1</version>
</Avoe_Catalog>
</modules>
<global>
<models>
<avoecatalog>
<class>Avoe_Catalog_Model</class>
</avoecatalog>
<catalog>
<rewrite>
<product_api_v2>Avoe_Catalog_Model_Product_Api_V2</product_api_v2>
</rewrite>
</catalog>
</models>
</global>
</config>
Avoe/Catalog/Model/Product/Api/V2.php:
copy the _prepareDataForSave
method from Mage_Catalog_Model_Product_Api_V2
to your new Api model:
class Avoe_Catalog_Model_Product_Api_V2 extends Mage_Catalog_Model_Product_Api_V2 {
protected function _prepareDataForSave ($product, $productData) {
...
if (property_exists($productData, 'tier_price')) {
...
}
//add the following code
if (property_exists($productData, 'group_price')) {
$groupPrices = Mage::getModel('avoecatalog/product_attribute_groupprice_api_V2')
->prepareGroupPrices($product, $productData->group_price);
$product->setData("group_price", $groupPrices);
}
}
}
Create the following file:
Avoe/Catalog/Model/Product/Attribute/Groupprice/Api/V2.php
copied from Mage/Catalog/Model/Product/Attribute/Tierprice/Api/V2.php
:
In this copied file, I've replaced all $tierPrices
with $groupPrices
and updated checks with needed options (cust_group, price, website_id).
class Avoe_Catalog_Model_Product_Attribute_Groupprice_Api_V2 extends Mage_Catalog_Model_Api_Resource
{
/**
* Prepare group prices for save
*
* @param Mage_Catalog_Model_Product $product
* @param array $groupPrices
* @return array
*/
public function prepareGroupPrices($product, $groupPrices = null)
{
if (!is_array($groupPrices)) {
return null;
}
$updateValue = array();
foreach ($groupPrices as $groupPrice1) {
$groupPrice = unserialize($groupPrice1);
if (!is_array($groupPrice)
|| !isset($groupPrice["cust_group"])
|| !isset($groupPrice["price"])) {
$this->_fault('data_invalid', Mage::helper('catalog')->__('Invalid Group Prices'));
}
if (!isset($groupPrice["website_id"]) || $groupPrice["website_id"] == 'all') {
$groupPrice["website_id"] = 0;
} else {
try {
$groupPrice["website_id"] = Mage::app()->getWebsite($groupPrice["website"])->getId();
} catch (Mage_Core_Exception $e) {
$groupPrice["website_id"] = 0;
}
}
if (intval($groupPrice["website_id"]) > 0 && !in_array($groupPrice["website_id"], $product->getWebsiteIds())) {
$this->_fault('data_invalid', Mage::helper('catalog')->__('Invalid group prices. The product is not associated to the requested website.'));
}
if (!isset($groupPrice["cust_group"])) {
$groupPrice["cust_group"] = '0';
}
if ($groupPrice["cust_group"] == 'all') {
$groupPrice["cust_group"] = '0';
}
$updateValue[] = array(
'website_id' => $groupPrice["website_id"],
'cust_group' => $groupPrice["cust_group"],
'price' => $groupPrice["price"],
'delete' => $groupPrice["delete"]
);
}
return $updateValue;
}
}
SOAPv2 API call
You can insert group prices via SOAPv2 then the following way:
$newProductData = new stdClass();
$additionalAttrs = array();
$gp = array(
"0" => array (
"website_id" => "0",
"cust_group" => "1",
"price" => "11.11",
"delete" => "1"
),
"1" => array (
"website_id" => "0",
"cust_group" => "0",
"price" => "12.12"
)
);
$gp = array("key" => "group_price", "value" => array(serialize($gp[0]),serialize($gp[1])));
$additionalAttrs['multi_data'][] = $gp;
$newProductData->additional_attributes = $additionalAttrs;
$result = $client->catalogProductUpdate($sessionId,$prodSku,$newProductData,"","sku");
Best Answer
This is just a part of a part of an idea.
For the product view pages and the cart you can simply retrieve the prices from your external source using the vent
catalog_product_get_final_price
.But if you have a lot of products you might get into performance problems.
But this approach won't work for listing products.
The product prices are indexed in
catalog_product_index_price
.If you have a lot of discount rules and a lot of tier prices I have no idea how you can achieve this, but if you have just simple prices, you can try to rewrite the method
\Magento\Catalog\Model\ResourceModel\Product::_productLimitationPrice
and retrieve your prices from the third party for the current collection.but again, if you have a lot of products, this will end up in performance issues.