mivita/app/Services/BusinessPlan/TreeUserItem.php
2022-07-29 18:18:05 +02:00

172 lines
6.4 KiB
PHP

<?php
namespace App\Services\BusinessPlan;
use App\User;
use stdClass;
use Carbon\Carbon;
use App\Models\UserLevel;
use App\Models\UserBusiness;
class TreeUserItem
{
public $items = [];
private $date;
public $lines = [];
public $user_level_active;
public function __construct($date)
{
$this->date = $date;
return $this;
}
public function makeUser(User $user){
$this->user_level_active = $user->user_level ? $user->user_level : null;
$this->b_user = new UserBusiness();
$fill = [
'user_id' => $user->id,
'month' => $this->date->month,
'year' => $this->date->year,
'm_level' => $user->m_level,
'm_sponsor' => $user->m_sponsor,
'user_level_name' => $user->user_level ? $user->user_level->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->user_level_active ? $user->user_level_active->margin : 0,
'margin_shop' => $user->user_level_active ? $user->user_level_active->margin_shop : 0,
'qual_kp' => $user->user_level_active ? $user->user_level_active->qual_kp : 0,
'qual_tp' => $user->user_level_active ? $user->user_level_active->qual_tp : 0,
];
$this->b_user->fill($fill);
}
public function addUserID(){
TreeCalcBot::addUserID($this->user_id);
}
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 checkSponsor(){
if($this->m_sponsor === null){
$this->m_sponsor_name = 'Keinen Sponsor zugewiesen';
return;
}
$user = User::find($this->m_sponsor);
if($user){
if($user->account){
$this->m_sponsor_name = substr('Sponsor: '.$user->account->first_name.' '.$user->account->last_name.' | '.$user->email.' | '.$user->account->m_account, 0, 190);
}else{
$this->m_sponsor_name = 'Sponsor: '.$user->email;
}
return;
}
$this->m_sponsor_name = 'Sponsor wurde gelöscht.';
return;
}
/*
'total_tp' => ,
'total_qual_tp' => ,
'commission_total' => ,
'lines',
'items',
'qual_user_level_id'
*/
public function readParentsUser(){
$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->user_id) //<- need the id for parents / sponsors
->where('users.payment_account', "!=", null)
->where('users.active_date', "<=", $this->date->end_date)
->get();
dd($users);
if($users){
foreach($users as $user){
$TreeUserItem = new TreeUserItem($this->date);
$TreeUserItem->makeUser($user);
$TreeUserItem->addUserID();
$this->items[] = $TreeUserItem;
}
}
foreach($this->items as $item){
$item->readParentsUser();
}
}
public function calcUserTP($line){
if(!isset($this->lines[$line])){
$this->lines[$line] = new stdClass();
$this->lines[$line]->points = 0;
}
foreach($this->items as $item){
if(count($item->items) > 0){
$this->calcUserTP($line+1);
}
$this->lines[$line]->points += $item->sales_volume_points_sum;
$this->total_tp += $item->sales_volume_points_sum;
}
}
public function calcQualTP(){
if($this->isQualKP()){
$this->total_qual_tp = $this->total_tp + $this->getRestQualKP();
$this->qual_user_level = UserLevel::where('qual_tp', '<=', $this->total_qual_tp)->where('pos', '<=', $this->user->user_level->pos)->orderBy('qual_tp', 'desc')->first();
$this->commission_total = 0;
if($this->qual_user_level){
foreach($this->lines as $line => $values){
$values->margin = $this->qual_user_level->{'pr_line_'.$line};
if($line > 6){
//wachstumsbonus
$values->margin = $this->qual_user_level->growth_bonus;
}
$values->commission = round($values->points / 100 * $values->margin, 2);
$this->commission_total += $values->commission;
$this->lines[$line] = $values;
}
}
}
}
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};
}
}
}