partner discounts and their referrals
This commit is contained in:
parent
748b21117a
commit
3a53ddbc59
11 changed files with 714 additions and 26 deletions
|
@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin;
|
|||
use App\Events\UserUpdateCreditsEvent;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\InvoiceSettings;
|
||||
use App\Models\PartnerDiscount;
|
||||
use App\Models\Payment;
|
||||
use App\Models\ShopProduct;
|
||||
use App\Models\Settings;
|
||||
|
@ -57,10 +58,13 @@ class PaymentController extends Controller
|
|||
public function checkOut(Request $request, ShopProduct $shopProduct)
|
||||
{
|
||||
return view('store.checkout')->with([
|
||||
'product' => $shopProduct,
|
||||
'taxvalue' => $shopProduct->getTaxValue(),
|
||||
'taxpercent' => $shopProduct->getTaxPercent(),
|
||||
'total' => $shopProduct->getTotalPrice()
|
||||
'product' => $shopProduct,
|
||||
'discountpercent' => PartnerDiscount::getDiscount(),
|
||||
'discountvalue' => PartnerDiscount::getDiscount() * $shopProduct->price/100,
|
||||
'discountedprice' => $shopProduct->getPriceAfterDiscount(),
|
||||
'taxvalue' => $shopProduct->getTaxValue(),
|
||||
'taxpercent' => $shopProduct->getTaxPercent(),
|
||||
'total' => $shopProduct->getTotalPrice()
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -78,7 +82,7 @@ class PaymentController extends Controller
|
|||
"purchase_units" => [
|
||||
[
|
||||
"reference_id" => uniqid(),
|
||||
"description" => $shopProduct->description,
|
||||
"description" => $shopProduct->display . (PartnerDiscount::getDiscount()?(" (" . __('Discount') . " " . PartnerDiscount::getDiscount() . '%)'):""),
|
||||
"amount" => [
|
||||
"value" => $shopProduct->getTotalPrice(),
|
||||
'currency_code' => strtoupper($shopProduct->currency_code),
|
||||
|
@ -86,7 +90,7 @@ class PaymentController extends Controller
|
|||
'item_total' =>
|
||||
[
|
||||
'currency_code' => strtoupper($shopProduct->currency_code),
|
||||
'value' => $shopProduct->price,
|
||||
'value' => $shopProduct->getPriceAfterDiscount(),
|
||||
],
|
||||
'tax_total' =>
|
||||
[
|
||||
|
@ -188,7 +192,7 @@ class PaymentController extends Controller
|
|||
if((config("SETTINGS::REFERRAL:MODE") == "commission" || config("SETTINGS::REFERRAL:MODE") == "both") && $shopProduct->type=="Credits"){
|
||||
if($ref_user = DB::table("user_referrals")->where('registered_user_id', '=', $user->id)->first()){
|
||||
$ref_user = User::findOrFail($ref_user->referral_id);
|
||||
$increment = number_format($shopProduct->quantity/100*config("SETTINGS::REFERRAL:PERCENTAGE"),0,"","");
|
||||
$increment = number_format($shopProduct->quantity*(PartnerDiscount::getCommission($ref_user->id))/100,0,"","");
|
||||
$ref_user->increment('credits', $increment);
|
||||
|
||||
//LOGS REFERRALS IN THE ACTIVITY LOG
|
||||
|
@ -273,10 +277,10 @@ class PaymentController extends Controller
|
|||
'price_data' => [
|
||||
'currency' => $shopProduct->currency_code,
|
||||
'product_data' => [
|
||||
'name' => $shopProduct->display,
|
||||
'name' => $shopProduct->display . (PartnerDiscount::getDiscount()?(" (" . __('Discount') . " " . PartnerDiscount::getDiscount() . '%)'):""),
|
||||
'description' => $shopProduct->description,
|
||||
],
|
||||
'unit_amount_decimal' => round($shopProduct->price * 100, 2),
|
||||
'unit_amount_decimal' => round($shopProduct->getPriceAfterDiscount() * 100, 2),
|
||||
],
|
||||
'quantity' => 1,
|
||||
],
|
||||
|
@ -284,7 +288,7 @@ class PaymentController extends Controller
|
|||
'price_data' => [
|
||||
'currency' => $shopProduct->currency_code,
|
||||
'product_data' => [
|
||||
'name' => 'Product Tax',
|
||||
'name' => __('Tax'),
|
||||
'description' => $shopProduct->getTaxPercent() . "%",
|
||||
],
|
||||
'unit_amount_decimal' => round($shopProduct->getTaxValue(), 2) * 100,
|
||||
|
@ -678,4 +682,4 @@ class PaymentController extends Controller
|
|||
->rawColumns(['actions'])
|
||||
->make(true);
|
||||
}
|
||||
}
|
||||
}
|
203
app/Http/Controllers/PartnerController.php
Normal file
203
app/Http/Controllers/PartnerController.php
Normal file
|
@ -0,0 +1,203 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\PartnerDiscount;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PartnerController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view('admin.partners.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*
|
||||
* @return Application|Factory|View
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('admin.partners.create', [
|
||||
'partners' =>PartnerDiscount::get(),
|
||||
'users' => User::orderBy('name')->get()
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param Request $request
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'user_id' => 'required|integer|min:0',
|
||||
'partner_discount' => 'required|integer|max:100|min:0',
|
||||
'registered_user_discount' => 'required|integer|max:100|min:0'
|
||||
]);
|
||||
|
||||
PartnerDiscount::create($request->all());
|
||||
|
||||
return redirect()->route('admin.partners.index')->with('success', __('partner has been created!'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param Voucher $voucher
|
||||
* @return Response
|
||||
*/
|
||||
public function show(Voucher $voucher)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param Voucher $voucher
|
||||
* @return Application|Factory|View
|
||||
*/
|
||||
public function edit(PartnerDiscount $partner)
|
||||
{
|
||||
return view('admin.partners.edit', [
|
||||
'partners' =>PartnerDiscount::get(),
|
||||
'partner' => $partner,
|
||||
'users' => User::orderBy('name')->get()
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param Request $request
|
||||
* @param Voucher $voucher
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
public function update(Request $request, PartnerDiscount $partner)
|
||||
{
|
||||
//dd($request);
|
||||
$request->validate([
|
||||
'user_id' => 'required|integer|min:0',
|
||||
'partner_discount' => 'required|integer|max:100|min:0',
|
||||
'registered_user_discount' => 'required|integer|max:100|min:0'
|
||||
]);
|
||||
|
||||
$partner->update($request->all());
|
||||
|
||||
return redirect()->route('admin.partners.index')->with('success', __('partner has been updated!'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @param Voucher $voucher
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
public function destroy(PartnerDiscount $partner)
|
||||
{
|
||||
$partner->delete();
|
||||
return redirect()->back()->with('success', __('partner has been removed!'));
|
||||
}
|
||||
|
||||
public function users(Voucher $voucher)
|
||||
{
|
||||
return view('admin.vouchers.users', [
|
||||
'voucher' => $voucher
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws ValidationException
|
||||
*/
|
||||
public function redeem(Request $request)
|
||||
{
|
||||
#general validations
|
||||
$request->validate([
|
||||
'code' => 'required|exists:vouchers,code'
|
||||
]);
|
||||
|
||||
#get voucher by code
|
||||
$voucher = Voucher::where('code', '=', $request->input('code'))->firstOrFail();
|
||||
|
||||
#extra validations
|
||||
if ($voucher->getStatus() == 'USES_LIMIT_REACHED') throw ValidationException::withMessages([
|
||||
'code' => __('This voucher has reached the maximum amount of uses')
|
||||
]);
|
||||
|
||||
if ($voucher->getStatus() == 'EXPIRED') throw ValidationException::withMessages([
|
||||
'code' => __('This voucher has expired')
|
||||
]);
|
||||
|
||||
if (!$request->user()->vouchers()->where('id', '=', $voucher->id)->get()->isEmpty()) throw ValidationException::withMessages([
|
||||
'code' => __('You already redeemed this voucher code')
|
||||
]);
|
||||
|
||||
if ($request->user()->credits + $voucher->credits >= 99999999) throw ValidationException::withMessages([
|
||||
'code' => "You can't redeem this voucher because you would exceed the limit of " . CREDITS_DISPLAY_NAME
|
||||
]);
|
||||
|
||||
#redeem voucher
|
||||
$voucher->redeem($request->user());
|
||||
|
||||
event(new UserUpdateCreditsEvent($request->user()));
|
||||
|
||||
return response()->json([
|
||||
'success' => "{$voucher->credits} " . CREDITS_DISPLAY_NAME ." ". __("have been added to your balance!")
|
||||
]);
|
||||
}
|
||||
|
||||
public function usersDataTable(Voucher $voucher)
|
||||
{
|
||||
$users = $voucher->users();
|
||||
|
||||
return datatables($users)
|
||||
->editColumn('name', function (User $user) {
|
||||
return '<a class="text-info" target="_blank" href="' . route('admin.users.show', $user->id) . '">' . $user->name . '</a>';
|
||||
})
|
||||
->addColumn('credits', function (User $user) {
|
||||
return '<i class="fas fa-coins mr-2"></i> ' . $user->credits();
|
||||
})
|
||||
->addColumn('last_seen', function (User $user) {
|
||||
return $user->last_seen ? $user->last_seen->diffForHumans() : '';
|
||||
})
|
||||
->rawColumns(['name', 'credits', 'last_seen'])
|
||||
->make();
|
||||
}
|
||||
public function dataTable()
|
||||
{
|
||||
$query = PartnerDiscount::query();
|
||||
|
||||
return datatables($query)
|
||||
->addColumn('actions', function (PartnerDiscount $partner) {
|
||||
return '
|
||||
<a data-content="'.__("Edit").'" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.partners.edit', $partner->id) . '" class="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></i></a>
|
||||
<form class="d-inline" onsubmit="return submitResult();" method="post" action="' . route('admin.partners.destroy', $partner->id) . '">
|
||||
' . csrf_field() . '
|
||||
' . method_field("DELETE") . '
|
||||
<button data-content="'.__("Delete").'" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm btn-danger mr-1"><i class="fas fa-trash"></i></button>
|
||||
</form>
|
||||
';
|
||||
})
|
||||
->addColumn('user', function (PartnerDiscount $partner) {
|
||||
return ($user=User::where('id', $partner->user_id)->first())?'<a href="'.route('admin.users.show', $partner->user_id).'">'.$user->name.'</a>':__('Unknown user');
|
||||
})
|
||||
->editColumn('created_at', function (PartnerDiscount $partner) {
|
||||
return $partner->created_at ? $partner->created_at->diffForHumans() : '';
|
||||
})
|
||||
->editColumn('partner_discount', function (PartnerDiscount $partner) {
|
||||
return $partner->partner_discount ? $partner->partner_discount . "%" : "0%";
|
||||
})
|
||||
->editColumn('registered_user_discount', function (PartnerDiscount $partner) {
|
||||
return $partner->registered_user_discount ? $partner->registered_user_discount . "%" : "0%";
|
||||
})
|
||||
->rawColumns(['user', 'actions'])
|
||||
->make();
|
||||
}
|
||||
}
|
40
app/Models/PartnerDiscount.php
Normal file
40
app/Models/PartnerDiscount.php
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class PartnerDiscount extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'user_id',
|
||||
'partner_discount',
|
||||
'registered_user_discount',
|
||||
'referral_system_commission'
|
||||
];
|
||||
|
||||
public static function getDiscount()
|
||||
{
|
||||
if($partnerDiscount = PartnerDiscount::where('user_id', Auth::user()->id)->first()){
|
||||
return $partnerDiscount->partner_discount;
|
||||
}
|
||||
else if($ref_user = DB::table("user_referrals")->where('registered_user_id', '=', Auth::user()->id)->first()){
|
||||
if($partnerDiscount = PartnerDiscount::where('user_id', $ref_user->referral_id)->first()){
|
||||
return $partnerDiscount->registered_user_discount;
|
||||
}
|
||||
return $discountPercent = 0;
|
||||
}
|
||||
}
|
||||
public static function getCommission($user_id)
|
||||
{
|
||||
if($partnerDiscount = PartnerDiscount::where('user_id', $user_id)->first()){
|
||||
if($partnerDiscount->referral_system_commission>=0) return $partnerDiscount->referral_system_commission>=0;
|
||||
}
|
||||
return config("SETTINGS::REFERRAL:PERCENTAGE");
|
||||
}
|
||||
}
|
|
@ -63,6 +63,11 @@ class ShopProduct extends Model
|
|||
return $tax < 0 ? 0 : $tax;
|
||||
}
|
||||
|
||||
public function getPriceAfterDiscount()
|
||||
{
|
||||
return number_format($this->price - ($this->price * PartnerDiscount::getDiscount() / 100), 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Returns the tax as Number
|
||||
*
|
||||
|
@ -70,7 +75,7 @@ class ShopProduct extends Model
|
|||
*/
|
||||
public function getTaxValue()
|
||||
{
|
||||
return number_format($this->price * $this->getTaxPercent() / 100, 2);
|
||||
return number_format($this->getPriceAfterDiscount() * $this->getTaxPercent() / 100, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -80,6 +85,6 @@ class ShopProduct extends Model
|
|||
*/
|
||||
public function getTotalPrice()
|
||||
{
|
||||
return number_format($this->price + $this->getTaxValue(), 2);
|
||||
return number_format($this->getPriceAfterDiscount() + $this->getTaxValue(), 2);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreatePartnerDiscountsTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('partner_discounts', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('user_id');
|
||||
$table->integer('partner_discount');
|
||||
$table->integer('registered_user_discount');
|
||||
$table->integer('referral_system_commission');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('partner_discounts');
|
||||
}
|
||||
}
|
139
resources/views/admin/partners/create.blade.php
Normal file
139
resources/views/admin/partners/create.blade.php
Normal file
|
@ -0,0 +1,139 @@
|
|||
@extends('layouts.main')
|
||||
|
||||
@section('content')
|
||||
<!-- CONTENT HEADER -->
|
||||
<section class="content-header">
|
||||
<div class="container-fluid">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
<h1>{{__('Vouchers')}}</h1>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<ol class="breadcrumb float-sm-right">
|
||||
<li class="breadcrumb-item"><a href="{{route('home')}}">{{__('Dashboard')}}</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{route('admin.partners.index')}}">{{__('Vouchers')}}</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item"><a class="text-muted"
|
||||
href="{{route('admin.partners.create')}}">{{__('Create')}}</a>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<!-- END CONTENT HEADER -->
|
||||
|
||||
<!-- MAIN CONTENT -->
|
||||
<section class="content">
|
||||
<div class="container-fluid">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">
|
||||
<i class="fas fa-handshake mr-2"></i>{{__('Partner details')}}
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{route('admin.partners.store')}}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="form-group">
|
||||
<label for="user_id">{{__('User')}}</label>
|
||||
<select id="user_id" style="width:100%"
|
||||
class="custom-select @error('user') is-invalid @enderror" name="user_id" autocomplete="off">
|
||||
@foreach($users as $user)
|
||||
<option @if($partners->contains('user_id' , $user->id)) disabled @endif
|
||||
value="{{$user->id}}">{{$user->name}} ({{$user->email}})</option>
|
||||
@endforeach
|
||||
</select>
|
||||
@error('user')
|
||||
<div class="text-danger">
|
||||
{{$message}}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="partner_discount">{{__('Partner discount')}}</label>
|
||||
<input value="{{old('partner_discount')}}" placeholder="{{__('Discount in percent')}}" id="partner_discount" name="partner_discount"
|
||||
type="number" step="any" min="0" max="100"
|
||||
class="form-control @error('partner_discount') is-invalid @enderror">
|
||||
@error('partner_discount')
|
||||
<div class="text-danger">
|
||||
{{$message}}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<label for="registered_user_discount">{{__('Registered user discount')}}</label>
|
||||
<div class="input-group">
|
||||
<input value="{{old('registered_user_discount')}}" placeholder="Discount in percent" id="registered_user_discount" name="registered_user_discount"
|
||||
type="number" class="form-control @error('registered_user_discount') is-invalid @enderror"
|
||||
required="required">
|
||||
</div>
|
||||
@error('registered_user_discount')
|
||||
<div class="text-danger">
|
||||
{{$message}}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="referral_system_commission">{{__('Referral system commission')}}
|
||||
<i data-toggle="popover" data-trigger="hover"
|
||||
data-content="{{__('Override value for referral system commission. You can set it to -1 to get the default commission from settings.')}}"
|
||||
class="fas fa-info-circle"></i>
|
||||
</label>
|
||||
<input value="{{old('referral_system_commission')}}" placeholder="{{__('Commission in percent')}}" id="referral_system_commission" name="referral_system_commission"
|
||||
type="number" step="any" min="-1" max="100"
|
||||
class="form-control @error('referral_system_commission') is-invalid @enderror">
|
||||
@error('referral_system_commission')
|
||||
<div class="text-danger">
|
||||
{{$message}}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group text-right">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{{__('Submit')}}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<i class="fas"></i>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
<!-- END CONTENT -->
|
||||
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', (event) => {
|
||||
$('#expires_at').datetimepicker({
|
||||
format: 'DD-MM-yyyy HH:mm:ss',
|
||||
icons: {
|
||||
time: 'far fa-clock',
|
||||
date: 'far fa-calendar',
|
||||
up: 'fas fa-arrow-up',
|
||||
down: 'fas fa-arrow-down',
|
||||
previous: 'fas fa-chevron-left',
|
||||
next: 'fas fa-chevron-right',
|
||||
today: 'fas fa-calendar-check',
|
||||
clear: 'far fa-trash-alt',
|
||||
close: 'far fa-times-circle'
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
@endsection
|
158
resources/views/admin/partners/edit.blade.php
Normal file
158
resources/views/admin/partners/edit.blade.php
Normal file
|
@ -0,0 +1,158 @@
|
|||
@extends('layouts.main')
|
||||
|
||||
@section('content')
|
||||
<!-- CONTENT HEADER -->
|
||||
<section class="content-header">
|
||||
<div class="container-fluid">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
<h1>{{__('Partners')}}</h1>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<ol class="breadcrumb float-sm-right">
|
||||
<li class="breadcrumb-item"><a href="{{route('home')}}">{{__('Dashboard')}}</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{route('admin.partners.index')}}">{{__('Partners')}}</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item"><a class="text-muted"
|
||||
href="{{route('admin.partners.edit' , $partner->id)}}">{{__('Edit')}}</a>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<!-- END CONTENT HEADER -->
|
||||
|
||||
<!-- MAIN CONTENT -->
|
||||
<section class="content">
|
||||
<div class="container-fluid">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">
|
||||
<i class="fas fa-handshake mr-2"></i>{{__('Partner details')}}
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{route('admin.partners.update' , $partner->id)}}" method="POST">
|
||||
@csrf
|
||||
@method('PATCH')
|
||||
|
||||
<div class="form-group">
|
||||
<label for="user_id">{{__('User')}}</label>
|
||||
<select id="user_id" style="width:100%"
|
||||
class="custom-select @error('user') is-invalid @enderror" name="user_id" autocomplete="off">
|
||||
@foreach($users as $user)
|
||||
<option @if($partners->contains('user_id' , $user->id)&&$partner->user_id!=$user->id) disabled @endif
|
||||
@if($partner->user_id==$user->id) selected @endif
|
||||
value="{{$user->id}}">{{$user->name}} ({{$user->email}})</option>
|
||||
@endforeach
|
||||
</select>
|
||||
@error('user')
|
||||
<div class="text-danger">
|
||||
{{$message}}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="partner_discount">{{__('Partner discount')}}</label>
|
||||
<input value="{{$partner->partner_discount}}" placeholder="{{__('Discount in percent')}}" id="partner_discount" name="partner_discount"
|
||||
type="number" step="any" min="0" max="100"
|
||||
class="form-control @error('partner_discount') is-invalid @enderror">
|
||||
@error('partner_discount')
|
||||
<div class="text-danger">
|
||||
{{$message}}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<label for="registered_user_discount">{{__('Registered user discount')}}</label>
|
||||
<div class="input-group">
|
||||
<input value="{{$partner->registered_user_discount}}" placeholder="Discount in percent" id="registered_user_discount" name="registered_user_discount"
|
||||
type="number" class="form-control @error('registered_user_discount') is-invalid @enderror"
|
||||
required="required">
|
||||
</div>
|
||||
@error('registered_user_discount')
|
||||
<div class="text-danger">
|
||||
{{$message}}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="referral_system_commission">{{__('Referral system commission')}}
|
||||
<i data-toggle="popover" data-trigger="hover"
|
||||
data-content="{{__('Override value for referral system commission. You can set it to -1 to get the default commission from settings.')}}"
|
||||
class="fas fa-info-circle"></i>
|
||||
</label>
|
||||
<input value="{{$partner->referral_system_commission}}" placeholder="{{__('Commission in percent')}}" id="referral_system_commission" name="referral_system_commission"
|
||||
type="number" step="any" min="-1" max="100"
|
||||
class="form-control @error('referral_system_commission') is-invalid @enderror">
|
||||
@error('referral_system_commission')
|
||||
<div class="text-danger">
|
||||
{{$message}}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group text-right">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{{__('Submit')}}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
<!-- END CONTENT -->
|
||||
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', (event) => {
|
||||
$('#expires_at').datetimepicker({
|
||||
format: 'DD-MM-yyyy HH:mm:ss',
|
||||
icons: {
|
||||
time: 'far fa-clock',
|
||||
date: 'far fa-calendar',
|
||||
up: 'fas fa-arrow-up',
|
||||
down: 'fas fa-arrow-down',
|
||||
previous: 'fas fa-chevron-left',
|
||||
next: 'fas fa-chevron-right',
|
||||
today: 'fas fa-calendar-check',
|
||||
clear: 'far fa-trash-alt',
|
||||
close: 'far fa-times-circle'
|
||||
}
|
||||
});
|
||||
})
|
||||
function setMaxUses() {
|
||||
let element = document.getElementById('uses')
|
||||
element.value = element.max;
|
||||
console.log(element.max)
|
||||
}
|
||||
function setRandomCode() {
|
||||
let element = document.getElementById('code')
|
||||
element.value = getRandomCode(36)
|
||||
}
|
||||
function getRandomCode(length) {
|
||||
let result = '';
|
||||
let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-';
|
||||
let charactersLength = characters.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
result += characters.charAt(Math.floor(Math.random() *
|
||||
charactersLength));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@endsection
|
92
resources/views/admin/partners/index.blade.php
Normal file
92
resources/views/admin/partners/index.blade.php
Normal file
|
@ -0,0 +1,92 @@
|
|||
@extends('layouts.main')
|
||||
|
||||
@section('content')
|
||||
<!-- CONTENT HEADER -->
|
||||
<section class="content-header">
|
||||
<div class="container-fluid">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
<h1>{{__('Partners')}}</h1>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<ol class="breadcrumb float-sm-right">
|
||||
<li class="breadcrumb-item"><a href="{{route('home')}}">{{__('Dashboard')}}</a></li>
|
||||
<li class="breadcrumb-item"><a class="text-muted"
|
||||
href="{{route('admin.partners.index')}}">{{__('Partners')}}</a></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<!-- END CONTENT HEADER -->
|
||||
|
||||
<!-- MAIN CONTENT -->
|
||||
<section class="content">
|
||||
<div class="container-fluid">
|
||||
|
||||
<div class="card">
|
||||
|
||||
<div class="card-header">
|
||||
<div class="d-flex justify-content-between">
|
||||
<h5 class="card-title"><i class="fas fa-handshake mr-2"></i>{{__('Partners')}}</h5>
|
||||
<a href="{{route('admin.partners.create')}}" class="btn btn-sm btn-primary"><i
|
||||
class="fas fa-plus mr-1"></i>{{__('Create new')}}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body table-responsive">
|
||||
|
||||
<table id="datatable" class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{__('User')}}</th>
|
||||
<th>{{__('Partner discount')}}</th>
|
||||
<th>{{__('Registered user discount')}}</th>
|
||||
<th>{{__('Created')}}</th>
|
||||
<th>{{__('Actions')}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<!-- END CUSTOM CONTENT -->
|
||||
|
||||
</section>
|
||||
<!-- END CONTENT -->
|
||||
|
||||
<script>
|
||||
function submitResult() {
|
||||
return confirm("{{__('Are you sure you wish to delete?')}}") !== false;
|
||||
}
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
$('#datatable').DataTable({
|
||||
language: {
|
||||
url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
|
||||
},
|
||||
processing: true,
|
||||
serverSide: true,
|
||||
stateSave: true,
|
||||
ajax: "{{route('admin.partners.datatable')}}",
|
||||
columns: [
|
||||
{data: 'user'},
|
||||
{data: 'partner_discount'},
|
||||
{data: 'registered_user_discount'},
|
||||
{data: 'created_at'},
|
||||
{data: 'actions', sortable: false}
|
||||
],
|
||||
fnDrawCallback: function( oSettings ) {
|
||||
$('[data-toggle="popover"]').popover();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@endsection
|
|
@ -319,6 +319,14 @@
|
|||
</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="{{ route('admin.partners.index') }}"
|
||||
class="nav-link @if (Request::routeIs('admin.partners.*')) active @endif">
|
||||
<i class="nav-icon fas fa-handshake"></i>
|
||||
<p>{{ __('Partners') }}</p>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
{{-- <li class="nav-header">Pterodactyl</li> --}}
|
||||
|
||||
{{-- <li class="nav-item"> --}}
|
||||
|
|
|
@ -107,18 +107,20 @@
|
|||
|
||||
<div class="table-responsive">
|
||||
<table class="table">
|
||||
@if($discountpercent&&$discountvalue)
|
||||
<tr>
|
||||
<th>{{ __('Discount') }} ({{ $discountpercent }}%):</th>
|
||||
<td>{{$product->formatToCurrency($discountvalue)}}</td>
|
||||
</tr>
|
||||
@endif
|
||||
<tr>
|
||||
<th style="width:50%">{{ __('Subtotal') }}:</th>
|
||||
<td>{{ $product->formatToCurrency($product->price) }}</td>
|
||||
<td>{{ $product->formatToCurrency($discountedprice) }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ __('Tax') }} ({{ $taxpercent }}%)</th>
|
||||
<th>{{ __('Tax') }} ({{ $taxpercent }}%):</th>
|
||||
<td>{{ $product->formatToCurrency($taxvalue) }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ __('Quantity') }}:</th>
|
||||
<td>1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ __('Total') }}:</th>
|
||||
<td>{{ $product->formatToCurrency($total) }}</td>
|
||||
|
@ -154,7 +156,6 @@
|
|||
//loading
|
||||
paymentMethod: '',
|
||||
paymentRoute: '',
|
||||
|
||||
setPaymentRoute(provider) {
|
||||
switch (provider) {
|
||||
case 'paypal':
|
||||
|
@ -167,12 +168,9 @@
|
|||
this.paymentRoute = '{{ route('payment.PaypalPay', $product->id) }}';
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@endsection
|
||||
@endsection
|
|
@ -30,6 +30,7 @@ use Illuminate\Support\Facades\Route;
|
|||
use App\Classes\Settings\Language;
|
||||
use App\Classes\Settings\Invoices;
|
||||
use App\Classes\Settings\System;
|
||||
use App\Http\Controllers\PartnerController;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
@ -173,6 +174,11 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () {
|
|||
Route::get('vouchers/{voucher}/users', [VoucherController::class, 'users'])->name('vouchers.users');
|
||||
Route::resource('vouchers', VoucherController::class);
|
||||
|
||||
#partners
|
||||
Route::get('partners/datatable', [PartnerController::class, 'datatable'])->name('partners.datatable');
|
||||
Route::get('partners/{voucher}/users', [PartnerController::class, 'users'])->name('partners.users');
|
||||
Route::resource('partners', PartnerController::class);
|
||||
|
||||
#api-keys
|
||||
Route::get('api/datatable', [ApplicationApiController::class, 'datatable'])->name('api.datatable');
|
||||
Route::resource('api', ApplicationApiController::class)->parameters([
|
||||
|
@ -198,4 +204,4 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () {
|
|||
});
|
||||
|
||||
Route::get('/home', [HomeController::class, 'index'])->name('home');
|
||||
});
|
||||
});
|
Loading…
Add table
Reference in a new issue