Catalog rule implementation complete, new product price mechanish remaining

This commit is contained in:
Prashant Singh 2019-08-19 15:05:56 +05:30
parent 8a9198e5d9
commit e97069d2be
6 changed files with 356 additions and 340 deletions

View File

@ -6,207 +6,205 @@ return [
'name' => 'admin::app.layouts.dashboard',
'route' => 'admin.dashboard.index',
'sort' => 1,
'icon-class' => 'dashboard-icon',
'icon-class' => 'dashboard-icon'
], [
'key' => 'sales',
'name' => 'admin::app.layouts.sales',
'route' => 'admin.sales.orders.index',
'sort' => 2,
'icon-class' => 'sales-icon',
'icon-class' => 'sales-icon'
], [
'key' => 'sales.orders',
'name' => 'admin::app.layouts.orders',
'route' => 'admin.sales.orders.index',
'sort' => 1,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'sales.shipments',
'name' => 'admin::app.layouts.shipments',
'route' => 'admin.sales.shipments.index',
'sort' => 2,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'sales.invoices',
'name' => 'admin::app.layouts.invoices',
'route' => 'admin.sales.invoices.index',
'sort' => 3,
'icon-class' => '',
'icon-class' => ''
],
[
'key' => 'catalog',
'name' => 'admin::app.layouts.catalog',
'route' => 'admin.catalog.products.index',
'sort' => 3,
'icon-class' => 'catalog-icon',
'icon-class' => 'catalog-icon'
], [
'key' => 'catalog.products',
'name' => 'admin::app.layouts.products',
'route' => 'admin.catalog.products.index',
'sort' => 4,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'catalog.categories',
'name' => 'admin::app.layouts.categories',
'route' => 'admin.catalog.categories.index',
'sort' => 3,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'catalog.attributes',
'name' => 'admin::app.layouts.attributes',
'route' => 'admin.catalog.attributes.index',
'sort' => 1,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'catalog.families',
'name' => 'admin::app.layouts.attribute-families',
'route' => 'admin.catalog.families.index',
'sort' => 2,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'customers',
'name' => 'admin::app.layouts.customers',
'route' => 'admin.customer.index',
'sort' => 4,
'icon-class' => 'customer-icon',
'icon-class' => 'customer-icon'
], [
'key' => 'customers.customers',
'name' => 'admin::app.layouts.customers',
'route' => 'admin.customer.index',
'sort' => 1,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'customers.groups',
'name' => 'admin::app.layouts.groups',
'route' => 'admin.groups.index',
'sort' => 2,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'customers.reviews',
'name' => 'admin::app.layouts.reviews',
'route' => 'admin.customer.review.index',
'sort' => 3,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'customers.subscribers',
'name' => 'admin::app.layouts.newsletter-subscriptions',
'route' => 'admin.customers.subscribers.index',
'sort' => 4,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'configuration',
'name' => 'admin::app.layouts.configure',
'route' => 'admin.configuration.index',
'sort' => 7,
'icon-class' => 'configuration-icon',
'icon-class' => 'configuration-icon'
], [
'key' => 'settings',
'name' => 'admin::app.layouts.settings',
'route' => 'admin.locales.index',
'sort' => 6,
'icon-class' => 'settings-icon',
'icon-class' => 'settings-icon'
], [
'key' => 'settings.locales',
'name' => 'admin::app.layouts.locales',
'route' => 'admin.locales.index',
'sort' => 1,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.currencies',
'name' => 'admin::app.layouts.currencies',
'route' => 'admin.currencies.index',
'sort' => 2,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.exchange_rates',
'name' => 'admin::app.layouts.exchange-rates',
'route' => 'admin.exchange_rates.index',
'sort' => 3,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.inventory_sources',
'name' => 'admin::app.layouts.inventory-sources',
'route' => 'admin.inventory_sources.index',
'sort' => 4,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.channels',
'name' => 'admin::app.layouts.channels',
'route' => 'admin.channels.index',
'sort' => 5,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.users',
'name' => 'admin::app.layouts.users',
'route' => 'admin.users.index',
'sort' => 6,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.users.users',
'name' => 'admin::app.layouts.users',
'route' => 'admin.users.index',
'sort' => 1,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.users.roles',
'name' => 'admin::app.layouts.roles',
'route' => 'admin.roles.index',
'sort' => 2,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.sliders',
'name' => 'admin::app.layouts.sliders',
'route' => 'admin.sliders.index',
'sort' => 7,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.taxes',
'name' => 'admin::app.layouts.taxes',
'route' => 'admin.tax-categories.index',
'sort' => 8,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.taxes.tax-categories',
'name' => 'admin::app.layouts.tax-categories',
'route' => 'admin.tax-categories.index',
'sort' => 1,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'settings.taxes.tax-rates',
'name' => 'admin::app.layouts.tax-rates',
'route' => 'admin.tax-rates.index',
'sort' => 2,
'icon-class' => '',
'icon-class' => ''
], [
'key' => 'promotions',
'name' => 'admin::app.layouts.promotion',
'route' => 'admin.cart-rule.index',
'sort' => 5,
'icon-class' => 'promotion-icon',
'icon-class' => 'promotion-icon'
], [
'key' => 'promotions.cart-rule',
'name' => 'admin::app.promotion.cart-rule',
'route' => 'admin.cart-rule.index',
'sort' => 1,
'icon-class' => ''
], [
'key' => 'promotions.catalog-rule',
'name' => 'admin::app.promotion.catalog-rule',
'route' => 'admin.catalog-rule.index',
'sort' => 1,
'icon-class' => '',
],
// [
// 'key' => 'promotions.catalog-rule',
// 'name' => 'admin::app.promotion.catalog-rule',
// 'route' => 'admin.catalog-rule.index',
// 'sort' => 1,
// 'icon-class' => '',
// ],
[
], [
'key' => 'cms',
'name' => 'admin::app.layouts.cms',
'route' => 'admin.cms.index',
'sort' => 6,
'icon-class' => 'cms-icon',
'icon-class' => 'cms-icon'
], [
'key' => 'cms.pages',
'name' => 'admin::app.cms.pages.pages',
'route' => 'admin.cms.index',
'sort' => 1,
'icon-class' => '',
'icon-class' => ''
]
];

View File

@ -6,6 +6,7 @@ use Webkul\Discount\Repositories\CatalogRuleRepository as CatalogRule;
use Webkul\Discount\Repositories\CatalogRuleProductsRepository as CatalogRuleProducts;
use Webkul\Discount\Repositories\CatalogRuleProductsPriceRepository as CatalogRuleProductsPrice;
use Webkul\Discount\Helpers\Catalog\ConvertXToProductId as ConvertX;
use Webkul\Product\Repositories\ProductRepository as Product;
use Webkul\Discount\Helpers\Catalog\Sale;
/**
@ -46,6 +47,11 @@ class Apply extends Sale
*/
protected $catalogRuleProductPrice;
/**
* Hold ProductRepository instance
*/
protected $product;
/**
* To hold the rule classes
*/
@ -58,7 +64,8 @@ class Apply extends Sale
CatalogRule $catalogRule,
ConvertX $convertX,
CatalogRuleProducts $catalogRuleProduct,
CatalogRuleProductsPrice $catalogRuleProductPrice
CatalogRuleProductsPrice $catalogRuleProductPrice,
Product $product
) {
$this->catalogRule = $catalogRule;
@ -68,6 +75,8 @@ class Apply extends Sale
$this->catalogRuleProductPrice = $catalogRuleProductPrice;
$this->product = $product;
$this->active = collect();
$this->activeRules = collect();
@ -100,20 +109,19 @@ class Apply extends Sale
if ($this->active->count()) {
$productIDs = array();
$temp = collect();
foreach ($this->activeRules as $rule) {
$productIDs = $this->getProductIds($rule);
$productIDs = $this->expandProducts($productIDs);
$result = $this->setSale($rule, $productIDs);
$this->setSale($rule, $productIDs);
}
dd($result, 'processing done');
// dd($result, 'processing done');
} else {
// handle the deceased rules here
dd($this->deceased);
// dd($this->deceased);
}
}
@ -130,18 +138,303 @@ class Apply extends Sale
// apply on selected products
foreach ($productIDs as $productID) {
// catalog rule product resource is updated here
$this->catalogRuleProduct->createOrUpdate($rule, $productID);
$this->createOrUpdateCatalogRuleProduct($rule, $productID);
// catalog rule product price resource is updated here
$this->catalogRuleProductPrice->createOrUpdate($rule, $productID);
$this->createOrUpdateCatalogRuleProductPrice($rule, $productID);
}
} else if ($productIDs == '*') {
$this->catalogRuleProduct->createOrUpdate($rule, $productIDs);
$this->catalogRuleProduct->createOrUpdateCatalogRuleProduct($rule, $productIDs);
$this->catalogRuleProductPrice->createOrUpdate($rule, $productIDs);
$this->catalogRuleProductPrice->createOrUpdateCatalogRuleProductPrice($rule, $productIDs);
}
}
/**
* Create or update catalog rule product resource
*
* @param CatalogRule $rule
* @param Integer $productID
*
* @return Void
*/
public function createOrUpdateCatalogRuleProduct($rule, $productID)
{
$channels = $rule->channels;
$customerGroups = $rule->customer_groups;
$channelsGroupsCross = $channels->crossJoin($customerGroups);
if ($productID == '*') {
$products = $this->product->all('id');
foreach ($channelsGroupsCross as $channelGroup) {
$channelId = $channelGroup[0]->channel_id;
$groupId = $channelGroup[1]->customer_group_id;
foreach ($products as $product) {
$productID = $product->id;
$catalogRuleProduct = $this->catalogRuleProduct->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
if ($catalogRuleProduct->count()) {
// check for tie breaker rules and then update
$product = $this->product->find($productID);
$productPrice = $product->price;
// check for tie breaker rules and then update
$previousRuleID = $catalogRuleProduct->first()->catalog_rule_id;
$newRuleID = $rule->id;
$winnerRuleId = $this->breakTie($previousRuleID, $newRuleID, $product);
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $discountPrice
];
if ($rule->id == $winnerRuleId) {
$this->catalogRuleProduct->create($data);
} else {
$this->catalogRuleProduct->update($data, $catalogRuleProduct->first()->id);
}
} else {
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $rule->discount_amount
];
$this->catalogRuleProduct->create($data);
}
}
}
} else {
foreach ($channelsGroupsCross as $channelGroup) {
$channelId = $channelGroup[0]->channel_id;
$groupId = $channelGroup[1]->customer_group_id;
$catalogRuleProduct = $this->catalogRuleProduct->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
if ($catalogRuleProduct->count()) {
$product = $this->product->find($productID);
$productPrice = $product->price;
// check for tie breaker rules and then update
$previousRuleID = $catalogRuleProduct->first()->catalog_rule_id;
$newRuleID = $rule->id;
$winnerRuleId = $this->breakTie($previousRuleID, $newRuleID, $product);
// update
if ($winnerRuleId != $rule->id) {
$discountAmount = $this->getDiscountAmount($product, $rule);
$catalogRuleProduct->first()->update([
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $discountAmount
]);
} else {
//do reassessment
}
} else if ($catalogRuleProduct->count() == 0) {
$product = $this->product->find($productID);
$discountAmount = $this->getDiscountAmount($product, $rule);
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $discountAmount
];
$this->catalogRuleProduct->create($data);
} else {
// do the reassessment updation if the cart rule action changes the new action and its amount needs to be updated
}
}
}
}
/**
* Create or update catalog rule product resource
*
* @param CatalogRule $rule
* @param Integer $productID
*
* @return Void
*/
public function createOrUpdateCatalogRuleProductPrice($rule, $productID)
{
$channels = $rule->channels;
$customerGroups = $rule->customer_groups;
$channelsGroupsCross = $channels->crossJoin($customerGroups);
if ($productID == '*') {
$products = $this->product->all('id');
foreach ($channelsGroupsCross as $channelGroup) {
$channelId = $channelGroup[0]->channel_id;
$groupId = $channelGroup[1]->customer_group_id;
foreach ($products as $product) {
$productID = $product->id;
$catalogRuleProductPrice = $this->catalogRuleProductPrice->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
if ($catalogRuleProductPrice->count()) {
// check for tie breaker rules and then update
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $rule->discount_amount
];
$this->catalogRuleProductPrice->update($data, $catalogRuleProductPrice->first()->id);
} else {
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $rule->discount_amount
];
$this->catalogRuleProductPrice->create($data);
}
}
}
} else {
foreach ($channelsGroupsCross as $channelGroup) {
$channelId = $channelGroup[0]->channel_id;
$groupId = $channelGroup[1]->customer_group_id;
$catalogRuleProduct = $this->catalogRuleProduct->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
$catalogRuleProductPrice = $this->catalogRuleProductPrice->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
if ($catalogRuleProductPrice->count()) {
$catalogRuleProduct = $catalogRuleProduct->first();
$product = $this->product->find($productID);
$productPrice = $product->price - $catalogRuleProduct->action_amount;
$winnerRuleId = $this->breakTie($catalogRuleProduct->catalog_rule_id, $rule->id, $product);
if ($winnerRuleId != $rule->id) {
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'rule_price' => $productPrice
];
$catalogRuleProductPrice->first()->update($data);
} else {
// do reassement
}
} else if ($catalogRuleProductPrice->count() == 0) {
$catalogRuleProduct = $catalogRuleProduct->first();
$discountAmount = $catalogRuleProduct->action_amount;
$product = $this->product->find($productID);
$productPrice = $product->price - $discountAmount;
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'rule_price' => $productPrice
];
$this->catalogRuleProductPrice->create($data);
} else {
// do the reassessment updation if the cart rule action changes the new action and its amount needs to be updated
}
}
}
}
/**
* Get discount amount for the rule and product
*
* @return Decimal $discountAmount
*/
public function getDiscountAmount($product, $rule)
{
$actionClass = config('discount-rules.catalog')[$rule->action_code];
$actionInstance = new $actionClass();
$discountAmount = $actionInstance->calculate($rule, $product);
return $discountAmount;
}
/**
* To expand the productIDs of configurable products
*
@ -184,13 +477,25 @@ class Apply extends Sale
*
* @return String $id
*/
public function breakTie($previousRuleID, $newRuleID)
public function breakTie($previousRuleID, $newRuleID, $product)
{
$oldRule = $this->catalogRule->find($previousRuleID);
$newRule = $this->catalogRule->find($newRuleID);
dd($oldRule->name, $newRule->name);
if ($oldRule->ends_other_rules) {
return $oldRule->id;
} else {
$oldRuleDiscount = $this->getDiscountAmount($product, $oldRule);
$newRuleDiscount = $this->getDiscountAmount($product, $newRule);
if ($newRuleDiscount > $oldRuleDiscount) {
return $newRule->id;
} else {
return $oldRule->id;
}
}
}
/**

View File

@ -48,136 +48,4 @@ class CatalogRuleProductsPriceRepository extends Repository
{
return 'Webkul\Discount\Contracts\CatalogRuleProductsPrice';
}
/**
* Create or update catalog rule product resource
*
* @param CatalogRule $rule
* @param Integer $productID
*
* @return Void
*/
public function createOrUpdate($rule, $productID)
{
$channels = $rule->channels;
$customerGroups = $rule->customer_groups;
$channelsGroupsCross = $channels->crossJoin($customerGroups);
if ($productID == '*') {
$products = $this->product->all('id');
foreach ($channelsGroupsCross as $channelGroup) {
$channelId = $channelGroup[0]->channel_id;
$groupId = $channelGroup[1]->customer_group_id;
foreach ($products as $product) {
$productID = $product->id;
$catalogRuleProductPrice = $this->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
if ($catalogRuleProductPrice->count()) {
// check for tie breaker rules and then update
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $rule->discount_amount
];
$this->update($data, $catalogRuleProductPrice->first()->id);
} else {
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $rule->discount_amount
];
$this->create($data);
}
}
}
} else {
foreach ($channelsGroupsCross as $channelGroup) {
$channelId = $channelGroup[0]->channel_id;
$groupId = $channelGroup[1]->customer_group_id;
$catalogRuleProduct = $this->catalogRuleProduct->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
$catalogRuleProductPrice = $this->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
if ($catalogRuleProductPrice->count() && $catalogRuleProductPrice->first()->catalog_rule_id != $rule->id) {
$catalogRuleProduct = $catalogRuleProduct->first();
$discountAmount = $rule->discount_amount;
$product = $this->product->find($productID);
$productPrice = $product->price - $catalogRuleProduct->action_amount;
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'rule_price' => $productPrice
];
// update
$catalogRuleProductPrice->first()->update($data);
} else if ($catalogRuleProductPrice->count() == 0) {
$catalogRuleProduct = $catalogRuleProduct->first();
$discountAmount = $rule->discount_amount;
$product = $this->product->find($productID);
$productPrice = $product->price - $catalogRuleProduct->action_amount;
if ($productPrice <= $discountAmount) {
$product->price = $productPrice - $discountAmount;
} else {
$product->price = 0;
}
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'rule_price' => $productPrice
];
$this->create($data);
} else {
// do the reassessment updation if the cart rule action changes the new action and its amount needs to be updated
}
}
}
}
}

View File

@ -14,40 +14,19 @@ use Illuminate\Container\Container as App;
*/
class CatalogRuleProductsRepository extends Repository
{
/**
* ProductRepository instance
*/
protected $product;
/**
* CatalogRule Apply instance
*/
protected $apply;
/**
* @param Product $product
* @param App $app
* @param Apply $apply
*/
public function __construct(Product $product, App $app)
public function __construct(App $app)
{
$this->product = $product;
parent::__construct($app);
}
public function getDiscountAmount($product, $rule)
{
$actionClass = config('discount-rules.catalog')[$rule->action_code];
$actionInstance = new $actionClass();
$discountAmount = $actionInstance->calculate($rule, $product);
return $discountAmount;
}
/**
* Specify Model class name
*
@ -57,137 +36,4 @@ class CatalogRuleProductsRepository extends Repository
{
return 'Webkul\Discount\Contracts\CatalogRuleProducts';
}
/**
* Create or update catalog rule product resource
*
* @param CatalogRule $rule
* @param Integer $productID
*
* @return Void
*/
public function createOrUpdate($rule, $productID)
{
$channels = $rule->channels;
$customerGroups = $rule->customer_groups;
$channelsGroupsCross = $channels->crossJoin($customerGroups);
if ($productID == '*') {
$products = $this->product->all('id');
foreach ($channelsGroupsCross as $channelGroup) {
$channelId = $channelGroup[0]->channel_id;
$groupId = $channelGroup[1]->customer_group_id;
$model = new $this->model();
foreach ($products as $product) {
$productID = $product->id;
$catalogRuleProduct = $this->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
if ($catalogRuleProduct->count()) {
// check for tie breaker rules and then update
$previousRuleID = $catalogRuleProduct->first()->catalog_rule_id;
$newRuleID = $rule->id;
$winnerRuleId = $this->breakTie($previousRuleID, $newRuleID);
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $rule->discount_amount
];
if ($rule->id == $winnerRuleId) {
$this->catalogRuleProduct->create($data);
} else {
$this->catalogRuleProduct->update($data, $catalogRuleProduct->first()->id);
}
} else {
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $rule->discount_amount
];
$this->catalogRuleProduct->create($data);
}
}
}
} else {
foreach ($channelsGroupsCross as $channelGroup) {
$channelId = $channelGroup[0]->channel_id;
$groupId = $channelGroup[1]->customer_group_id;
$catalogRuleProduct = $this->findWhere([
'channel_id' => $channelId,
'customer_group_id' => $groupId,
'product_id' => $productID
]);
if ($catalogRuleProduct->count() && $catalogRuleProduct->first()->catalog_rule_id != $rule->id) {
$product = $this->product->find($productID);
$productPrice = $product->price;
$discountAmount = $this->getDiscountAmount($product, $rule);
// check for tie breaker rules and then update
$previousRuleID = $catalogRuleProduct->first()->catalog_rule_id;
$newRuleID = $rule->id;
$winnerRuleId = $this->breakTie($previousRuleID, $newRuleID);
// update
$catalogRuleProduct->first()->update([
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $discountAmount
]);
} else if ($catalogRuleProduct->count() == 0) {
$product = $this->product->find($productID);
$productPrice = $product->price;
$discountAmount = $this->getDiscountAmount($product, $rule);
$data = [
'catalog_rule_id' => $rule->id,
'starts_from' => $rule->starts_from,
'ends_till' => $rule->ends_till,
'customer_group_id' => $groupId,
'channel_id' => $channelId,
'product_id' => $productID,
'action_code' => $rule->action_code,
'action_amount' => $discountAmount
];
$this->create($data);
} else {
// do the reassessment updation if the cart rule action changes the new action and its amount needs to be updated
}
}
}
}
}

View File

@ -3,7 +3,6 @@
namespace Webkul\Product\Helpers;
use Webkul\Attribute\Repositories\AttributeRepository as Attribute;
use Webkul\Product\Models\ProductAttributeValue;
use Webkul\Product\Models\Product;
use Webkul\Product\Models\ProductFlat;