checkPermission(self::READ_PERMISSION); return view('admin.coupons.index', [ 'locale_datatables' => $localeSettings->datatables ]); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { $this->checkPermission(self::WRITE_PERMISSION); return view('admin.coupons.create'); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $coupon_code = $request->input('code'); $random_codes_amount = $request->input('range_codes'); $rules = $this->requestRules($request); // If for some reason you pass both fields at once. if ($coupon_code && $random_codes_amount) { return redirect()->back()->with('error', __('Only one of the two code inputs must be provided.'))->withInput($request->all()); } if (!$coupon_code && !$random_codes_amount) { return redirect()->back()->with('error', __('At least one of the two code inputs must be provided.'))->withInput($request->all()); } $request->validate($rules); if (array_key_exists('range_codes', $rules)) { $data = []; $coupons = Coupon::generateRandomCoupon($random_codes_amount); // Scroll through all the randomly generated coupons. foreach ($coupons as $coupon) { $data[] = [ 'code' => $coupon, 'type' => $request->input('type'), 'value' => $request->input('value'), 'max_uses' => $request->input('max_uses'), 'expires_at' => $request->input('expires_at'), 'created_at' => Carbon::now(), // Does not fill in by itself when using the 'insert' method. 'updated_at' => Carbon::now() ]; } Coupon::insert($data); } else { Coupon::create($request->except('_token')); } return redirect()->route('admin.coupons.index')->with('success', __("The coupon's was registered successfully.")); } /** * Display the specified resource. * * @param \App\Models\Coupon $coupon * @return \Illuminate\Http\Response */ public function show(Coupon $coupon) { // } /** * Show the form for editing the specified resource. * * @param \App\Models\Coupon $coupon * @return \Illuminate\Http\Response */ public function edit(Coupon $coupon) { $this->checkPermission(self::WRITE_PERMISSION); return view('admin.coupons.edit', [ 'coupon' => $coupon, 'expired_at' => $coupon->expires_at ? Carbon::createFromTimestamp($coupon->expires_at) : null ]); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param \App\Models\Coupon $coupon * @return \Illuminate\Http\Response */ public function update(Request $request, Coupon $coupon) { $coupon_code = $request->input('code'); $random_codes_amount = $request->input('range_codes'); $rules = $this->requestRules($request); // If for some reason you pass both fields at once. if ($coupon_code && $random_codes_amount) { return redirect()->back()->with('error', __('Only one of the two code inputs must be provided.'))->withInput($request->all()); } if (!$coupon_code && !$random_codes_amount) { return redirect()->back()->with('error', __('At least one of the two code inputs must be provided.'))->withInput($request->all()); } $request->validate($rules); $coupon->update($request->except('_token')); return redirect()->route('admin.coupons.index')->with('success', __('coupon has been updated!')); } /** * Remove the specified resource from storage. * * @param \App\Models\Coupon $coupon * @return \Illuminate\Http\Response */ public function destroy(Coupon $coupon) { $this->checkPermission(self::WRITE_PERMISSION); $coupon->delete(); return redirect()->back()->with('success', __('coupon has been removed!')); } private function requestRules(Request $request) { $coupon_code = $request->input('code'); $random_codes_amount = $request->input('range_codes'); $rules = [ "type" => "required|string|in:percentage,amount", "max_uses" => "required|integer|digits_between:1,100", "value" => "required|numeric|between:0,100", "expires_at" => "nullable|date|after:" . Carbon::now()->format(Coupon::formatDate()) ]; if ($coupon_code) { $rules['code'] = "required|string|min:4"; } elseif ($random_codes_amount) { $rules['range_codes'] = 'required|integer|digits_between:1,100'; } return $rules; } public function redeem(Request $request) { return $this->validateCoupon($request->user(), $request->input('couponCode'), $request->input('productId')); } public function dataTable() { $query = Coupon::query(); return datatables($query) ->addColumn('actions', function(Coupon $coupon) { return '
'.csrf_field().' '.method_field('DELETE').'
'; }) ->addColumn('status', function(Coupon $coupon) { $color = 'success'; $status = $coupon->getStatus(); if ($status != __('VALID')) { $color = 'danger'; } return ''.str_replace('_', ' ', $status).''; }) ->editColumn('uses', function (Coupon $coupon) { return "{$coupon->uses} / {$coupon->max_uses}"; }) ->editColumn('value', function (Coupon $coupon) { if ($coupon->type === 'percentage') { return $coupon->value . "%"; } return number_format($coupon->value, 2, '.', ''); }) ->editColumn('expires_at', function (Coupon $coupon) { if (!$coupon->expires_at) { return __('Never'); } return Carbon::createFromTimestamp($coupon->expires_at); }) ->editColumn('created_at', function(Coupon $coupon) { return Carbon::createFromTimeString($coupon->created_at); }) ->editColumn('code', function (Coupon $coupon) { return "{$coupon->code}"; }) ->rawColumns(['actions', 'code', 'status']) ->make(); } }