Merge pull request #1105 from prashant-webkul/development

Development
This commit is contained in:
Jitendra Singh 2019-06-25 15:02:46 +05:30 committed by GitHub
commit a60e339218
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 252 additions and 84 deletions

View File

@ -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 '<label class="badge badge-success">Active</label>';
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 '<label class="badge badge-danger">In Active</label>';
}
]);
@ -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 '<label class="badge badge-success">True</label>';
else
return 'False';
return '<label class="badge badge-danger">False</label>';
}
]);
@ -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 '<label class="badge badge-success">True</label>';
} else {
return '<label class="badge badge-danger">False</label>';
}
}
]);
}
public function prepareActions()

View File

@ -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) {

View File

@ -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'
]
],

View File

@ -142,17 +142,6 @@
<span class="control-error" v-if="errors.has('per_customer')">@{{ errors.first('per_customer') }}</span>
</div> --}}
<div class="control-group" :class="[errors.has('is_guest') ? 'has-error' : '']">
<label for="is_guest" class="required">{{ __('admin::app.promotion.general-info.is-guest') }}</label>
<select type="text" class="control" name="is_guest" v-model="is_guest" v-validate="'required'" value="{{ old('is_guest')}}" data-vv-as="&quot;{{ __('admin::app.promotion.general-info.is-guest') }}&quot;">
<option value="1" :selected="is_guest == 1">{{ __('admin::app.promotion.general-info.is-coupon-yes') }}</option>
<option value="0" :selected="is_guest == 0">{{ __('admin::app.promotion.general-info.is-coupon-no') }}</option>
</select>
<span class="control-error" v-if="errors.has('is_guest')">@{{ errors.first('is_guest') }}</span>
</div>
{{-- <div class="control-group" :class="[errors.has('usage_limit') ? 'has-error' : '']">
<label for="usage_limit" class="required">{{ __('admin::app.promotion.general-info.limit') }}</label>
@ -364,10 +353,9 @@
<div v-if="label.global == null || label.global == ''">
@foreach(core()->getAllChannels() as $channel)
<span>[{{ $channel->code }}]</span>
@foreach($channel->locales as $locale)
<div class="control-group" :class="[errors.has('label') ? 'has-error' : '']">
<label for="code">{{ $locale->code }}</label>
<label for="code"><span class="locale">[{{ $channel->code }} - {{ $locale->code }}]</span></label>
<input type="text" class="control" name="label[{{ $channel->code }}][{{ $locale->code }}]" v-model="label.{{ $channel->code }}.{{ $locale->code }}" data-vv-as="&quot;Label&quot;">
@ -405,7 +393,6 @@
use_coupon: null,
auto_generation: false,
usage_limit: 0,
is_guest: 0,
action_type: null,
apply: null,

View File

@ -144,7 +144,7 @@
<span class="control-error" v-if="errors.has('per_customer')">@{{ errors.first('per_customer') }}</span>
</div> --}}
<div class="control-group" :class="[errors.has('is_guest') ? 'has-error' : '']">
{{-- <div class="control-group" :class="[errors.has('is_guest') ? 'has-error' : '']">
<label for="is_guest" class="required">{{ __('admin::app.promotion.general-info.is-guest') }}</label>
<select type="text" class="control" name="is_guest" v-model="is_guest" v-validate="'required'" value="{{ old('is_guest')}}" data-vv-as="&quot;{{ __('admin::app.promotion.general-info.is-guest') }}&quot;">
@ -153,7 +153,7 @@
</select>
<span class="control-error" v-if="errors.has('is_guest')">@{{ errors.first('is_guest') }}</span>
</div>
</div> --}}
{{-- <div class="control-group" :class="[errors.has('usage_limit') ? 'has-error' : '']">
<label for="usage_limit" class="required">{{ __('admin::app.promotion.general-info.limit') }}</label>
@ -393,7 +393,6 @@
use_coupon: null,
// auto_generation: 0,
usage_limit: 0,
is_guest: 0,
action_type: null,
apply: null,

View File

@ -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
*

View File

@ -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) {

View File

@ -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' => [

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class RemoveIsGuestFromCartRulesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('cart_rules', function (Blueprint $table) {
$table->dropColumn('is_guest');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('cart_rules', function (Blueprint $table) {
$table->boolean('is_guest')->default(0);
});
}
}

View File

@ -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;

View File

@ -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();
}
}
}
}
}

View File

@ -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());
}
}

View File

@ -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;

View File

@ -50,13 +50,12 @@
<div class="discount">
<div class="discount-group">
<form class="coupon-form" method="post" @submit.prevent="onSubmit">
<div class="control-group mt-20" :class="[errors.has('code') ? 'has-error' : '']">
<input type="text" class="control" value="" v-model="coupon_code" name="code" placeholder="Enter Coupon Code" v-validate="'required'" style="width: 100%">
<div class="control-group mt-20" :class="[errors.has('code') ? 'has-error' : '']" style="margin-bottom: 10px">
<input type="text" class="control" value="" v-model="coupon_code" name="code" placeholder="Enter Coupon Code" v-validate="'required'" style="width: 100%" @change="changeCoupon">
</div>
<div class="control-error mb-10" v-if="error_message != null">@{{ error_message }}</div>
<span class="control-error" v-if="error_message.length > 0">@{{ error_message }}</span>
<button class="btn btn-lg btn-black">{{ __('shop::app.checkout.onepage.apply-coupon') }}</button>
<button class="btn btn-lg btn-black" :disabled="couponChanged">{{ __('shop::app.checkout.onepage.apply-coupon') }}</button>
</form>
</div>
</div>