PartnerController.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\PartnerDiscount;
  4. use App\Models\User;
  5. use Illuminate\Http\Request;
  6. class PartnerController extends Controller
  7. {
  8. public function index()
  9. {
  10. return view('admin.partners.index');
  11. }
  12. /**
  13. * Show the form for creating a new resource.
  14. *
  15. * @return Application|Factory|View
  16. */
  17. public function create()
  18. {
  19. return view('admin.partners.create', [
  20. 'partners' =>PartnerDiscount::get(),
  21. 'users' => User::orderBy('name')->get()
  22. ]);
  23. }
  24. /**
  25. * Store a newly created resource in storage.
  26. *
  27. * @param Request $request
  28. * @return RedirectResponse
  29. */
  30. public function store(Request $request)
  31. {
  32. $request->validate([
  33. 'user_id' => 'required|integer|min:0',
  34. 'partner_discount' => 'required|integer|max:100|min:0',
  35. 'registered_user_discount' => 'required|integer|max:100|min:0'
  36. ]);
  37. PartnerDiscount::create($request->all());
  38. return redirect()->route('admin.partners.index')->with('success', __('partner has been created!'));
  39. }
  40. /**
  41. * Display the specified resource.
  42. *
  43. * @param Voucher $voucher
  44. * @return Response
  45. */
  46. public function show(Voucher $voucher)
  47. {
  48. //
  49. }
  50. /**
  51. * Show the form for editing the specified resource.
  52. *
  53. * @param Voucher $voucher
  54. * @return Application|Factory|View
  55. */
  56. public function edit(PartnerDiscount $partner)
  57. {
  58. return view('admin.partners.edit', [
  59. 'partners' =>PartnerDiscount::get(),
  60. 'partner' => $partner,
  61. 'users' => User::orderBy('name')->get()
  62. ]);
  63. }
  64. /**
  65. * Update the specified resource in storage.
  66. *
  67. * @param Request $request
  68. * @param Voucher $voucher
  69. * @return RedirectResponse
  70. */
  71. public function update(Request $request, PartnerDiscount $partner)
  72. {
  73. //dd($request);
  74. $request->validate([
  75. 'user_id' => 'required|integer|min:0',
  76. 'partner_discount' => 'required|integer|max:100|min:0',
  77. 'registered_user_discount' => 'required|integer|max:100|min:0'
  78. ]);
  79. $partner->update($request->all());
  80. return redirect()->route('admin.partners.index')->with('success', __('partner has been updated!'));
  81. }
  82. /**
  83. * Remove the specified resource from storage.
  84. *
  85. * @param Voucher $voucher
  86. * @return RedirectResponse
  87. */
  88. public function destroy(PartnerDiscount $partner)
  89. {
  90. $partner->delete();
  91. return redirect()->back()->with('success', __('partner has been removed!'));
  92. }
  93. public function users(Voucher $voucher)
  94. {
  95. return view('admin.vouchers.users', [
  96. 'voucher' => $voucher
  97. ]);
  98. }
  99. /**
  100. * @param Request $request
  101. * @return JsonResponse
  102. * @throws ValidationException
  103. */
  104. public function redeem(Request $request)
  105. {
  106. #general validations
  107. $request->validate([
  108. 'code' => 'required|exists:vouchers,code'
  109. ]);
  110. #get voucher by code
  111. $voucher = Voucher::where('code', '=', $request->input('code'))->firstOrFail();
  112. #extra validations
  113. if ($voucher->getStatus() == 'USES_LIMIT_REACHED') throw ValidationException::withMessages([
  114. 'code' => __('This voucher has reached the maximum amount of uses')
  115. ]);
  116. if ($voucher->getStatus() == 'EXPIRED') throw ValidationException::withMessages([
  117. 'code' => __('This voucher has expired')
  118. ]);
  119. if (!$request->user()->vouchers()->where('id', '=', $voucher->id)->get()->isEmpty()) throw ValidationException::withMessages([
  120. 'code' => __('You already redeemed this voucher code')
  121. ]);
  122. if ($request->user()->credits + $voucher->credits >= 99999999) throw ValidationException::withMessages([
  123. 'code' => "You can't redeem this voucher because you would exceed the limit of " . CREDITS_DISPLAY_NAME
  124. ]);
  125. #redeem voucher
  126. $voucher->redeem($request->user());
  127. event(new UserUpdateCreditsEvent($request->user()));
  128. return response()->json([
  129. 'success' => "{$voucher->credits} " . CREDITS_DISPLAY_NAME ." ". __("have been added to your balance!")
  130. ]);
  131. }
  132. public function usersDataTable(Voucher $voucher)
  133. {
  134. $users = $voucher->users();
  135. return datatables($users)
  136. ->editColumn('name', function (User $user) {
  137. return '<a class="text-info" target="_blank" href="' . route('admin.users.show', $user->id) . '">' . $user->name . '</a>';
  138. })
  139. ->addColumn('credits', function (User $user) {
  140. return '<i class="fas fa-coins mr-2"></i> ' . $user->credits();
  141. })
  142. ->addColumn('last_seen', function (User $user) {
  143. return $user->last_seen ? $user->last_seen->diffForHumans() : '';
  144. })
  145. ->rawColumns(['name', 'credits', 'last_seen'])
  146. ->make();
  147. }
  148. public function dataTable()
  149. {
  150. $query = PartnerDiscount::query();
  151. return datatables($query)
  152. ->addColumn('actions', function (PartnerDiscount $partner) {
  153. return '
  154. <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>
  155. <form class="d-inline" onsubmit="return submitResult();" method="post" action="' . route('admin.partners.destroy', $partner->id) . '">
  156. ' . csrf_field() . '
  157. ' . method_field("DELETE") . '
  158. <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>
  159. </form>
  160. ';
  161. })
  162. ->addColumn('user', function (PartnerDiscount $partner) {
  163. return ($user=User::where('id', $partner->user_id)->first())?'<a href="'.route('admin.users.show', $partner->user_id).'">'.$user->name.'</a>':__('Unknown user');
  164. })
  165. ->editColumn('created_at', function (PartnerDiscount $partner) {
  166. return $partner->created_at ? $partner->created_at->diffForHumans() : '';
  167. })
  168. ->editColumn('partner_discount', function (PartnerDiscount $partner) {
  169. return $partner->partner_discount ? $partner->partner_discount . "%" : "0%";
  170. })
  171. ->editColumn('registered_user_discount', function (PartnerDiscount $partner) {
  172. return $partner->registered_user_discount ? $partner->registered_user_discount . "%" : "0%";
  173. })
  174. ->editColumn('referral_system_commission', function (PartnerDiscount $partner) {
  175. return $partner->referral_system_commission>=0 ? $partner->referral_system_commission . "%" : __('Default') . " (" . config("SETTINGS::REFERRAL:PERCENTAGE") . "%)";
  176. })
  177. ->rawColumns(['user', 'actions'])
  178. ->make();
  179. }
  180. }