261 lines
10 KiB
PHP
261 lines
10 KiB
PHP
<?php
|
|
namespace App\Services\BusinessPlan;
|
|
|
|
use App\User;
|
|
use stdClass;
|
|
use Carbon\Carbon;
|
|
use App\Models\UserLevel;
|
|
use App\Models\UserBusiness;
|
|
use App\Models\UserBusinessStructure;
|
|
|
|
|
|
class BusinessUserItem
|
|
{
|
|
public $businessUserItems = [];
|
|
|
|
private $date;
|
|
private $b_user;
|
|
private $user_level_active_pos;
|
|
|
|
|
|
|
|
public function __construct($date)
|
|
{
|
|
$this->date = $date;
|
|
return $this;
|
|
}
|
|
|
|
public function makeUser($user_id){
|
|
|
|
//check for user an load
|
|
$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);
|
|
$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,
|
|
'sales_volume_points' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_points'),
|
|
'sales_volume_points_shop' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_points_shop'),
|
|
'sales_volume_points_sum' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_points_sum'),
|
|
'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,
|
|
'margin_shop' => $user_level_active ? $user_level_active->margin_shop : 0,
|
|
'qual_kp' => $user_level_active ? $user_level_active->qual_kp : 0,
|
|
'qual_tp' => $user_level_active ? $user_level_active->qual_tp : 0,
|
|
'commission_team_total' => 0,
|
|
'commission_shop_sales' => 0,
|
|
];
|
|
$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 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_tp += $points;
|
|
|
|
}
|
|
|
|
public function isQualKP(){
|
|
return ($this->sales_volume_points_sum >= $this->qual_kp) ? true : false;
|
|
}
|
|
|
|
public function getRestQualKP(){
|
|
return $this->sales_volume_points_sum - $this->qual_kp;
|
|
}
|
|
|
|
public function getCommissionTotal(){
|
|
return round($this->commission_shop_sales + $this->commission_team_total, 2);
|
|
}
|
|
|
|
public function calcQualTP(){
|
|
if($this->isQualKP()){
|
|
$this->b_user->total_qual_tp = $this->total_tp + $this->getRestQualKP();
|
|
$commission_total = 0;
|
|
$qualUserLevel = UserLevel::where('qual_tp', '<=', $this->total_qual_tp)->where('pos', '<=', $this->user_level_active_pos)->orderBy('qual_tp', 'desc')->first();
|
|
$nextQualUserLevel = UserLevel::where('qual_tp', '<=', $this->total_qual_tp)->where('pos', '>', $this->user_level_active_pos)->orderBy('qual_tp', 'desc')->first();
|
|
if($nextQualUserLevel){
|
|
$this->b_user->next_qual_user_level = $nextQualUserLevel->toArray();
|
|
}
|
|
if($qualUserLevel){
|
|
$this->b_user->qual_user_level = $qualUserLevel->toArray();
|
|
foreach($this->business_lines as $line => $object){
|
|
//growth_bonus = ab ebene 6 wachstumsbonus
|
|
$object->margin = ($line <= 6) ? $this->qual_user_level['pr_line_'.$line] : $this->qual_user_level['growth_bonus'];
|
|
$object->commission = round($object->points / 100 * $object->margin, 2);
|
|
$commission_total += $object->commission;
|
|
$this->b_user->business_lines[$line] = $object;
|
|
}
|
|
}
|
|
$this->b_user->commission_team_total = $commission_total;
|
|
}
|
|
}
|
|
|
|
/*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)
|
|
->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)
|
|
->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;
|
|
return;
|
|
}
|
|
|
|
public function isSave(){
|
|
return $this->b_user->isSave();
|
|
}
|
|
|
|
public function __get($property) {
|
|
if (property_exists($this->b_user, $property)) {
|
|
return $this->b_user->$property;
|
|
}
|
|
if (isset($this->b_user->{$property})) {
|
|
return $this->b_user->{$property};
|
|
}
|
|
}
|
|
|
|
}
|