MINI Sh3ll
<?php
namespace App\Solar\Repositories\Enquiry;
use Auth;
use App\Models\Enquiry;
use App\Models\Company;
use App\Models\CompanyUser;
use App\Models\EnquiryAssigned;
use App\Models\EnquiryRemark;
use App\Models\Country;
use App\Models\Plant;
use App\Models\PlantUser;
use App\User;
use Illuminate\Support\Facades\Notification;
use App\Notifications\EnquiryMail;
use App\Notifications\EnquiryStatusMail;
use App\Solar\Repositories\Zendesk\ZendeskInterface;
class EnquiryRepository implements EnquiryInterface {
/**
* @var Enquiry
*/
private $enquiry;
private $enquiryAssign;
private $enquiryRemark;
private $zendesk;
/**
* EnquiryRepository constructor.
* @param Enquiry $enquiry
*/
public function __construct(Enquiry $enquiry, EnquiryAssigned $enquiryAssign, EnquiryRemark $enquiryRemark, ZendeskInterface $zendesk) {
$this->enquiry = $enquiry;
$this->enquiryAssign = $enquiryAssign;
$this->enquiryRemark = $enquiryRemark;
$this->zendesk = $zendesk;
}
/* public function getCompanies() {
return Company::get();
} */
public function getCountries() {
return Country::get();
}
/*
* Get all company name
*/
public function getAllCompanyNames() {
$user_id = Auth::user()->id;
return CompanyUser::where('user_id', $user_id)->with('company')
->get();
}
/*
* Get companies of users
*/
public function getCompanies($user_id) {
return CompanyUser::where('user_id', $user_id)->with('company')
->get();
}
/*
* Get plants of company and assigned users
*/
public function getPlants($user_id, $company_id) {
return PlantUser::when($user_id != ' ', function($qry) use($user_id) {
return $qry->where('user_id', $user_id);
})
->with(['plant' => function($q) use($company_id) {
$q->where('company_id', $company_id);
}])
->get();
}
/*
* Get user
*/
public function getUser($user_id) {
return User::where('id', $user_id)
->first();
}
/*
* Get all company and plant users to list when submit enquiry
*/
public function getAllCompanyUsers() {
$users = array();
$role_id = config('constants.role.user.id');
if(\Auth::user()->role_id == config('constants.role.superadmin.id') || \Auth::user()->role_id == config('constants.role.scpl_user.id')) {
$data = User::where(['role_id' => $role_id, 'status' => 1])->distinct()->get();
} else {
$company = \Auth::user()->company_users()->pluck('company_id')->toArray();
$results = Plant::with('company_plant_users.user')->whereIn('company_id', $company)->get();
//dd($results);
foreach ($results as $result) {
foreach ($result->company_plant_users as $plant_user) {
$users[] = $plant_user->user;
}
}
$data = (object)$users;
}
return $data;
}
/*
* Get Plant users for a particular user
*/
public function getPlantsForUser() {
$user_id = Auth::user()->id;
return PlantUser::where('plant_users.user_id', $user_id)->get();
}
/*
* Store company details, assign company admin
*/
public function store($request) {
$status = false;
$sendEnquiryMail = $this->sendEnquiryMail($request);
$createTicket = $this->zendesk->createTicket($sendEnquiryMail);
if($createTicket){
$enquiry = $this->enquiry;
$this->buildEnquiryObject($enquiry, $request);
$enquiry->save();
if ($enquiry) {
$status = true;
$enquiry = $this->enquiry->findOrFail($enquiry->id);
$enquiry->ticket_id = $createTicket->ticket->id;
$enquiry->save();
$id = $request->user_id?$request->user_id:\Auth::id();
$user = User::findOrFail($id);
if (empty($user->zendesk_id)) {
$user->zendesk_id = $createTicket->ticket->requester_id;
$user->save();
// Send email to company admin, portal admin after submit enquiry
if (isset($request->company_id)) {
$company_id = $request->company_id;
$users = User::whereHas('company_users', function($q) use($company_id) {
$q->where('company_id', $company_id);
})->where('role_id','!=', config('constants.role.user.id'))->get();
foreach ($users as $user) {
$user = User::where('id', $user->id)->first();
$user->notify((new EnquiryMail($sendEnquiryMail))->delay(10));
}
}
}
}
}
// // Send email to user who submit enquiry
// if (isset($enquiry->created_by)) {
// $user = User::where('id', $enquiry->created_by)->first();
// $user->enquiry_status = $enquiry->status;
// $user->notify((new EnquiryMail($user))->delay(10));
// }
return $status;
}
/*
* Bind enquiry and request object
*/
public function buildEnquiryObject($enquiry, $request) {
$enquiry->created_by = $request->user_id?$request->user_id:\Auth::id();
$enquiry->contact_name = $request->contact_name;
if (isset($request->user_id)) {
$user = $this->getUser($request->user_id);
$enquiry->contact_name = $user->first_name . ' ' . $user->last_name;
}
$enquiry->email = $request->email;
$enquiry->mobile = $request->mobile;
$enquiry->company_id = $request->company_id;
$enquiry->plant_id = $request->plant_id;
$enquiry->product_type = $request->product_type;
$enquiry->country_id = $request->country_id;
$enquiry->site_locator = $request->site_locator;
$enquiry->date_code = $request->date_codes;
$enquiry->serial_number = $request->serial_number;
$enquiry->issue_type = $request->issue_type;
$enquiry->description = $request->description;
$enquiry->updated_by = Auth::user()->id;
}
/*
* Get resource details
*/
public function getEnquiry($from_date, $to_date, $company_id, $plant_id, $status, $product_type_id, $issue_type_id, $created_by, $flag = NULL) {
if(\Auth::user()->role_id == config('constants.role.superadmin.id') || \Auth::user()->role_id == config('constants.role.scpl_user.id')) {
$query = Enquiry::with('company','plant')->whereHas('plant', function($q){
$q->where('status', '1');
})->whereHas('company', function($q){
$q->where('status', '1');
});
}elseif(\Auth::user()->role_id == config('constants.role.company_admin.id') || \Auth::user()->role_id == config('constants.role.portal_admin.id') || \Auth::user()->role_id == config('constants.role.portal_support.id')) {
$companies = \Auth::user()->company_users->pluck('company_id')->all();
$query = Enquiry::with('company','plant')->whereHas('plant', function($q){
$q->where('status', '1');
})->whereHas('company', function($q){
$q->where('status', '1');
})->whereIn('company_id', $companies);
}else{
$query = Enquiry::with('company','plant')->whereHas('plant', function($q){
$q->where('status', '1');
})->whereHas('company', function($q){
$q->where('status', '1');
})->where('created_by', \Auth::id());
}
$query->when($company_id != ' ', function($qry) use($company_id) {
return $qry->where('company_id', $company_id);
});
$query->when($plant_id != ' ', function($qry) use($plant_id) {
return $qry->where('plant_id', $plant_id);
});
$query->when($status != ' ', function($qry) use($status) {
return $qry->where('status', $status);
});
$query->when($product_type_id != ' ', function($qry) use($product_type_id) {
return $qry->where('product_type', $product_type_id);
});
$query->when($issue_type_id != ' ', function($qry) use($issue_type_id) {
return $qry->where('issue_type', $issue_type_id);
});
$query->when($created_by != ' ', function($qry) use($created_by) {
return $qry->where('created_by', $created_by);
});
if ($from_date != null || $to_date != null) {
$query->whereBetween(\DB::raw('DATE(created_at)'), array($from_date, $to_date));
}
return $enquiryData = $query->orderBy('id', 'DESC')->get();
}
/*
* Find resource instance
*/
public function find($id) {
return $this->enquiry->newInstance()->with('company', 'country')->findOrFail($id);
}
/*
* Update resource details
*/
public function update($id, $request) {
$enquiry = $this->enquiry->findOrFail($id);
$enquiry->status = $request->status;
$enquiry->save();
/* if (!empty($request->assigned_to) && isset($request->assigned_to)) {
$enquiryAssign = $this->enquiryAssign;
$this->buildEnquiryAssignObject($enquiry, $enquiryAssign, $request);
$enquiryAssign->save();
$enquiry->status = $request->status;
$enquiry->save();
$user = User::where('id', $request->assigned_to)->first();
$user->description = $enquiry->description;
if ($enquiry->product_type == 1) {
$user->product_type = config('constants.productType.accessory.name');
} elseif ($enquiry->product_type == 2) {
$user->product_type = config('constants.productType.inverter.name');
} elseif ($enquiry->product_type == 3) {
$user->product_type = config('constants.productType.micro.name');
} else {
$user->product_type = config('constants.productType.monitoring.name');
}
if ($enquiry->issue_type == 1) {
$user->issue_type = config('constants.issueType.presalesTechnicalQuestion.name');
} else {
$user->issue_type = config('constants.issueType.postSalesTechnicalQuestion.name');
}
$user->notify(new EnquiryMail($user));
} */
if ($enquiry) {
$status = $request->status == 1 ? 'pending' : 'solved';
$changeStatus = $this->zendesk->changeTicketStatus($enquiry->ticket_id, $status);
}
if (!empty($request->remark) && isset($request->remark)) {
//Check for User created on zendesk or not
$role = \Auth::user()->roles()->first();
$assignee_id = (\Auth::user()->zendesk_id) ? \Auth::user()->zendesk_id : 0;
if (empty(\Auth::user()->zendesk_id)) {
$name = \Auth::user()->first_name . ' ' . \Auth::user()->last_name;
$createUser = $this->zendesk->createUser($name, \Auth::user()->email);
$assignee_id = $createUser->user->id;
$user = User::findOrFail(\Auth::id());
$user->zendesk_id = $assignee_id;
$user->save();
}
//Post Comment on zendsesk
$reComment = $this->zendesk->createReComment($enquiry->ticket_id, $assignee_id, $request->remark);
// $enquiryRemark = $this->enquiryRemark;
// $this->buildEnquiryRemarkObject($enquiry, $enquiryRemark, $request);
// $enquiryRemark->save();
}
// Send email to portal admin, portal support and user after enquiry closed
if (!empty($enquiry->status) && isset($enquiry->status) && ($enquiry->status == 2)) {
if (isset($enquiry->company_id)) {
$company_id = $enquiry->company_id;
$users = User::whereHas('company_users', function($q) use($company_id) {
$q->where('company_id', $company_id);
})
->where('role_id', config('constants.role.portal_admin.id'))
->orWhere('role_id', config('constants.role.portal_support.id'))
->get();
/* foreach ($users as $user) {
$user = User::where('id', $user->id)->first();
$user->notify((new EnquiryStatusMail($user))->delay(10));
} */
}
/* $user = User::where('id', $request->assigned_to)->first();
$user->notify(new EnquiryStatusMail($user)); */
}
return $enquiry;
}
/*
* Bind enquiry, enquiry_assign and request object
*/
/* public function buildEnquiryAssignObject($enquiry, $enquiryAssign, $request) {
$enquiryAssign->enquiry_id = $enquiry->id;
$enquiryAssign->assigned_to = $request->assigned_to;
$enquiryAssign->assigned_by = auth::user()->id;
} */
/*
* Bind enquiry, enquiry_remark and request object
*/
public function buildEnquiryRemarkObject($enquiry, $enquiryRemark, $request) {
$enquiryRemark->enquiry_id = $enquiry->id;
$enquiryRemark->remark = $request->remark;
$enquiryRemark->status = $enquiry->status;
$enquiryRemark->remark_by = auth::user()->id;
}
/*
* Destroy resource details
*/
public function delete($id) {
$enquiry = $this->enquiry->findOrFail($id);
$ticket_id = $enquiry->ticket_id;
$enquiry->delete();
// $deleteTicket = $this->zendesk->deleteTicket($ticket_id);
return $enquiry;
}
/*
* Get Portal support users for a specific company
*/
public function getPortalSupports($company_id) {
return User::whereHas('company_users', function($q) use($company_id) {
$q->where('company_id', $company_id);
})->where('role_id', config('constants.role.portal_support.id'))->get();
}
/*
* Get remarks
*/
public function getRemark($id) {
return $this->enquiryRemark->where('enquiry_id', $id)->with('remark_by')->orderBy('id', 'desc')->get();
}
/*
* Get remarks
*/
/* public function getEnquiryAssignedTo($id) {
return $this->enquiryAssign->where('enquiry_id', $id)->with('assignedto')->orderBy('id', 'desc')->first();
} */
/*
* Get all enquiry created by name
*/
public function getAllEnquiryCreatedBy() {
return $this->enquiry->select('created_by', 'contact_name')->distinct()->get();
}
/*
* Get all enquiry comment from zendesk
*/
public function getComment($id) {
$enquiry = $this->enquiry->findOrFail($id);
$comments = $this->zendesk->getTicketComments($enquiry->ticket_id);
$result = array();
if (!empty($comments)) {
foreach (array_slice($comments, 1) as $comment) {
$user = $this->zendesk->getUser($comment['author_id']);
$result[] = array('name' => $user->user->name, 'comment' => $comment['plain_body'], 'created_at' => $comment['created_at'], 'status' => 'pending');
}
if ($enquiry->status == 2) {
$key = array_key_last($result);
$result[$key]['status'] = 'closed';
}
}
return array_reverse($result);
}
public function getEnquiryClosedDetails($id) {
$enquiry = $this->enquiry->findOrFail($id);
$comments = $this->zendesk->getTicketComments($enquiry->ticket_id);
$lastComment = end($comments);
$user = $this->zendesk->getUser($lastComment['author_id']);
$result = array('name' => $user->user->name, 'closedDate' => $lastComment['created_at']);
return $result;
}
/*
* Send mail to company's users
*/
public function sendEnquiryMail($request)
{
if (isset($request->user_id)) {
$name = '';
$user= User::findOrFail($request->user_id);
$name = $user->first_name.' '.$user->last_name;
}else
$name = $request->contact_name;
$plant = '';
$plant_name = '';
$company = Company::findOrFail($request->company_id);
if(isset($request->plant_id)&& $request->plant_id!=null){
$plant = Plant::findOrFail($request->plant_id);
$plant_name = $plant->plant_name;
}
$productTypes = config('constants.productType');
foreach ($productTypes as $product) {
if($product['id']==$request->product_type)
$producttype = $product['name'];
}
$issueTypes = config('constants.issueType');
foreach ($issueTypes as $issue) {
if($issue['id']==$request->issue_type)
$issuetype = $issue['name'];
}
$country = Country::find($request->country_id);
$subject = 'New enquiry generated by '.$name;
$body = array('contact_name'=>$name,
'mobile'=>$request->mobile,
'company'=>$company->company_name,
'plant'=>$plant_name,
'product_types'=> $producttype,
'country'=>$country->name,
'site_locator'=>$request->site_locator,
'date_codes'=>$request->date_codes,
'serial_number'=> $request->serial_number,
'issue_type'=>$issuetype,
'description'=> $request->description);
return $result = array('name'=>$name,'email'=>$request->email,'subject' => $subject ,'body'=>$body);
}
/*Get all plant active and deactive*/
public function getEnqPlants($company_id) {
if(\Auth::user()->role_id == config('constants.role.user.id')) {
$plantdetails = PlantUser::where('user_id', \Auth::id())
->with(['plant' => function($q) use($company_id) {
$q->where('company_id', $company_id);
$q->where('status', '1');
}])
->get();
foreach ($plantdetails as $plantdetail) {
$plants[] = $plantdetail->plant;
}
} else
{
$plants = Plant::where('company_id',$company_id)->where('status','1')->get();
}
return $plants;
}
}
OHA YOOOO