ultimatepos/Modules/Crm/Http/Controllers/CrmDashboardController.php

305 lines
9.1 KiB
PHP

<?php
namespace Modules\Crm\Http\Controllers;
use App\Category;
use App\Contact;
use App\User;
use DB;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\Crm\Entities\CrmCallLog;
use Modules\Crm\Entities\CrmContact;
use Modules\Crm\Entities\Schedule;
use Modules\Crm\Utils\CrmUtil;
class CrmDashboardController extends Controller
{
protected $crmUtil;
/**
* Constructor
*
* @param Util $commonUtil
* @return void
*/
public function __construct(CrmUtil $crmUtil)
{
$this->crmUtil = $crmUtil;
}
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$business_id = request()->session()->get('user.business_id');
$contacts = Contact::where('business_id', $business_id)
->Active()
->get();
$customers = $contacts->whereIn('type', ['customer', 'both']);
$leads = $contacts->where('type', 'lead');
$total_customers = $customers->count();
$total_leads = $leads->count();
$sources = Category::where('business_id', $business_id)
->where('category_type', 'source')
->get();
$total_sources = $sources->count();
$life_stages = Category::where('business_id', $business_id)
->where('category_type', 'life_stage')
->get();
$total_life_stage = $life_stages->count();
$leads_by_life_stage = $leads->groupBy('crm_life_stage');
$contacts_count_by_source = CrmContact::getContactsCountBySourceOfGivenTyps($business_id);
$leads_count_by_source = CrmContact::getContactsCountBySourceOfGivenTyps($business_id, ['lead']);
$customers_count_by_source = CrmContact::getContactsCountBySourceOfGivenTyps($business_id, ['customer', 'both']);
$todays_birthdays = array_merge($this->getBirthdays($customers)['todays_birthdays'], $this->getBirthdays($leads)['todays_birthdays']);
$upcoming_birthdays = array_merge($this->getBirthdays($customers)['upcoming_birthdays'], $this->getBirthdays($leads)['upcoming_birthdays']);
$my_follow_ups = $this->myFollowUps();
$my_follow_ups_arr = [];
foreach ($my_follow_ups as $follow_up) {
if (! empty($follow_up->status)) {
$my_follow_ups_arr[$follow_up->status] = $follow_up->total_follow_ups;
} else {
$my_follow_ups_arr['__other'] = $follow_up->total_follow_ups;
}
}
$statuses = Schedule::statusDropdown();
$my_leads = $this->myLeads();
$my_conversion = $this->myConversion();
$todays_followups = $this->todaysFollowUp();
$my_call_logs = [];
if (config('constants.enable_crm_call_log')) {
$my_call_logs = $this->getMyCallLogs();
}
$followup_category = Category::forDropdown($business_id, 'followup_category');
$is_admin = $this->crmUtil->is_admin(auth()->user());
return view('crm::crm_dashboard.index')->with(compact('total_customers', 'total_leads', 'total_sources', 'total_life_stage', 'leads_by_life_stage', 'sources', 'life_stages', 'todays_birthdays', 'upcoming_birthdays', 'leads_count_by_source', 'contacts_count_by_source', 'customers_count_by_source', 'my_follow_ups_arr', 'statuses', 'my_leads', 'my_conversion', 'todays_followups', 'my_call_logs', 'followup_category', 'is_admin'));
}
/**
* Function to fetch all the followups of the logged in user
*/
private function myFollowUps()
{
$my_follow_ups = User::user()
->where('users.id', auth()->user()->id)
->join('crm_schedule_users as su', 'su.user_id', '=', 'users.id')
->join('crm_schedules as follow_ups', 'follow_ups.id', '=', 'su.schedule_id')
->select(
'follow_ups.status',
DB::raw('COUNT(su.id) as total_follow_ups')
)->groupBy('follow_ups.status')->get();
return $my_follow_ups;
}
/**
* Function to fetch call log statistic of the logged in user
*/
private function getMyCallLogs()
{
$business_id = request()->session()->get('user.business_id');
$today = \Carbon::now()->format('Y-m-d');
$yesterday = \Carbon::yesterday()->format('Y-m-d');
$first_day_of_month = \Carbon::now()->startOfMonth()->format('Y-m-d');
$my_call_logs = CrmCallLog::where('business_id', $business_id)
->where('created_by', auth()->user()->id)
->whereDate('start_time', '>=', $first_day_of_month)
->select(
DB::raw("SUM(IF(DATE(start_time)='{$today}', 1, 0)) as calls_today"),
DB::raw("SUM(IF(DATE(start_time)='{$yesterday}', 1, 0)) as calls_yesterday"),
DB::raw('COUNT(id) as calls_this_month')
)->first();
return $my_call_logs;
}
/**
* Function to fetch all the followups of the logged in user
*/
private function todaysFollowUp()
{
$todays_followups = Schedule::whereHas('users', function ($q) {
$q->where('user_id', auth()->user()->id);
})
->whereIn('status', ['open', 'scheduled'])
->whereDate('start_datetime', \Carbon::now()->format('Y-m-d'))
->count();
return $todays_followups;
}
/**
* Function to count all the leads of the logged in user
*/
private function myLeads()
{
$business_id = request()->session()->get('user.business_id');
$total_leads = CrmContact::where('contacts.business_id', $business_id)
->where('contacts.type', 'lead')
->whereHas('leadUsers', function ($q) {
$q->where('user_id', auth()->user()->id);
})->count();
return $total_leads;
}
/**
* Function to count all the leads to customer conversion of the logged in user
*/
private function myConversion()
{
$count = Contact::where('converted_by', auth()->user()->id)
->count();
return $count;
}
private function getBirthdays($contacts)
{
$todays_birthdays = [];
$upcoming_birthdays = [];
$today = \Carbon::now();
$thirty_days_from_today = \Carbon::now()->addDays(30)->format('Y-m-d');
foreach ($contacts as $contact) {
if (empty($contact->dob)) {
continue;
}
$dob = \Carbon::parse($contact->dob);
$dob_md = $dob->format('m-d');
$next_birthday = \Carbon::parse($today->format('Y').'-'.$dob_md);
if ($next_birthday->lt($today)) {
$next_birthday->addYear();
}
if ($today->format('m-d') == $dob->format('m-d')) {
$todays_birthdays[] = ['id' => $contact->id, 'name' => $contact->name];
} elseif ($next_birthday->between($today->format('Y-m-d'), $thirty_days_from_today)) {
$upcoming_birthdays[] = [
'name' => $contact->name,
'id' => $contact->id,
'dob' => $dob->format('m-d'),
'dob_display' => $this->formatBirthdayDisplay($dob),
];
}
}
return [
'todays_birthdays' => $todays_birthdays,
'upcoming_birthdays' => $upcoming_birthdays,
];
}
/**
* Format birthday month-day for display (Jalali when Persian is active).
*/
private function formatBirthdayDisplay($dob)
{
if (is_persian_lang()) {
$parts = gregorian_to_jalali_parts($dob->year, $dob->month, $dob->day);
return persian_number($parts[2]).' '.persian_month_name($parts[1]);
}
return $dob->format('j M');
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
return view('crm::create');
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
//
}
/**
* Show the specified resource.
*
* @param int $id
* @return Response
*/
public function show($id)
{
return view('crm::show');
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return Response
*/
public function edit($id)
{
return view('crm::edit');
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
*/
public function destroy($id)
{
//
}
}