瀏覽代碼

partner discounts and their referrals

ok236449 2 年之前
父節點
當前提交
3a53ddbc59

+ 15 - 11
app/Http/Controllers/Admin/PaymentController.php

@@ -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 - 0
app/Http/Controllers/PartnerController.php

@@ -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 - 0
app/Models/PartnerDiscount.php

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

+ 8 - 3
app/Models/ShopProduct.php

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

+ 35 - 0
database/migrations/2022_08_25_202109_create_partner_discounts_table.php

@@ -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 - 0
resources/views/admin/partners/create.blade.php

@@ -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 - 0
resources/views/admin/partners/edit.blade.php

@@ -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 - 0
resources/views/admin/partners/index.blade.php

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

+ 8 - 0
resources/views/layouts/main.blade.php

@@ -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"> --}}

+ 9 - 11
resources/views/store/checkout.blade.php

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

+ 7 - 1
routes/web.php

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