catalog rule create complete, migrations changes, translations added
This commit is contained in:
parent
f460de584c
commit
1e96a6bf36
|
|
@ -21,7 +21,7 @@ class CatalogRuleDataGrid extends DataGrid
|
|||
{
|
||||
$queryBuilder = DB::table('catalog_rules')
|
||||
->select('id')
|
||||
->addSelect('id', 'name', 'description', 'status', 'end_other_rules', 'action_type');
|
||||
->addSelect('id', 'name', 'starts_from', 'ends_till', 'priority', 'status', 'end_other_rules', 'action_type');
|
||||
|
||||
$this->setQueryBuilder($queryBuilder);
|
||||
}
|
||||
|
|
@ -47,9 +47,27 @@ class CatalogRuleDataGrid extends DataGrid
|
|||
]);
|
||||
|
||||
$this->addColumn([
|
||||
'index' => 'description',
|
||||
'label' => trans('admin::app.datagrid.desc'),
|
||||
'type' => 'string',
|
||||
'index' => 'starts_from',
|
||||
'label' => trans('admin::app.datagrid.starts_from'),
|
||||
'type' => 'date',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'filterable' => true
|
||||
]);
|
||||
|
||||
$this->addColumn([
|
||||
'index' => 'ends_till',
|
||||
'label' => trans('admin::app.datagrid.ends_till'),
|
||||
'type' => 'date',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'filterable' => true
|
||||
]);
|
||||
|
||||
$this->addColumn([
|
||||
'index' => 'priority',
|
||||
'label' => trans('admin::app.datagrid.priority'),
|
||||
'type' => 'number',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'filterable' => true
|
||||
|
|
@ -61,7 +79,13 @@ class CatalogRuleDataGrid extends DataGrid
|
|||
'type' => 'boolean',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'filterable' => true
|
||||
'filterable' => true,
|
||||
'wrapper' => function ($value) {
|
||||
if ($value->status == 1)
|
||||
return 'True';
|
||||
else
|
||||
return 'False';
|
||||
}
|
||||
]);
|
||||
|
||||
$this->addColumn([
|
||||
|
|
@ -70,7 +94,13 @@ class CatalogRuleDataGrid extends DataGrid
|
|||
'type' => 'boolean',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'filterable' => true
|
||||
'filterable' => true,
|
||||
'wrapper' => function ($value) {
|
||||
if ($value->end_other_rules == 1)
|
||||
return 'True';
|
||||
else
|
||||
return 'False';
|
||||
}
|
||||
]);
|
||||
|
||||
$this->addColumn([
|
||||
|
|
@ -79,34 +109,41 @@ class CatalogRuleDataGrid extends DataGrid
|
|||
'type' => 'string',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'filterable' => true
|
||||
'filterable' => true,
|
||||
'wrapper' => function ($value) {
|
||||
foreach(config('pricerules.catalog.actions') as $key => $action) {
|
||||
if ($value->action_type == $key) {
|
||||
return trans($action);
|
||||
}
|
||||
}
|
||||
}
|
||||
]);
|
||||
}
|
||||
|
||||
public function prepareActions()
|
||||
{
|
||||
// $this->addAction([
|
||||
// 'type' => 'Edit',
|
||||
// 'method' => 'GET', //use post only for redirects only
|
||||
// 'route' => 'admin.catalog.attributes.edit',
|
||||
// 'icon' => 'icon pencil-lg-icon'
|
||||
// ]);
|
||||
$this->addAction([
|
||||
'type' => 'Edit',
|
||||
'method' => 'GET', //use post only for redirects only
|
||||
'route' => 'admin.catalog-rule.edit',
|
||||
'icon' => 'icon pencil-lg-icon'
|
||||
]);
|
||||
|
||||
// $this->addAction([
|
||||
// 'type' => 'Delete',
|
||||
// 'method' => 'POST', //use post only for requests other than redirects
|
||||
// 'route' => 'admin.catalog.attributes.delete',
|
||||
// 'route' => 'admin.catalog-rule.delete',
|
||||
// 'icon' => 'icon trash-icon'
|
||||
// ]);
|
||||
}
|
||||
|
||||
public function prepareMassActions()
|
||||
{
|
||||
$this->addMassAction([
|
||||
'type' => 'delete',
|
||||
'action' => route('admin.catalog.attributes.massdelete'),
|
||||
'label' => 'Delete',
|
||||
'method' => 'DELETE'
|
||||
]);
|
||||
// $this->addMassAction([
|
||||
// 'type' => 'delete',
|
||||
// 'action' => route('admin.catalog.attributes.massdelete'),
|
||||
// 'label' => 'Delete',
|
||||
// 'method' => 'DELETE'
|
||||
// ]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -629,6 +629,14 @@ Route::group(['middleware' => ['web']], function () {
|
|||
'redirect' => 'admin.catalog-rule.create'
|
||||
])->name('admin.catalog-rule.store');
|
||||
|
||||
Route::get('/catalog-rule/edit/{id}', 'Webkul\Discount\Http\Controllers\CatalogRuleController@edit')->defaults('_config', [
|
||||
'view' => 'admin::promotions.catalog-rule.edit'
|
||||
])->name('admin.catalog-rule.edit');
|
||||
|
||||
Route::post('/catalog-rule/edit/{id}', 'Webkul\Discount\Http\Controllers\CatalogRuleController@update')->defaults('_config', [
|
||||
'redirect' => 'admin.catalog-rule.edit'
|
||||
])->name('admin.catalog-rule.update');
|
||||
|
||||
Route::post('fetch/options', 'Webkul\Discount\Http\Controllers\CatalogRuleController@fetchAttributeOptions')->name('admin.catalog-rule.options');
|
||||
|
||||
Route::get('/cart-rule', 'Webkul\Discount\Http\Controllers\CartRuleController@index')->defaults('_config', [
|
||||
|
|
|
|||
|
|
@ -771,6 +771,8 @@ return [
|
|||
'cart-rule' => 'Cart Rule',
|
||||
'add-catalog-rule' => 'Add Catalog Rule',
|
||||
'add-cart-rule' => 'Add Cart Rule',
|
||||
'edit-cart-rule' => 'Edit Cart Rule',
|
||||
'edit-catalog-rule' => 'Edit Catalog Rule',
|
||||
'create-catalog-rule' => 'Create Catalog Rule',
|
||||
'create-cart-rule' => 'Create Cart Rule',
|
||||
'save-btn-title' => 'Create',
|
||||
|
|
@ -793,8 +795,16 @@ return [
|
|||
'is-coupon-no' => 'No',
|
||||
'uses-per-cust' => 'Uses per customer',
|
||||
'all' => 'All',
|
||||
'any' => 'Any'
|
||||
'any' => 'Any',
|
||||
'end_other_rules' => 'End other rules',
|
||||
'status' => 'Is Active',
|
||||
],
|
||||
|
||||
'status' => [
|
||||
'success' => 'Success! rule created',
|
||||
'failed' => 'Error! failed to create rule'
|
||||
],
|
||||
|
||||
'catalog' => [
|
||||
'name' => 'Name',
|
||||
'description' => 'Description',
|
||||
|
|
|
|||
|
|
@ -298,6 +298,7 @@
|
|||
priority: 0,
|
||||
starts_from: null,
|
||||
uses_per_cust: 0,
|
||||
status: null
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,363 @@
|
|||
@extends('admin::layouts.content')
|
||||
|
||||
@section('page_title')
|
||||
{{ __('admin::app.promotion.edit-cart-rule') }}
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
<div class="content">
|
||||
<form method="POST" action="{{ route('admin.cart-rule.store') }}" @submit.prevent="onSubmit">
|
||||
@csrf
|
||||
|
||||
<div class="page-header">
|
||||
<div class="page-title">
|
||||
<h1>
|
||||
<i class="icon angle-left-icon back-link" onclick="history.length > 1 ? history.go(-1) : window.location = '{{ url('/admin/dashboard') }}';"></i>
|
||||
|
||||
{{ __('admin::app.promotion.edit-cart-rule') }}
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<div class="page-action">
|
||||
<button type="submit" class="btn btn-lg btn-primary">
|
||||
{{ __('admin::app.promotion.save-btn-title') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="page-content">
|
||||
<div class="form-container">
|
||||
<cart-rule></cart-rule>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@push('scripts')
|
||||
<script type="text/x-template" id="cart-rule-form-template">
|
||||
<div>
|
||||
@csrf()
|
||||
|
||||
<accordian :active="true" title="Information">
|
||||
<div slot="body">
|
||||
<div class="control-group" :class="[errors.has('name') ? 'has-error' : '']">
|
||||
<label for="name" class="required">{{ __('admin::app.promotion.general-info.name') }}</label>
|
||||
|
||||
<input type="text" class="control" name="name" v-model="name" v-validate="'required'" value="{{ old('name') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.name') }}"">
|
||||
|
||||
<span class="control-error" v-if="errors.has('name')">@{{ errors.first('name') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('description') ? 'has-error' : '']">
|
||||
<label for="description">{{ __('admin::app.promotion.general-info.description') }}</label>
|
||||
|
||||
<textarea class="control" name="description" v-model="description" v-validate="'required'" value="{{ old('description') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.description') }}""></textarea>
|
||||
|
||||
<span class="control-error" v-if="errors.has('description')">@{{ errors.first('description') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('customer_groups[]') ? 'has-error' : '']">
|
||||
<label for="customer_groups" class="required">{{ __('admin::app.promotion.general-info.cust-groups') }}</label>
|
||||
|
||||
<select type="text" class="control" name="customer_groups[]" v-model="customer_groups" v-validate="'required'" value="{{ old('customer_groups') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.cust-groups') }}"" multiple="multiple">
|
||||
<option disabled="disabled">Select Customer Groups</option>
|
||||
@foreach(app('Webkul\Customer\Repositories\CustomerGroupRepository')->all() as $channel)
|
||||
<option value="{{ $channel->id }}">{{ $channel->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
|
||||
<span class="control-error" v-if="errors.has('customer_groups[]')">@{{ errors.first('customer_groups[]') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('channels[]') ? 'has-error' : '']">
|
||||
<label for="channels" class="required">{{ __('admin::app.promotion.general-info.channels') }}</label>
|
||||
|
||||
<select type="text" class="control" name="channels[]" v-model="channels" v-validate="'required'" value="{{ old('channels') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.channels') }}"" multiple="multiple">
|
||||
<option disabled="disabled">Select Channels</option>
|
||||
@foreach(app('Webkul\Core\Repositories\ChannelRepository')->all() as $channel)
|
||||
<option value="{{ $channel->id }}">{{ $channel->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
|
||||
<span class="control-error" v-if="errors.has('channels[]')">@{{ errors.first('channels[]') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('is_coupon') ? 'has-error' : '']">
|
||||
<label for="customer_groups" class="required">{{ __('admin::app.promotion.general-info.is-coupon') }}</label>
|
||||
|
||||
<select type="text" class="control" name="is_coupon" v-model="is_coupon" v-validate="'required'" value="{{ old('is_coupon') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.is-coupon') }}"">
|
||||
<option value="0">{{ __('admin::app.promotion.general-info.is-coupon-yes') }}</option>
|
||||
<option value="1">{{ __('admin::app.promotion.general-info.is-coupon-no') }}</option>
|
||||
</select>
|
||||
|
||||
<span class="control-error" v-if="errors.has('is_coupon')">@{{ errors.first('is_coupon') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('uses_per_cust') ? 'has-error' : '']">
|
||||
<label for="uses_per_cust" class="required">{{ __('admin::app.promotion.general-info.uses-per-cust') }}</label>
|
||||
|
||||
<input type="number" step="1" class="control" name="uses_per_cust" v-model="uses_per_cust" v-validate="'required|numeric|min_value:1'" value="{{ old('uses_per_cust') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.uses-per-cust') }}"">
|
||||
|
||||
<span class="control-error" v-if="errors.has('uses_per_cust')">@{{ errors.first('uses_per_cust') }}</span>
|
||||
</div>
|
||||
|
||||
<datetime :name="starts_from">
|
||||
<div class="control-group" :class="[errors.has('starts_from') ? 'has-error' : '']">
|
||||
<label for="starts_from" class="required">{{ __('admin::app.promotion.general-info.starts-from') }}</label>
|
||||
|
||||
<input type="text" class="control" v-model="starts_from" name="starts_from" v-validate="'required'" data-vv-as=""{{ __('admin::app.promotion.general-info.starts-from') }}"">
|
||||
|
||||
<span class="control-error" v-if="errors.has('starts_from')">@{{ errors.first('starts_from') }}</span>
|
||||
</div>
|
||||
</datetime>
|
||||
|
||||
<datetime :name="starts_from">
|
||||
<div class="control-group" :class="[errors.has('ends_till') ? 'has-error' : '']">
|
||||
<label for="ends_till" class="required">{{ __('admin::app.promotion.general-info.ends-till') }}</label>
|
||||
|
||||
<input type="text" class="control" v-model="ends_till" name="ends_till" v-validate="'required'" data-vv-as=""{{ __('admin::app.promotion.general-info.ends-till') }}"">
|
||||
|
||||
<span class="control-error" v-if="errors.has('ends_till')">@{{ errors.first('ends_till') }}</span>
|
||||
</div>
|
||||
</datetime>
|
||||
|
||||
<div class="control-group" :class="[errors.has('priority') ? 'has-error' : '']">
|
||||
<label for="priority" class="required">{{ __('admin::app.promotion.general-info.priority') }}</label>
|
||||
|
||||
<input type="number" class="control" step="1" name="priority" v-model="priority" v-validate="'required|numeric|min_value:1'" value="{{ old('priority') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.priority') }}"">
|
||||
|
||||
<span class="control-error" v-if="errors.has('priority')">@{{ errors.first('priority') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</accordian>
|
||||
|
||||
<accordian :active="true" title="Conditions">
|
||||
<div slot="body">
|
||||
<div class="add-condition">
|
||||
<div class="control-group" :class="[errors.has('criteria') ? 'has-error' : '']">
|
||||
<label for="criteria" class="required">{{ __('admin::app.promotion.general-info.add-condition') }}</label>
|
||||
|
||||
<select type="text" class="control" name="criteria" v-model="criteria" v-validate="'required'" value="{{ old('channels') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.cust-groups') }}"">
|
||||
<option value="cart">Cart Attribute</option>
|
||||
</select>
|
||||
|
||||
<span class="control-error" v-if="errors.has('criteria')">@{{ errors.first('criteria') }}</span>
|
||||
</div>
|
||||
|
||||
<span class="btn btn-primary btn-lg" v-on:click="addCondition">Add Condition</span>
|
||||
</div>
|
||||
|
||||
<div class="condition-set">
|
||||
|
||||
<!-- Cart Attribute -->
|
||||
<div v-for="(cart_attr, index) in cart_attrs" :key="index">
|
||||
<div class="control-container mt-20">
|
||||
<div class="title-bar">
|
||||
<span>Cart Attribute is </span>
|
||||
<span class="icon cross-icon" v-on:click="removeCartAttr(index)"></span>
|
||||
</div>
|
||||
|
||||
<div class="control-group mt-10" :key="index">
|
||||
<select class="control" name="cart_attributes[]" v-model="cart_attrs[index].attribute" v-validate="'required'" title="You Can Make Multiple Selections Here" style="margin-right: 15px;" v-on:change="enableCondition($event, index)">
|
||||
<option disabled="disabled">Select attribute</option>
|
||||
|
||||
<option v-for="(cart_attribute, index1) in cart_attributes" :value="cart_attribute.name" :key="index1">@{{ cart_attribute.name }}</option>
|
||||
</select>
|
||||
|
||||
<div v-if='cart_attrs[index].type == "string"'>
|
||||
<select class="control" name="cart_attributes[]" v-model="cart_attrs[index].condition" v-validate="'required'" style="margin-right: 15px;">
|
||||
<option v-for="(config_param, index) in config_params.text" :value="config_param" :key="index">@{{ config_param }}</option>
|
||||
</select>
|
||||
|
||||
<div v-if='cart_attrs[index].attribute == "Shipping State"'>
|
||||
<select class="control" v-validate="'required'" v-model="cart_attrs[index].value">
|
||||
<option disabled="disabled">Select State</option>
|
||||
<optgroup v-for='(state, code) in states' :label="code">
|
||||
<option v-for="(stateObj, index) in state" :value="stateObj.code">@{{ stateObj.default_name }}</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div v-if='cart_attrs[index].attribute == "Shipping Country"'>
|
||||
<select class="control" v-validate="'required'" v-model="cart_attrs[index].value">
|
||||
<option disabled="disabled">Select Country</option>
|
||||
<option v-for="(country, index) in countries" :value="country.code">@{{ country.name }}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<input type="text" class="control" name="cart_attributes[]" v-model="cart_attrs[index].value" placeholder="Enter Value" v-if='cart_attrs[index].attribute != "Shipping State" && cart_attrs[index].attribute != "Shipping Country"'>
|
||||
</div>
|
||||
|
||||
<div v-if='cart_attrs[index].type == "numeric"'>
|
||||
<select class="control" name="attributes[]" v-model="cart_attrs[index].condition" v-validate="'required'" style="margin-right: 15px;">
|
||||
<option v-for="(config_param, index) in config_params.numeric" :value="config_param" :key="index">@{{ config_param }}</option>
|
||||
</select>
|
||||
|
||||
<input type="number" step="0.1000" class="control" name="cart_attributes[]" v-model="cart_attrs[index].value" placeholder="Enter Value">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</accordian>
|
||||
|
||||
<accordian :active="true" title="Actions">
|
||||
<div slot="body">
|
||||
<div class="control-group" :class="[errors.has('apply') ? 'has-error' : '']">
|
||||
<label for="apply" class="required">Apply</label>
|
||||
|
||||
<select class="control" name="apply" v-model="apply" v-validate="'required'" value="{{ old('apply') }}" data-vv-as=""Apply As"" v-on:change="detectApply">
|
||||
<option value="1">{{ __('admin::app.promotion.catalog.apply-percent') }}</option>
|
||||
<option value="2">{{ __('admin::app.promotion.catalog.apply-fixed') }}</option>
|
||||
<option value="3">{{ __('admin::app.promotion.catalog.adjust-to-percent') }}</option>
|
||||
<option value="4">{{ __('admin::app.promotion.catalog.adjust-to-value') }}</option>
|
||||
</select>
|
||||
|
||||
<span class="control-error" v-if="errors.has('apply')">@{{ errors.first('apply') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('disc_amount') ? 'has-error' : '']" v-if="apply_amt">
|
||||
<label for="disc_amount" class="required">{{ __('admin::app.promotion.general-info.disc_amt') }}</label>
|
||||
|
||||
<input type="number" step="1.0000" class="control" name="disc_amount" v-model="disc_amount" v-validate="'required|decimal|min_value:0.0001'" value="{{ old('disc_amount') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.disc_amt') }}"">
|
||||
|
||||
<span class="control-error" v-if="errors.has('disc_amount')">@{{ errors.first('disc_amount') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('disc_percent') ? 'has-error' : '']" v-if="apply_prct">
|
||||
<label for="disc_percent" class="required">{{ __('admin::app.promotion.general-info.disc_percent') }}</label>
|
||||
|
||||
<input type="number" step="0.5000" class="control" name="disc_percent" v-model="disc_percent" v-validate="'required|decimal|min_value:0.0001'" value="{{ old('disc_percent') }}" data-vv-as=""{{ __('admin::app.promotion.general-info.disc_percent') }}"">
|
||||
|
||||
<span class="control-error" v-if="errors.has('disc_percent')">@{{ errors.first('disc_percent') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('buy_atleast') ? 'has-error' : '']">
|
||||
<label for="buy_atleast" class="required">{{ __('admin::app.promotion.cart.buy-atleast') }}</label>
|
||||
|
||||
<input type="number" step="1" class="control" name="buy_atleast" v-model="buy_atleast" v-validate="'required|numeric|min_value:1'" value="{{ old('buy_atleast') }}" data-vv-as=""{{ __('admin::app.promotion.cart.buy-atleast') }}"">
|
||||
|
||||
<span class="control-error" v-if="errors.has('buy_atleast')">@{{ errors.first('buy_atleast') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('apply_to_shipping') ? 'has-error' : '']">
|
||||
<label for="customer_groups" class="required">{{ __('admin::app.promotion.cart.apply-to-shipping') }}</label>
|
||||
|
||||
<select type="text" class="control" name="apply_to_shipping" v-model="apply_to_shipping" v-validate="'required'" value="{{ old('apply_to_shipping') }}" data-vv-as=""{{ __('admin::app.promotion.cart.apply-to-shipping') }}"">
|
||||
<option value="0">{{ __('admin::app.promotion.general-info.is-coupon-yes') }}</option>
|
||||
|
||||
<option value="1">{{ __('admin::app.promotion.general-info.is-coupon-no') }}</option>
|
||||
</select>
|
||||
|
||||
<span class="control-error" v-if="errors.has('apply_to_shipping')">@{{ errors.first('apply_to_shipping') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</accordian>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
Vue.component('cart-rule', {
|
||||
template: '#cart-rule-form-template',
|
||||
|
||||
inject: ['$validator'],
|
||||
|
||||
data () {
|
||||
return {
|
||||
type: [],
|
||||
apply: null,
|
||||
apply_amt: false,
|
||||
apply_prct: false,
|
||||
apply_to_shipping: null,
|
||||
buy_atleast: null,
|
||||
attribute_options: @json($criteria[1]),
|
||||
cart_attributes: @json($criteria[0]).cart,
|
||||
cart_attr: {
|
||||
attribute: null,
|
||||
condition: null,
|
||||
value: null,
|
||||
type: null
|
||||
},
|
||||
cart_attrs: [],
|
||||
cart_attrs_count: 0,
|
||||
channels: [],
|
||||
conditions: [],
|
||||
countries: @json($criteria[2]['countries']),
|
||||
states: @json($criteria[2]['states']),
|
||||
config_params: @json($criteria[0]).conditions,
|
||||
criteria: null,
|
||||
customer_groups: [],
|
||||
description: null,
|
||||
disc_amount: 0.0,
|
||||
disc_percent: 0.0,
|
||||
ends_till: null,
|
||||
end_other_rules: null,
|
||||
is_coupon: null,
|
||||
name: null,
|
||||
priority: 0,
|
||||
starts_from: null,
|
||||
uses_per_cust: 0,
|
||||
status: null
|
||||
}
|
||||
},
|
||||
|
||||
mounted () {
|
||||
},
|
||||
|
||||
methods: {
|
||||
addCondition () {
|
||||
if (this.criteria == 'product_subselection' || this.criteria == 'cart') {
|
||||
this.condition_on = this.criteria;
|
||||
} else {
|
||||
alert('please try again');
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.condition_on == 'cart') {
|
||||
this.cart_attrs.push(this.cart_attr);
|
||||
|
||||
this.cart_attr = {
|
||||
attribute: null,
|
||||
condition: null,
|
||||
value: null,
|
||||
type: null
|
||||
};
|
||||
} else if (this.condition_on == 'product_subselection') {
|
||||
}
|
||||
},
|
||||
|
||||
detectApply() {
|
||||
if (this.apply == 1 || this.apply == 3) {
|
||||
this.apply_prct = true;
|
||||
this.apply_amt = false;
|
||||
} else if (this.apply == 2 || this.apply == 4) {
|
||||
this.apply_prct = false;
|
||||
this.apply_amt = true;
|
||||
}
|
||||
},
|
||||
|
||||
enableCondition(event, pushedIndex) {
|
||||
selectedIndex = event.target.selectedIndex - 1;
|
||||
|
||||
for (i in this.cart_attributes) {
|
||||
if (i == selectedIndex) {
|
||||
console.log(this.cart_attributes[i].name);
|
||||
this.cart_attrs[pushedIndex].type = this.cart_attributes[i].type;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
removeCartAttr(index) {
|
||||
this.cart_attrs.splice(index, 1);
|
||||
},
|
||||
|
||||
removeCat(index) {
|
||||
this.cats.splice(index, 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
@stop
|
||||
|
|
@ -79,6 +79,30 @@
|
|||
<span class="control-error" v-if="errors.has('channels[]')">@{{ errors.first('channels[]') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('status') ? 'has-error' : '']">
|
||||
<label for="status" class="required">{{ __('admin::app.promotion.general-info.status') }}</label>
|
||||
|
||||
<select type="text" class="control" name="status" v-model="status" v-validate="'required'" data-vv-as=""{{ __('admin::app.promotion.general-info.status') }}"">
|
||||
<option disabled="disabled">Select status</option>
|
||||
<option value="1">Yes</option>
|
||||
<option value="0">No</option>
|
||||
</select>
|
||||
|
||||
<span class="control-error" v-if="errors.has('status')">@{{ errors.first('status') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="control-group" :class="[errors.has('end_other_rules') ? 'has-error' : '']">
|
||||
<label for="end_other_rules" class="required">{{ __('admin::app.promotion.general-info.end_other_rules') }}</label>
|
||||
|
||||
<select type="text" class="control" name="end_other_rules" v-model="end_other_rules" v-validate="'required'" data-vv-as=""{{ __('admin::app.promotion.general-info.end_other_rules') }}"">
|
||||
<option disabled="disabled">Select option</option>
|
||||
<option value="1">Yes</option>
|
||||
<option value="0">No</option>
|
||||
</select>
|
||||
|
||||
<span class="control-error" v-if="errors.has('end_other_rules')">@{{ errors.first('end_other_rules') }}</span>
|
||||
</div>
|
||||
|
||||
<datetime :name="starts_from">
|
||||
<div class="control-group" :class="[errors.has('starts_from') ? 'has-error' : '']">
|
||||
<label for="starts_from" class="required">{{ __('admin::app.promotion.general-info.starts-from') }}</label>
|
||||
|
|
@ -262,6 +286,7 @@
|
|||
|
||||
data () {
|
||||
return {
|
||||
all_conditions: [],
|
||||
apply: null,
|
||||
apply_amt: false,
|
||||
apply_prct: false,
|
||||
|
|
@ -296,7 +321,7 @@
|
|||
name: null,
|
||||
priority: 0,
|
||||
starts_from: null,
|
||||
all_conditions: []
|
||||
status: null,
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@
|
|||
</div>
|
||||
|
||||
<div class="page-content">
|
||||
@inject('customerGrid','Webkul\Admin\DataGrids\CustomerDataGrid')
|
||||
{!! $customerGrid->render() !!}
|
||||
@inject('catalogRuleGrid','Webkul\Admin\DataGrids\CatalogRuleDataGrid')
|
||||
{!! $catalogRuleGrid->render() !!}
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -10,6 +10,8 @@ use Webkul\Attribute\Repositories\AttributeFamilyRepository as AttributeFamily;
|
|||
use Webkul\Category\Repositories\CategoryRepository as Category;
|
||||
use Webkul\Product\Repositories\ProductFlatRepository as Product;
|
||||
use Webkul\Discount\Repositories\CatalogRuleRepository as CatalogRule;
|
||||
use Webkul\Discount\Repositories\CatalogRuleChannelsRepository as CatalogRuleChannels;
|
||||
use Webkul\Discount\Repositories\CatalogRuleCustomerGroupsRepository as CatalogRuleCustomerGroups;
|
||||
|
||||
/**
|
||||
* Catalog Rule controller
|
||||
|
|
@ -54,12 +56,22 @@ class CatalogRuleController extends Controller
|
|||
*/
|
||||
protected $appliedConditions;
|
||||
|
||||
/**
|
||||
* Property to hold Catalog Rule Channels Repository
|
||||
*/
|
||||
protected $catalogRuleChannels;
|
||||
|
||||
/**
|
||||
* Property to hold Catalog Rule Customer Groups Repository
|
||||
*/
|
||||
protected $catalogRuleCustomerGroups;
|
||||
|
||||
/**
|
||||
* To hold the catalog repository instance
|
||||
*/
|
||||
protected $catalogRule;
|
||||
|
||||
public function __construct(Attribute $attribute, AttributeFamily $attributeFamily, Category $category, Product $product, CatalogRule $catalogRule)
|
||||
public function __construct(Attribute $attribute, AttributeFamily $attributeFamily, Category $category, Product $product, CatalogRule $catalogRule, CatalogRuleChannels $catalogRuleChannels, CatalogRuleCustomerGroups $catalogRuleCustomerGroups)
|
||||
{
|
||||
$this->_config = request('_config');
|
||||
$this->attribute = $attribute;
|
||||
|
|
@ -67,6 +79,8 @@ class CatalogRuleController extends Controller
|
|||
$this->category = $category;
|
||||
$this->product = $product;
|
||||
$this->catalogRule = $catalogRule;
|
||||
$this->catalogRuleChannels = $catalogRuleChannels;
|
||||
$this->catalogRuleCustomerGroups = $catalogRuleCustomerGroups;
|
||||
$this->appliedConfig = config('pricerules.catalog');
|
||||
$this->appliedConditions = config('pricerules.conditions');
|
||||
}
|
||||
|
|
@ -92,18 +106,82 @@ class CatalogRuleController extends Controller
|
|||
'channels' => 'required',
|
||||
'starts_from' => 'required|date',
|
||||
'ends_till' => 'required|date',
|
||||
'status' => 'required|boolean',
|
||||
'end_other_rules' => 'required|boolean',
|
||||
'priority' => 'required|numeric',
|
||||
'criteria' => 'required',
|
||||
'all_conditions' => 'required|array',
|
||||
'apply' => 'required|numeric|min:0|max:3'
|
||||
'apply' => 'required|numeric|min:0|max:3',
|
||||
'disc_amount' => 'sometimes',
|
||||
'disc_percent' => 'sometimes',
|
||||
]);
|
||||
|
||||
$data = request()->all();
|
||||
$data['status'] = 1;
|
||||
$catalog_rule = request()->all();
|
||||
|
||||
dd($data);
|
||||
$catalog_rule_channels = array();
|
||||
$catalog_rule_customer_groups = array();
|
||||
|
||||
$catalogRule = $this->catalogRule->create($data);
|
||||
$catalog_rule_channels = $catalog_rule['channels'];
|
||||
$catalog_rule_customer_groups = $catalog_rule['customer_groups'];
|
||||
unset($catalog_rule['channels']); unset($catalog_rule['customer_groups']);
|
||||
|
||||
unset($catalog_rule['criteria']);
|
||||
|
||||
$catalog_rule['conditions'] = $catalog_rule['all_conditions'];
|
||||
unset($catalog_rule['all_conditions']);
|
||||
|
||||
if (isset($catalog_rule['disc_amt'])) {
|
||||
$catalog_rule['action_type'] = $catalog_rule['apply'];
|
||||
$catalog_rule['actions'] = [
|
||||
'action_type' => $catalog_rule['apply'],
|
||||
'disc_amt' => $catalog_rule['disc_amt']
|
||||
];
|
||||
} else if (isset($catalog_rule['disc_percent'])) {
|
||||
$catalog_rule['action_type'] = $catalog_rule['apply'];
|
||||
$catalog_rule['actions'] = [
|
||||
'action_type' => $catalog_rule['apply'],
|
||||
'disc_percent' => $catalog_rule['disc_percent'],
|
||||
];
|
||||
}
|
||||
|
||||
unset($catalog_rule['apply']);
|
||||
unset($catalog_rule['attributes']);
|
||||
unset($catalog_rule['_token']);
|
||||
unset($catalog_rule['all_actions']);
|
||||
|
||||
$catalog_rule['actions'] = json_encode($catalog_rule['actions']);
|
||||
$catalog_rule['conditions'] = json_encode($catalog_rule['conditions']);
|
||||
|
||||
$catalogRule = $this->catalogRule->create($catalog_rule);
|
||||
|
||||
foreach($catalog_rule_channels as $catalog_rule_channel) {
|
||||
$catalog_rule_channels['catalog_rule_id'] = $catalog_rule_channel;
|
||||
$catalog_rule_channels['channel_id'] = $catalog_rule_channel;
|
||||
$catalogRuleChannels = $this->catalogRuleChannels->create($catalog_rule_channels);
|
||||
}
|
||||
|
||||
foreach ($catalog_rule_customer_groups as $catalog_rule_channel) {
|
||||
$catalog_rule_customer_groups['catalog_rule_id'] = $catalogRule['id'];
|
||||
$catalog_rule_customer_groups['customer_group_id'] = $catalog_rule_channel;
|
||||
$catalogRuleCustomerGroups = $this->catalogRuleCustomerGroups->create($catalog_rule_customer_groups);
|
||||
}
|
||||
|
||||
if($catalogRule && $catalogRuleChannels && $catalogRuleCustomerGroups) {
|
||||
session()->flash('success', trans('admin::app.promotion.status.success'));
|
||||
} else {
|
||||
session()->flash('error', trans('admin::app.promotion.status.failed'));
|
||||
}
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$catalog_rule = $this->catalogRule->find($id);
|
||||
$catalog_rule_channels = $this->catalogRuleChannels->findByField('catalog_rule_id', $id);
|
||||
$catalog_rule_customer_groups = $this->catalogRuleCustomerGroups->findByField('catalog_rule_id', $id);
|
||||
|
||||
dd($catalog_rule, $catalog_rule_channels, $catalog_rule_customer_groups);
|
||||
}
|
||||
|
||||
public function fetchOptionableAttributes()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Discount\Repositories;
|
||||
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
|
||||
/**
|
||||
* Cart Rule Reposotory
|
||||
*
|
||||
* @author Prashant Singh <prashant.singh852@webkul.com>
|
||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||
*/
|
||||
class CartRuleRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* Specify Model class name
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function model()
|
||||
{
|
||||
return 'Webkul\Discount\Contracts\CartRule';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Discount\Repositories;
|
||||
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
|
||||
/**
|
||||
* Cart Rule Customer Groups Reposotory
|
||||
*
|
||||
* @author Prashant Singh <prashant.singh852@webkul.com>
|
||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||
*/
|
||||
class CartRuleCustomerGroupsRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* Specify Model class name
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function model()
|
||||
{
|
||||
return 'Webkul\Discount\Contracts\CartRuleCustomerGroups';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Discount\Repositories;
|
||||
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
|
||||
/**
|
||||
* Catalog Rule Customer Groups Reposotory
|
||||
*
|
||||
* @author Prashant Singh <prashant.singh852@webkul.com>
|
||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||
*/
|
||||
class CatalogRuleChannelsRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* Specify Model class name
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function model()
|
||||
{
|
||||
return 'Webkul\Discount\Contracts\CatalogRuleChannels';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Discount\Repositories;
|
||||
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
|
||||
/**
|
||||
* Catalog Rule Customer Groups Reposotory
|
||||
*
|
||||
* @author Prashant Singh <prashant.singh852@webkul.com>
|
||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||
*/
|
||||
class CatalogRuleCustomerGroupsRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* Specify Model class name
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function model()
|
||||
{
|
||||
return 'Webkul\Discount\Contracts\CatalogRuleCustomerGroups';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Discount\Repositories;
|
||||
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
|
||||
/**
|
||||
* Catalog Rule Products Reposotory
|
||||
*
|
||||
* @author Prashant Singh <prashant.singh852@webkul.com>
|
||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||
*/
|
||||
class CatalogRuleProductsRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* Specify Model class name
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function model()
|
||||
{
|
||||
return 'Webkul\Discount\Contracts\CatalogRuleProducts';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Discount\Repositories;
|
||||
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
|
||||
/**
|
||||
* Catalog Rule Products Price Reposotory
|
||||
*
|
||||
* @author Prashant Singh <prashant.singh852@webkul.com>
|
||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||
*/
|
||||
class CatalogRuleProductsPriceRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* Specify Model class name
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function model()
|
||||
{
|
||||
return 'Webkul\Discount\Contracts\CatalogRuleProductsPrice';
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue