ultimatepos/Modules/Crm/Utils/CrmUtil.php

260 lines
11 KiB
PHP

<?php
namespace Modules\Crm\Utils;
use App\Business;
use App\Transaction;
use App\User;
use App\Utils\Util;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Facades\Hash;
use Modules\Crm\Entities\CrmContact;
use Modules\Crm\Entities\Schedule;
class CrmUtil extends Util
{
public function addFollowUp($input, $user)
{
$input['notify_via'] = [
'sms' => ! empty($input['notify_via']['sms']) ? 1 : 0,
'mail' => ! empty($input['notify_via']['mail']) ? 1 : 0,
];
$input['notify_type'] = ! empty($input['notify_type']) ? $input['notify_type'] : 'hour';
$input['schedule_type'] = ! empty($input['schedule_type']) ? $input['schedule_type'] : 'email';
$input['allow_notification'] = ! empty($input['allow_notification']) ? 1 : 0;
$input['business_id'] = $user->business_id;
$input['created_by'] = $user->id;
$input['followup_category_id'] = $input['followup_category_id'];
$assigned_user = $input['user_id'];
unset($input['user_id']);
$schedule = Schedule::create($input);
$schedule->users()->sync($assigned_user);
return $schedule;
}
public function addRecursiveFollowUp($input, $user)
{
$input['notify_via'] = [
'sms' => ! empty($input['notify_via']['sms']) ? 1 : 0,
'mail' => ! empty($input['notify_via']['mail']) ? 1 : 0,
];
$input['notify_type'] = ! empty($input['notify_type']) ? $input['notify_type'] : 'hour';
$input['schedule_type'] = ! empty($input['schedule_type']) ? $input['schedule_type'] : 'email';
$input['allow_notification'] = ! empty($input['allow_notification']) ? 1 : 0;
$input['business_id'] = $user->business_id;
$input['created_by'] = $user->id;
$input['is_recursive'] = 1;
$input['followup_category_id'] = $input['followup_category_id'];
$assigned_user = $input['user_id'];
unset($input['user_id']);
$schedule = Schedule::create($input);
$schedule->users()->sync($assigned_user);
return $schedule;
}
public function addAdvanceFollowUp($input, $user)
{
$follow_ups = $input['follow_ups'];
unset($input['follow_ups']);
if (array_key_exists('invoices', $input)) {
unset($input['invoices']);
}
$replacable_inputs['in_days'] = ! empty($input['in_days']) ? $input['in_days'] : null;
$replacable_inputs['title'] = $input['title'];
$replacable_inputs['description'] = $input['description'];
if (array_key_exists('in_days', $input)) {
unset($input['in_days']);
}
foreach ($follow_ups as $key => $value) {
$input['contact_id'] = $key;
$input['user_id'] = $value['user_id'];
$invoices = ! empty($value['invoices']) ? $value['invoices'] : [];
$replaced_tag_input = $this->replaceAdvFollowUpTags($input['contact_id'], $invoices, $replacable_inputs);
$input['title'] = $replaced_tag_input['title'];
$input['description'] = $replaced_tag_input['description'];
$follow_up = $this->addFollowUp($input, $user);
if (! empty($value['invoices'])) {
$follow_up->invoices()->sync($value['invoices']);
}
}
}
public function updateFollowUp($follow_up_id, $input, $user)
{
$input['notify_via'] = [
'sms' => ! empty($input['notify_via']['sms']) ? 1 : 0,
'mail' => ! empty($input['notify_via']['mail']) ? 1 : 0,
];
$input['notify_type'] = ! empty($input['notify_type']) ? $input['notify_type'] : 'hour';
$input['schedule_type'] = ! empty($input['schedule_type']) ? $input['schedule_type'] : 'email';
$input['allow_notification'] = ! empty($input['allow_notification']) ? 1 : 0;
$input['followup_category_id'] = $input['followup_category_id'];
$assigned_user = $input['user_id'];
unset($input['user_id']);
$query = Schedule::where('business_id', $user->business_id);
if (! $user->can('crm.access_all_schedule') && $user->can('crm.access_own_schedule')) {
$query->where(function ($qry) use ($user) {
$qry->whereHas('users', function ($q) use ($user) {
$q->where('user_id', $user->id);
})->orWhere('created_by', $user->id);
});
}
$schedule = $query->findOrFail($follow_up_id);
$schedule->update($input);
$schedule->users()->sync($assigned_user);
return $schedule;
}
public function getFollowUpForGivenDate($user, $start_date, $end_date = null)
{
$query = Schedule::with(['customer', 'followupCategory'])->where('business_id', $user->business_id);
if (! empty($start_date) && ! empty($end_date)) {
$query->whereBetween(DB::raw('date(start_datetime)'), [$start_date, $end_date]);
} elseif (! empty($start_date)) {
$query->where(DB::raw('date(start_datetime)'), $start_date);
}
if (! $user->can('crm.access_all_schedule') && $user->can('crm.access_own_schedule')) {
$query->where(function ($qry) use ($user) {
$qry->whereHas('users', function ($q) use ($user) {
$q->where('user_id', $user->id);
})->orWhere('created_by', $user->id);
});
}
return $query;
}
public function getLeadsListQuery($business_id)
{
$leads = CrmContact::with(['Source', 'lifeStage', 'leadUsers'])
->where('contacts.business_id', $business_id)
->where('contacts.type', 'lead')
->select('contacts.contact_id', 'name', 'supplier_business_name', 'email',
'mobile', 'tax_number', 'contacts.created_at', 'custom_field1',
'custom_field2', 'custom_field3', 'custom_field4', 'custom_field5',
'custom_field6', 'alternate_number', 'landline', 'dob', 'contact_status',
'type', 'custom_field7', 'custom_field8', 'custom_field9', 'custom_field10',
'contacts.id', 'contacts.business_id', 'crm_source', 'crm_life_stage',
'crm_lead_title', 'crm_lead_value', 'crm_lead_description', 'crm_last_contacted', 'crm_is_archived',
'address_line_1',
'address_line_2', 'city', 'state', 'country', 'zip_code',
'contacts.prefix', 'contacts.first_name', 'contacts.middle_name', 'contacts.last_name',
DB::raw('(SELECT CS.id FROM crm_schedules AS CS WHERE CS.contact_id=contacts.id AND CS.start_datetime < "'.Carbon::today()->toDateTimeString().'" ORDER BY CS.start_datetime DESC LIMIT 1) as last_follow_up_id'), DB::raw('(SELECT CS.id FROM crm_schedules AS CS WHERE CS.contact_id=contacts.id AND CS.start_datetime > "'.Carbon::today()->toDateTimeString().'" ORDER BY CS.start_datetime ASC LIMIT 1) as upcoming_follow_up_id'),
DB::raw('(SELECT CS.start_datetime FROM crm_schedules AS CS WHERE CS.contact_id=contacts.id AND CS.start_datetime < "'.Carbon::today()->toDateTimeString().'" ORDER BY CS.start_datetime DESC LIMIT 1) as last_follow_up'),
DB::raw('(SELECT CS.start_datetime FROM crm_schedules AS CS WHERE CS.contact_id=contacts.id AND CS.start_datetime > "'.Carbon::today()->toDateTimeString().'" ORDER BY CS.start_datetime ASC LIMIT 1) as upcoming_follow_up'),
DB::raw('(SELECT CS.followup_additional_info FROM crm_schedules AS CS WHERE CS.contact_id=contacts.id AND CS.start_datetime < "'.Carbon::today()->toDateTimeString().'" ORDER BY CS.start_datetime DESC LIMIT 1) as last_follow_up_additional_info'),
DB::raw('(SELECT CS.followup_additional_info FROM crm_schedules AS CS WHERE CS.contact_id=contacts.id AND CS.start_datetime > "'.Carbon::today()->toDateTimeString().'" ORDER BY CS.start_datetime ASC LIMIT 1) as upcoming_follow_up_additional_info'));
return $leads;
}
public function creatContactPerson($input)
{
$input['password'] = Hash::make($input['password']);
if (empty($input['user_type'])) {
$contact = \App\Contact::find($input['crm_contact_id'] ?? null);
$input['user_type'] = ($contact && $contact->type === 'supplier')
? 'user_supplier'
: 'user_customer';
}
$input['cmmsn_percent'] = ! empty($input['cmmsn_percent']) ? $input['cmmsn_percent'] : 0;
if (empty($input['allow_login'])) {
$input['password'] = null;
$input['username'] = null;
$input['allow_login'] = 0;
}
// Create the user
$user = User::create($input);
}
public function getAdvFollowupsTags()
{
return [
'invoice' => [
'{invoice_numbers}', '{customer_business_name}', '{customer_name}',
],
'trans_days' => [
'{customer_business_name}', '{customer_name}', '{days}',
],
'contact_name' => [
'{customer_business_name}', '{customer_name}',
],
'help_text' => __('lang_v1.available_tags'),
];
}
public function replaceAdvFollowUpTags($contact_id, $invoices, $input)
{
$contact = CrmContact::where('id', $contact_id)
->first();
$invoice_numbers = '';
if (! empty($invoices)) {
$transactions = Transaction::find($invoices);
$invoice_numbers = implode(', ', $transactions->pluck('invoice_no')->toArray());
}
foreach ($input as $key => $value) {
//replace invoice numbers
if (strpos($value, '{invoice_numbers}') !== false) {
$input[$key] = str_replace('{invoice_numbers}', $invoice_numbers, $input[$key]);
}
//replace customer biz name
if (strpos($value, '{customer_business_name}') !== false) {
$input[$key] = str_replace('{customer_business_name}', $contact->supplier_business_name, $input[$key]);
}
//replace customer name
if (strpos($value, '{customer_name}') !== false) {
$input[$key] = str_replace('{customer_name}', $contact->name, $input[$key]);
}
//replace days
if (strpos($value, '{days}') !== false) {
$input[$key] = str_replace('{days}', $input['in_days'], $input[$key]);
}
}
return $input;
}
public function getCrmSettings($business_id)
{
$crm_settings = Business::where('id', $business_id)
->value('crm_settings');
$crm_settings = ! empty($crm_settings) ? json_decode($crm_settings, true) : [];
return $crm_settings;
}
}