From 3a53ddbc59a8302052617896008c94bb2eaaf9f6 Mon Sep 17 00:00:00 2001 From: ok236449 Date: Sat, 27 Aug 2022 18:59:07 +0200 Subject: [PATCH] partner discounts and their referrals --- .../Controllers/Admin/PaymentController.php | 26 ++- app/Http/Controllers/PartnerController.php | 203 ++++++++++++++++++ app/Models/PartnerDiscount.php | 40 ++++ app/Models/ShopProduct.php | 11 +- ..._202109_create_partner_discounts_table.php | 35 +++ .../views/admin/partners/create.blade.php | 139 ++++++++++++ resources/views/admin/partners/edit.blade.php | 158 ++++++++++++++ .../views/admin/partners/index.blade.php | 92 ++++++++ resources/views/layouts/main.blade.php | 8 + resources/views/store/checkout.blade.php | 20 +- routes/web.php | 8 +- 11 files changed, 714 insertions(+), 26 deletions(-) create mode 100644 app/Http/Controllers/PartnerController.php create mode 100644 app/Models/PartnerDiscount.php create mode 100644 database/migrations/2022_08_25_202109_create_partner_discounts_table.php create mode 100644 resources/views/admin/partners/create.blade.php create mode 100644 resources/views/admin/partners/edit.blade.php create mode 100644 resources/views/admin/partners/index.blade.php diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 8d3a0d23..086da7b7 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/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); } -} +} \ No newline at end of file diff --git a/app/Http/Controllers/PartnerController.php b/app/Http/Controllers/PartnerController.php new file mode 100644 index 00000000..7d11f417 --- /dev/null +++ b/app/Http/Controllers/PartnerController.php @@ -0,0 +1,203 @@ +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 '' . $user->name . ''; + }) + ->addColumn('credits', function (User $user) { + return ' ' . $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 ' + +
+ ' . csrf_field() . ' + ' . method_field("DELETE") . ' + +
+ '; + }) + ->addColumn('user', function (PartnerDiscount $partner) { + return ($user=User::where('id', $partner->user_id)->first())?''.$user->name.'':__('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(); + } +} \ No newline at end of file diff --git a/app/Models/PartnerDiscount.php b/app/Models/PartnerDiscount.php new file mode 100644 index 00000000..1c49e00c --- /dev/null +++ b/app/Models/PartnerDiscount.php @@ -0,0 +1,40 @@ +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"); + } +} \ No newline at end of file diff --git a/app/Models/ShopProduct.php b/app/Models/ShopProduct.php index 4d158be8..3339a169 100644 --- a/app/Models/ShopProduct.php +++ b/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); } -} +} \ No newline at end of file diff --git a/database/migrations/2022_08_25_202109_create_partner_discounts_table.php b/database/migrations/2022_08_25_202109_create_partner_discounts_table.php new file mode 100644 index 00000000..976aa3a8 --- /dev/null +++ b/database/migrations/2022_08_25_202109_create_partner_discounts_table.php @@ -0,0 +1,35 @@ +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'); + } +} \ No newline at end of file diff --git a/resources/views/admin/partners/create.blade.php b/resources/views/admin/partners/create.blade.php new file mode 100644 index 00000000..8ac26d54 --- /dev/null +++ b/resources/views/admin/partners/create.blade.php @@ -0,0 +1,139 @@ +@extends('layouts.main') + +@section('content') + +
+
+
+
+

{{__('Vouchers')}}

+
+ +
+
+
+ + + +
+
+ +
+
+
+
+
+ {{__('Partner details')}} +
+
+
+
+ @csrf + +
+ + + @error('user') +
+ {{$message}} +
+ @enderror +
+ +
+ + + @error('partner_discount') +
+ {{$message}} +
+ @enderror +
+ + +
+ +
+ +
+ @error('registered_user_discount') +
+ {{$message}} +
+ @enderror +
+ +
+ + + @error('referral_system_commission') +
+ {{$message}} +
+ @enderror +
+ +
+ +
+
+
+
+
+
+ + + +
+
+ + + + + + +@endsection \ No newline at end of file diff --git a/resources/views/admin/partners/edit.blade.php b/resources/views/admin/partners/edit.blade.php new file mode 100644 index 00000000..2806f749 --- /dev/null +++ b/resources/views/admin/partners/edit.blade.php @@ -0,0 +1,158 @@ +@extends('layouts.main') + +@section('content') + +
+
+
+
+

{{__('Partners')}}

+
+ +
+
+
+ + + +
+
+ +
+
+
+
+
+ {{__('Partner details')}} +
+
+
+
+ @csrf + @method('PATCH') + +
+ + + @error('user') +
+ {{$message}} +
+ @enderror +
+ +
+ + + @error('partner_discount') +
+ {{$message}} +
+ @enderror +
+ + +
+ +
+ +
+ @error('registered_user_discount') +
+ {{$message}} +
+ @enderror +
+ +
+ + + @error('referral_system_commission') +
+ {{$message}} +
+ @enderror +
+ +
+ +
+
+
+
+
+
+ +
+
+ + + + + + +@endsection \ No newline at end of file diff --git a/resources/views/admin/partners/index.blade.php b/resources/views/admin/partners/index.blade.php new file mode 100644 index 00000000..ae66aaf6 --- /dev/null +++ b/resources/views/admin/partners/index.blade.php @@ -0,0 +1,92 @@ +@extends('layouts.main') + +@section('content') + +
+
+
+
+

{{__('Partners')}}

+
+ +
+
+
+ + + +
+
+ +
+ +
+
+
{{__('Partners')}}
+ {{__('Create new')}} +
+
+ +
+ + + + + + + + + + + + + +
{{__('User')}}{{__('Partner discount')}}{{__('Registered user discount')}}{{__('Created')}}{{__('Actions')}}
+ +
+
+ + +
+ + +
+ + + + + + +@endsection \ No newline at end of file diff --git a/resources/views/layouts/main.blade.php b/resources/views/layouts/main.blade.php index ae31b5e1..384f08d6 100644 --- a/resources/views/layouts/main.blade.php +++ b/resources/views/layouts/main.blade.php @@ -319,6 +319,14 @@ + + {{-- --}} {{--