PartnerController.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. *
  103. * @throws ValidationException
  104. */
  105. public function redeem(Request $request)
  106. {
  107. //general validations
  108. $request->validate([
  109. 'code' => 'required|exists:vouchers,code',
  110. ]);
  111. //get voucher by code
  112. $voucher = Voucher::where('code', '=', $request->input('code'))->firstOrFail();
  113. //extra validations
  114. if ($voucher->getStatus() == 'USES_LIMIT_REACHED') {
  115. throw ValidationException::withMessages([
  116. 'code' => __('This voucher has reached the maximum amount of uses'),
  117. ]);
  118. }
  119. if ($voucher->getStatus() == 'EXPIRED') {
  120. throw ValidationException::withMessages([
  121. 'code' => __('This voucher has expired'),
  122. ]);
  123. }
  124. if (! $request->user()->vouchers()->where('id', '=', $voucher->id)->get()->isEmpty()) {
  125. throw ValidationException::withMessages([
  126. 'code' => __('You already redeemed this voucher code'),
  127. ]);
  128. }
  129. if ($request->user()->credits + $voucher->credits >= 99999999) {
  130. throw ValidationException::withMessages([
  131. 'code' => "You can't redeem this voucher because you would exceed the limit of ".CREDITS_DISPLAY_NAME,
  132. ]);
  133. }
  134. //redeem voucher
  135. $voucher->redeem($request->user());
  136. event(new UserUpdateCreditsEvent($request->user()));
  137. return response()->json([
  138. 'success' => "{$voucher->credits} ".CREDITS_DISPLAY_NAME.' '.__('have been added to your balance!'),
  139. ]);
  140. }
  141. public function usersDataTable(Voucher $voucher)
  142. {
  143. $users = $voucher->users();
  144. return datatables($users)
  145. ->editColumn('name', function (User $user) {
  146. return '<a class="text-info" target="_blank" href="'.route('admin.users.show', $user->id).'">'.$user->name.'</a>';
  147. })
  148. ->addColumn('credits', function (User $user) {
  149. return '<i class="fas fa-coins mr-2"></i> '.$user->credits();
  150. })
  151. ->addColumn('last_seen', function (User $user) {
  152. return $user->last_seen ? $user->last_seen->diffForHumans() : '';
  153. })
  154. ->rawColumns(['name', 'credits', 'last_seen'])
  155. ->make();
  156. }
  157. public function dataTable()
  158. {
  159. $query = PartnerDiscount::query();
  160. return datatables($query)
  161. ->addColumn('actions', function (PartnerDiscount $partner) {
  162. return '
  163. <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>
  164. <form class="d-inline" onsubmit="return submitResult();" method="post" action="'.route('admin.partners.destroy', $partner->id).'">
  165. '.csrf_field().'
  166. '.method_field('DELETE').'
  167. <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>
  168. </form>
  169. ';
  170. })
  171. ->addColumn('user', function (PartnerDiscount $partner) {
  172. return ($user = User::where('id', $partner->user_id)->first()) ? '<a href="'.route('admin.users.show', $partner->user_id).'">'.$user->name.'</a>' : __('Unknown user');
  173. })
  174. ->editColumn('created_at', function (PartnerDiscount $partner) {
  175. return $partner->created_at ? $partner->created_at->diffForHumans() : '';
  176. })
  177. ->editColumn('partner_discount', function (PartnerDiscount $partner) {
  178. return $partner->partner_discount ? $partner->partner_discount.'%' : '0%';
  179. })
  180. ->editColumn('registered_user_discount', function (PartnerDiscount $partner) {
  181. return $partner->registered_user_discount ? $partner->registered_user_discount.'%' : '0%';
  182. })
  183. ->editColumn('referral_system_commission', function (PartnerDiscount $partner) {
  184. return $partner->referral_system_commission >= 0 ? $partner->referral_system_commission.'%' : __('Default').' ('.config('SETTINGS::REFERRAL:PERCENTAGE').'%)';
  185. })
  186. ->rawColumns(['user', 'actions'])
  187. ->make();
  188. }
  189. }