/** * observe point log event saving * 1. Check if reference were from user * 2. Check if reference were from voucher * 3. act, accept or refuse * * @param $model * @return bool */ public function saving($model) { $errors = new MessageBag(); //1. Check if reference were from user if ($model->reference_type == 'App\\Models\\User') { //1a. Check referee $reference = PointLog::userid($model->reference_id)->referencetype('App\\Models\\User')->first(); $user = PointLog::userid($model->user_id)->referencetype('App\\Models\\User')->first(); $alreadyhasvoucher = PointLog::userid($model->user_id)->referencetype('App\\Models\\Voucher')->first(); //1ai. If user alerady has voucher or referral, refuse if ($user || $alreadyhasvoucher) { $errors->add('PointLog', 'Maaf, Anda tidak dapat menambahkan referral code, karena anda sudah menggunakan referral code ' . $model->reference->referral_code); } elseif ($reference && $model->user_id == $reference->reference_id) { $errors->add('PointLog', 'Tidak dapat memakai referensi dari pemberi referens.'); } elseif ($model->user_id == $model->reference_id) { $errors->add('PointLog', 'Tidak memakai dapat referral code anda sebagai pemberi referens.'); } elseif ($model->reference->quota_referral <= 0) { $errors->add('PointLog', 'Untuk saat ini tidak dapat menggunakan referral code ' . $model->reference->name); } else { $gift = StoreSetting::type('invitation_royalty')->Ondate('now')->first(); //check if no royalti, refuse if (!$gift) { $errors->add('PointLog', 'Tidak ada campaign untuk point reference.'); } elseif ($model->reference->referral->value != 0) { $model->amount = $model->reference->referral->value; $model->notes = 'Referensi promo ' . $model->reference->name; } else { $model->amount = $gift->value; $model->notes = 'Direferensikan ' . $model->reference->name; } } if (!$errors->count()) { $result = $model->CreditQuota($model->reference->referral, 'Mereferensikan ' . $model->user->name); if (!$result) { return false; } } } elseif ($model->reference_type == 'App\\Models\\Voucher') { $reference = PointLog::userid($model->reference->user_id)->referencetype('App\\Models\\User')->first(); $user = PointLog::userid($model->reference->user_id)->referencetype('App\\Models\\User')->first(); $alreadyhasvoucher = PointLog::userid($model->user_id)->referencetype('App\\Models\\Voucher')->first(); $alreadyhasreferral = PointLog::userid($model->user_id)->referencetype('App\\Models\\User')->first(); //2bi. If user alerady has voucher or referral, refuse if ($alreadyhasvoucher || $alreadyhasreferral) { $errors->add('PointLog', 'Maaf, Anda tidak dapat menambahkan referral code, karena anda sudah menggunakan referral code ' . $model->reference->referral_code); } elseif ($reference && $model->user_id == $reference->reference_id) { $errors->add('PointLog', 'Tidak dapat memakai referensi dari pemberi referens.'); } elseif ($model->user_id == $model->reference->user_id) { $errors->add('PointLog', 'Tidak memakai dapat referral code anda sebagai pemberi referens.'); } elseif ($model->reference->quota <= 0) { $errors->add('PointLog', 'Untuk saat ini tidak dapat menggunakan referral code ' . $model->reference->name); } else { $prev_reference = $model->reference_id; $gift = StoreSetting::type('invitation_royalty')->Ondate('now')->first(); //check if no royalti, refuse if (!$gift) { $errors->add('PointLog', 'Tidak ada campaign untuk point reference.'); } elseif ($model->reference->value != 0) { $model->amount = $model->reference->value; $model->notes = 'Referensi promo #' . $model->reference->code; } else { $model->amount = $gift->value; $model->notes = 'Direferensikan ' . $model->reference->user->name; } if (!$errors->count()) { $result = $model->CreditQuota(\App\Models\Voucher::findorfail($prev_reference), 'Mereferensikan ' . $model->user->name); if (!$result) { return false; } } } } if ($errors->count()) { $model['errors'] = $errors; 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; }