last changes since 6-2023

This commit is contained in:
Kevin Adametz 2023-07-03 10:07:08 +02:00
parent 0341c9c189
commit 04d677d37a
142 changed files with 7895 additions and 2855 deletions

View file

@ -34,6 +34,9 @@ class BusinessUserItem
}
//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();
@ -50,18 +53,28 @@ class BusinessUserItem
'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_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_sum' => $user->getUserSalesVolumeBy($this->date->month, $this->date->year, 'sales_volume_points_sum'),
'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,
'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,
'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 = [];
@ -73,6 +86,7 @@ class BusinessUserItem
public function addUserID(){
TreeCalcBot::addUserID($this->b_user->user_id);
}
public function getBUser(){
return $this->b_user;
}
@ -88,43 +102,160 @@ class BusinessUserItem
}
public function addTotalTP($points){
$this->b_user->total_tp += $points;
$this->b_user->total_pp += $points;
}
public function isQualKP(){
return ($this->sales_volume_points_sum >= $this->qual_kp) ? true : false;
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(){
return $this->sales_volume_points_sum - $this->qual_kp;
$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_team_total, 2);
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(){
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;
//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;
}
}
$this->b_user->commission_team_total = $commission_total;
//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(){
dd($this->b_user->payline_points_qual_kp);
$this->b_user->total_qual_pp = $this->total_pp + $this->getRestQualKP();
$nextQualUserLevel = UserLevel::where('qual_pp', '<=', $this->total_qual_pp)->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(){
@ -174,7 +305,6 @@ class BusinessUserItem
}
}
public function readStoredParentsBusinessUsers($structure){
$parents = $this->findParentsBusinessOnStored($this->b_user->user_id, $structure);

View file

@ -0,0 +1,120 @@
<?php
namespace App\Services\BusinessPlan;
use App\User;
use stdClass;
use Carbon;
class ExportBot
{
public $date;
private $init_from;
private $order;
public $user_tree;
public $user_list;
private $root_user;
public function __construct($init_from = 'member')
{
$this->date = Carbon::now();
$this->init_from = $init_from;
}
public function initStructureUser(User $user, $order='list') //tree or list
{
$line = 0;
$this->order = $order;
$this->root_user = $user;
if($this->order === 'tree'){
$this->user_tree = $this->setUserValues($user, $line);
$this->user_tree->childs = $this->readChildUsers($this->user_tree, $line+1);
}
if($this->order === 'list'){
$this->user_list = $this->setUserValues($user, $line);
$this->readChildUsers($this->user_list, $line+1);
}
}
private function readChildUsers($parent_user, $line){
$childUsers = [];
$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', "=", $parent_user->user_id) //<- need the id for childs / sponsors
->where('users.payment_account', "!=", null)
->where('users.active', "=", 1)
->get();
if($users){
foreach($users as $user){
$user_values = $this->setUserValues($user, $line);
$childUsers[] = $user_values;
if($this->order === 'list'){
$this->user_list->childs[] = $user_values;
$this->readChildUsers($user_values, $line+1);
}
}
}
return $childUsers;
}
private function setUserValues(User $user, $line){
$sponsor_name = "";
if($user->m_sponsor && $user->user_sponsor->account){
$sponsor_name = $user->user_sponsor->account->m_first_name." ".$user->user_sponsor->account->m_last_name;
}
$obj = new stdClass();
$obj->line = $line;
$obj->user_id = $user->id;
$obj->m_level = $user->m_level;
$obj->level_name = $user->user_level ? $user->user_level->name : '';
$obj->m_sponsor = $user->m_sponsor;
$obj->sponsor_name = $sponsor_name;
$obj->m_account = $user->m_account;
$obj->email = $user->email;
$obj->active_account = $user->payment_account ? Carbon::parse($user->payment_account)->gt(Carbon::parse($this->date->format('Y-m-d H:i:s'))) : 0;
$obj->payment_account_date = $user->payment_account ? $user->getPaymentAccountDateFormat(false) : "";
$obj->first_name = $user->account->first_name;
$obj->last_name = $user->account->last_name;
$obj->address = $user->account->address;
$obj->address_2 = $user->account->address_2;
$obj->zipcode = $user->account->zipcode;
$obj->city = $user->account->city;
$obj->country_id = $user->account->country_id ? $user->account->country->de : "";
$pre_phone = $user->account->pre_phone_id != "" ? $user->account->pre_phone->phone." " : "";
$pre_mobil = $user->account->pre_mobil_id != "" ? $user->account->pre_mobil->phone." " : "";
$obj->phone = $pre_phone.$user->account->phone;
$obj->mobil = $pre_mobil.$user->account->mobil;
$obj->birthday = $user->account->birthday;
if($this->order === 'tree'){
$obj->childs = $this->readChildUsers($obj, $line+1);
}
if($this->order === 'list'){
$obj->childs = [];
}
return $obj;
}
public function getUser(){
return $this->root_user;
}
}

View file

@ -2,6 +2,7 @@
namespace App\Services\BusinessPlan;
use App\User;
use stdClass;
use App\Services\Util;
use App\Models\ShoppingOrder;
use App\Models\UserSalesVolume;
@ -33,7 +34,9 @@ class SalesPointsVolume
$shoppingOrder->user_sales_volume->message = 'zugewiesen: '.date('d.m.Y');
$syslog = $shoppingOrder->user_sales_volume->syslog;
$syslog[date('d.m.Y-h:i:s')] = 'change form: #'.$form_user_id.' '.$form_user->email.' to: #'.$to_user_id.' '.$to_user->email;
$from_email = $form_user ? $form_user->email : '';
$to_email = $to_user ? $to_user->email : '';
$syslog[date('d.m.Y-h:i:s')] = 'change form: #'.$form_user_id.' '.$from_email.' to: #'.$to_user_id.' '.$to_email;
$shoppingOrder->user_sales_volume->syslog = $syslog;
$shoppingOrder->user_sales_volume->save();
@ -47,10 +50,23 @@ class SalesPointsVolume
}
private static function add_KP_TP_Points($userSalesVolume, $month_points){
if($userSalesVolume->status_points === 2) { //KP
$month_points->KP += $userSalesVolume->points;
}else{
// === 1 //TP + KP
$month_points->KP += $userSalesVolume->points;
$month_points->TP += $userSalesVolume->points;
}
return $month_points;
}
public static function reCalculateSalesPointsVolume($user_id, $month, $year){
$userSalesVolumes = UserSalesVolume::where('user_id', $user_id)->where('month', $month)->where('year', $year)->orderBy('id', 'ASC')->get();
$month_points = 0;
$month_points = new stdClass();
$month_points->KP = 0;
$month_points->TP = 0;
$month_total_net = 0;
$month_shop_points = 0;
$month_shop_total_net = 0;
@ -59,21 +75,26 @@ class SalesPointsVolume
foreach($userSalesVolumes as $userSalesVolume){
switch ($userSalesVolume->status) {
case 1: //Bestellung Berater
$month_points += $userSalesVolume->points;
$month_points = self::add_KP_TP_Points($userSalesVolume, $month_points);
$month_total_net += $userSalesVolume->total_net;
break;
case 2: //Shop
$month_shop_points += $userSalesVolume->points;
$month_shop_total_net += $userSalesVolume->total_net;
break;
case 4: //add Berater
$month_points += $userSalesVolume->points;
case 4: //Gutschrift
$month_points = self::add_KP_TP_Points($userSalesVolume, $month_points);
$month_total_net += $userSalesVolume->total_net;
break;
case 4: //Registrierung
$month_points = self::add_KP_TP_Points($userSalesVolume, $month_points);
$month_total_net += $userSalesVolume->total_net;
break;
}
$userSalesVolume->month_shop_points = $month_shop_points;
$userSalesVolume->month_shop_total_net = $month_shop_total_net;
$userSalesVolume->month_points = $month_points;
$userSalesVolume->month_KP_points = $month_points->KP;
$userSalesVolume->month_TP_points = $month_points->TP;
$userSalesVolume->month_total_net = $month_total_net;
$userSalesVolume->save();
}
@ -88,6 +109,7 @@ class SalesPointsVolume
2 => 'hinzugefügt aus Shop',
3 => 'hinzugefügt aus Shop / pending',
*/
$status = self::getStatusByOrderPaymentFor($shoppingOrder);
$user_id = $shoppingOrder->auth_user_id ? $shoppingOrder->auth_user_id : $shoppingOrder->member_id;
//akuteller tag / Monat.
@ -95,45 +117,27 @@ class SalesPointsVolume
$year = date('Y');
$date = date('d.m.Y');
if($status === 3){ //shop bestellung User pending if is_like
$user_id = NULL;//$shoppingOrder->auth_user_id ? $shoppingOrder->auth_user_id : $shoppingOrder->member_id;
$month_points = 0;
$month_total_net = 0;
$month_shop_points = 0;
$month_shop_total_net = 0;
}else{
$month_points = UserSalesVolume::where('user_id', $user_id)->where('status', 1)->where('month', $month)->where('year', $year)->sum('points');
$month_total_net = UserSalesVolume::where('user_id', $user_id)->where('status', 1)->where('month', $month)->where('year', $year)->sum('total_net');
$month_shop_points = UserSalesVolume::where('user_id', $user_id)->where('status', 2)->where('month', $month)->where('year', $year)->sum('points');
$month_shop_total_net = UserSalesVolume::where('user_id', $user_id)->where('status', 2)->where('month', $month)->where('year', $year)->sum('total_net');
}
switch ($status) {
case 1: //Bestellung
$month_points += $shoppingOrder->points;
$month_total_net += $shoppingOrder->subtotal;
break;
case 2: //Shop
$month_shop_points += $shoppingOrder->points;
$month_shop_total_net += $shoppingOrder->subtotal;
break;
}
return UserSalesVolume::create([
if($status === 3){ //shop bestellung User pending if is_like
$user_id = NULL;
}
$user_sales_volume = UserSalesVolume::create([
'user_id' => $user_id,
'shopping_order_id' => $shoppingOrder->id,
'month' => $month,
'year' => $year,
'date' => $date,
'points' => $shoppingOrder->points,
'month_points' => $month_points,
'month_shop_points' => $month_shop_points,
'total_net' => $shoppingOrder->subtotal,
'month_total_net' => $month_total_net,
'month_shop_total_net' => $month_shop_total_net,
'total_net' => $shoppingOrder->subtotal,
'status_points' => 1, //KP + TP
'message' => '',
'status' => $status,
]);
if($status !== 3){
self::reCalculateSalesPointsVolume($user_sales_volume->user_id, $user_sales_volume->month, $user_sales_volume->year);
}
}
public static function setToUserAndReCalculate(UserSalesVolume $user_sales_volume, $user_id){
@ -181,6 +185,7 @@ class SalesPointsVolume
$user_sales_volume->message = 'geändert: '.date('d.m.Y');
$user_sales_volume->info = $data['info'];
$user_sales_volume->status_points = $data['status_points'];
$syslog = $user_sales_volume->syslog;
$syslog[date('d.m.Y-h:i:s')] = 'edit points: #'.$old_points.' '.$user_sales_volume->points .' total: #'.$old_total_net.' '.$user_sales_volume->total_ne;
@ -198,7 +203,6 @@ class SalesPointsVolume
public static function addSalesPointsVolume($data){
if(!isset($data['user_id'])){
\Session()->flash('alert-error', 'Kein Berater ausgewählt');
return;
@ -211,7 +215,7 @@ class SalesPointsVolume
$total_net = isset($data['total_net']) ? Util::reFormatNumber($data['total_net']) : 0;
$points = isset($data['points']) ? intval($data['points']) : 0;
$syslog[date('d.m.Y-h:i:s')] = 'add points: #'.$points.' total: #'.$total_net;
$status = isset($data['status']) ? intval($data['status']) : 4;
$user_sales_volume = UserSalesVolume::create([
'user_id' => $user->id,
@ -220,11 +224,12 @@ class SalesPointsVolume
'year' => $year,
'date' => $date,
'points' => $points,
'status_points' => $data['status_points'],
'total_net' => $total_net,
'message' => 'hinzugefügt: '.date('d.m.Y'),
'info' => $data['info'],
'syslog' => $syslog,
'status' => 4,
'status' => $status,
]);

View file

@ -0,0 +1,12 @@
<?php
namespace App\Services\BusinessPlan;
use App\Models\UserSalesVolume;
class SalesPointsVolumeHelper
{
}

View file

@ -1,9 +1,10 @@
<?php
namespace App\Services\BusinessPlan;
use App\Models\UserBusinessStructure;
use App\User;
use stdClass;
use Carbon;
use App\Models\UserBusinessStructure;
class TreeCalcBot
{
@ -24,7 +25,7 @@ class TreeCalcBot
public function __construct($month, $year, $init_from = 'member')
{
$this->date = new stdClass();
$date = \Carbon::parse($year.'-'.$month.'-1');
$date = Carbon::parse($year.'-'.$month.'-1');
$this->date->month = $month;
$this->date->year = $year;
$this->date->start_date = $date->format('Y-m-d H:i:s');
@ -49,7 +50,7 @@ class TreeCalcBot
public function initStructureUser($user_id)
{
$BusinessUserItem = new BusinessUserItem($this->date);
$BusinessUserItem->makeUser($user_id);
$BusinessUserItem->addUserID();
@ -63,13 +64,10 @@ class TreeCalcBot
$this->readStoredSponsorUser($this->business_users[0]->sponsor->user_id);
}
}else{
$this->readParentsUsers();
$this->readSponsorUser($user_id);
}
}
@ -79,12 +77,14 @@ class TreeCalcBot
$this->business_user->makeUser($user->id);
$this->business_user->checkSponsor($user);
if(!$this->business_user->isSave()){
//Aufbau der Struktur für den User in die unendliche Tiefe.
$this->business_user->readParentsBusinessUsers();
//calculate Lines
//calculate Points in Lines
if(count($this->business_user->businessUserItems) > 0){
$this->calcUserTP($this->business_user->businessUserItems, 1);
$this->calcUserPoints($this->business_user->businessUserItems, 1);
}
$this->business_user->calcQualTP();
//qualifikation nach qual_kp (KundenPoints) und qual_pp (PaylinePoints)
$this->business_user->calcQualPP();
}
}
@ -102,7 +102,7 @@ class TreeCalcBot
return false;
}
private function calcUserTP($businessUserItems, $line){
private function calcUserPoints($businessUserItems, $line){
if(!isset($this->business_user->business_lines[$line])){
$obj = new stdClass();
$obj->points = 0;
@ -110,10 +110,12 @@ class TreeCalcBot
}
foreach($businessUserItems as $business_user_item){
if(count($business_user_item->businessUserItems) > 0){
$this->calcUserTP($business_user_item->businessUserItems, $line+1);
$this->calcUserPoints($business_user_item->businessUserItems, $line+1);
}
$this->business_user->addBusinessLinePoints($line, $business_user_item->sales_volume_points_sum);
$this->business_user->addTotalTP($business_user_item->sales_volume_points_sum);
//business_lines points nach line
$this->business_user->addBusinessLinePoints($line, $business_user_item->sales_volume_points_TP_sum); //TP + Shop Points
//total_pp gesamte Punkte
$this->business_user->addTotalTP($business_user_item->sales_volume_points_TP_sum); //TP + Shop Points
}
}
@ -259,7 +261,8 @@ class TreeCalcBot
private function addItem($item, $deep){
$button = '';
if(($this->init_from === 'admin' && \Auth::user()->isAdmin()) || ($this->init_from === 'member' && \Auth::user()->id === $item->user_id)){
if(($this->init_from === 'admin' && \Auth::user()->isAdmin()) || ($this->init_from === 'member')){ // && \Auth::user()->id === $item->user_id
$button = ' | <button type="button" class="btn icon-btn btn-xs btn-secondary" data-toggle="modal" data-target="#modals-load-content"
data-id="'.$item->user_id.'"
data-action="business-user-detail"
@ -280,7 +283,7 @@ class TreeCalcBot
<strong>'.$item->first_name.' '.$item->last_name.'</strong> <a href="mailto: '.$item->email.'">'.$item->email.'</a> <span class="badge badge-outline-default '.($item->active_account ? '' : 'text-muted').'">'.$item->user_level_name.' | '.$item->m_account.'</span>
<br><span class="small">'.
($item->active_account ?
'<strong>Gesamte Points: '.$item->sales_volume_points_sum.'</strong> | E: '.$item->sales_volume_points.' | S: '.$item->sales_volume_points_shop.' <strong>
'<strong>Gesamte Points: '.$item->sales_volume_points_sum.'</strong> | E: '.$item->sales_volume_KP_points.' | S: '.$item->sales_volume_points_shop.' <strong>
| Umsatz netto: '.formatNumber($item->sales_volume_total_sum).' &euro;</strong> | E: '.formatNumber($item->sales_volume_total).' &euro; | S: '.formatNumber($item->sales_volume_total_shop).' &euro;'.
$button
:
@ -324,7 +327,7 @@ class TreeCalcBot
<strong>'.$item->first_name.' '.$item->last_name.'</strong> <a href="mailto: '.$item->email.'">'.$item->email.'</a> <span class="badge badge-outline-default '.($item->active_account ? '' : 'text-muted').'">'.$item->user_level_name.' | '.$item->m_account.'</span>
<br><span class="small">'.
($item->active_account ?
'<strong>Gesamte Points: '.$item->sales_volume_points_sum.'</strong> | E: '.$item->sales_volume_points.' | S: '.$item->sales_volume_points_shop.' <strong>
'<strong>Gesamte Points: '.$item->sales_volume_points_sum.'</strong> | E: '.$item->sales_volume_KP_points.' | S: '.$item->sales_volume_points_shop.' <strong>
| Umsatz netto: '.formatNumber($item->sales_volume_total_sum).' &euro;</strong> | E: '.formatNumber($item->sales_volume_total).' &euro; | S: '.formatNumber($item->sales_volume_total_shop).' &euro;'.
' | <button type="button" class="btn icon-btn btn-xs btn-secondary" data-toggle="modal" data-target="#modals-load-content"
data-id="'.$item->user_id.'"
@ -356,7 +359,7 @@ class TreeCalcBot
if($this->init_from === 'admin'){
$ret .= '<br><span class="small">'.
($this->sponsor->active_account ?
'<strong>Gesamte Points: '.$this->sponsor->sales_volume_points_sum.'</strong> | E: '.$this->sponsor->sales_volume_points.' | S: '.$this->sponsor->sales_volume_points_shop.' <strong>
'<strong>Gesamte Points: '.$this->sponsor->sales_volume_points_sum.'</strong> | E: '.$this->sponsor->sales_volume_KP_points.' | S: '.$this->sponsor->sales_volume_points_shop.' <strong>
| Umsatz netto: '.formatNumber($this->sponsor->sales_volume_total_sum).' &euro;</strong> | E: '.formatNumber($this->sponsor->sales_volume_total).' &euro; | S: '.formatNumber($this->sponsor->sales_volume_total_shop).' &euro;'
:
'Account bis: '.$this->sponsor->payment_account_date).

View file

@ -0,0 +1,379 @@
<?php
namespace App\Services\BusinessPlan;
use App\User;
use stdClass;
use Carbon;
use App\Models\UserBusinessStructure;
class ExportBot
{
public $date;
public $business_user;
public $business_users = [];
public $parentless = [];
private $sponsor;
private $init_from;
private static $userIDs = [];
public static function addUserID($id){
self::$userIDs[$id] = $id;
}
public function __construct($month, $year, $init_from = 'member')
{
$this->date = new stdClass();
$date = Carbon::parse($year.'-'.$month.'-1');
$this->date->month = $month;
$this->date->year = $year;
$this->date->start_date = $date->format('Y-m-d H:i:s');
$this->date->end_date = $date->endOfMonth()->format('Y-m-d H:i:s');
$this->init_from = $init_from;
}
public function initStructureAdmin($check = true)
{
//check is month is saved.
if($check && $UserBusinessStructure = self::isFromStored($this->date->month, $this->date->year)){
$this->readStoredRootUsers($UserBusinessStructure);
$this->readStoredParentsUsers($UserBusinessStructure);
$this->readStoredParentlessUser($UserBusinessStructure);
}else{
$this->readRootUsers();
$this->readParentsUsers();
$this->readParentlessUser();
}
}
public function initStructureUser($user_id)
{
$BusinessUserItem = new BusinessUserItem($this->date);
$BusinessUserItem->makeUser($user_id);
$BusinessUserItem->addUserID();
$this->business_users[] = $BusinessUserItem;
//check is month is saved.
if($UserBusinessStructure = self::isFromStored($this->date->month, $this->date->year)){
$this->readStoredParentsUsers($UserBusinessStructure);
if(isset($this->business_users[0]) && $this->business_users[0]->sponsor){
$this->readStoredSponsorUser($this->business_users[0]->sponsor->user_id);
}
}else{
$this->readParentsUsers();
$this->readSponsorUser($user_id);
}
}
public function initBusinesslUserDetail($user)
{
$this->business_user = new BusinessUserItem($this->date);
$this->business_user->makeUser($user->id);
$this->business_user->checkSponsor($user);
if(!$this->business_user->isSave()){
//Aufbau der Struktur für den User in die unendliche Tiefe.
$this->business_user->readParentsBusinessUsers();
//calculate Points in Lines
if(count($this->business_user->businessUserItems) > 0){
$this->calcUserPoints($this->business_user->businessUserItems, 1);
}
//qualifikation nach qual_kp (KundenPoints) und qual_pp (PaylinePoints)
$this->business_user->calcQualPP();
}
}
/*public function storeBusinesslUser()
{
$this->business_user->storeUser();
}*/
public static function isFromStored($month, $year){
//when is stored an completed
$UserBusinessStructure = UserBusinessStructure::where('year', $year)->where('month', $month)->first();
if($UserBusinessStructure && $UserBusinessStructure->completed){
return $UserBusinessStructure;
}
return false;
}
private function calcUserPoints($businessUserItems, $line){
if(!isset($this->business_user->business_lines[$line])){
$obj = new stdClass();
$obj->points = 0;
$this->business_user->addBusinessLineToUser($line, $obj);
}
foreach($businessUserItems as $business_user_item){
if(count($business_user_item->businessUserItems) > 0){
$this->calcUserPoints($business_user_item->businessUserItems, $line+1);
}
//business_lines points nach line
$this->business_user->addBusinessLinePoints($line, $business_user_item->sales_volume_points_TP_sum); //TP + Shop Points
//total_pp gesamte Punkte
$this->business_user->addTotalTP($business_user_item->sales_volume_points_TP_sum); //TP + Shop Points
}
}
public function getGrowthBonus(){
if(count($this->business_user->business_lines) > 6){
$b_lines = $this->business_user->business_lines->toArray();
return array_slice($b_lines, 6);
}
return [];
}
public function getKeybyLine($line, $key){
if($this->business_user->business_lines){
$b_lines = $this->business_user->business_lines;
if(isset($b_lines[$line])){
if($b_lines[$line] instanceof stdClass){
if(isset($b_lines[$line]->{$key})){
return $b_lines[$line]->{$key};
}
}else{
if(isset($b_lines[$line][$key])){
return $b_lines[$line][$key];
}
}
}
}
return 0;
}
//* reading from current*//
private function readRootUsers(){
$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', "=", null)
->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->business_users[] = $BusinessUserItem;
}
}
}
private function readParentsUsers(){
foreach($this->business_users as $business_user){
$business_user->readParentsBusinessUsers();
}
}
private function readParentlessUser(){
$users = User::with('account')->select('users.*')
->where('users.deleted_at', '=', null)
->where('users.id', '!=', 1)
->where('users.admin', "<", 4)
->where('users.payment_account', "!=", null)
->where('users.active_date', "<=", $this->date->end_date)
->get();
foreach($users as $user){
if(!isset(self::$userIDs[$user->id])){
$BusinessUserItem = new BusinessUserItem($this->date);
$BusinessUserItem->makeUser($user->id);
$this->parentless[] = $BusinessUserItem;
}
}
}
//* reading from stored*//
private function readStoredRootUsers(UserBusinessStructure $userBusinessStructure){
//first level is root
if($userBusinessStructure->structure){
foreach($userBusinessStructure->structure as $obj){
$BusinessUserItem = new BusinessUserItem($this->date);
$BusinessUserItem->makeUser($obj->user_id);
$BusinessUserItem->addUserID();
$this->business_users[] = $BusinessUserItem;
}
}
}
private function readStoredParentsUsers(UserBusinessStructure $userBusinessStructure){
foreach($this->business_users as $business_user){
$business_user->readStoredParentsBusinessUsers($userBusinessStructure->structure);
}
}
private function readStoredParentlessUser(UserBusinessStructure $userBusinessStructure){
if($userBusinessStructure->parentless){
foreach($userBusinessStructure->parentless as $obj){
if(!isset(self::$userIDs[$obj->user_id])){
$BusinessUserItem = new BusinessUserItem($this->date);
$BusinessUserItem->makeUser($obj->user_id);
$this->parentless[] = $BusinessUserItem;
}
}
}
}
public function readSponsorUser($user_id){
$user = User::find($user_id);
$userSponsor = User::find($user->m_sponsor);
if($userSponsor){
$this->sponsor = new BusinessUserItem($this->date);
$this->sponsor->makeUser($userSponsor->id);
}
}
public function readStoredSponsorUser($user_id){
$this->sponsor = new BusinessUserItem($this->date);
$this->sponsor->makeUser($user_id);
}
public function getItems(){
return $this->business_users;
}
public function makeHtmlTree(){
$deep = 0;
$ret = '<ol class="dd-list">';
foreach($this->business_users as $business_user){
$ret .= $this->addItem($business_user, $deep);
}
$ret .= '</ol>';
return $ret;
}
private function addItem($item, $deep){
$button = '';
if(($this->init_from === 'admin' && \Auth::user()->isAdmin()) || ($this->init_from === 'member')){ // && \Auth::user()->id === $item->user_id
$button = ' | <button type="button" class="btn icon-btn btn-xs btn-secondary" data-toggle="modal" data-target="#modals-load-content"
data-id="'.$item->user_id.'"
data-action="business-user-detail"
data-back=""
data-modal="modal-xl"
data-init_from="'.$this->init_from .'"
data-route="'.route('modal_load').'"><span class="far fa-calculator"></span></button>';
}
return '<li class="dd-item dd-nodrag" data-id="'.$item->user_id.'">'.
'<div class="dd-handle">
<div class="media align-items-center">
<div class="d-flex flex-column justify-content-center align-items-center">
'.(($deep > 0) ? '<div class="text-large font-weight-bolder line-height-1 my-2 text-secondary badge badge-outline-secondary">'.$deep.'</div>' : '').'
</div>
<div class="media-body ml-2">
<span class="'.($item->active_account ? '' : 'text-muted').'">
<span class="mr-1 ion ion-ios-contact '.($item->active_account ? 'text-primary' : 'text-danger').'"></span>
<strong>'.$item->first_name.' '.$item->last_name.'</strong> <a href="mailto: '.$item->email.'">'.$item->email.'</a> <span class="badge badge-outline-default '.($item->active_account ? '' : 'text-muted').'">'.$item->user_level_name.' | '.$item->m_account.'</span>
<br><span class="small">'.
($item->active_account ?
'<strong>Gesamte Points: '.$item->sales_volume_points_sum.'</strong> | E: '.$item->sales_volume_KP_points.' | S: '.$item->sales_volume_points_shop.' <strong>
| Umsatz netto: '.formatNumber($item->sales_volume_total_sum).' &euro;</strong> | E: '.formatNumber($item->sales_volume_total).' &euro; | S: '.formatNumber($item->sales_volume_total_shop).' &euro;'.
$button
:
'Account bis: '.$item->payment_account_date).
'</span>
</span>
</div>
</div>
</div>'.
$this->addParentItem($item, $deep).
'</li>';
}
private function addParentItem($item, $deep){
if($item->businessUserItems){
$ret = '<ol class="dd-list dd-nodrag">';
foreach($item->businessUserItems as $parent){
$ret .= $this->addItem($parent, $deep+1);
}
$ret .='</ol>';
return $ret;
}
return;
}
public function isParentless(){
return $this->parentless ? true : false;
}
public function makeParentlessHtml(){
$ret = "";
foreach($this->parentless as $item){
$ret .= '<li class="dd-item dd-nodrag" data-id="'.$item->user_id.'">'.
'<div class="dd-handle">
<span class="'.($item->active_account ? '' : 'text-muted').'">
<span class="mr-1 ion ion-ios-contact '.($item->active_account ? 'text-primary' : 'text-danger').'"></span>
<strong>'.$item->first_name.' '.$item->last_name.'</strong> <a href="mailto: '.$item->email.'">'.$item->email.'</a> <span class="badge badge-outline-default '.($item->active_account ? '' : 'text-muted').'">'.$item->user_level_name.' | '.$item->m_account.'</span>
<br><span class="small">'.
($item->active_account ?
'<strong>Gesamte Points: '.$item->sales_volume_points_sum.'</strong> | E: '.$item->sales_volume_KP_points.' | S: '.$item->sales_volume_points_shop.' <strong>
| Umsatz netto: '.formatNumber($item->sales_volume_total_sum).' &euro;</strong> | E: '.formatNumber($item->sales_volume_total).' &euro; | S: '.formatNumber($item->sales_volume_total_shop).' &euro;'.
' | <button type="button" class="btn icon-btn btn-xs btn-secondary" data-toggle="modal" data-target="#modals-load-content"
data-id="'.$item->user_id.'"
data-action="business-user-detail"
data-back=""
data-modal="modal-xl"
data-route="'.route('modal_load').'"><span class="far fa-calculator"></span></button>'
:
'Account bis: '.$item->payment_account_date).
'<br>'.$item->m_sponsor_name.
'</span>
</span>
</div>'.
'</li>';
}
return $ret;
}
public function makeSponsorHtml(){
if($this->sponsor){
//' | <a href="' . route('admin_business_user_detail', [$this->sponsor->id]) . '" class="btn icon-btn btn-xs btn-secondary"><span class="far fa-calculator"></span></a>'
$ret = '<li class="dd-item dd-nodrag" data-id="">'.
'<div class="dd-handle">
<span class="'.($this->sponsor->active_account ? '' : 'text-muted').'">
<span class="mr-1 ion ion-ios-contact '.($this->sponsor->active_account ? 'text-primary' : 'text-danger').'"></span>
<strong>'.$this->sponsor->first_name.' '.$this->sponsor->last_name.'</strong> <a href="mailto: '.$this->sponsor->email.'">'.$this->sponsor->email.'</a> <span class="badge badge-outline-default '.($this->sponsor->active_account ? '' : 'text-muted').'">'.$this->sponsor->user_level_name.' | '.$this->sponsor->m_account.'</span>';
if($this->init_from === 'admin'){
$ret .= '<br><span class="small">'.
($this->sponsor->active_account ?
'<strong>Gesamte Points: '.$this->sponsor->sales_volume_points_sum.'</strong> | E: '.$this->sponsor->sales_volume_KP_points.' | S: '.$this->sponsor->sales_volume_points_shop.' <strong>
| Umsatz netto: '.formatNumber($this->sponsor->sales_volume_total_sum).' &euro;</strong> | E: '.formatNumber($this->sponsor->sales_volume_total).' &euro; | S: '.formatNumber($this->sponsor->sales_volume_total_shop).' &euro;'
:
'Account bis: '.$this->sponsor->payment_account_date).
'</span>';
}
$ret .= '</span>
</div>
</li>';
return $ret;
}
return 'Keinen Sponsor zugewiesen';
}
}