ultimatepos/Modules/Connector/Http/Controllers/Api/ContactController.php

750 lines
29 KiB
PHP

<?php
namespace Modules\Connector\Http\Controllers\Api;
use App\Contact;
use App\Utils\ContactUtil;
use App\Utils\TransactionUtil;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Modules\Connector\Transformers\CommonResource;
/**
* @group Contact management
* @authenticated
*
* APIs for managing contacts
*/
class ContactController extends ApiController
{
protected $contactUtil;
protected $transactionUtil;
/**
* Constructor
*
* @param ContactUtil $contactUtil
* @return void
*/
public function __construct(
ContactUtil $contactUtil,
TransactionUtil $transactionUtil
) {
$this->contactUtil = $contactUtil;
$this->transactionUtil = $transactionUtil;
}
/**
* List contact
*
* @queryParam type required Type of contact (supplier, customer)
* @queryParam name Search term for contact name
* @queryParam biz_name Search term for contact's business name
* @queryParam mobile_num Search term for contact's mobile number
* @queryParam contact_id Search term for contact'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, Direction: desc, asc
* @queryParam per_page Total records per page. default: 10, Set -1 for no pagination Example:10
* @response {
"data": [
{
"id": 2,
"business_id": 1,
"type": "supplier",
"supplier_business_name": "Alpha Clothings",
"name": "Michael",
"prefix": null,
"first_name": "Michael",
"middle_name": null,
"last_name": null,
"email": null,
"contact_id": "CO0001",
"contact_status": "active",
"tax_number": "4590091535",
"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": 15,
"pay_term_type": "days",
"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": 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:59:38",
"updated_at": "2018-06-11 22:21:03",
"remember_token": null,
"password": null
},
{
"id": 3,
"business_id": 1,
"type": "supplier",
"supplier_business_name": "Manhattan Clothing Ltd.",
"name": "Philip",
"prefix": null,
"first_name": "Philip",
"middle_name": null,
"last_name": null,
"email": null,
"contact_id": "CO0003",
"contact_status": "active",
"tax_number": "54869310093",
"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": 15,
"pay_term_type": "days",
"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": 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 21:00:55",
"updated_at": "2018-06-11 22:21:36",
"remember_token": null,
"password": null
},
{
"id": 5,
"business_id": 1,
"type": "supplier",
"supplier_business_name": "Digital Ocean",
"name": "Mike McCubbin",
"prefix": null,
"first_name": "Mike McCubbin",
"middle_name": null,
"last_name": null,
"email": null,
"contact_id": "CN0004",
"contact_status": "active",
"tax_number": "52965489001",
"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": 30,
"pay_term_type": "days",
"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": 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-06 06:53:22",
"updated_at": "2018-06-11 22:21:47",
"remember_token": null,
"password": null
},
{
"id": 6,
"business_id": 1,
"type": "supplier",
"supplier_business_name": "Univer Suppliers",
"name": "Jackson Hill",
"prefix": null,
"first_name": "Jackson Hill",
"middle_name": null,
"last_name": null,
"email": null,
"contact_id": "CO0002",
"contact_status": "active",
"tax_number": "5459000655",
"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": 45,
"pay_term_type": "days",
"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": 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-06 06:55:09",
"updated_at": "2018-06-11 22:21:18",
"remember_token": null,
"password": null
}
],
"links": {
"first": "http://local.pos.com/connector/api/contactapi?page=1",
"last": "http://local.pos.com/connector/api/contactapi?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "http://local.pos.com/connector/api/contactapi",
"per_page": "10",
"to": 4,
"total": 4
}
}
*/
public function index()
{
if (! auth()->user()->can('supplier.view') && ! auth()->user()->can('customer.view') && ! auth()->user()->can('customer.view_own') && ! auth()->user()->can('supplier.view_own')) {
abort(403, 'Unauthorized action.');
}
$user = Auth::user();
$business_id = $user->business_id;
$type = request()->get('type', null);
$query = Contact::where('business_id', $business_id);
if ($type == 'supplier') {
$query->onlySuppliers();
} elseif ($type == 'customer') {
$query->onlyCustomers();
} else {
if (auth()->check() && ((! auth()->user()->can('customer.view') && auth()->user()->can('customer.view_own'))) || (! auth()->user()->can('supplier.view') && auth()->user()->can('supplier.view_own'))) {
$query->onlyOwnContact();
}
}
$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) {
$contacts = $query->paginate($per_page);
$contacts->appends(request()->query());
} else {
$contacts = $query->get();
}
return CommonResource::collection($contacts);
}
/**
* Create contact
*
* @bodyParam type string required Type of contact (supplier, customer, both, lead) Example: customer
* @bodyParam supplier_business_name string required Required if type is supplier
* @bodyParam prefix string Prefix for the name of the contact
* @bodyParam first_name string required Name of the contact
* @bodyParam middle_name string
* @bodyParam last_name string
* @bodyParam tax_number string Example:8787fefef
* @bodyParam pay_term_number float Example: 3
* @bodyParam pay_term_type string (months ,days) Example: months
* @bodyParam mobile string required Example:4578691009
* @bodyParam landline string Example:5487-8454-4145
* @bodyParam alternate_number string Example: 841847541222
* @bodyParam address_line_1 string
* @bodyParam address_line_2 string
* @bodyParam city string
* @bodyParam state string
* @bodyParam country string
* @bodyParam zip_code string
* @bodyParam customer_group_id string
* @bodyParam contact_id string
* @bodyParam dob string Fromat: Y-m-d Example:2000-06-13
* @bodyParam custom_field1 string
* @bodyParam custom_field2 string
* @bodyParam custom_field3 string
* @bodyParam custom_field4 string
* @bodyParam email string
* @bodyParam shipping_address string
* @bodyParam position string
* @bodyParam opening_balance float Example: 0.0000
* @bodyParam source_id integer Id of the source. Applicable only if the type is lead
* @bodyParam life_stage_id integer Id of the Life stage. Applicable only if the type is lead
* @bodyParam assigned_to array Ids of the users the lead is assigned to. Applicable only if the type is lead
*
* @response {
"data": {
"type": "customer",
"name": "test customer",
"tax_number": "75879BHF",
"mobile": "7878825008",
"business_id": 1,
"created_by": 9,
"credit_limit": null,
"contact_id": "CO0007",
"updated_at": "2020-06-04 21:59:21",
"created_at": "2020-06-04 21:59:21",
"id": 17
}
}
*/
public function store(Request $request)
{
try {
$request->validate([
'first_name' => 'required',
'type' => 'required|in:customer,supplier,both,lead',
'mobile' => 'required',
'supplier_business_name' => 'required_if:type,supplier',
]);
$input = $request->only(['type', 'supplier_business_name',
'prefix', 'first_name', 'middle_name', 'last_name', 'tax_number', 'pay_term_number', 'pay_term_type', 'mobile', 'landline', 'alternate_number', 'city', 'state', 'country', 'address_line_1', 'address_line_2', 'customer_group_id', 'zip_code', 'contact_id', 'custom_field1', 'custom_field2', 'custom_field3', 'custom_field4', 'email', 'shipping_address', 'position', 'dob', ]);
$input['business_id'] = Auth::user()->business_id;
$input['created_by'] = Auth::user()->id;
$input['credit_limit'] = $request->input('credit_limit') != '' ? $request->input('credit_limit') : null;
if (! empty($input['prefix'])) {
$name_array[] = $input['prefix'];
}
$name_array[] = $input['first_name'];
if (! empty($input['middle_name'])) {
$name_array[] = $input['middle_name'];
}
if (! empty($input['last_name'])) {
$name_array[] = $input['last_name'];
}
$input['name'] = implode(' ', $name_array);
DB::beginTransaction();
if ($input['type'] == 'lead') {
$input['crm_source'] = $request->input('source_id') ?? null;
$input['crm_life_stage'] = $request->input('life_stage_id') ?? null;
$assigned_to = $request->input('assigned_to') ?? [];
$lead = \Modules\Crm\Entities\CrmContact::createNewLead($input, $assigned_to);
$output['data'] = $lead;
} else {
$output = $this->contactUtil->createNewContact($input);
}
DB::commit();
return new CommonResource($output['data']);
} catch (\Exception $e) {
DB::rollBack();
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
return $this->otherExceptions($e);
}
}
/**
* Get the specified contact
*
* @urlParam contact required comma separated ids of contacts Example: 2
* @response {
"data": [
{
"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": "walkin@test.com",
"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": "85001",
"dob": null,
"mobile": "(378) 400-1234",
"landline": null,
"alternate_number": null,
"pay_term_number": null,
"pay_term_type": null,
"credit_limit": "0.0000",
"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,
"deleted_at": null,
"created_at": "2018-01-03 20:45:20",
"updated_at": "2020-08-10 10:26:45",
"remember_token": null,
"password": null,
"customer_group": null,
"opening_balance": "0.0000",
"opening_balance_paid": "0.0000",
"total_purchase": "0.0000",
"purchase_paid": "0.0000",
"total_purchase_return": "0.0000",
"purchase_return_paid": "0.0000",
"total_invoice": "2050.0000",
"invoice_received": "1987.5000",
"total_sell_return": "0.0000",
"sell_return_paid": "0.0000",
"purchase_due": 0,
"sell_due": 62.5,
"purchase_return_due": 0,
"sell_return_due": 0
}
]
}
*/
public function show($contact_ids)
{
$user = Auth::user();
// if (!$user->can('api.access')) {
// return $this->respondUnauthorized();
// }
$business_id = $user->business_id;
$contact_ids = explode(',', $contact_ids);
$query = $this->contactUtil->getContactQuery($business_id, 'both', $contact_ids);
$contacts = $query->get();
foreach ($contacts as $key => $value) {
$contacts[$key]->purchase_due = $value->total_purchase - $value->total_purchase_paid;
$contacts[$key]->sell_due = $value->total_invoice - $value->invoice_received;
$contacts[$key]->purchase_return_due = $value->total_purchase_return - $value->purchase_return_paid;
$contacts[$key]->sell_return_due = $value->total_sell_return - $value->sell_return_paid;
}
return CommonResource::collection($contacts);
}
/**
* Update contact
*
* @urlParam contact required id of the contact to be updated Example: 17
* @bodyParam type string Type of contact (supplier, customer, both) Example:customer
* @bodyParam supplier_business_name string required* Required if type is supplier
* @bodyParam prefix string Prefix for the name of the contact
* @bodyParam first_name string required Name of the contact
* @bodyParam middle_name string
* @bodyParam last_name string
* @bodyParam tax_number string Example: 488744dwd
* @bodyParam pay_term_number float Example: 3
* @bodyParam pay_term_type string (months ,days) Example:months
* @bodyParam mobile string required Example:8795461009
* @bodyParam landline string Example:65484-848-848
* @bodyParam alternate_number string Example:9898795220
* @bodyParam address_line_1 string
* @bodyParam address_line_2 string
* @bodyParam city string
* @bodyParam state string
* @bodyParam country string
* @bodyParam zip_code string
* @bodyParam customer_group_id string
* @bodyParam contact_id string
* @bodyParam dob string Fromat: Y-m-d Example:2000-06-13
* @bodyParam custom_field1 string
* @bodyParam custom_field2 string
* @bodyParam custom_field3 string
* @bodyParam custom_field4 string
* @bodyParam email string
* @bodyParam shipping_address string
* @bodyParam position string
* @bodyParam opening_balance float Example:10.3
* @bodyParam source_id integer Id of the source. Applicable only if the type is lead
* @bodyParam life_stage_id integer Id of the Life stage. Applicable only if the type is lead
* @bodyParam assigned_to array Ids of the users the lead is assigned to. Applicable only if the type is lead
*
* @response {
"data": {
"id": 21,
"business_id": 1,
"type": "customer",
"supplier_business_name": null,
"name": "created from api",
"prefix": null,
"first_name": "created from api",
"middle_name": null,
"last_name": null,
"email": null,
"contact_id": "CO0009",
"contact_status": "active",
"tax_number": null,
"city": null,
"state": null,
"country": null,
"address_line_1": "test address",
"address_line_2": null,
"zip_code": "54878787",
"dob": "2000-06-13",
"mobile": "8754154872154",
"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": null,
"crm_life_stage": null,
"custom_field1": null,
"custom_field2": null,
"custom_field3": null,
"custom_field4": null,
"deleted_at": null,
"created_at": "2020-08-10 10:41:42",
"updated_at": "2020-08-10 10:41:42",
"remember_token": null,
"password": null
}
}
*/
public function update(Request $request, $id)
{
try {
$input = $request->only(['type', 'supplier_business_name', 'prefix', 'first_name', 'middle_name', 'last_name', 'tax_number', 'pay_term_number', 'pay_term_type', 'mobile', 'address_line_1', 'address_line_2', 'zip_code', 'dob', 'alternate_number', 'city', 'state', 'country', 'landline', 'customer_group_id', 'contact_id', 'custom_field1', 'custom_field2', 'custom_field3', 'custom_field4', 'email', 'shipping_address', 'position']);
$business_id = Auth::user()->business_id;
$updates = [];
foreach ($input as $key => $value) {
if ($request->has($key)) {
$updates[$key] = $value;
}
}
if (! empty($input['prefix'])) {
$name_array[] = $input['prefix'];
}
$name_array[] = $input['first_name'];
if (! empty($input['middle_name'])) {
$name_array[] = $input['middle_name'];
}
if (! empty($input['last_name'])) {
$name_array[] = $input['last_name'];
}
$input['name'] = implode(' ', $name_array);
DB::beginTransaction();
if ($input['type'] == 'lead') {
$input['crm_source'] = $request->input('source_id') ?? null;
$input['crm_life_stage'] = $request->input('life_stage_id') ?? null;
$assigned_to = $request->input('assigned_to') ?? [];
$lead = \Modules\Crm\Entities\CrmContact::updateLead($id, $input, $assigned_to);
$output['data'] = $lead;
} else {
$output = $this->contactUtil->updateContact($updates, $id, $business_id);
}
DB::commit();
return new CommonResource($output['data']);
} catch (\Exception $e) {
DB::rollBack();
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
return $this->otherExceptions($e);
}
}
/**
* Contact payment
*
* @bodyParam contact_id int required id of the contact Example: 17
* @bodyParam amount float required amount of the payment Example: 453.1300
* @bodyParam method string payment methods ('cash', 'card', 'cheque', 'bank_transfer', 'other', 'custom_pay_1', 'custom_pay_2', 'custom_pay_3') Example: cash
* @bodyParam paid_on string transaction date format:Y-m-d H:i:s, Example: 2020-07-22 15:48:29
* @bodyParam account_id int account id
* @bodyParam card_number string
* @bodyParam card_holder_name string
* @bodyParam card_transaction_number string
* @bodyParam card_type string
* @bodyParam card_month string
* @bodyParam card_year string
* @bodyParam card_security string
* @bodyParam transaction_no_1 string
* @bodyParam transaction_no_2 string
* @bodyParam transaction_no_3 string
* @bodyParam cheque_number string
* @bodyParam bank_account_number string
* @bodyParam note string payment note
*
*@response {
"data": {
"amount": "20",
"method": "cash",
"paid_on": "2020-07-22 15:48:29",
"created_by": 1,
"payment_for": "19",
"business_id": 1,
"is_advance": 1,
"payment_ref_no": "SP2020/0127",
"document": null,
"updated_at": "2020-07-22 15:48:29",
"created_at": "2020-07-22 15:48:29",
"id": 215
}
}
*/
public function contactPay(Request $request)
{
try {
DB::beginTransaction();
$payment = $this->transactionUtil->payContact($request, false);
DB::commit();
return new CommonResource($payment);
} catch (\Exception $e) {
DB::rollBack();
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
return $this->otherExceptions($e);
}
}
}