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;
         }
     }
 }
Beispiel #2
0
 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'));
     }
 }
Beispiel #3
0
 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'));
     }
 }
Beispiel #4
0
 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;
 }