/**
  * absence log
  *
  * @return void
  * @author 
  **/
 public function generate()
 {
     Log::info('Running PointExpireQueue Generator command @' . date('Y-m-d H:i:s'));
     $clients = ClientTemplate::get();
     foreach ($clients as $key => $value) {
         $points = PointLog::debit(true)->onactive([Carbon::parse(' + 1 month')->startOfDay()->format('Y-m-d H:i:s'), Carbon::parse(' + 1 month')->endOfDay()->format('Y-m-d H:i:s')])->haventgetcut(true)->get();
         if (count($points) > 0) {
             $policies = new Store();
             $policies = $policies->default(true)->get()->toArray();
             $store = [];
             foreach ($policies as $key => $value2) {
                 $store[$value2['type']] = $value2['value'];
             }
             $store['action'] = $store['url'] . '/product';
             DB::beginTransaction();
             $parameter['store'] = $store;
             $parameter['template'] = $value['located'];
             $parameter['on'] = Carbon::parse(' + 1 month')->format('Y-m-d H:i:s');
             $queue = new Queue();
             $queue->fill(['process_name' => 'point:expire', 'parameter' => json_encode($parameter), 'total_process' => count($points), 'task_per_process' => 1, 'process_number' => 0, 'total_task' => count($points), 'message' => 'Initial Commit']);
             if (!$queue->save()) {
                 DB::rollback();
                 Log::error('Save queue on PointExpireQueue command ' . json_encode($queue->getError()));
             } else {
                 DB::Commit();
             }
         }
     }
     return true;
 }
Пример #2
0
 /**
  * update 1st version
  *
  * @return void
  * @author 
  **/
 public function pointexpire($id)
 {
     $queue = new Queue();
     $pending = $queue->find($id);
     $parameters = json_decode($pending->parameter, true);
     $messages = json_decode($pending->message, true);
     $errors = new MessageBag();
     //check point expire on that day that havent get cut by transaction (or even left over)
     $points = PointLog::debit(true)->onactive([Carbon::parse($parameters['on'])->startOfDay()->format('Y-m-d H:i:s'), Carbon::parse($parameters['on'])->endOfDay()->format('Y-m-d H:i:s')])->haventgetcut(true)->with(['user'])->get()->toArray();
     foreach ($points as $idx => $point) {
         //1. Check tag/category viewed
         $stat = \App\Models\StatUserView::userid($point['user_id'])->statabletype(['App\\Models\\Category', 'App\\Models\\Tag'])->get(['statable_id'])->toArray();
         //1b. Get slugs
         $slugs = [];
         $purchased_prods = [];
         $purchased_varians = [];
         foreach ($stat as $key => $value) {
             $slugs[] = \App\Models\Cluster::find($value['statable_id'])['slug'];
         }
         $purchased = \App\Models\TransactionDetail::TransactionSellOn(['paid', 'packed', 'shipping', 'delivered'])->where('transactions.user_id', $point['user_id'])->groupby('varian_id')->with(['varian', 'varian.product', 'varian.product.clusters'])->get()->toArray();
         foreach ($purchased as $key => $value) {
             //2. Check tag/category purchased
             foreach ($value['varian']['product']['clusters'] as $key2 => $value2) {
                 $slugs[] = $value2['slug'];
             }
             $purchased_prods[] = $value['varian']['product_id'];
             $purchased_varians[] = $value['varian']['size'];
         }
         //2a. get slug of category/tag
         //2b. get product id
         //2c. get varian size
         $slug = array_unique($slugs);
         $productids = array_unique($purchased_prods);
         $variansize = array_unique($purchased_varians);
         $result = \App\Models\Product::sellable(true);
         if (!empty($slug)) {
             $result = $result->clustersslug($slug);
         }
         if (!empty($productids)) {
             $result = $result->notid($productids);
         }
         if (!empty($variansize)) {
             $result = $result->variansize($variansize);
         }
         $product = $result->orderby('price', 'desc')->take(4)->get()->toArray();
         $data = ['point' => $point, 'balin' => $parameters['store'], 'product' => $product];
         //send mail
         Mail::send('mail.' . $parameters['template'] . '.crm.point', ['data' => $data], function ($message) use($point, $parameters) {
             $message->to($point['user']['email'], $point['user']['name'])->subject(strtoupper($parameters['template']) . ' - POINT REMINDER');
         });
         $pnumber = $pending->process_number + 1;
         $messages['message'][$pnumber] = 'Sukses Mengirim Email ' . (isset($point['user']['name']) ? $point['user']['name'] : '');
         $pending->fill(['process_number' => $pnumber, 'message' => json_encode($messages)]);
         $pending->save();
     }
     return true;
 }
Пример #3
0
 /**
  * Display my points
  *
  * @return Response
  */
 public function points($user_id = null)
 {
     $result = \App\Models\PointLog::summary($user_id)->orderby('created_at', 'desc');
     $count = count($result->get(['id']));
     if (Input::has('skip')) {
         $skip = Input::get('skip');
         $result = $result->skip($skip);
     }
     if (Input::has('take')) {
         $take = Input::get('take');
         $result = $result->take($take);
     }
     $result = $result->get()->toArray();
     return new JSend('success', (array) ['count' => $count, 'data' => $result]);
 }
Пример #4
0
 /** 
  * observe point log event saved
  * 1. Check if reference were from user
  * 2. act, accept or refuse
  * 
  * @param $model
  * @return bool
  */
 public function saved($model)
 {
     $errors = new MessageBag();
     //1. Check if reference were from user
     if ($model->reference_type == 'App\\Models\\User') {
         $gift = StoreSetting::type('referral_royalty')->Ondate('now')->first();
         //check if no royalti, refuse
         if (!$gift) {
             $errors->add('PointLog', 'Tidak ada campaign untuk point reference.');
         } else {
             //give royalti to referral
             $voucher = Referral::userid($model->reference_id)->first();
             if ($voucher && $voucher['value'] == 0) {
                 $referee = new PointLog();
                 $referee->fill(['user_id' => $model->reference_id, 'amount' => $gift->value, 'expired_at' => $model->expired_at, 'notes' => 'Mereferensikan ' . $model->user->name]);
                 $referee->reference()->associate($model);
                 if (!$referee->save()) {
                     $errors->add('PointLog', $referee->getError());
                 }
             }
         }
     }
     if ($errors->count()) {
         $model['errors'] = $errors;
         return false;
     }
     return true;
 }
Пример #5
0
 /**
  * save welcome gift
  * 
  * @param model of user
  * @return boolean
  */
 public function giveWelcomeGift($user)
 {
     $gift = StoreSetting::type('welcome_gift')->Ondate('now')->first();
     $store = StoreSetting::type('voucher_point_expired')->Ondate('now')->first();
     if ($gift) {
         if ($store) {
             $expired_at = new Carbon($store->value);
         } else {
             $expired_at = new Carbon('+ 3 months');
         }
         $point = new PointLog();
         $point->fill(['user_id' => $user->id, 'amount' => $gift->value, 'expired_at' => $expired_at->format('Y-m-d H:i:s'), 'notes' => 'Welcome Gift dari BALIN']);
         if (!$point->save()) {
             $this->errors = $point->getError();
             return false;
         }
     }
     return true;
 }
Пример #6
0
 /**
  * Credit point.
  *
  * @param model transaction
  * @return boolean
  */
 public function CreditPoint($transaction)
 {
     //cek all  in debit active point
     $points = PointLog::userid($transaction->user_id)->onactive('now')->debit(true)->get();
     //count leftover active point
     $sumpoints = PointLog::userid($transaction->user_id)->onactive('now')->sum('amount');
     $idx = 0;
     $currentamount = 0;
     $transactionamount = $transaction['bills'];
     while ($transactionamount <= $transaction['bills'] && $points && isset($points[$idx]) && $transactionamount > 0 && $sumpoints > 0) {
         $sumpoints = PointLog::userid($transaction->user_id)->onactive('now')->sum('amount');
         //count left over point per debit to credit
         $currentamount = $points[$idx]['amount'];
         foreach ($points[$idx]->pointlogs as $key => $value) {
             $currentamount = $currentamount + $value['amount'];
         }
         //if leftover more than 0
         if ($currentamount > 0 && $currentamount >= $transactionamount) {
             $camount = 0 - $transactionamount;
         } else {
             $camount = 0 - $currentamount;
         }
         if ($currentamount > 0) {
             $point = new PointLog();
             $point->fill(['user_id' => $points[$idx]->user_id, 'reference_id' => $transaction->id, 'reference_type' => get_class($transaction), 'point_log_id' => $points[$idx]->id, 'amount' => $camount, 'expired_at' => $points[$idx]->expired_at, 'notes' => 'Pembayaran Belanja #' . $transaction->ref_number]);
             if (!$point->save()) {
                 $this->errors = $point->getError();
                 return false;
             }
             $transactionamount = $transactionamount + $camount;
         }
         $idx++;
     }
     return $transactionamount;
 }
Пример #7
0
 /**
  * Debit Point from voucher
  *
  * @param model transaction
  * @return voucher discount
  */
 public function DebitPoint($transaction, $debit)
 {
     if (!is_null($transaction->id)) {
         $expired = StoreSetting::type('voucher_point_expired')->Ondate('now')->first();
         $previous = PointLog::referenceid($transaction->id)->referencetype('App\\Models\\Transaction')->first();
         if ($expired && !$previous) {
             $point = new PointLog();
             $point->fill(['user_id' => $transaction->user_id, 'amount' => $debit, 'expired_at' => date('Y-m-d H:i:s', strtotime($transaction->transact_at . ' ' . $expired->value)), 'notes' => 'Bonus Belanja dengan Voucher ']);
             $point->reference()->associate($transaction);
             if (!$point->save()) {
                 $this->errors = $point->getError();
                 return false;
             }
         }
     }
     return $result;
 }
Пример #8
0
 /**
  * boot
  * observing model
  *
  */
 public static function boot()
 {
     parent::boot();
     PointLog::observe(new PointLogObserver());
 }
Пример #9
0
 /**
  * Store a point
  *
  * @return Response
  */
 public function store()
 {
     if (!Input::has('point')) {
         return new JSend('error', (array) Input::all(), 'Tidak ada data point.');
     }
     $errors = new MessageBag();
     DB::beginTransaction();
     //1. Validate Point Parameter
     $point = Input::get('point');
     if (is_null($point['id'])) {
         $is_new = true;
     } else {
         $is_new = false;
     }
     //1. Get original data
     $point_data = \App\Models\PointLog::findornew($point['id']);
     if (!$errors->count()) {
         $point_rules = ['user_id' => 'required|exists:users,id', 'amount' => 'required|numeric', 'expired_at' => 'required|date_format:"Y-m-d H:i:s"', 'notes' => 'required'];
         $validator = Validator::make($point, $point_rules);
         if (!$validator->passes()) {
             $errors->add('Point', $validator->errors());
         } else {
             $point_data = new \App\Models\PointLog();
             $point_data = $point_data->fill($point);
             if (!$point_data->save()) {
                 $errors->add('Point', $point_data->getError());
             }
         }
     }
     if ($errors->count()) {
         DB::rollback();
         return new JSend('error', (array) Input::all(), $errors);
     }
     DB::commit();
     $final_point = \App\Models\PointLog::id($point_data['id'])->with(['user'])->first()->toArray();
     return new JSend('success', (array) $final_point);
 }