1053 lines
44 KiB
PHP
1053 lines
44 KiB
PHP
<?php
|
|
|
|
namespace Modules\Connector\Http\Controllers\Api\Crm;
|
|
|
|
use App\Utils\ModuleUtil;
|
|
use App\Utils\Util;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Modules\Connector\Http\Controllers\Api\ApiController;
|
|
use Modules\Connector\Transformers\CommonResource;
|
|
use Modules\Crm\Utils\CrmUtil;
|
|
|
|
/**
|
|
* @group CRM
|
|
* @authenticated
|
|
*
|
|
* APIs for managing follow up
|
|
*/
|
|
class FollowUpController extends ApiController
|
|
{
|
|
/**
|
|
* All Utils instance.
|
|
*/
|
|
protected $moduleUtil;
|
|
|
|
protected $commonUtil;
|
|
|
|
protected $crmUtil;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct(Util $commonUtil, ModuleUtil $moduleUtil, CrmUtil $crmUtil)
|
|
{
|
|
$this->moduleUtil = $moduleUtil;
|
|
$this->commonUtil = $commonUtil;
|
|
$this->crmUtil = $crmUtil;
|
|
}
|
|
|
|
/**
|
|
* List Follow ups
|
|
*
|
|
* @queryParam start_date format: Y-m-d (Ex: 2020-12-16) Example: 2020-12-16
|
|
* @queryParam end_date format: Y-m-d (Ex: 2020-12-16) Example: 2020-12-16
|
|
* @queryParam status filter the result through status, get status from getFollowUpResources->statuses
|
|
* @queryParam follow_up_type filter the result through follow_up_type, get follow_up_type from getFollowUpResources->follow_up_types
|
|
* @queryParam followup_category_id filter the result through followup_category_id
|
|
* @queryParam order_by Column name to sort the result, Column: start_datetime Example:start_datetime
|
|
* @queryParam direction Direction to sort the result, Required if using 'order_by', direction: desc, asc Example:desc
|
|
* @queryParam per_page Total records per page. default: 10, Set -1 for no pagination Example:10
|
|
* @response {
|
|
"data": [
|
|
{
|
|
"id": 1,
|
|
"business_id": 1,
|
|
"contact_id": 50,
|
|
"title": "Test Follow up",
|
|
"status": "scheduled",
|
|
"start_datetime": "2020-12-16 15:15:00",
|
|
"end_datetime": "2020-12-16 15:15:00",
|
|
"description": "<p>tst</p>",
|
|
"schedule_type": "call",
|
|
"allow_notification": 0,
|
|
"notify_via": {
|
|
"sms": 0,
|
|
"mail": 1
|
|
},
|
|
"notify_before": null,
|
|
"notify_type": "minute",
|
|
"created_by": 1,
|
|
"followup_additional_info": null,
|
|
"created_at": "2020-12-16 03:15:23",
|
|
"updated_at": "2020-12-16 15:46:34",
|
|
"customer": {
|
|
"id": 50,
|
|
"business_id": 1,
|
|
"type": "lead",
|
|
"supplier_business_name": null,
|
|
"name": " Lead 4 ",
|
|
"prefix": null,
|
|
"first_name": "Lead 4",
|
|
"middle_name": null,
|
|
"last_name": null,
|
|
"email": null,
|
|
"contact_id": "CO0011",
|
|
"contact_status": "active",
|
|
"tax_number": null,
|
|
"city": null,
|
|
"state": null,
|
|
"country": null,
|
|
"address_line_1": null,
|
|
"address_line_2": null,
|
|
"zip_code": null,
|
|
"dob": null,
|
|
"mobile": "234567",
|
|
"landline": null,
|
|
"alternate_number": null,
|
|
"pay_term_number": null,
|
|
"pay_term_type": null,
|
|
"credit_limit": null,
|
|
"created_by": 1,
|
|
"balance": "0.0000",
|
|
"total_rp": 0,
|
|
"total_rp_used": 0,
|
|
"total_rp_expired": 0,
|
|
"is_default": 0,
|
|
"shipping_address": null,
|
|
"position": null,
|
|
"customer_group_id": null,
|
|
"crm_source": "55",
|
|
"crm_life_stage": "62",
|
|
"custom_field1": null,
|
|
"custom_field2": null,
|
|
"custom_field3": null,
|
|
"custom_field4": null,
|
|
"custom_field5": null,
|
|
"custom_field6": null,
|
|
"custom_field7": null,
|
|
"custom_field8": null,
|
|
"custom_field9": null,
|
|
"custom_field10": null,
|
|
"deleted_at": null,
|
|
"created_at": "2020-12-15 23:14:48",
|
|
"updated_at": "2021-01-07 15:32:52",
|
|
"remember_token": null,
|
|
"password": null
|
|
}
|
|
},
|
|
{
|
|
"id": 2,
|
|
"business_id": 1,
|
|
"contact_id": 50,
|
|
"title": "Test Follow up 1",
|
|
"status": "completed",
|
|
"start_datetime": "2020-12-16 15:46:00",
|
|
"end_datetime": "2020-12-16 15:46:00",
|
|
"description": "<p>Test Follow up</p>",
|
|
"schedule_type": "call",
|
|
"allow_notification": 0,
|
|
"notify_via": {
|
|
"sms": 0,
|
|
"mail": 1
|
|
},
|
|
"notify_before": null,
|
|
"notify_type": "minute",
|
|
"created_by": 1,
|
|
"followup_additional_info": null,
|
|
"created_at": "2020-12-16 15:46:57",
|
|
"updated_at": "2020-12-17 10:24:11",
|
|
"customer": {
|
|
"id": 50,
|
|
"business_id": 1,
|
|
"type": "lead",
|
|
"supplier_business_name": null,
|
|
"name": " Lead 4 ",
|
|
"prefix": null,
|
|
"first_name": "Lead 4",
|
|
"middle_name": null,
|
|
"last_name": null,
|
|
"email": null,
|
|
"contact_id": "CO0011",
|
|
"contact_status": "active",
|
|
"tax_number": null,
|
|
"city": null,
|
|
"state": null,
|
|
"country": null,
|
|
"address_line_1": null,
|
|
"address_line_2": null,
|
|
"zip_code": null,
|
|
"dob": null,
|
|
"mobile": "234567",
|
|
"landline": null,
|
|
"alternate_number": null,
|
|
"pay_term_number": null,
|
|
"pay_term_type": null,
|
|
"credit_limit": null,
|
|
"created_by": 1,
|
|
"balance": "0.0000",
|
|
"total_rp": 0,
|
|
"total_rp_used": 0,
|
|
"total_rp_expired": 0,
|
|
"is_default": 0,
|
|
"shipping_address": null,
|
|
"position": null,
|
|
"customer_group_id": null,
|
|
"crm_source": "55",
|
|
"crm_life_stage": "62",
|
|
"custom_field1": null,
|
|
"custom_field2": null,
|
|
"custom_field3": null,
|
|
"custom_field4": null,
|
|
"custom_field5": null,
|
|
"custom_field6": null,
|
|
"custom_field7": null,
|
|
"custom_field8": null,
|
|
"custom_field9": null,
|
|
"custom_field10": null,
|
|
"deleted_at": null,
|
|
"created_at": "2020-12-15 23:14:48",
|
|
"updated_at": "2021-01-07 15:32:52",
|
|
"remember_token": null,
|
|
"password": null
|
|
}
|
|
}
|
|
],
|
|
"links": {
|
|
"first": "http://local.pos.com/connector/api/crm/follow-ups?page=1",
|
|
"last": "http://local.pos.com/connector/api/crm/follow-ups?page=21",
|
|
"prev": null,
|
|
"next": "http://local.pos.com/connector/api/crm/follow-ups?page=2"
|
|
},
|
|
"meta": {
|
|
"current_page": 1,
|
|
"from": 1,
|
|
"last_page": 21,
|
|
"path": "http://local.pos.com/connector/api/crm/follow-ups",
|
|
"per_page": "2",
|
|
"to": 2,
|
|
"total": 42
|
|
}
|
|
}
|
|
*/
|
|
public function index()
|
|
{
|
|
$user = Auth::user();
|
|
if (! ($this->moduleUtil->isModuleInstalled('Crm') && ($user->can('crm.access_all_schedule') || $user->can('crm.access_own_schedule')))) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
$start_date = request()->input('start_date');
|
|
$end_date = request()->input('end_date');
|
|
|
|
$query = $this->crmUtil->getFollowUpForGivenDate($user, $start_date, $end_date);
|
|
|
|
if (! empty(request()->input('status'))) {
|
|
$query->where('status', request()->input('status'));
|
|
}
|
|
|
|
if (! empty(request()->input('follow_up_type'))) {
|
|
$query->where('schedule_type', request()->input('follow_up_type'));
|
|
}
|
|
|
|
$order_by = request()->input('order_by');
|
|
$order_by_dir = request()->input('direction');
|
|
if (! empty($order_by) && ! empty($order_by_dir)) {
|
|
$query->orderBy($order_by, $order_by_dir);
|
|
}
|
|
|
|
$per_page = ! empty(request()->input('per_page')) ? request()->input('per_page') : $this->perPage;
|
|
|
|
if ($per_page != -1) {
|
|
$follow_ups = $query->paginate($per_page);
|
|
$follow_ups->appends(request()->query());
|
|
} else {
|
|
$follow_ups = $query->get();
|
|
}
|
|
|
|
return CommonResource::collection($follow_ups);
|
|
}
|
|
|
|
/**
|
|
* Get follow up resources
|
|
*
|
|
* @response {
|
|
"data": {
|
|
"statuses": {
|
|
"scheduled": "Scheduled",
|
|
"open": "Open",
|
|
"canceled": "Cancelled",
|
|
"completed": "Completed"
|
|
},
|
|
"follow_up_types": {
|
|
"call": "Call",
|
|
"sms": "Sms",
|
|
"meeting": "Meeting",
|
|
"email": "Email"
|
|
},
|
|
"notify_type": {
|
|
"minute": "Minute",
|
|
"hour": "Hour",
|
|
"day": "Day"
|
|
},
|
|
"notify_via": {
|
|
"sms": "Sms",
|
|
"mail": "Email"
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
public function getFollowUpResources()
|
|
{
|
|
if (! $this->moduleUtil->isModuleInstalled('Crm')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
$params['statuses'] = \Modules\Crm\Entities\Schedule::statusDropdown();
|
|
$params['follow_up_types'] = \Modules\Crm\Entities\Schedule::followUpTypeDropdown();
|
|
$params['notify_type'] = \Modules\Crm\Entities\Schedule::followUpNotifyTypeDropdown();
|
|
$params['notify_via'] = \Modules\Crm\Entities\Schedule::followUpNotifyViaDropdown();
|
|
|
|
return new CommonResource($params);
|
|
}
|
|
|
|
/**
|
|
* Add follow up
|
|
*
|
|
* @bodyParam title string required Follow up title Example: Meeting with client
|
|
* @bodyParam contact_id integer required Contact to be followed up Example: 2
|
|
* @bodyParam description text Follow up description
|
|
* @bodyParam schedule_type string required Follow up type default get from getFollowUpResources->follow_up_types
|
|
* @bodyParam user_id array required Integer ID; Follow up to be assigned Ex: [2,3,8] Example:[2,3,5]
|
|
* @bodyParam notify_before integer Integer value will be used to send auto notification before follow up starts. Example:5
|
|
* @bodyParam notify_type string Notify type Ex: 'minute', 'hour', 'day'. default is hour Example: minute
|
|
* @bodyParam status string Follow up status Example: open
|
|
* @bodyParam notify_via array Will be used to send notification Ex: ['sms' => 0 ,'mail' => 1] Example: ['sms' => 0 ,'mail' => 1]
|
|
* @bodyParam start_datetime datetime required Follow up start datetime format: Y-m-d H:i:s Ex: 2020-12-16 03:15:23 Example: 2021-01-06 13:05:00
|
|
* @bodyParam end_datetime datetime required Follow up end datetime format: Y-m-d H:i:s Ex: 2020-12-16 03:15:23 Example: 2021-01-06 13:05:00
|
|
* @bodyParam followup_additional_info array Follow up additional info Ex: ['call duration' => '1 hour'] Example:['call duration' => '1 hour']
|
|
* @bodyParam allow_notification boolean 0/1 : If notification will be send before follow up starts. default is 1(true) Example:1
|
|
*
|
|
* @response {
|
|
"data": {
|
|
"title": "test",
|
|
"contact_id": "1",
|
|
"description": null,
|
|
"schedule_type": "call",
|
|
"followup_category_id": "1",
|
|
"notify_before": null,
|
|
"status": null,
|
|
"start_datetime": "2021-01-06 15:27:00",
|
|
"end_datetime": "2021-01-06 15:27:00",
|
|
"allow_notification": 0,
|
|
"notify_via": {
|
|
"sms": 1,
|
|
"mail": 1
|
|
},
|
|
"notify_type": "hour",
|
|
"business_id": 1,
|
|
"created_by": 1,
|
|
"updated_at": "2021-01-06 17:04:54",
|
|
"created_at": "2021-01-06 17:04:54",
|
|
"id": 20
|
|
}
|
|
}
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
if (! $this->moduleUtil->isModuleInstalled('Crm')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
try {
|
|
$request->validate([
|
|
'title' => 'required',
|
|
'contact_id' => 'required',
|
|
'start_datetime' => 'required',
|
|
'end_datetime' => 'required',
|
|
'schedule_type' => 'required',
|
|
'user_id' => 'required',
|
|
]);
|
|
|
|
$params = $request->only(['title', 'contact_id', 'description', 'notify_before',
|
|
'status', 'start_datetime', 'end_datetime', 'allow_notification', 'notify_via',
|
|
'notify_type', 'schedule_type', 'user_id', 'followup_additional_info', 'followup_category_id',
|
|
]);
|
|
|
|
DB::beginTransaction();
|
|
|
|
$schedule = $this->crmUtil->addFollowUp($params, Auth::user());
|
|
|
|
DB::commit();
|
|
|
|
return new CommonResource($schedule);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
|
|
return $this->otherExceptions($e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the specified followup
|
|
*
|
|
* @urlParam follow_up required comma separated ids of the follow_ups Example: 1,2
|
|
* @response {
|
|
"data": [
|
|
{
|
|
"id": 20,
|
|
"business_id": 1,
|
|
"contact_id": 1,
|
|
"title": "Meeting with client",
|
|
"status": null,
|
|
"start_datetime": "2021-01-06 15:27:00",
|
|
"end_datetime": "2021-01-06 15:27:00",
|
|
"description": null,
|
|
"schedule_type": "call",
|
|
"allow_notification": 0,
|
|
"notify_via": {
|
|
"sms": 1,
|
|
"mail": 1
|
|
},
|
|
"notify_before": null,
|
|
"notify_type": "hour",
|
|
"created_by": 1,
|
|
"created_at": "2021-01-06 17:04:54",
|
|
"updated_at": "2021-01-06 17:04:54",
|
|
"customer": {
|
|
"id": 1,
|
|
"business_id": 1,
|
|
"type": "customer",
|
|
"supplier_business_name": null,
|
|
"name": "Walk-In Customer",
|
|
"prefix": null,
|
|
"first_name": "Walk-In Customer",
|
|
"middle_name": null,
|
|
"last_name": null,
|
|
"email": null,
|
|
"contact_id": "CO0005",
|
|
"contact_status": "active",
|
|
"tax_number": null,
|
|
"city": "Phoenix",
|
|
"state": "Arizona",
|
|
"country": "USA",
|
|
"address_line_1": "Linking Street",
|
|
"address_line_2": null,
|
|
"zip_code": null,
|
|
"dob": null,
|
|
"mobile": "(378) 400-1234",
|
|
"landline": null,
|
|
"alternate_number": null,
|
|
"pay_term_number": null,
|
|
"pay_term_type": null,
|
|
"credit_limit": null,
|
|
"created_by": 1,
|
|
"balance": "0.0000",
|
|
"total_rp": 0,
|
|
"total_rp_used": 0,
|
|
"total_rp_expired": 0,
|
|
"is_default": 1,
|
|
"shipping_address": null,
|
|
"position": null,
|
|
"customer_group_id": null,
|
|
"crm_source": null,
|
|
"crm_life_stage": null,
|
|
"custom_field1": null,
|
|
"custom_field2": null,
|
|
"custom_field3": null,
|
|
"custom_field4": null,
|
|
"custom_field5": null,
|
|
"custom_field6": null,
|
|
"custom_field7": null,
|
|
"custom_field8": null,
|
|
"custom_field9": null,
|
|
"custom_field10": null,
|
|
"deleted_at": null,
|
|
"created_at": "2018-01-03 20:45:20",
|
|
"updated_at": "2018-06-11 22:22:05",
|
|
"remember_token": null,
|
|
"password": null
|
|
},
|
|
"users": [
|
|
{
|
|
"id": 2,
|
|
"user_type": "user",
|
|
"surname": "Mr",
|
|
"first_name": "Demo",
|
|
"last_name": "Cashier",
|
|
"username": "cashier",
|
|
"email": "cashier@example.com",
|
|
"language": "en",
|
|
"contact_no": null,
|
|
"address": null,
|
|
"business_id": 1,
|
|
"max_sales_discount_percent": null,
|
|
"allow_login": 1,
|
|
"essentials_department_id": null,
|
|
"essentials_designation_id": null,
|
|
"status": "active",
|
|
"crm_contact_id": null,
|
|
"is_cmmsn_agnt": 0,
|
|
"cmmsn_percent": "0.00",
|
|
"selected_contacts": 0,
|
|
"dob": null,
|
|
"gender": null,
|
|
"marital_status": null,
|
|
"blood_group": null,
|
|
"contact_number": null,
|
|
"fb_link": null,
|
|
"twitter_link": null,
|
|
"social_media_1": null,
|
|
"social_media_2": null,
|
|
"permanent_address": null,
|
|
"current_address": null,
|
|
"guardian_name": null,
|
|
"custom_field_1": null,
|
|
"custom_field_2": null,
|
|
"custom_field_3": null,
|
|
"custom_field_4": null,
|
|
"bank_details": null,
|
|
"id_proof_name": null,
|
|
"id_proof_number": null,
|
|
"deleted_at": null,
|
|
"created_at": "2018-01-04 02:20:58",
|
|
"updated_at": "2018-01-04 02:20:58",
|
|
"pivot": {
|
|
"schedule_id": 20,
|
|
"user_id": 2
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
*/
|
|
public function show($follow_up_ids)
|
|
{
|
|
$user = Auth::user();
|
|
if (! ($this->moduleUtil->isModuleInstalled('Crm') && ($user->can('crm.access_all_schedule') || $user->can('crm.access_own_schedule')))) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
$follow_up_ids = explode(',', $follow_up_ids);
|
|
|
|
$query = \Modules\Crm\Entities\Schedule::with(['customer', 'users', 'followupCategory'])
|
|
->where('business_id', $user->business_id)
|
|
->whereIn('id', $follow_up_ids);
|
|
|
|
if (! $user->can('crm.access_all_schedule') && $user->can('crm.access_own_schedule')) {
|
|
$query->where(function ($qry) use ($user) {
|
|
$qry->whereHas('users', function ($q) {
|
|
//$q->where('user_id', $user->id);
|
|
})->orWhere('created_by', $user->id);
|
|
});
|
|
}
|
|
|
|
$follow_ups = $query->get();
|
|
|
|
return CommonResource::collection($follow_ups);
|
|
}
|
|
|
|
/**
|
|
* Update follow up
|
|
*
|
|
* @urlParam follow_up required id of the follow up to be updated Example: 20
|
|
* @bodyParam title string required Follow up title Example: Meeting with client
|
|
* @bodyParam contact_id integer required Contact to be followed up Example: 2
|
|
* @bodyParam description text Follow up description
|
|
* @bodyParam schedule_type string required Follow up type default get from getFollowUpResources->follow_up_types
|
|
* @bodyParam user_id array required Integer ID; Follow up to be assigned Ex: [2,3,8] Example:[2,3,5]
|
|
* @bodyParam notify_before integer Integer value will be used to send auto notification before follow up starts. Example:5
|
|
* @bodyParam notify_type string Notify type Ex: 'minute', 'hour', 'day'. default is hour Example: minute
|
|
* @bodyParam status string Follow up status Example: open
|
|
* @bodyParam notify_via array Will be used to send notification Ex: ['sms' => 0 ,'mail' => 1] Example: ['sms' => 0 ,'mail' => 1]
|
|
* @bodyParam followup_additional_info array Follow up additional info Ex: ['call duration' => '1 hour'] Example:['call duration' => '1 hour']
|
|
* @bodyParam start_datetime datetime required Follow up start datetime format: Y-m-d H:i:s Ex: 2020-12-16 03:15:23 Example: 2021-01-06 13:05:00
|
|
* @bodyParam end_datetime datetime required Follow up end datetime format: Y-m-d H:i:s Ex: 2020-12-16 03:15:23 Example: 2021-01-06 13:05:00
|
|
* @bodyParam allow_notification boolean 0/1 : If notification will be send before follow up starts. default is 1(true) Example:1
|
|
*
|
|
* @response {
|
|
"data": {
|
|
"id": 20,
|
|
"business_id": 1,
|
|
"contact_id": "1",
|
|
"title": "Meeting with client",
|
|
"status": null,
|
|
"start_datetime": "2021-01-06 15:27:00",
|
|
"end_datetime": "2021-01-06 15:27:00",
|
|
"description": null,
|
|
"schedule_type": "call",
|
|
"allow_notification": 0,
|
|
"notify_via": {
|
|
"sms": 1,
|
|
"mail": 0
|
|
},
|
|
"notify_before": null,
|
|
"notify_type": "hour",
|
|
"created_by": 1,
|
|
"created_at": "2021-01-06 17:04:54",
|
|
"updated_at": "2021-01-06 18:22:21"
|
|
}
|
|
}
|
|
*/
|
|
public function update(Request $request, $follow_up_id)
|
|
{
|
|
$user = Auth::user();
|
|
if (! ($this->moduleUtil->isModuleInstalled('Crm') && ($user->can('crm.access_all_schedule') || $user->can('crm.access_own_schedule')))) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
try {
|
|
$request->validate([
|
|
'title' => 'required',
|
|
'contact_id' => 'required',
|
|
'start_datetime' => 'required',
|
|
'end_datetime' => 'required',
|
|
'schedule_type' => 'required',
|
|
'user_id' => 'required',
|
|
]);
|
|
|
|
$params = $request->only(['title', 'contact_id', 'description', 'notify_before',
|
|
'status', 'start_datetime', 'end_datetime', 'allow_notification', 'notify_via',
|
|
'notify_type', 'schedule_type', 'user_id', 'followup_additional_info', 'followup_category_id',
|
|
]);
|
|
|
|
DB::beginTransaction();
|
|
|
|
$schedule = $this->crmUtil->updateFollowUp($follow_up_id, $params, Auth::user());
|
|
|
|
DB::commit();
|
|
|
|
return new CommonResource($schedule);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
|
|
return $this->otherExceptions($e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* List lead
|
|
*
|
|
* @queryParam assigned_to comma separated ids of users to whom lead is assigned (Ex: 1,2,3) Example: 1,2,3
|
|
* @queryParam name Search term for lead name
|
|
* @queryParam biz_name Search term for lead's business name
|
|
* @queryParam mobile_num Search term for lead's mobile number
|
|
* @queryParam contact_id Search term for lead's contact_id. Ex(CO0005)
|
|
* @queryParam order_by Column name to sort the result, Column: name, supplier_business_name
|
|
* @queryParam direction Direction to sort the result, Required if using 'order_by', direction: desc, asc Example:desc
|
|
* @queryParam per_page Total records per page. default: 10, Set -1 for no pagination Example:10
|
|
* @response {
|
|
"data": [
|
|
{
|
|
"contact_id": "CO0010",
|
|
"name": "mr Lead 3 kr kr 2",
|
|
"supplier_business_name": "POS",
|
|
"email": null,
|
|
"mobile": "9437638555",
|
|
"tax_number": null,
|
|
"created_at": "2020-12-15 23:14:30",
|
|
"custom_field1": null,
|
|
"custom_field2": null,
|
|
"custom_field3": null,
|
|
"custom_field4": null,
|
|
"custom_field5": null,
|
|
"custom_field6": null,
|
|
"alternate_number": null,
|
|
"landline": null,
|
|
"dob": null,
|
|
"contact_status": "active",
|
|
"type": "lead",
|
|
"custom_field7": null,
|
|
"custom_field8": null,
|
|
"custom_field9": null,
|
|
"custom_field10": null,
|
|
"id": 49,
|
|
"business_id": 1,
|
|
"crm_source": "55",
|
|
"crm_life_stage": "60",
|
|
"address_line_1": null,
|
|
"address_line_2": null,
|
|
"city": null,
|
|
"state": null,
|
|
"country": null,
|
|
"zip_code": null,
|
|
"last_follow_up_id": 18,
|
|
"upcoming_follow_up_id": null,
|
|
"last_follow_up": "2021-01-07 10:26:00",
|
|
"upcoming_follow_up": null,
|
|
"last_follow_up_additional_info": "{\"test\":\"test done\",\"call_duration\":\"1.5 Hour\",\"rand\":1}",
|
|
"upcoming_follow_up_additional_info": null,
|
|
"source": {
|
|
"id": 55,
|
|
"name": "Facebook",
|
|
"business_id": 1,
|
|
"short_code": null,
|
|
"parent_id": 0,
|
|
"created_by": 1,
|
|
"category_type": "source",
|
|
"description": "Facebook",
|
|
"slug": null,
|
|
"woocommerce_cat_id": null,
|
|
"deleted_at": null,
|
|
"created_at": "2020-12-15 23:07:53",
|
|
"updated_at": "2020-12-15 23:07:53"
|
|
},
|
|
"life_stage": {
|
|
"id": 60,
|
|
"name": "Open Deal",
|
|
"business_id": 1,
|
|
"short_code": null,
|
|
"parent_id": 0,
|
|
"created_by": 1,
|
|
"category_type": "life_stage",
|
|
"description": "Open Deal",
|
|
"slug": null,
|
|
"woocommerce_cat_id": null,
|
|
"deleted_at": null,
|
|
"created_at": "2020-12-15 23:11:05",
|
|
"updated_at": "2020-12-15 23:11:05"
|
|
},
|
|
"lead_users": [
|
|
{
|
|
"id": 10,
|
|
"user_type": "user",
|
|
"surname": "Mr.",
|
|
"first_name": "WooCommerce",
|
|
"last_name": "User",
|
|
"username": "woocommerce_user",
|
|
"email": "woo@example.com",
|
|
"language": "en",
|
|
"contact_no": null,
|
|
"address": null,
|
|
"business_id": 1,
|
|
"max_sales_discount_percent": null,
|
|
"allow_login": 1,
|
|
"essentials_department_id": null,
|
|
"essentials_designation_id": null,
|
|
"status": "active",
|
|
"crm_contact_id": null,
|
|
"is_cmmsn_agnt": 0,
|
|
"cmmsn_percent": "0.00",
|
|
"selected_contacts": 0,
|
|
"dob": null,
|
|
"gender": null,
|
|
"marital_status": null,
|
|
"blood_group": null,
|
|
"contact_number": null,
|
|
"fb_link": null,
|
|
"twitter_link": null,
|
|
"social_media_1": null,
|
|
"social_media_2": null,
|
|
"permanent_address": null,
|
|
"current_address": null,
|
|
"guardian_name": null,
|
|
"custom_field_1": null,
|
|
"custom_field_2": null,
|
|
"custom_field_3": null,
|
|
"custom_field_4": null,
|
|
"bank_details": null,
|
|
"id_proof_name": null,
|
|
"id_proof_number": null,
|
|
"deleted_at": null,
|
|
"created_at": "2018-08-02 04:05:55",
|
|
"updated_at": "2018-08-02 04:05:55",
|
|
"pivot": {
|
|
"contact_id": 49,
|
|
"user_id": 10
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"contact_id": "CO0011",
|
|
"name": " Lead 4 ",
|
|
"supplier_business_name": null,
|
|
"email": null,
|
|
"mobile": "234567",
|
|
"tax_number": null,
|
|
"created_at": "2020-12-15 23:14:48",
|
|
"custom_field1": null,
|
|
"custom_field2": null,
|
|
"custom_field3": null,
|
|
"custom_field4": null,
|
|
"custom_field5": null,
|
|
"custom_field6": null,
|
|
"alternate_number": null,
|
|
"landline": null,
|
|
"dob": null,
|
|
"contact_status": "active",
|
|
"type": "lead",
|
|
"custom_field7": null,
|
|
"custom_field8": null,
|
|
"custom_field9": null,
|
|
"custom_field10": null,
|
|
"id": 50,
|
|
"business_id": 1,
|
|
"crm_source": "55",
|
|
"crm_life_stage": "62",
|
|
"address_line_1": null,
|
|
"address_line_2": null,
|
|
"city": null,
|
|
"state": null,
|
|
"country": null,
|
|
"zip_code": null,
|
|
"last_follow_up_id": 32,
|
|
"upcoming_follow_up_id": null,
|
|
"last_follow_up": "2021-01-08 16:06:00",
|
|
"upcoming_follow_up": null,
|
|
"last_follow_up_additional_info": "{\"call_durartion\":\"5 hour\"}",
|
|
"upcoming_follow_up_additional_info": null,
|
|
"source": {
|
|
"id": 55,
|
|
"name": "Facebook",
|
|
"business_id": 1,
|
|
"short_code": null,
|
|
"parent_id": 0,
|
|
"created_by": 1,
|
|
"category_type": "source",
|
|
"description": "Facebook",
|
|
"slug": null,
|
|
"woocommerce_cat_id": null,
|
|
"deleted_at": null,
|
|
"created_at": "2020-12-15 23:07:53",
|
|
"updated_at": "2020-12-15 23:07:53"
|
|
},
|
|
"life_stage": {
|
|
"id": 62,
|
|
"name": "New",
|
|
"business_id": 1,
|
|
"short_code": null,
|
|
"parent_id": 0,
|
|
"created_by": 1,
|
|
"category_type": "life_stage",
|
|
"description": "New",
|
|
"slug": null,
|
|
"woocommerce_cat_id": null,
|
|
"deleted_at": null,
|
|
"created_at": "2020-12-15 23:11:26",
|
|
"updated_at": "2020-12-15 23:11:26"
|
|
},
|
|
"lead_users": [
|
|
{
|
|
"id": 11,
|
|
"user_type": "user",
|
|
"surname": "Mr",
|
|
"first_name": "Admin Essential",
|
|
"last_name": null,
|
|
"username": "admin-essentials",
|
|
"email": "admin_essentials@example.com",
|
|
"language": "en",
|
|
"contact_no": null,
|
|
"address": null,
|
|
"business_id": 1,
|
|
"max_sales_discount_percent": null,
|
|
"allow_login": 1,
|
|
"essentials_department_id": null,
|
|
"essentials_designation_id": null,
|
|
"status": "active",
|
|
"crm_contact_id": null,
|
|
"is_cmmsn_agnt": 0,
|
|
"cmmsn_percent": "0.00",
|
|
"selected_contacts": 0,
|
|
"dob": null,
|
|
"gender": null,
|
|
"marital_status": null,
|
|
"blood_group": null,
|
|
"contact_number": null,
|
|
"fb_link": null,
|
|
"twitter_link": null,
|
|
"social_media_1": null,
|
|
"social_media_2": null,
|
|
"permanent_address": null,
|
|
"current_address": null,
|
|
"guardian_name": null,
|
|
"custom_field_1": null,
|
|
"custom_field_2": null,
|
|
"custom_field_3": null,
|
|
"custom_field_4": null,
|
|
"bank_details": null,
|
|
"id_proof_name": null,
|
|
"id_proof_number": null,
|
|
"deleted_at": null,
|
|
"created_at": "2018-01-04 02:15:19",
|
|
"updated_at": "2018-01-04 02:15:19",
|
|
"pivot": {
|
|
"contact_id": 50,
|
|
"user_id": 11
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"contact_id": "CO0015",
|
|
"name": " Lead kr ",
|
|
"supplier_business_name": null,
|
|
"email": null,
|
|
"mobile": "9437638555",
|
|
"tax_number": null,
|
|
"created_at": "2021-01-07 18:31:08",
|
|
"custom_field1": null,
|
|
"custom_field2": null,
|
|
"custom_field3": null,
|
|
"custom_field4": null,
|
|
"custom_field5": null,
|
|
"custom_field6": null,
|
|
"alternate_number": null,
|
|
"landline": null,
|
|
"dob": "2021-01-07",
|
|
"contact_status": "active",
|
|
"type": "lead",
|
|
"custom_field7": null,
|
|
"custom_field8": null,
|
|
"custom_field9": null,
|
|
"custom_field10": null,
|
|
"id": 82,
|
|
"business_id": 1,
|
|
"crm_source": null,
|
|
"crm_life_stage": null,
|
|
"address_line_1": null,
|
|
"address_line_2": null,
|
|
"city": null,
|
|
"state": null,
|
|
"country": null,
|
|
"zip_code": null,
|
|
"last_follow_up_id": 36,
|
|
"upcoming_follow_up_id": null,
|
|
"last_follow_up": "2021-01-07 18:31:08",
|
|
"upcoming_follow_up": null,
|
|
"last_follow_up_additional_info": "{\"call duration\":\"1 hour\",\"call descr\":\"talked to him and all okay\"}",
|
|
"upcoming_follow_up_additional_info": null,
|
|
"source": null,
|
|
"life_stage": null,
|
|
"lead_users": [
|
|
{
|
|
"id": 11,
|
|
"user_type": "user",
|
|
"surname": "Mr",
|
|
"first_name": "Admin Essential",
|
|
"last_name": null,
|
|
"username": "admin-essentials",
|
|
"email": "admin_essentials@example.com",
|
|
"language": "en",
|
|
"contact_no": null,
|
|
"address": null,
|
|
"business_id": 1,
|
|
"max_sales_discount_percent": null,
|
|
"allow_login": 1,
|
|
"essentials_department_id": null,
|
|
"essentials_designation_id": null,
|
|
"status": "active",
|
|
"crm_contact_id": null,
|
|
"is_cmmsn_agnt": 0,
|
|
"cmmsn_percent": "0.00",
|
|
"selected_contacts": 0,
|
|
"dob": null,
|
|
"gender": null,
|
|
"marital_status": null,
|
|
"blood_group": null,
|
|
"contact_number": null,
|
|
"fb_link": null,
|
|
"twitter_link": null,
|
|
"social_media_1": null,
|
|
"social_media_2": null,
|
|
"permanent_address": null,
|
|
"current_address": null,
|
|
"guardian_name": null,
|
|
"custom_field_1": null,
|
|
"custom_field_2": null,
|
|
"custom_field_3": null,
|
|
"custom_field_4": null,
|
|
"bank_details": null,
|
|
"id_proof_name": null,
|
|
"id_proof_number": null,
|
|
"deleted_at": null,
|
|
"created_at": "2018-01-04 02:15:19",
|
|
"updated_at": "2018-01-04 02:15:19",
|
|
"pivot": {
|
|
"contact_id": 82,
|
|
"user_id": 11
|
|
}
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"links": {
|
|
"first": "http://local.pos.com/connector/api/crm/leads?page=1",
|
|
"last": "http://local.pos.com/connector/api/crm/leads?page=1",
|
|
"prev": null,
|
|
"next": null
|
|
},
|
|
"meta": {
|
|
"current_page": 1,
|
|
"from": 1,
|
|
"last_page": 1,
|
|
"path": "http://local.pos.com/connector/api/crm/leads",
|
|
"per_page": "10",
|
|
"to": 3,
|
|
"total": 3
|
|
}
|
|
}
|
|
*/
|
|
public function getLeads()
|
|
{
|
|
$user = Auth::user();
|
|
$query = $this->crmUtil->getLeadsListQuery($user->business_id);
|
|
|
|
$can_access_all_leads = $user->can('crm.access_all_leads');
|
|
$can_access_own_leads = $user->can('crm.access_own_leads');
|
|
|
|
if (! empty(request()->input('assigned_to'))) {
|
|
$assigned_to = explode(',', request()->input('assigned_to'));
|
|
$query->where(function ($query) use ($assigned_to) {
|
|
$query->whereHas('leadUsers', function ($q) use ($assigned_to) {
|
|
$q->whereIn('user_id', $assigned_to);
|
|
});
|
|
});
|
|
}
|
|
|
|
//If can access only own leads
|
|
if (! $can_access_all_leads && $can_access_own_leads) {
|
|
$query->where(function ($q) use ($user) {
|
|
$q->whereHas('leadUsers', function ($qu) use ($user) {
|
|
$qu->where('user_id', $user->id);
|
|
});
|
|
});
|
|
}
|
|
|
|
$search = request()->only(['name', 'biz_name', 'mobile_num', 'contact_id']);
|
|
if (! empty($search)) {
|
|
$query->where(function ($query) use ($search) {
|
|
if (! empty($search['name'])) {
|
|
$query->where('contacts.name', 'like', '%'.$search['name'].'%');
|
|
}
|
|
|
|
if (! empty($search['biz_name'])) {
|
|
$query->orWhere('contacts.supplier_business_name', 'like', '%'.$search['biz_name'].'%');
|
|
}
|
|
|
|
if (! empty($search['mobile_num'])) {
|
|
$query->orWhere('contacts.mobile', 'like', '%'.$search['mobile_num'].'%')
|
|
->orWhere('contacts.landline', 'like', '%'.$search['mobile_num'].'%')
|
|
->orWhere('contacts.alternate_number', 'like', '%'.$search['mobile_num'].'%');
|
|
}
|
|
|
|
if (! empty($search['contact_id'])) {
|
|
$query->orWhere('contacts.contact_id', 'like', '%'.$search['contact_id'].'%');
|
|
}
|
|
});
|
|
}
|
|
|
|
$order_by = request()->input('order_by');
|
|
$order_by_dir = request()->input('direction');
|
|
if (! empty($order_by) && ! empty($order_by_dir)) {
|
|
$query->orderBy($order_by, $order_by_dir);
|
|
}
|
|
|
|
$per_page = ! empty(request()->input('per_page')) ? request()->input('per_page') : $this->perPage;
|
|
|
|
if ($per_page != -1) {
|
|
$leads = $query->paginate($per_page);
|
|
$leads->appends(request()->query());
|
|
} else {
|
|
$leads = $query->get();
|
|
}
|
|
|
|
return CommonResource::collection($leads);
|
|
}
|
|
}
|