OKyJIucT

Untitled

Apr 13th, 2023
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.61 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: kohone
  5.  * Date: 22.11.2018
  6.  * Time: 16:09
  7.  */
  8.  
  9. namespace App\Services\Dashboard;
  10.  
  11.  
  12. use App\Http\Resources\DealResource\DealDashboardResource;
  13. use App\Http\Resources\LeadResource\LeadDashboardResource;
  14. use App\Models\Deal\Deal;
  15. use App\Models\Lead\Lead;
  16. use App\Models\Payment\Payment;
  17. use App\Models\Team\Team;
  18. use App\Models\Team\TeamUser;
  19. use App\Models\User;
  20. use App\Services\Deal\DealService;
  21. use App\Services\Lead\LeadService;
  22. use Carbon\Carbon;
  23. use Illuminate\Http\Request;
  24.  
  25. class DashboardService
  26. {
  27.     /**
  28.      * @var Lead
  29.      */
  30.     private $_leadModel;
  31.  
  32.     /**
  33.      * @var
  34.      */
  35.     private $_leadService;
  36.  
  37.     /**
  38.      * @var
  39.      */
  40.     private $_dealService;
  41.  
  42.  
  43.     /**
  44.      * @var
  45.      */
  46.     private $_role;
  47.  
  48.  
  49.     /**
  50.      * @var mixed
  51.      */
  52.     private $_user;
  53.  
  54.  
  55.     public function __construct(
  56.         Request $request,
  57.         Lead $leadModel,
  58.         LeadService $leadService,
  59.         DealService $dealService
  60.     ) {
  61.         $this->_leadModel = $leadModel;
  62.         $this->_leadService = $leadService;
  63.         $this->_dealService = $dealService;
  64.         $this->_user = $request->user();
  65.         $this->_role = $this->_user->getRole();
  66.     }
  67.  
  68.  
  69.     public function userDashboardData()
  70.     {
  71.         $deals = [];
  72.         $leads = [];
  73.         $total_payments = '';
  74.         $statuses_role = Lead::getLeadStatusForList();
  75.         $list = $this->_leadModel;
  76.  
  77.         $this->_leadService->useOffset($list);
  78.         $this->_leadService->useSort($list);
  79.         $this->_leadService->useFilter($list);
  80.  
  81.         switch ($this->_role) {
  82.             case User::ROLE_TEAMLEAD:
  83.                 $team = Team::select('teams.*')
  84.                     ->leftJoin('team_teamleads', 'team_teamleads.team_id', '=', 'teams.id')
  85.                     ->where('team_teamleads.user_id', $this->_user->id)
  86.                     ->first();
  87.  
  88.                 if ($team) {
  89.                     $total_payments = $this->getTeamPayments($team);
  90.                     $teamUsers = TeamUser::where('team_id', $team->id)
  91.                         ->groupBy('user_id')
  92.                         ->pluck('user_id')
  93.                         ->toArray();
  94.                     $deals = Deal::whereIn('manager_id', $teamUsers)->orderBy('deals.created_at', 'desc')->take(5)->get(
  95.                     );
  96.                     $leads = $list->with([
  97.                         'country',
  98.                         'mirrors' => function ($mirror) {
  99.                             $mirror->where('main', true);
  100.                         }
  101.                     ])->whereIn('status', $statuses_role[$this->_role])->whereIn('owner_id', $teamUsers)->orderBy(
  102.                         'leads.created_at',
  103.                         'desc'
  104.                     )->take(5)->get();
  105.                 }
  106.  
  107.                 break;
  108.  
  109.             case User::ROLE_FIN_CONTROL:
  110.                 $deals = Deal::whereHas('payments', function ($query) {
  111.                     $query->where('status', Payment::STATUS_WAITING_FOR_PAYMENT);
  112.                 })->where([['fincontrol_id', $this->_user->id]])->orderBy('deals.created_at', 'desc')->take(5)->get();
  113.                 break;
  114.  
  115.             case User::ROLE_BUYING_CONTROL:
  116.                 $list = (new Deal())->newQuery();
  117.                 $list->select('deals.*');
  118.                 $list->where([['deals.status', Deal::STATUS_REVIEW]]);
  119.                 $this->_dealService->useFilter($list);
  120.                 $deals = $list->orderBy('deals.created_at', 'desc')->take(5)->get();
  121.                 break;
  122.  
  123.             case User::ROLE_AUDITOR:
  124.                 $deals = Deal::whereHas('payments', function ($query) {
  125.                     $query->where('status', Payment::STATUS_AUDIT);
  126.                 })->orderBy('deals.created_at', 'desc')->take(5)->get();
  127.                 break;
  128.  
  129.             case User::ROLE_SEARCHER:
  130.                 $leads = Lead::with([
  131.                     'country',
  132.                     'mirrors' => function ($mirror) {
  133.                         $mirror->where('main', true);
  134.                     }
  135.                 ])->where('owner_id', $this->_user->id)->whereIn('status', $statuses_role[$this->_role])->orderBy(
  136.                     'leads.created_at',
  137.                     'desc'
  138.                 )->take(5)->get();
  139.                 break;
  140.  
  141.             case User::ROLE_CHIEF:
  142.                 $deals = Deal::where('type', Deal::DEAL_TYPE_OFFLINE)->orderBy('deals.created_at', 'desc')->take(
  143.                     5
  144.                 )->get();
  145.                 break;
  146.  
  147.             case User::ROLE_CONTROL:
  148.                 $team_user = TeamUser::where('user_id', $this->_user->id)->first();
  149.                 $user_team = TeamUser::where('team_id', $team_user->team_id)->pluck('user_id')->toArray();
  150.                 $leads = $list->with([
  151.                     'country',
  152.                     'mirrors' => function ($mirror) {
  153.                         $mirror->where('main', true);
  154.                     }
  155.                 ])->whereIn('status', $statuses_role[$this->_role])->whereIn('owner_id', $user_team)->orderBy(
  156.                     'leads.created_at',
  157.                     'desc'
  158.                 )->take(5)->get();
  159.                 $deals = [];
  160.                 break;
  161.  
  162.             case User::ROLE_HEAD_CONTROL:
  163.                 $teams = Team::select('teams.*')
  164.                     ->leftJoin('team_heads', 'team_heads.team_id', '=', 'teams.id')
  165.                     ->where('team_heads.user_id', $this->_user->id)
  166.                     ->get();
  167.  
  168.                 if (count($teams)) {
  169.                     $teamUsers[$this->_user->id] = $this->_user->id;
  170.  
  171.                     // собираем манагеров со всех тим, в которых состоит head
  172.                     foreach ($teams as $team) {
  173.                         $result = TeamUser::where('team_id', $team->id)
  174.                             ->groupBy('user_id')
  175.                             ->get()
  176.                             ->pluck('user_id');
  177.  
  178.                         if (count($result)) {
  179.                             foreach ($result as $item) {
  180.                                 $teamUsers[$item] = $item;
  181.                             }
  182.                         }
  183.                     }
  184.  
  185.                     $deals = Deal::whereIn('manager_id', $teamUsers)->orderBy('deals.created_at', 'desc')->take(5)->get(
  186.                     );
  187.                 }
  188.  
  189.                 break;
  190.  
  191.             case User::ROLE_MANAGER:
  192.                 $leads = $list->with([
  193.                     'country',
  194.                     'mirrors' => function ($mirror) {
  195.                         $mirror->where('main', true);
  196.                     }
  197.                 ])->whereIn('status', $statuses_role[$this->_role])->groupBy('leads.id')->orderBy(
  198.                     'leads.created_at',
  199.                     'desc'
  200.                 )->take(5)->get();
  201.  
  202.                 $deals = Deal::whereIn('status', $statuses_role[$this->_role])->where([['manager_id', $this->_user->id]]
  203.                 )->orderBy('deals.created_at', 'desc')->take(5)->get();
  204.  
  205.                 break;
  206.  
  207.             case User::ROLE_ADMIN:
  208.                 $leads = $list->with([
  209.                     'country',
  210.                     'mirrors' => function ($mirror) {
  211.                         $mirror->where('main', true);
  212.                     }
  213.                 ])->whereIn('status', $statuses_role[$this->_role])->where(
  214.                     'leads.created_at',
  215.                     '<=',
  216.                     Carbon::now()
  217.                 )->orderBy('leads.created_at', 'desc')->take(5)->get();
  218.  
  219.                 $deals = Deal::where('type', '!=', Deal::DEAL_TYPE_GOOGLE_DOCS)->orderBy(
  220.                     'deals.created_at',
  221.                     'desc'
  222.                 )->take(5)->get();
  223.  
  224.                 $total_payments = $this->getTeamPayments();
  225.  
  226.                 break;
  227.         }
  228.  
  229.         $response = [
  230.             'deals' => DealDashboardResource::collection($deals),
  231.             'leads' => LeadDashboardResource::collection($leads),
  232.             'crm_payments' => isset($total_payments['cpm']) ? $total_payments['cpm'] : null,
  233.             'doc_payments' => isset($total_payments['gdoc']) ? $total_payments['gdoc'] : null
  234.         ];
  235.  
  236.         return $response;
  237.     }
  238.  
  239.  
  240.     public function getTeamPayments($team = null)
  241.     {
  242.         $startDate = Carbon::now()->startOfMonth();
  243.         $endDate = Carbon::now();
  244.         $costItem = 3;
  245.         $google_doc_percent = 0;
  246.         $crm_percent = 0;
  247.  
  248.         $list = Payment::select(
  249.             'payments.created_at',
  250.             'payments.usd_summary as usd_cost',
  251.             'teams.name as team_name',
  252.             'deals.type as deal_type'
  253.         )
  254.             ->leftJoin('deals', 'payments.deal_id', '=', 'deals.id')
  255.             ->leftJoin('teams', 'deals.team_id', '=', 'teams.id')
  256.             ->whereBetween('payments.created_at', [$startDate, $endDate])
  257.             ->where('payments.status', Payment::STATUS_DONE)
  258.             ->where('deals.cost_item_id', $costItem);
  259.  
  260.         if (!is_null($team)) {
  261.             $list->where('deals.team_id', $team->id);
  262.         }
  263.         $payments = $list->groupBy('payments.id')->get();
  264.  
  265.         foreach ($payments as $payment) {
  266.             if ($payment->deal_type === Deal::DEAL_TYPE_GOOGLE_DOCS) {
  267.                 $google_doc_percent++;
  268.             }
  269.             $crm_percent++;
  270.         }
  271.         if ($crm_percent > 0) {
  272.             $google_doc_percent = (round((($google_doc_percent / $crm_percent) * 100), 2));
  273.             $crm_percent = 100 - $google_doc_percent;
  274.         }
  275.  
  276.         return ['cpm' => $crm_percent, 'gdoc' => $google_doc_percent];
  277.     }
  278.  
  279. }
  280.  
Add Comment
Please, Sign In to add comment