/** * 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; }
/** * 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; }
/** * 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]); }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * boot * observing model * */ public static function boot() { parent::boot(); PointLog::observe(new PointLogObserver()); }
/** * 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); }