date = $date; return $this; } public function makeUser($user_id) { // check for user an load is saved $this->b_user = UserBusiness::where('user_id', $user_id)->where('month', $this->date->month)->where('year', $this->date->year)->first(); if ($this->b_user !== null) { return; } // read User here, can delete in stored data. $user = User::find($user_id); if (! $user) { return; } $user_level_active = $user->user_level ? $user->user_level : null; $this->user_level_active_pos = $user_level_active ? $user_level_active->pos : 0; $this->b_user = new UserBusiness; $fill = [ 'user_id' => $user->id, 'month' => $this->date->month, 'year' => $this->date->year, 'm_level_id' => $user->m_level, 'user_level_name' => $user_level_active ? $user_level_active->name : '', 'active_account' => $user->payment_account ? Carbon::parse($user->payment_account)->gt(Carbon::parse($this->date->start_date)) : false, 'payment_account_date' => $user->payment_account ? $user->getPaymentAccountDateFormat(false) : null, 'active_date' => $user->active_date ? $user->active_date : null, 'm_account' => $user->account->m_account, 'email' => $user->email, 'first_name' => $user->account->first_name, 'last_name' => $user->account->last_name, 'user_birthday' => $user->account->birthday, 'user_phone' => $user->account->getPhoneNumber(), 'sales_volume_KP_points' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_KP_points'), 'sales_volume_TP_points' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_TP_points'), 'sales_volume_points_shop' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_points_shop'), 'sales_volume_points_KP_sum' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_points_KP_sum'), // KP + Shop Points 'sales_volume_points_TP_sum' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_points_TP_sum'), // TP + Shop Points 'sales_volume_total' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_total'), 'sales_volume_total_shop' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_total_shop'), 'sales_volume_total_sum' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_total_sum'), 'margin' => $user_level_active ? $user_level_active->margin : 0, // is fix Rabatt für Kundenbestellungen 'margin_shop' => $user_level_active ? $user_level_active->margin_shop : 0, // is fix Rabatt für Shopbestellungen 'qual_kp' => $user_level_active ? $user_level_active->qual_kp : 0, // KP Kundenpoints from level 'qual_pp' => $user_level_active ? $user_level_active->qual_pp : 0, // PP Payline Points from level 'payline_points' => 0, 'commission_pp_total' => 0, 'commission_shop_sales' => 0, 'commission_growth_total' => 0, 'version' => 2, ]; $this->b_user->fill($fill); $this->b_user->business_lines = []; $this->b_user->user_items = []; $this->b_user->commission_shop_sales = round($this->b_user->sales_volume_total_shop / 100 * $this->b_user->margin_shop, 2); } public function getSalesVolumeTotalMargin() { return $this->b_user->getSalesVolumeTotalMargin(); } public function addUserID() { TreeCalcBot::addUserID($this->b_user->user_id); } public function getBUser() { return $this->b_user; } public function addBusinessLineToUser($line, $obj) { $this->b_user->business_lines[$line] = $obj; } public function addBusinessLinePoints($line, $points) { $obj = $this->business_lines[$line]; $obj->points += $points; $this->b_user->business_lines[$line] = $obj; } public function addTotalTP($points) { $this->b_user->total_pp += $points; } public function isQualKP() { return ($this->sales_volume_points_KP_sum >= $this->qual_kp) ? true : false; } public function isQualLevel() { return ($this->qual_user_level) ? true : false; } public function isQualEqualLevel() { if ($this->qual_user_level) { return ($this->m_level_id == $this->qual_user_level['id']) ? true : false; } return false; } public function getQualLevelPaylines() { if ($this->qual_user_level) { return $this->qual_user_level['paylines']; } return 0; } public function isQualLevelGrowth($line) { if (isset($this->business_lines[$line])) { $object = $this->business_lines[$line]; if (isset($object->growth_bonus)) { return true; } } return false; } public function getRestQualKP() { $ret = $this->sales_volume_points_KP_sum - $this->qual_kp; return $ret > 0 ? $ret : 0; } public function getCommissionTotal() { return round($this->commission_shop_sales + $this->commission_pp_total + $this->commission_growth_total, 2); } // Provisierungslevel brechnen, Berechnung der Provisionen nach Level public function calcQualPP() { // das ist der erreichte Provisierungslevel, nach paylinePoints und KP $qualUserLevel = $this->calcuQualLevel(); if ($qualUserLevel !== null) { // prüfe einen Aufsieg im KarriereLevel $this->setNextUserLevel(); $this->b_user->qual_user_level = $qualUserLevel->toArray(); // setzen nächsten ProvisionsLevel wenn not isQualEqualLevel $this->setQualNextLevel(); // Berechnung der Provisionen in der Payline $commission_pp_total = 0; $commission_growth_total = 0; for ($i = 1; $i <= $qualUserLevel->paylines; $i++) { if (isset($this->business_lines[$i])) { $object = $this->business_lines[$i]; $object->margin = $this->qual_user_level['pr_line_'.$i]; // provision in % $object->commission = round($object->points / 100 * $object->margin, 2); // provision in points/euro $object->payline = true; $commission_pp_total += $object->commission; $this->b_user->business_lines[$i] = $object; } } // Berechnung der Provisionen nach WB if ($qualUserLevel->growth_bonus) { // ['growth_bonus'] // $payline = (int) $this->b_user->qual_user_level['paylines'] + 1; $maxlines = count($this->business_lines) + 1; $growth_bonus = (float) $this->b_user->qual_user_level['growth_bonus']; for ($i = $payline; $i <= $maxlines; $i++) { if (isset($this->business_lines[$i])) { $object = $this->business_lines[$i]; $object->margin = $growth_bonus; // provision in % $object->commission = round($object->points / 100 * $object->margin, 2); // provision in points/euro $object->growth_bonus = true; $commission_growth_total += $object->commission; $this->b_user->business_lines[$i] = $object; } } } $this->b_user->commission_pp_total = $commission_pp_total; $this->b_user->commission_growth_total = $commission_growth_total; } else { // erste Provisierungslevel als next setzen, hat keine oder wenig points $qualUserLevelNext = UserLevel::where('pos', '=', 1)->orderBy('qual_pp', 'asc')->first(); if ($qualUserLevelNext) { $this->b_user->qual_user_level_next = $qualUserLevelNext->toArray(); } } } // qualifikation nach qual_kp (KundenPoints) und qual_pp (PaylinePoints) public function calcuQualLevel() { // alle levels wo die qual_kp erreicht ist, sortiert nach Rang > $qualUserLevels = UserLevel::where('qual_kp', '<=', $this->sales_volume_points_KP_sum)->where('pos', '<=', $this->user_level_active_pos)->orderBy('qual_pp', 'desc')->get(); foreach ($qualUserLevels as $qualUserLevel) { // brechnet die Points nach der Payline $payline_points = $this->getPointsforPayline($qualUserLevel->paylines); $payline_points_qual_kp = $payline_points + $this->getRestQualKP(); if ($payline_points_qual_kp >= $qualUserLevel->qual_pp) { // match payline_points erreicht, ist der akutelle Level für die Provision $this->b_user->payline_points = $payline_points; $this->b_user->payline_points_qual_kp = $payline_points_qual_kp; return $qualUserLevel; } } return null; } // PaylinePoints nach paylines / welche ebenen gezählt werden, 3,4,5,6 ... private function getPointsforPayline($paylines) { $payline_points = 0; for ($i = 1; $i <= $paylines; $i++) { if (isset($this->business_lines[$i])) { $payline_points += $this->business_lines[$i]->points; } } return $payline_points; } // wenn nicht erreicht, was wäre der nächste Provisionslevel? private function setQualNextLevel() { if (! $this->isQualEqualLevel()) { $qualUserLevelNext = UserLevel::where('id', '=', $this->b_user->qual_user_level['next_id'])->orderBy('qual_pp', 'asc')->first(); if ($qualUserLevelNext) { $this->b_user->qual_user_level_next = $qualUserLevelNext->toArray(); } } } private function setNextUserLevel() { // $this->b_user->payline_points_qual_kp // das sind die Payline Points + Rest KP // $this->b_user->total_qual_pp = $this->total_pp + $this->getRestQualKP(); //hier werden alle Linien TP gezähle // $this->b_user->total_qual_pp = $this->total_pp + $this->getRestQualKP(); //hier werden alle Linien TP gezähle $nextQualUserLevel = UserLevel::where('qual_pp', '<=', $this->payline_points_qual_kp)->where('pos', '>', $this->user_level_active_pos)->orderBy('qual_pp', 'desc')->first(); if ($nextQualUserLevel && $this->isQualKP()) { $this->b_user->next_qual_user_level = $nextQualUserLevel->toArray(); } else { // wenn nicht erreicht, was wäre der nächste Karrierelevel? $nextCanUserLevel = UserLevel::where('pos', '>', $this->user_level_active_pos)->orderBy('qual_pp', 'asc')->first(); if ($nextCanUserLevel) { $this->b_user->next_can_user_level = $nextCanUserLevel->toArray(); } } } /*public function storeUser(){ $this->b_user->user_items = $this->storeUserItems($this->businessUserItems, 1); $this->b_user->save(); } private function storeUserItems($userItems, $line){ $ret = []; foreach($userItems as $userItem){ $temp = null; if(count($userItem->businessUserItems) > 0){ $temp = $this->storeUserItems($userItem->businessUserItems, $line+1); } $obj = new stdClass(); $obj->user_id = $userItem->user_id; $obj->line = $line; $obj->points = $userItem->sales_volume_points_sum; $obj->parents = $temp; $ret[] = $obj; } return $ret; }*/ public function readParentsBusinessUsers() { $users = User::with('account')->select('users.*') ->where('users.deleted_at', '=', null) ->where('users.id', '!=', 1) ->where('users.admin', '<', 4) ->where('users.m_level', '!=', null) ->whereColumn('users.id', '!=', 'users.m_sponsor') ->where('users.m_sponsor', '=', $this->b_user->user_id) // <- need the id for parents / sponsors ->where('users.payment_account', '!=', null) ->where('users.active_date', '<=', $this->date->end_date) // wurde in dem Monat freigeschaltet ->get(); if ($users) { foreach ($users as $user) { $BusinessUserItem = new BusinessUserItem($this->date); $BusinessUserItem->makeUser($user->id); $BusinessUserItem->addUserID(); $this->businessUserItems[] = $BusinessUserItem; } } foreach ($this->businessUserItems as $businessUserItem) { $businessUserItem->readParentsBusinessUsers(); } } public function readStoredParentsBusinessUsers($structure) { $parents = $this->findParentsBusinessOnStored($this->b_user->user_id, $structure); if ($parents) { foreach ($parents as $obj) { $BusinessUserItem = new BusinessUserItem($this->date); $BusinessUserItem->makeUser($obj->user_id); $BusinessUserItem->addUserID(); $this->businessUserItems[] = $BusinessUserItem; } foreach ($this->businessUserItems as $businessUserItem) { $businessUserItem->readStoredParentsBusinessUsers($parents); } } } private function findParentsBusinessOnStored($user_id, $structures) { if ($structures) { foreach ($structures as $obj) { if ($user_id === $obj->user_id) { return $obj->parents; } if ($obj->parents) { if ($ret = $this->findParentsBusinessOnStored($user_id, $obj->parents)) { return $ret; } } } } return null; } public function checkSponsor($user) { // check is store? has ID if ($this->b_user->isSave()) { return; } $sponsor = new stdClass; $sponsor->is_sponsor = false; $sponsor->user_id = false; $sponsor->first_name = ''; $sponsor->last_name = ''; $sponsor->email = ''; $sponsor->m_account = ''; $sponsor->full_name = 'Keinen Sponsor zugewiesen'; if ($user->m_sponsor) { if ($user->user_sponsor) { $sponsor->is_sponsor = true; $sponsor->user_id = $user->user_sponsor->id; if ($user->user_sponsor->account) { $sponsor->full_name = substr('Sponsor: '.$user->user_sponsor->account->first_name.' '.$user->user_sponsor->account->last_name.' | '.$user->user_sponsor->email.' | '.$user->user_sponsor->account->m_account, 0, 250); $sponsor->first_name = $user->user_sponsor->account->last_name; $sponsor->last_name = $user->user_sponsor->account->first_name; $sponsor->m_account = $user->user_sponsor->account->m_account; } else { $sponsor->full_name = 'Sponsor: '.$user->user_sponsor->email; } $sponsor->email = $user->user_sponsor->email; } else { $sponsor->full_name = 'Sponsor wurde gelöscht.'; } } $this->b_user->sponsor = $sponsor; } public function isSave() { return $this->b_user->isSave(); } public function __get($property) { if ($this->b_user === null) { return null; } if (property_exists($this->b_user, $property)) { return $this->b_user->$property; } if (isset($this->b_user->{$property})) { return $this->b_user->{$property}; } } }