Последняя версия с сервера прошлого разработчика
This commit is contained in:
14
app/Domain/Votes/Models/Vote.php
Executable file
14
app/Domain/Votes/Models/Vote.php
Executable file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domain\Votes\Models;
|
||||
|
||||
use App\Models\Model;
|
||||
use App\Models\User;
|
||||
|
||||
class Vote extends Model
|
||||
{
|
||||
public function users()
|
||||
{
|
||||
return $this->belongsToMany(User::class)->withPivot('payment');
|
||||
}
|
||||
}
|
||||
22
app/Domain/Votes/Observers/VoteObserver.php
Executable file
22
app/Domain/Votes/Observers/VoteObserver.php
Executable file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
namespace App\Domain\Votes\Observers;
|
||||
|
||||
use App\Domain\Votes\Models\Vote;
|
||||
use App\Domain\Votes\Services\VoteService;
|
||||
|
||||
class VoteObserver
|
||||
{
|
||||
|
||||
public function created(Vote $vote)
|
||||
{
|
||||
$mode = nova_get_setting('vote_paid_mode');
|
||||
|
||||
// Платный режим
|
||||
if($mode){
|
||||
(new VoteService($vote))->accrualPoints();
|
||||
}else{
|
||||
(new VoteService($vote))->freeMode();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
180
app/Domain/Votes/Services/VoteService.php
Executable file
180
app/Domain/Votes/Services/VoteService.php
Executable file
@@ -0,0 +1,180 @@
|
||||
<?php
|
||||
namespace App\Domain\Votes\Services;
|
||||
|
||||
use DB;
|
||||
use Carbon\Carbon;
|
||||
use App\Models\User;
|
||||
use App\Domain\Points\Models\Point;
|
||||
use App\Domain\Points\Enums\DirectionEnum;
|
||||
use App\Domain\Subscriptions\Models\Subscription;
|
||||
use App\Domain\Subscriptions\Service\SubscriptionService;
|
||||
|
||||
class VoteService
|
||||
{
|
||||
public $vote;
|
||||
public $leaders;
|
||||
|
||||
public function __construct($vote)
|
||||
{
|
||||
$leader_count = nova_get_setting('vote_leader_count');
|
||||
$leaders = SubscriptionService::leaders();
|
||||
$leaders = array_column(array_slice($leaders, 0, $leader_count), 'user_id');
|
||||
$this->leaders = $leaders;
|
||||
$this->vote = $vote;
|
||||
}
|
||||
|
||||
|
||||
public function accrualPoints()
|
||||
{
|
||||
DB::beginTransaction();
|
||||
|
||||
$procent_site = (int)nova_get_setting('vote_procent_site');
|
||||
$procent_site = $procent_site / 100;
|
||||
|
||||
$procent_top = (int)nova_get_setting('vote_procent_leader');
|
||||
$procent_top = $procent_top / 100;
|
||||
|
||||
$procent_local = (int)nova_get_setting('vote_procent_local_leader');
|
||||
$procent_local = $procent_local / 100;
|
||||
|
||||
$subscriptions = Subscription::with('user.subscribers.subscription')->where('ends_at', '>', Carbon::now())
|
||||
->where('status', 'complete')->get();
|
||||
|
||||
$sum_site = 0;
|
||||
$sdr_leader_pay = 0;
|
||||
$sdr_leader_for_all_pay = [];
|
||||
|
||||
foreach ($subscriptions as $subscription) {
|
||||
|
||||
|
||||
$user = $subscription->user;
|
||||
$subscribers = $this->activeSubs($user->subscribers);
|
||||
|
||||
// Фильтр лидеров
|
||||
$subscribersLeader = $subscribers->filter(function ($subscriber) {
|
||||
return $subscriber->pivot->leader === 1;
|
||||
});
|
||||
// Фильтр простых пользователей
|
||||
$subscribersSimple = $subscribers->filter(function ($subscriber) {
|
||||
return $subscriber->pivot->leader === 0;
|
||||
});
|
||||
|
||||
|
||||
|
||||
$price = $subscription->price;
|
||||
$to_site = round($price * $procent_site);
|
||||
$sum_site += $to_site;
|
||||
|
||||
$sdr = round($price - $to_site); // сумма для распределения
|
||||
|
||||
$sdr_leader_global = round($sdr * $procent_top);
|
||||
$sdr_leader_local = round($sdr * $procent_local);
|
||||
|
||||
$sdr_simple = $sdr - $sdr_leader_global - $sdr_leader_local;
|
||||
|
||||
// добавляем лидерам
|
||||
$sdr_leader_pay += $sdr_leader_global;
|
||||
|
||||
//если 0 подписок, но куплена подписка на сайт
|
||||
// отдаем лидеру 40%, а 60% сайту
|
||||
if($subscribers->isEmpty()){
|
||||
$sum_site += ($sdr - $sdr_leader_global); // 20%сайту(вместо локальных) и 40%сайту (вместо простых)
|
||||
}else {
|
||||
if ($subscribersLeader->isNotEmpty()) {
|
||||
//Выплачиваем каждому локальному лидеру
|
||||
$sdr_parts_local = round($sdr_leader_local / $subscribersLeader->count());
|
||||
//сохраняем транзакции локальных лидеров
|
||||
foreach ($subscribersLeader as $subs) {
|
||||
$sdr_leader_for_all_pay[$subs->id][] = $sdr_parts_local;
|
||||
}
|
||||
}else{
|
||||
$sum_site += $sdr_leader_local; //если у пользователя есть подписки, но он не выбрал лидеров
|
||||
}
|
||||
|
||||
if ($subscribersSimple->isNotEmpty()) {
|
||||
//Выплачиваем каждому юзеру
|
||||
$sdr_parts = round($sdr_simple / $subscribersSimple->count());
|
||||
//сохраняем транзакции простых пользователей
|
||||
foreach ($subscribersSimple as $subs) {
|
||||
$sdr_leader_for_all_pay[$subs->id][] = $sdr_parts;
|
||||
}
|
||||
}else{
|
||||
$sum_site += $sdr_simple;
|
||||
}
|
||||
}
|
||||
|
||||
$this->updateSubs($subscription);
|
||||
}
|
||||
|
||||
$part_for_leader = round($sdr_leader_pay/count($this->leaders));
|
||||
foreach ($this->leaders as $leader) {
|
||||
$sdr_leader_for_all_pay[$leader][] = $part_for_leader;
|
||||
}
|
||||
|
||||
|
||||
$this->payUsers($sdr_leader_for_all_pay);
|
||||
$this->payForSystemUser($sum_site);
|
||||
|
||||
DB::commit();
|
||||
}
|
||||
|
||||
private function payUsers($sdr)
|
||||
{
|
||||
$sdr_users_pay = array_map(function ($lines) {
|
||||
return array_sum($lines);
|
||||
}, $sdr);
|
||||
|
||||
|
||||
foreach ($sdr_users_pay as $user_pay_id => $sdr_user) {
|
||||
$this->addPoint($user_pay_id, $sdr_user);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private function payForSystemUser($sum_site)
|
||||
{
|
||||
$system_user_id = User::system()->id;
|
||||
$this->addPoint($system_user_id, $sum_site);
|
||||
}
|
||||
|
||||
|
||||
private function addPoint($user_id, $amount)
|
||||
{
|
||||
$point = new Point;
|
||||
$point->user_id = $user_id;
|
||||
$point->point = $amount;
|
||||
$point->type = 'votes'; //YSV ENUM!
|
||||
$point->direction = DirectionEnum::COMING();
|
||||
$point->save();
|
||||
|
||||
$this->vote->users()->attach($user_id, ['payment' => $amount]);
|
||||
}
|
||||
|
||||
private function updateSubs($sub)
|
||||
{
|
||||
$sub->status = 'end'; //YSV ENUM!
|
||||
$sub->save();
|
||||
}
|
||||
|
||||
|
||||
//проверка на акт. подписки
|
||||
private function activeSubs($subscribers)
|
||||
{
|
||||
return $subscribers->filter(function ($subscriber) {
|
||||
return optional($subscriber->subscription->first())->ends_at > Carbon::now();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public function freeMode()
|
||||
{
|
||||
|
||||
$users = SubscriptionService::freeLeaders();
|
||||
|
||||
foreach ($users as $leader) {
|
||||
$this->vote->users()->attach($leader->id, ['payment' => $leader->countVote]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
155
app/Domain/Votes/Services/VoteServiceOld.php
Executable file
155
app/Domain/Votes/Services/VoteServiceOld.php
Executable file
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
namespace App\Domain\Votes\Services;
|
||||
|
||||
use DB;
|
||||
use Carbon\Carbon;
|
||||
use App\Models\User;
|
||||
use App\Domain\Points\Models\Point;
|
||||
use App\Domain\Points\Enums\DirectionEnum;
|
||||
use App\Domain\Subscriptions\Models\Subscription;
|
||||
use App\Domain\Subscriptions\Service\SubscriptionService;
|
||||
|
||||
class VoteServiceOld
|
||||
{
|
||||
public $vote;
|
||||
public $leaders;
|
||||
|
||||
public function __construct($vote)
|
||||
{
|
||||
$leaders = SubscriptionService::leaders();
|
||||
$leaders = array_column(array_slice($leaders, 0, 2), 'user_id');
|
||||
$this->leaders = $leaders;
|
||||
$this->vote = $vote;
|
||||
}
|
||||
|
||||
|
||||
public function accrualPoints()
|
||||
{
|
||||
DB::beginTransaction();
|
||||
|
||||
$procent_site = (int)$this->vote->procent_site;
|
||||
$procent_site = $procent_site / 100;
|
||||
$procent_top = (int)$this->vote->procent_top;
|
||||
$procent_top = $procent_top / 100;
|
||||
|
||||
$subscriptions = Subscription::with('user.subscribers.subscription')->where('ends_at', '>', Carbon::now())
|
||||
->where('status', 'complete')->get();
|
||||
|
||||
$sum_site = 0;
|
||||
$sdr_leader_pay = 0;
|
||||
$sdr_users_pay = [];
|
||||
foreach ($subscriptions as $subscription) {
|
||||
$subscribers_simple = collect([]);
|
||||
$user = $subscription->user;
|
||||
|
||||
$subscribers = $this->activeSubs($user->subscribers);
|
||||
$one_sub_is_leader = $this->oneLeaders($subscribers);
|
||||
|
||||
if (! $one_sub_is_leader) {
|
||||
$subscribers_simple = $subscribers->filter(function ($subscriber) {
|
||||
return ! in_array($subscriber->id, $this->leaders);
|
||||
});
|
||||
}
|
||||
|
||||
$price = $subscription->price;
|
||||
$to_site = $price * $procent_site;
|
||||
$sum_site += $to_site;
|
||||
$sdr = round($price - $to_site);
|
||||
|
||||
$sdr_leader = round($sdr * $procent_top);
|
||||
$sdr_simple = $sdr - $sdr_leader;
|
||||
|
||||
if ($one_sub_is_leader) {
|
||||
//выплачиваем весь sdr если чел. подписан на лидеров, и у него больше нет простых
|
||||
$sdr_leader_pay += $sdr;
|
||||
} else {
|
||||
$sdr_leader_pay += $sdr_leader;
|
||||
}
|
||||
|
||||
if ($subscribers_simple->isNotEmpty()) {
|
||||
//Выплачиваем каждому юзеру
|
||||
$sdr_parts = round($sdr_simple / $subscribers_simple->count());
|
||||
//сохраняем транзакции простых пользователей
|
||||
foreach ($subscribers_simple as $subs) {
|
||||
$sdr_users_pay[$subs->id][] = $sdr_parts;
|
||||
}
|
||||
}
|
||||
|
||||
$this->updateSubs($subscription);
|
||||
}
|
||||
|
||||
$this->payForSimpleUser($sdr_users_pay);
|
||||
$this->payForLeaderUser($sdr_leader_pay);
|
||||
$this->payForSystemUser($sum_site);
|
||||
|
||||
DB::commit();
|
||||
}
|
||||
|
||||
public function payForSystemUser($sum_site)
|
||||
{
|
||||
$system_user_id = User::system()->id;
|
||||
$this->addPoint($system_user_id, $sum_site);
|
||||
}
|
||||
|
||||
//оплата лидеров
|
||||
public function payForLeaderUser($sdr_leader_pay)
|
||||
{
|
||||
$part_for_leader = round($sdr_leader_pay/count($this->leaders));
|
||||
|
||||
foreach ($this->leaders as $leader) {
|
||||
$this->addPoint($leader, $part_for_leader);
|
||||
}
|
||||
}
|
||||
|
||||
//оплата обычных
|
||||
public function payForSimpleUser($sdr_users_pay)
|
||||
{
|
||||
$sdr_users_pay = array_map(function ($lines) {
|
||||
return array_sum($lines);
|
||||
}, $sdr_users_pay);
|
||||
|
||||
foreach ($sdr_users_pay as $user_pay_id => $sdr_users) {
|
||||
$this->addPoint($user_pay_id, $sdr_users);
|
||||
}
|
||||
}
|
||||
|
||||
public function addPoint($user_id, $amount)
|
||||
{
|
||||
$point = new Point;
|
||||
$point->user_id = $user_id;
|
||||
$point->point = $amount;
|
||||
$point->type = 'votes'; //YSV ENUM!
|
||||
$point->direction = DirectionEnum::COMING();
|
||||
$point->save();
|
||||
|
||||
$this->vote->users()->attach($user_id, ['payment' => $amount]);
|
||||
}
|
||||
|
||||
public function updateSubs($sub)
|
||||
{
|
||||
$sub->status = 'end'; //YSV ENUM!
|
||||
$sub->save();
|
||||
}
|
||||
|
||||
// есть в списке только лидеры
|
||||
public function oneLeaders($subscribers)
|
||||
{
|
||||
if ($subscribers->count() <= count($this->leaders)) {
|
||||
$contains = $subscribers->filter(function ($subscriber) {
|
||||
return in_array($subscriber->id, $this->leaders);
|
||||
});
|
||||
if ($contains->count() === $subscribers->count()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//проверка на акт. подписки
|
||||
public function activeSubs($subscribers)
|
||||
{
|
||||
return $subscribers->filter(function ($subscriber) {
|
||||
return optional($subscriber->subscription->first())->ends_at > Carbon::now();
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user