users = [];
$this->users_pending = [];
}
public function readUserHasCredits(){
//user by m_sponsor_id die Partner Provisionen haben
$usersWithPartnerCommission = $this->getUsersWithPartnerCommission(false);
//user die manuelle Gutschriften haben
$usersWithCreditMargin = $this->getUsersWithCreditMargin();
//user die Shop Provisionen haben
$usersWithShopCommission = $this->getUsersWithShopCommission(false);
// Alle Benutzer zum Array hinzufügen
$allUsers = $usersWithPartnerCommission->concat($usersWithCreditMargin)->concat($usersWithShopCommission);
foreach ($allUsers as $user) {
//prüfe ob der User Account noch aktiv ist
if(UserHelper::isActiveAccountByID($user->user_id)){
$this->addUser($user);
}
}
}
public function readUserHasPendingCredit(){
//sponsor Users von Provisionen die bezahlt wurden die noch im pending sind
$usersWithPartnerCommissionPending = $this->getUsersWithPartnerCommission(true);
$usersWithShopCommissionPending = $this->getUsersWithShopCommission(true);
// Alle Benutzer zum Array hinzufügen
$allUsers = $usersWithPartnerCommissionPending->concat($usersWithShopCommissionPending);
foreach ($allUsers as $user) {
//prüfe ob der User Account noch aktiv ist
if(UserHelper::isActiveAccountByID($user->user_id)){
$this->addUserPending($user);
}
}
}
public function getUsers(){
return $this->users;
}
public function getUsersPending(){
return $this->users_pending;
}
private function addUser($user){
// Prüfen, ob Benutzer bereits existiert
if (!isset($this->users[$user->user_id])) {
$this->users[$user->user_id] = $this->createUserCredit($user);
$this->addCreditItems($user->user_id, false);
}
}
private function addUserPending($user){
// Prüfen, ob Benutzer bereits existiert
if (!isset($this->users_pending[$user->user_id])) {
$this->users_pending[$user->user_id] = $this->createUserCredit($user);
$this->addCreditItems($user->user_id, true);
}
}
private function addCreditItems($user_id, $isPending){
// Partner Provisionen hinzufügen
$this->addPartnerCommissionItems($user_id, $isPending);
// Shop Provisionen hinzufügen
$this->addShopCommissionItems($user_id, $isPending);
// Wenn es nicht ausstehende Credits sind, füge manuelle Gutschriften hinzu
if (!$isPending) {
$this->addCreditMarginItems($user_id);
}
}
private function addPartnerCommissionItems($user_id, $isPending){
$shoppingOrderMargins = UserMarign::getPartnerCommissionItems($user_id, $isPending);
if ($isPending) {
$targetArray = 'users_pending';
} else {
$targetArray = 'users';
}
foreach ($shoppingOrderMargins as $shoppingOrderMargin) {
$entry = $this->createCreditEntry($shoppingOrderMargin);
if ($shoppingOrderMargin->net_partner_commission) {
$entry->price_formatted = $shoppingOrderMargin->getFormattedNetPartnerCommission();
$entry->price = $shoppingOrderMargin->net_partner_commission;
}
$this->{$targetArray}[$user_id]->addItem($entry);
if (!empty($entry->price)) {
$this->{$targetArray}[$user_id]->total += $entry->price;
}
}
}
private function addShopCommissionItems($user_id, $isPending){
$shoppingOrderMargins = UserMarign::getShopCommissionItems($user_id, $isPending);
if ($isPending) {
$targetArray = 'users_pending';
} else {
$targetArray = 'users';
}
foreach ($shoppingOrderMargins as $shoppingOrderMargin) {
$entry = $this->createCreditEntry($shoppingOrderMargin);
$entry->delete = $this->addDeleteButton($shoppingOrderMargin->id, 'shopping_order_margin');
if ($shoppingOrderMargin->net_discount) {
$entry->price_formatted = $shoppingOrderMargin->getFormattedNetDiscount();
$entry->price = $shoppingOrderMargin->net_discount;
}
$this->{$targetArray}[$user_id]->addItem($entry);
if (!empty($entry->price)) {
$this->{$targetArray}[$user_id]->total += $entry->price;
}
}
}
private function addCreditMarginItems($user_id){
$creditMargins = UserMarign::getUserCreditMarginByUserID($user_id);
foreach ($creditMargins as $creditMargin) {
$entry = new \stdClass();
$entry->badge = ' ';
$entry->link = '';//route('admin_credits_detail', [$creditMargin->id]);
$entry->name = nl2br($creditMargin->message);
$entry->reference = '';
$entry->total = '';
$entry->date = $creditMargin->created_at->format("d.m.Y");
$entry->price_formatted = formatNumber($creditMargin->credit);
$entry->price = $creditMargin->credit;
$entry->delete = $this->addDeleteButton($creditMargin->id, 'user_credit_margin', $creditMargin->deleteTime());
$this->users[$user_id]->addItem($entry);
if (!empty($entry->price)) {
$this->users[$user_id]->total += $entry->price;
}
}
}
private function createCreditEntry($shoppingOrderMargin){
$entry = new \stdClass();
$entry->badge = \App\Services\Payment::getPaymentForTypeBadge($shoppingOrderMargin->shopping_order);
if ($shoppingOrderMargin->shopping_order->payment_for === 7 || $shoppingOrderMargin->shopping_order->payment_for === 8) {
$entry->link = route('admin_sales_customers_detail', [$shoppingOrderMargin->shopping_order->id]);
} else {
$entry->link = route('admin_sales_users_detail', [$shoppingOrderMargin->shopping_order->id]);
}
$entry->name = $shoppingOrderMargin->shopping_order->shopping_user->billing_firstname . " " .
$shoppingOrderMargin->shopping_order->shopping_user->billing_lastname;
$entry->reference = $shoppingOrderMargin->shopping_order->getLastShoppingPayment('reference');
$entry->total = $shoppingOrderMargin->shopping_order->getFormattedTotalWithoutCredit() . " €";
$entry->date = $shoppingOrderMargin->shopping_order->created_at->format("d.m.Y");
return $entry;
}
private function addDeleteButton($id, $type, $deleteTime = false){
if($type === 'shopping_order_margin'){
return '
';
}
if($type === 'user_credit_margin'){
if($deleteTime){
return '
noch '. $deleteTime .' min.
';
}
}
return '';
}
/**
* Gibt User mit Partner Provisionen zurück
*
* @param bool $isPending True für künftige Provisionen, False für fällige Provisionen
* @return \Illuminate\Database\Eloquent\Collection
*/
private function getUsersWithPartnerCommission(bool $isPending)
{
$query = ShoppingOrderMargin::join('users', 'm_sponsor_id', '=', 'users.id')
->groupBy('m_sponsor_id')
->join('user_accounts', 'account_id', '=', 'user_accounts.id')
->select('users.id as user_id', 'users.email', 'user_accounts.first_name', 'user_accounts.last_name')
->whereOrderPaid(true)
->whereOutPaid(false)
->whereCancellation(false)
->wherePartnerCommissionPaid(false)
->whereNotNull('partner_commission_pending_to');
if ($isPending) {
$query->where('partner_commission_pending_to', '>=', Carbon::now());
} else {
$query->where('partner_commission_pending_to', '<', Carbon::now());
}
return $query->get();
}
/**
* Gibt User mit Shop Provisionen zurück
*
* @param bool $isPending True für künftige Provisionen, False für fällige Provisionen
* @return \Illuminate\Database\Eloquent\Collection
*/
private function getUsersWithShopCommission(bool $isPending)
{
$query = ShoppingOrderMargin::join('users', 'user_id', '=', 'users.id')
->groupBy('user_id')
->join('user_accounts', 'account_id', '=', 'user_accounts.id')
->select('users.id as user_id', 'users.email', 'user_accounts.first_name', 'user_accounts.last_name')
->whereOrderPaid(true)
->whereOutPaid(false)
->whereCancellation(false)
->whereMarginPaid(false)
->whereNotNull('margin_pending_to');
if ($isPending) {
$query->where('margin_pending_to', '>=', Carbon::now());
} else {
$query->where('margin_pending_to', '<', Carbon::now());
}
return $query->get();
}
/**
* Gibt User mit manuellen Gutschriften zurück
*
* @return \Illuminate\Database\Eloquent\Collection
*/
private function getUsersWithCreditMargin()
{
return UserCreditMargin::join('users', 'user_id', '=', 'users.id')
->join('user_accounts', 'account_id', '=', 'user_accounts.id')
->select('user_id', 'users.email', 'user_accounts.first_name', 'user_accounts.last_name')
->wherePaid(false)
->get();
}
/**
* Erstellt ein neues UserCredits-Objekt
*
* @param object $user Benutzerdaten
* @return UserCredits
*/
private function createUserCredit($user)
{
$userCredit = new UserCredits();
$userCredit->email = $user->email;
$userCredit->first_name = $user->first_name;
$userCredit->last_name = $user->last_name;
$userCredit->user_id = $user->user_id;
$userCredit->total = 0;
return $userCredit;
}
}