ultimatepos/Modules/Crm/Entities/CrmContact.php

251 lines
7.7 KiB
PHP

<?php
namespace Modules\Crm\Entities;
use App\Contact;
use DB;
use Illuminate\Database\Eloquent\Model;
class CrmContact extends Contact
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'contacts';
/**
* The member that assigned to the lead.
*/
public function leadUsers()
{
return $this->belongsToMany(\App\User::class, 'crm_lead_users', 'contact_id', 'user_id');
}
/**
* get source for contact
*/
public function Source()
{
return $this->belongsTo(\App\Category::class, 'crm_source');
}
/**
* get life_stage for contact
*/
public function lifeStage()
{
return $this->belongsTo(\App\Category::class, 'crm_life_stage');
}
/**
* Return list of lead dropdown for a business
*
* @param $business_id int
* @param $prepend_none = true (boolean)
* @return array users
*/
public static function leadsDropdown($business_id, $prepend_none = true, $append_id = true)
{
$all_contacts = CrmContact::where('business_id', $business_id)
->where('type', 'lead')
->active();
if ($append_id) {
$all_contacts->select(
DB::raw("IF(contact_id IS NULL OR contact_id='', CONCAT( COALESCE(supplier_business_name, ''), ' - ', name), CONCAT(COALESCE(supplier_business_name, ''), ' - ', name, ' (', contact_id, ')')) AS leads"),
'id'
);
} else {
$all_contacts->select('id', DB::raw('name as leads'));
}
$can_access_all_leads = auth()->user()->can('crm.access_all_leads');
$can_access_own_leads = auth()->user()->can('crm.access_own_leads');
if (! $can_access_all_leads && $can_access_own_leads) {
$all_contacts->OnlyOwnLeads();
}
$leads = $all_contacts->pluck('leads', 'id');
//Prepend none
if ($prepend_none) {
$leads = $leads->prepend(__('lang_v1.none'), '');
}
return $leads;
}
public static function getCustomerAndLeadsDropdown($business_id)
{
$leads = CrmContact::leadsDropdown($business_id, false);
$customers = Contact::customersDropdown($business_id, false)->toArray();
foreach ($customers as $key => $value) {
$customers[$key] = $value.' ('.__('contact.customer').')';
}
foreach ($leads as $key => $value) {
$customers[$key] = $value.' ('.__('crm::lang.lead').')';
}
return $customers;
}
public static function contactsDropdownForLogin($business_id, $append_contact_id = true)
{
$all_contacts = Contact::where('business_id', $business_id)
->active();
if ($append_contact_id) {
$all_contacts->select(
DB::raw("IF(contact_id IS NULL OR contact_id='', CONCAT( COALESCE(supplier_business_name, ''), ' - ', name), CONCAT(COALESCE(supplier_business_name, ''), ' - ', name, ' (', contact_id, ')')) AS contacts"),
'id'
);
} else {
$all_contacts->select('id', DB::raw('name as contacts'));
}
$contacts = $all_contacts->pluck('contacts', 'id');
return $contacts;
}
public static function createNewLead($input, $assigned_to)
{
//Check Contact id
$count = 0;
if (! empty($input['contact_id'])) {
$count = CrmContact::where('business_id', $input['business_id'])
->where('contact_id', $input['contact_id'])
->count();
}
if ($count == 0) {
//Update reference count
$commonUtil = new \App\Utils\Util;
$ref_count = $commonUtil->setAndGetReferenceCount('contacts', $input['business_id']);
if (empty($input['contact_id'])) {
//Generate reference number
$input['contact_id'] = $commonUtil->generateReferenceNumber('contacts', $ref_count, $input['business_id']);
}
$contact = CrmContact::create($input);
$contact->leadUsers()->sync($assigned_to);
//update user contact access also
if (! empty($assigned_to)) {
$lead_contact = Contact::find($contact->id);
$lead_contact->userHavingAccess()->sync($assigned_to);
}
return $contact;
} else {
throw new \Exception('Error Processing Request', 1);
}
}
public static function updateLead($id, $input, $assigned_to)
{
$business_id = auth()->user()->business_id;
//Check Contact id
$count = 0;
if (! empty($input['contact_id'])) {
$count = CrmContact::where('business_id', $business_id)
->where('contact_id', $input['contact_id'])
->where('id', '!=', $id)
->count();
}
if ($count == 0) {
$query = CrmContact::where('business_id', $business_id);
if (! auth()->user()->can('crm.access_all_leads') && auth()->user()->can('crm.access_own_leads')) {
$query->where(function ($qry) {
$qry->whereHas('leadUsers', function ($q) {
$q->where('user_id', auth()->user()->id);
})->orWhere('created_by', auth()->user()->id);
});
}
$contact = $query->findOrFail($id);
$contact->update($input);
$contact->leadUsers()->sync($assigned_to);
//update user contact access also
if (! empty($assigned_to)) {
$lead_contact = Contact::find($id);
$lead_contact->userHavingAccess()->sync($assigned_to);
}
return $contact;
} else {
throw new \Exception('Error Processing Request', 1);
}
}
public static function getContactsCountBySourceOfGivenTyps($business_id, $types = [])
{
$query = Contact::where('business_id', $business_id)
->Active();
if (! empty($types)) {
$query->whereIn('type', $types);
}
$contacts_count_by_source = $query->select(\DB::raw('count(crm_source) as count, crm_source'))
->groupBy('crm_source')
->get()
->keyBy('crm_source');
return $contacts_count_by_source;
}
/**
* Filters only own created lead or is assigned
*/
public function scopeOnlyOwnLeads($query)
{
$query->where(function ($qry) {
$qry->whereHas('leadUsers', function ($q) {
$q->where('user_id', auth()->user()->id);
})->orWhere('created_by', auth()->user()->id);
});
}
public function getFullNameWithBusinessAttribute()
{
$name_array = [];
if (! empty($this->prefix)) {
$name_array[] = $this->prefix;
}
if (! empty($this->first_name)) {
$name_array[] = $this->first_name;
}
if (! empty($this->middle_name)) {
$name_array[] = $this->middle_name;
}
if (! empty($this->last_name)) {
$name_array[] = $this->last_name;
}
$full_name = implode(' ', $name_array);
$business_name = ! empty($this->supplier_business_name) ? $this->supplier_business_name.', ' : '';
return $business_name.$full_name;
}
public function getDisplayLeadTitleAttribute()
{
if (! empty($this->crm_lead_title)) {
return $this->crm_lead_title;
}
return $this->full_name_with_business;
}
}