function saving($model) { if (!$model->code) { do { $code = date("Ym") . strtoupper(str_random(5)); } while (IssuedVoucher::where('code', 'like', $code)->count()); $model->code = $code; } /////////// // RULES // /////////// $rules['tour_id'] = ['required', 'exists:tours,_id']; $rules['schedule_id'] = ['required']; $rules['voucher_id'] = ['required']; $rules['code'] = ['required', 'string', 'min:6', 'unique:issued_vouchers,code,' . ($model->_id ? $model->_id : null) . ',_id']; $rules['validated_at'] = ['date', 'date_format:Y-m-d H:i:s']; ////////////// // VALIDATE // ////////////// $validator = Validator::make($model->toArray(), $rules); if ($validator->fails()) { $model->setErrors($validator->messages()); return false; } ///////////////////////////// // CHECK IF ALREADY ISSUED // ///////////////////////////// $same_voucher = IssuedVoucher::where('schedule_id', '=', $model->schedule_id)->where('voucher_id', '=', $model->voucher_id)->first(); if ($same_voucher) { if ($model->_id && $model->_id != $same_voucher->_id) { $model->setErrors(new MessageBag(['duplicated' => 'User already register for this voucher'])); return false; } } }
function validated_voucher() { /////////////////// // GET PARAMETER // /////////////////// $filters = $this->request->only('start_date', 'end_date', 'travel_agent_id', 'skip', 'take'); $filters['take'] = min(max(1, $filters['take'] * 1), 50); $filters['skip'] = $filters['skip'] * 1; /////////// // Query // /////////// if ($filters['travel_agent_id']) { $query[][] = ['travel_agent_id' => $filters['travel_agent_id']]; } //////////////// // Start Date // //////////////// if (!$filters['start_date']) { $start_date = new \MongoDate(\Carbon\Carbon::now()->subDays(30)->timestamp); } else { try { $start_date = new \MongoDate(\Carbon\Carbon::parse($filters['start_date'])->timestamp); } catch (\Exception $e) { return response()->json(JSend::fail(['start' => ['Invalid start_date parameter: invalid date']])->asArray())->setCallback($this->request->input('callback')); } } ////////////// // End Date // ////////////// if (!$filters['end_date']) { $end_date = new \MongoDate(\Carbon\Carbon::now()->timestamp); } else { try { $end_date = new \MongoDate(\Carbon\Carbon::parse($filters['end_date'])->timestamp); } catch (\Exception $e) { return response()->json(JSend::fail(['start' => ['Invalid end_date parameter: invalid date']])->asArray())->setCallback($this->request->input('callback')); } } ////////////////////////////// // Compare Start & End Date // ////////////////////////////// if ($start_date > $end_date) { $tmp = $start_date; $start_date = $end_date; $end_date = $tmp; } if ($start_date) { $query[] = ['$match' => ['validated_at' => ['$gte' => $start_date, '$lte' => $end_date]]]; } ////////// // SORT // ////////// $query[] = ['$group' => ['_id' => ['year' => ['$year' => '$validated_at'], 'month' => ['$month' => '$validated_at'], 'day' => ['$dayOfMonth' => '$validated_at']], 'count' => ['$sum' => 1]]]; $vouchers = IssuedVoucher::raw(function ($collection) use($query) { return $collection->aggregate($query); }); if ($vouchers['ok']) { return response()->json(JSend::success(['data' => $vouchers['result']])->asArray())->setCallback($this->request->input('callback')); } else { return response()->json(JSend::fail(['InvalidCalculation' => 'Invalid Calculation'])->asArray())->setCallback($this->request->input('callback')); } }
function validate($code, $travel_agent_id) { ///////////////////////////////////////////// // GET unvalidated VOUCHER FROM TRAVEL AGENT // ///////////////////////////////////////////// $issued_voucher = IssuedVoucher::with('tour', 'tour.travel_agent', 'user')->where('code', 'regex', '/' . preg_quote($code) . '/i')->first(); if (!$issued_voucher) { return response()->json(JSend::fail(['VoucherNotFound' => 'Voucher not found'])->asArray())->setCallback($this->request->input('callback')); } ////////////////////////////////////////////////////// // Ensure travel agent is the same with validated one // ////////////////////////////////////////////////////// if ($issued_voucher->tour->travel_agent_id != $travel_agent_id) { return response()->json(JSend::fail(['VoucherNotFound' => 'Voucher not found'])->asArray())->setCallback($this->request->input('callback')); } ////////////////////////////////////////////////////// // Ensure unvalidated // ////////////////////////////////////////////////////// if ($issued_voucher->validated_at) { return response()->json(JSend::fail(['VoucherAlreadyValidated' => 'Voucher dengan kode "' . $issued_voucher->code . '" sudah divalidasi sebelumnya (Tgl ' . \Carbon\Carbon::parse($issued_voucher->validated_at)->format('d-m-Y') . ' jam ' . \Carbon\Carbon::parse($issued_voucher->validated_at)->format('H:i') . ')'])->asArray())->setCallback($this->request->input('callback')); } ////////////////////// // Issue Voucher // ////////////////////// $issued_voucher->validated_at = \Carbon\Carbon::now()->format('Y-m-d H:i:s'); if ($issued_voucher->save()) { return response()->json(JSend::success(['data' => $issued_voucher])->asArray())->setCallback($this->request->input('callback')); } else { return response()->json(JSend::fail($issued_voucher->getErrors())->asArray())->setCallback($this->request->input('callback')); } }
function syncVoucher($vouchers) { if (!$this->attributes) { return false; } //////////////////////////////// // Add address to this object // //////////////////////////////// foreach ($vouchers as $k => $voucher) { if ($voucher instanceof Voucher) { ////////////// // Validate // ////////////// $observer = new \App\Models\VoucherObserver(); if ($observer->saving($voucher) === false) { $this->setErrors($voucher->getErrors()); return false; } } } ///////////////////////////////////////////////////////////////// // Check if there's a deletion on voucher that has been issued // ///////////////////////////////////////////////////////////////// if ($this->vouchers->count()) { foreach ($this->vouchers as $voucher) { //////////////////////////////////////////////////////// // Check if old voucher is missing in current voucher // //////////////////////////////////////////////////////// $still_in_voucher_list = false; foreach ($vouchers as $new_voucher) { if ($new_voucher->_id == $voucher->_id) { $still_in_voucher_list = true; } } ////////////////////////////////////////////////// // For missing voucher, check if already issued // ////////////////////////////////////////////////// if (!$still_in_voucher_list) { if (IssuedVoucher::ScheduleId($this->_id)->voucherId($voucher->_id)->count()) { $this->setErrors(new MessageBag(['voucher.' . $k => 'Unable to delete voucher ' . $k . ' as it has issued voucher'])); return false; } } } } ////////////////////////////////////////////////////////////////// // Check if there's changes on voucher that already been issued // ////////////////////////////////////////////////////////////////// foreach ($vouchers as $k => $voucher) { if ($voucher->isDirty()) { if (IssuedVoucher::ScheduleId($this->_id)->voucherId($voucher->id)->count()) { $this->setErrors(new MessageBag(['voucher.' . $k => 'Unable to update voucher ' . $k . ' as it has issued voucher'])); return false; } } } //////////////////////////// // Delete current address // //////////////////////////// foreach ($this->vouchers as $voucher) { $this->vouchers()->dissociate($voucher); } /////////////////////////// // Associate all address // /////////////////////////// $vouchers = array_sort($vouchers, function ($value) { return $value->since; }); foreach ($vouchers as $voucher) { $this->vouchers()->associate($voucher); } return true; }