commit
a60e339218
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
]
|
||||
],
|
||||
|
|
|
|||
|
|
@ -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=""{{ __('admin::app.promotion.general-info.is-guest') }}"">
|
||||
<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=""Label"">
|
||||
|
||||
|
|
@ -405,7 +393,6 @@
|
|||
use_coupon: null,
|
||||
auto_generation: false,
|
||||
usage_limit: 0,
|
||||
is_guest: 0,
|
||||
|
||||
action_type: null,
|
||||
apply: null,
|
||||
|
|
|
|||
|
|
@ -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=""{{ __('admin::app.promotion.general-info.is-guest') }}"">
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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' => [
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue