diff --git a/packages/Webkul/Admin/src/DataGrids/CartRuleDataGrid.php b/packages/Webkul/Admin/src/DataGrids/CartRuleDataGrid.php index ef51932bf..83cfa0a79 100644 --- a/packages/Webkul/Admin/src/DataGrids/CartRuleDataGrid.php +++ b/packages/Webkul/Admin/src/DataGrids/CartRuleDataGrid.php @@ -21,7 +21,7 @@ class CartRuleDataGrid extends DataGrid { $queryBuilder = DB::table('cart_rules') ->select('id') - ->addSelect('id', 'name', 'starts_from', 'ends_till', 'priority', 'usage_limit', 'per_customer', 'status', 'end_other_rules', 'is_guest', 'action_type'); + ->addSelect('id', 'name', 'starts_from', 'ends_till', 'priority', 'status', 'end_other_rules', 'action_type', 'disc_quantity', 'disc_threshold', 'use_coupon'); $this->setQueryBuilder($queryBuilder); } @@ -62,26 +62,12 @@ class CartRuleDataGrid extends DataGrid 'searchable' => false, 'sortable' => true, 'filterable' => true, + 'closure' => true, 'wrapper' => function($value) { if ($value->status == 1) - return 'True'; + return ''; else - return 'False'; - } - ]); - - $this->addColumn([ - 'index' => 'is_guest', - 'label' => trans('admin::app.datagrid.for-guest'), - 'type' => 'boolean', - 'searchable' => false, - 'sortable' => true, - 'filterable' => true, - 'wrapper' => function($value) { - if ($value->is_guest == 1) - return 'True'; - else - return 'False'; + return ''; } ]); @@ -92,11 +78,12 @@ class CartRuleDataGrid extends DataGrid 'searchable' => false, 'sortable' => true, 'filterable' => true, + 'closure' => true, 'wrapper' => function($value) { if ($value->end_other_rules == 1) - return 'True'; + return ''; else - return 'False'; + return ''; } ]); @@ -106,8 +93,46 @@ class CartRuleDataGrid extends DataGrid 'type' => 'string', 'searchable' => false, 'sortable' => true, + 'filterable' => true, + 'wrapper' => function($value) { + return config('pricerules.cart.actions')[$value->action_type]; + } + ]); + + $this->addColumn([ + 'index' => 'disc_quantity', + 'label' => 'Quantity', + 'type' => 'number', + 'searchable' => false, + 'sortable' => true, 'filterable' => true ]); + + $this->addColumn([ + 'index' => 'disc_threshold', + 'label' => 'Threshold', + 'type' => 'number', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true + ]); + + $this->addColumn([ + 'index' => 'use_coupon', + 'label' => 'Use Coupon', + 'type' => 'boolean', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'closure' => true, + 'wrapper' => function($value) { + if ($value->use_coupon == 1) { + return ''; + } else { + return ''; + } + } + ]); } public function prepareActions() diff --git a/packages/Webkul/Admin/src/Resources/assets/js/app.js b/packages/Webkul/Admin/src/Resources/assets/js/app.js index 225eacb32..4b13eeabd 100755 --- a/packages/Webkul/Admin/src/Resources/assets/js/app.js +++ b/packages/Webkul/Admin/src/Resources/assets/js/app.js @@ -121,8 +121,7 @@ $(document).ready(function () { } }, - addServerErrors() { - var scope = null; + addServerErrors(scope = null) { for (var key in serverErrors) { var inputNames = []; key.split('.').forEach(function(chunk, index) { diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php index 177477423..2cb5f3ca3 100755 --- a/packages/Webkul/Admin/src/Resources/lang/en/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -823,7 +823,7 @@ return [ 'cust-groups' => 'Customer Groups', 'priority' => 'Priority', 'add-condition' => 'Add Conditions', - 'disc_amt' => 'Discount Amount(B)', + 'disc_amt' => 'Discount Amount', 'disc_percent' => 'Discount Percentage', 'is-coupon' => 'Use Coupon', 'is-coupon-yes' => 'Yes', @@ -879,7 +879,7 @@ return [ ], 'cart' => [ - 'buy-atleast' => 'Buy Atleast (N)', + 'buy-atleast' => 'Buy Atleast', 'apply-to-shipping' => 'Apply to shipping' ] ], diff --git a/packages/Webkul/Admin/src/Resources/views/promotions/cart-rule/create.blade.php b/packages/Webkul/Admin/src/Resources/views/promotions/cart-rule/create.blade.php index 6c1f28aa9..e15794bd7 100644 --- a/packages/Webkul/Admin/src/Resources/views/promotions/cart-rule/create.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/promotions/cart-rule/create.blade.php @@ -142,17 +142,6 @@ @{{ errors.first('per_customer') }} --}} -
- - - - - @{{ errors.first('is_guest') }} -
- {{--
@@ -364,10 +353,9 @@
@foreach(core()->getAllChannels() as $channel) - [{{ $channel->code }}] @foreach($channel->locales as $locale)
- + @@ -405,7 +393,6 @@ use_coupon: null, auto_generation: false, usage_limit: 0, - is_guest: 0, action_type: null, apply: null, diff --git a/packages/Webkul/Admin/src/Resources/views/promotions/cart-rule/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/promotions/cart-rule/edit.blade.php index 1653562d4..b446f2e6d 100644 --- a/packages/Webkul/Admin/src/Resources/views/promotions/cart-rule/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/promotions/cart-rule/edit.blade.php @@ -144,7 +144,7 @@ @{{ errors.first('per_customer') }}
--}} -
+ {{--
@{{ errors.first('is_guest') }} -
+
--}} {{--
@@ -393,7 +393,6 @@ use_coupon: null, // auto_generation: 0, usage_limit: 0, - is_guest: 0, action_type: null, apply: null, diff --git a/packages/Webkul/Core/src/Core.php b/packages/Webkul/Core/src/Core.php index d4c333028..861fd674f 100755 --- a/packages/Webkul/Core/src/Core.php +++ b/packages/Webkul/Core/src/Core.php @@ -596,6 +596,16 @@ class Core return $coreConfigValue->value; } + /** + * Retrieve a group of information from the core config table + * + * @return array + */ + public function retrieveGroupConfig($criteria) + { + return $criteria; + } + /** * Retrieve all countries * diff --git a/packages/Webkul/Discount/src/Actions/FixedAmount.php b/packages/Webkul/Discount/src/Actions/FixedAmount.php index a46ae6ecd..8ff965281 100644 --- a/packages/Webkul/Discount/src/Actions/FixedAmount.php +++ b/packages/Webkul/Discount/src/Actions/FixedAmount.php @@ -8,7 +8,7 @@ class FixedAmount extends Action { public function calculate($rule, $item, $cart) { - //calculate discount amount + // calculate discount amount $action_type = $rule->action_type; // action type used $disc_threshold = $rule->disc_threshold; // atleast quantity by default 1 --> may be omitted in near future $disc_amount = $rule->disc_amount; // value of discount @@ -18,7 +18,7 @@ class FixedAmount extends Action $realQty = $item['quantity']; - if ($cart >= $disc_threshold) { + if ($cart->items_qty >= $disc_threshold) { $amountDiscounted = $disc_amount; if ($realQty > $disc_quantity) { diff --git a/packages/Webkul/Discount/src/Config/rule-conditions.php b/packages/Webkul/Discount/src/Config/rule-conditions.php index c881b7dc1..99d170b7a 100644 --- a/packages/Webkul/Discount/src/Config/rule-conditions.php +++ b/packages/Webkul/Discount/src/Config/rule-conditions.php @@ -34,7 +34,7 @@ return [ 'actions' => [ 'percent_of_product' => 'Percentage of product', 'fixed_amount' => 'Apply as fixed amount', - 'buy_a_get_b' => 'Get B amount back', + 'buy_a_get_b' => 'Buy A get B' ], 'validation' => [ diff --git a/packages/Webkul/Discount/src/Database/Migrations/2019_06_25_110122_remove_is_guest_from_cart_rules_table.php b/packages/Webkul/Discount/src/Database/Migrations/2019_06_25_110122_remove_is_guest_from_cart_rules_table.php new file mode 100644 index 000000000..a34fe12d9 --- /dev/null +++ b/packages/Webkul/Discount/src/Database/Migrations/2019_06_25_110122_remove_is_guest_from_cart_rules_table.php @@ -0,0 +1,32 @@ +dropColumn('is_guest'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('cart_rules', function (Blueprint $table) { + $table->boolean('is_guest')->default(0); + }); + } +} diff --git a/packages/Webkul/Discount/src/Helpers/Discount.php b/packages/Webkul/Discount/src/Helpers/Discount.php index 852307862..4f239d198 100644 --- a/packages/Webkul/Discount/src/Helpers/Discount.php +++ b/packages/Webkul/Discount/src/Helpers/Discount.php @@ -92,8 +92,10 @@ abstract class Discount } } } else { - if ($rule->is_guest) { - $customerGroupBased = true; + foreach ($rule->customer_groups as $customer_group) { + if ($customer_group->customer_group->code == 'guest') { + $customerGroupBased = true; + } } } @@ -317,6 +319,29 @@ abstract class Discount } } + /** + * Retreives all the payment methods from application config + * + * @return array + */ + public function getPaymentMethods() + { + $paymentMethods = config('paymentmethods'); + + return $paymentMethods; + } + + /** + * Retreives all the shippin methods from the application config + * + * @return array + */ + public function getShippingMethods() + { + $shippingMethods = config('carriers'); + + return $shippingMethods; + } /** * Checks the rule against the current cart instance whether rule conditions are applicable @@ -326,39 +351,67 @@ abstract class Discount */ protected function testIfAllConditionAreTrue($conditions, $cart) { + $paymentMethods = $this->getPaymentMethods(); + + $shippingMethods = $this->getShippingMethods(); + array_pop($conditions); - $shipping_address = $cart->getShippingAddressAttribute() ?? ''; + $shipping_address = $cart->getShippingAddressAttribute() ?? null; - $shipping_method = $cart->shipping_method ?? ''; - $shipping_country = $shipping_address->country ?? ''; - $shipping_state = $shipping_address->state ?? ''; - $shipping_postcode = $shipping_address->postcode ?? ''; - $shipping_city = $shipping_address->city ?? ''; + $shipping_method = $cart->selected_shipping_rate->method_title ?? null; + + $shipping_country = $shipping_address->country ?? null; + + $shipping_state = $shipping_address->state ?? null; + + $shipping_postcode = $shipping_address->postcode ?? null; + + $shipping_city = $shipping_address->city ?? null; + + $payment_method = $paymentMethods[$cart->payment->method]['title']; - $payment_method = $cart->payment->method ?? ''; $sub_total = $cart->base_sub_total; $total_items = $cart->items_qty; + $total_weight = 0; - foreach($cart->items as $item) { + foreach ($cart->items as $item) { $total_weight = $total_weight + $item->base_total_weight; } $result = true; foreach ($conditions as $condition) { - if (isset($condition->attribute)) + if (isset($condition->attribute)) { $actual_value = ${$condition->attribute}; - if (isset($condition->value)) + } else { + $result = false; + } + + if (isset($condition->value)) { $test_value = $condition->value; - if (isset($condition->condition)) + } else { + $result = false; + } + + if (isset($condition->condition)) { $test_condition = $condition->condition; + } + else { + $result = false; + } if (isset($condition->type) && ($condition->type == 'numeric' || $condition->type == 'string' || $condition->type == 'text')) { + if ($condition->type == 'string') { + $actual_value = strtolower($actual_value); + + $test_value = strtolower($test_value); + } + if ($test_condition == '=') { if ($actual_value != $test_value) { $result = false; @@ -414,23 +467,34 @@ abstract class Discount * * @return boolean */ - protected function testIfAnyConditionIsTrue($conditions, $cart) { + protected function testIfAnyConditionIsTrue($conditions, $cart) + { + $paymentMethods = $this->getPaymentMethods(); + + $shippingMethods = $this->getShippingMethods(); + array_pop($conditions); $result = false; - $shipping_address = $cart->getShippingAddressAttribute() ?? ''; + $shipping_address = $cart->getShippingAddressAttribute() ?? null; - $shipping_method = $cart->shipping_method ?? ''; - $shipping_country = $shipping_address->country ?? ''; - $shipping_state = $shipping_address->state ?? ''; - $shipping_postcode = $shipping_address->postcode ?? ''; - $shipping_city = $shipping_address->city ?? ''; + $shipping_method = $cart->selected_shipping_rate->method_title ?? null; + + $shipping_country = $shipping_address->country ?? null; + + $shipping_state = $shipping_address->state ?? null; + + $shipping_postcode = $shipping_address->postcode ?? null; + + $shipping_city = $shipping_address->city ?? null; + + $payment_method = $paymentMethods[$cart->payment->method]['title']; - $payment_method = $cart->payment->method ?? ''; $sub_total = $cart->base_sub_total; $total_items = $cart->items_qty; + $total_weight = 0; foreach($cart->items as $item) { @@ -438,11 +502,34 @@ abstract class Discount } foreach ($conditions as $condition) { - $actual_value = ${$condition->attribute}; - $test_value = $condition->value; - $test_condition = $condition->condition; + if (isset($condition->attribute)) { + $actual_value = ${$condition->attribute}; + + } else { + $result = false; + } + + if (isset($condition->value)) { + $test_value = $condition->value; + + } else { + $result = false; + } + + if (isset($condition->condition)) { + $test_condition = $condition->condition; + } + else { + $result = false; + } if ($condition->type == 'numeric' || $condition->type == 'string' || $condition->type == 'text') { + if ($condition->type == 'string') { + $actual_value = strtolower($actual_value); + + $test_value = strtolower($test_value); + } + if ($test_condition == '=') { if ($actual_value == $test_value) { $result = true; diff --git a/packages/Webkul/Discount/src/Helpers/NonCouponAbleRule.php b/packages/Webkul/Discount/src/Helpers/NonCouponAbleRule.php index 7f7cbb4de..b747860fe 100644 --- a/packages/Webkul/Discount/src/Helpers/NonCouponAbleRule.php +++ b/packages/Webkul/Discount/src/Helpers/NonCouponAbleRule.php @@ -36,15 +36,14 @@ class NonCouponAbleRule extends Discount 'cart_id' => $cart->id, ]); - if (count($alreadyAppliedCartRuleCart)) { $alreadyAppliedRule = $alreadyAppliedCartRuleCart->first()->cart_rule; $validated = $this->validateRule($alreadyAppliedRule); - if (! $alreadyAppliedRule->use_coupon && ! $validated) { + if (! $validated) { // if the validation fails then the cart rule gets deleted from cart rule cart - $alreadyAppliedRule->delete(); + $alreadyAppliedCartRuleCart->first()->delete(); // all discount is cleared fro mthe cart and cart items table $this->clearDiscount(); @@ -68,10 +67,25 @@ class NonCouponAbleRule extends Discount $impact = $actionInstance->calculate($rule, $item, $cart); - array_push($applicableRules, [ - 'rule' => $rule, - 'impact' => $impact - ]); + if ($impact['discount'] > 0) { + array_push($applicableRules, [ + 'rule' => $rule, + 'impact' => $impact + ]); + } + + if (count($alreadyAppliedCartRuleCart)) { + $alreadyAppliedRule = $alreadyAppliedCartRuleCart->first()->cart_rule; + + if ($alreadyAppliedRule->id == $rule->id) { + if ($impact['discount'] == 0) { + $alreadyAppliedCartRuleCart->first()->delete(); + + // all discount is cleared from cart and cart items table + $this->clearDiscount(); + } + } + } } } diff --git a/packages/Webkul/Discount/src/Models/CartRuleCustomerGroups.php b/packages/Webkul/Discount/src/Models/CartRuleCustomerGroups.php index 64d99d3c0..a3e70fee4 100644 --- a/packages/Webkul/Discount/src/Models/CartRuleCustomerGroups.php +++ b/packages/Webkul/Discount/src/Models/CartRuleCustomerGroups.php @@ -3,6 +3,7 @@ namespace Webkul\Discount\Models; use Illuminate\Database\Eloquent\Model; +use Webkul\Customer\Moels\CustomerGroupProxy; use Webkul\Discount\Contracts\CartRuleCustomerGroups as CartRuleCustomerGroupContract; class CartRuleCustomerGroups extends Model implements CartRuleCustomerGroupContract @@ -10,4 +11,9 @@ class CartRuleCustomerGroups extends Model implements CartRuleCustomerGroupContr protected $table = 'cart_rule_customer_groups'; protected $guarded = ['created_at', 'updated_at']; + + public function customer_group() + { + return $this->hasOne(CustomerGroupProxy::modelClass()); + } } diff --git a/packages/Webkul/Shop/src/Resources/views/checkout/onepage.blade.php b/packages/Webkul/Shop/src/Resources/views/checkout/onepage.blade.php index 521af556b..2ba29bc61 100755 --- a/packages/Webkul/Shop/src/Resources/views/checkout/onepage.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/checkout/onepage.blade.php @@ -486,7 +486,9 @@ coupon_code: null, - error_message: '' + error_message: null, + + couponChanged: false } }, @@ -517,15 +519,23 @@ axios.post('{{ route('shop.checkout.check.coupons') }}', {code: this_this.coupon_code}) .then(function(response) { - this_this.$emit('onApplyCoupon') + this_this.$emit('onApplyCoupon'); + + this_this.couponChanged = true; }) .catch(function(error) { - window.flashMessages = [{'type' : 'alert-error', 'message' : error.response.data.message}]; + this_this.couponChanged = true; - this_this.$root.addFlashMessages(); + this_this.error_message = error.response.data.message; }); }, + changeCoupon: function() { + if (this.couponChanged == true) { + this.couponChanged = false; + } + }, + removeCoupon: function () { var this_this = this; diff --git a/packages/Webkul/Shop/src/Resources/views/checkout/total/summary.blade.php b/packages/Webkul/Shop/src/Resources/views/checkout/total/summary.blade.php index 01de2b767..20098085f 100755 --- a/packages/Webkul/Shop/src/Resources/views/checkout/total/summary.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/checkout/total/summary.blade.php @@ -50,13 +50,12 @@
-
- +
+
+
@{{ error_message }}
- @{{ error_message }} - - +