CouponController.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Coupon;
  5. use App\Settings\LocaleSettings;
  6. use App\Traits\Coupon as CouponTrait;
  7. use Illuminate\Http\Request;
  8. use Carbon\Carbon;
  9. class CouponController extends Controller
  10. {
  11. const READ_PERMISSION = "admin.coupons.read";
  12. const WRITE_PERMISSION = "admin.coupons.write";
  13. use CouponTrait;
  14. /**
  15. * Display a listing of the resource.
  16. *
  17. * @return \Illuminate\Http\Response
  18. */
  19. public function index(LocaleSettings $localeSettings)
  20. {
  21. $this->checkPermission(self::READ_PERMISSION);
  22. return view('admin.coupons.index', [
  23. 'locale_datatables' => $localeSettings->datatables
  24. ]);
  25. }
  26. /**
  27. * Show the form for creating a new resource.
  28. *
  29. * @return \Illuminate\Http\Response
  30. */
  31. public function create()
  32. {
  33. $this->checkPermission(self::WRITE_PERMISSION);
  34. return view('admin.coupons.create');
  35. }
  36. /**
  37. * Store a newly created resource in storage.
  38. *
  39. * @param \Illuminate\Http\Request $request
  40. * @return \Illuminate\Http\Response
  41. */
  42. public function store(Request $request)
  43. {
  44. $coupon_code = $request->input('code');
  45. $random_codes_amount = $request->input('range_codes');
  46. $rules = $this->requestRules($request);
  47. // If for some reason you pass both fields at once.
  48. if ($coupon_code && $random_codes_amount) {
  49. return redirect()->back()->with('error', __('Only one of the two code inputs must be provided.'))->withInput($request->all());
  50. }
  51. if (!$coupon_code && !$random_codes_amount) {
  52. return redirect()->back()->with('error', __('At least one of the two code inputs must be provided.'))->withInput($request->all());
  53. }
  54. $request->validate($rules);
  55. if (array_key_exists('range_codes', $rules)) {
  56. $data = [];
  57. $coupons = Coupon::generateRandomCoupon($random_codes_amount);
  58. // Scroll through all the randomly generated coupons.
  59. foreach ($coupons as $coupon) {
  60. $data[] = [
  61. 'code' => $coupon,
  62. 'type' => $request->input('type'),
  63. 'value' => $request->input('value'),
  64. 'max_uses' => $request->input('max_uses'),
  65. 'expires_at' => $request->input('expires_at'),
  66. 'created_at' => Carbon::now(), // Does not fill in by itself when using the 'insert' method.
  67. 'updated_at' => Carbon::now()
  68. ];
  69. }
  70. Coupon::insert($data);
  71. } else {
  72. Coupon::create($request->except('_token'));
  73. }
  74. return redirect()->route('admin.coupons.index')->with('success', __("The coupon's was registered successfully."));
  75. }
  76. /**
  77. * Display the specified resource.
  78. *
  79. * @param \App\Models\Coupon $coupon
  80. * @return \Illuminate\Http\Response
  81. */
  82. public function show(Coupon $coupon)
  83. {
  84. //
  85. }
  86. /**
  87. * Show the form for editing the specified resource.
  88. *
  89. * @param \App\Models\Coupon $coupon
  90. * @return \Illuminate\Http\Response
  91. */
  92. public function edit(Coupon $coupon)
  93. {
  94. $this->checkPermission(self::WRITE_PERMISSION);
  95. return view('admin.coupons.edit', [
  96. 'coupon' => $coupon,
  97. 'expired_at' => $coupon->expires_at ? Carbon::createFromTimestamp($coupon->expires_at) : null
  98. ]);
  99. }
  100. /**
  101. * Update the specified resource in storage.
  102. *
  103. * @param \Illuminate\Http\Request $request
  104. * @param \App\Models\Coupon $coupon
  105. * @return \Illuminate\Http\Response
  106. */
  107. public function update(Request $request, Coupon $coupon)
  108. {
  109. $coupon_code = $request->input('code');
  110. $random_codes_amount = $request->input('range_codes');
  111. $rules = $this->requestRules($request);
  112. // If for some reason you pass both fields at once.
  113. if ($coupon_code && $random_codes_amount) {
  114. return redirect()->back()->with('error', __('Only one of the two code inputs must be provided.'))->withInput($request->all());
  115. }
  116. if (!$coupon_code && !$random_codes_amount) {
  117. return redirect()->back()->with('error', __('At least one of the two code inputs must be provided.'))->withInput($request->all());
  118. }
  119. $request->validate($rules);
  120. $coupon->update($request->except('_token'));
  121. return redirect()->route('admin.coupons.index')->with('success', __('coupon has been updated!'));
  122. }
  123. /**
  124. * Remove the specified resource from storage.
  125. *
  126. * @param \App\Models\Coupon $coupon
  127. * @return \Illuminate\Http\Response
  128. */
  129. public function destroy(Coupon $coupon)
  130. {
  131. $this->checkPermission(self::WRITE_PERMISSION);
  132. $coupon->delete();
  133. return redirect()->back()->with('success', __('coupon has been removed!'));
  134. }
  135. private function requestRules(Request $request)
  136. {
  137. $coupon_code = $request->input('code');
  138. $random_codes_amount = $request->input('range_codes');
  139. $rules = [
  140. "type" => "required|string|in:percentage,amount",
  141. "max_uses" => "required|integer|digits_between:1,100",
  142. "value" => "required|numeric|between:0,100",
  143. "expires_at" => "nullable|date|after:" . Carbon::now()->format(Coupon::formatDate())
  144. ];
  145. if ($coupon_code) {
  146. $rules['code'] = "required|string|min:4";
  147. } elseif ($random_codes_amount) {
  148. $rules['range_codes'] = 'required|integer|digits_between:1,100';
  149. }
  150. return $rules;
  151. }
  152. public function redeem(Request $request)
  153. {
  154. return $this->validateCoupon($request->user(), $request->input('couponCode'), $request->input('productId'));
  155. }
  156. public function dataTable()
  157. {
  158. $query = Coupon::query();
  159. return datatables($query)
  160. ->addColumn('actions', function(Coupon $coupon) {
  161. return '
  162. <a data-content="'.__('Edit').'" data-toggle="popover" data-trigger="hover" data-placement="top" href="'.route('admin.coupons.edit', $coupon->id).'" class="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></i></a>
  163. <form class="d-inline" onsubmit="return submitResult();" method="post" action="'.route('admin.coupons.destroy', $coupon->id).'">
  164. '.csrf_field().'
  165. '.method_field('DELETE').'
  166. <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>
  167. </form>
  168. ';
  169. })
  170. ->addColumn('status', function(Coupon $coupon) {
  171. $color = 'success';
  172. $status = $coupon->getStatus();
  173. if ($status != __('VALID')) {
  174. $color = 'danger';
  175. }
  176. return '<span class="badge badge-'.$color.'">'.str_replace('_', ' ', $status).'</span>';
  177. })
  178. ->editColumn('uses', function (Coupon $coupon) {
  179. return "{$coupon->uses} / {$coupon->max_uses}";
  180. })
  181. ->editColumn('value', function (Coupon $coupon) {
  182. if ($coupon->type === 'percentage') {
  183. return $coupon->value . "%";
  184. }
  185. return number_format($coupon->value, 2, '.', '');
  186. })
  187. ->editColumn('expires_at', function (Coupon $coupon) {
  188. if (!$coupon->expires_at) {
  189. return __('Never');
  190. }
  191. return Carbon::createFromTimestamp($coupon->expires_at);
  192. })
  193. ->editColumn('created_at', function(Coupon $coupon) {
  194. return Carbon::createFromTimeString($coupon->created_at);
  195. })
  196. ->editColumn('code', function (Coupon $coupon) {
  197. return "<code>{$coupon->code}</code>";
  198. })
  199. ->rawColumns(['actions', 'code', 'status'])
  200. ->make();
  201. }
  202. }