101 lines
3.2 KiB
PHP
101 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Gate;
|
|
|
|
use App\Models\{Account,Invoice,Payment,Service,User};
|
|
|
|
class SearchController extends Controller
|
|
{
|
|
/**
|
|
* Search from the Application Dashboard.
|
|
*
|
|
* @param Request $request
|
|
* @return Collection
|
|
*/
|
|
public function search(Request $request): Collection
|
|
{
|
|
$result = collect();
|
|
|
|
// If the user isnt logged in
|
|
if (! Auth::user())
|
|
abort(401,'Need to login');
|
|
|
|
// If there isnt a term value, return null
|
|
if (! $request->input('term'))
|
|
return $result;
|
|
|
|
$account_ids = ($x=Auth::user()->accounts_all)->pluck('id');
|
|
$user_ids = $x->pluck('user_id')->unique();
|
|
|
|
// Look for User
|
|
foreach (User::Search($request->input('term'))
|
|
->whereIN('id',$user_ids)
|
|
->orderBy('lastname')
|
|
->orderBy('firstname')
|
|
->limit(10)->get() as $o)
|
|
{
|
|
$result->push(['name'=>sprintf('%s (%s) - %s',$o->name,$o->lid,$o->email),'value'=>'/u/home/'.$o->id,'category'=>'Users']);
|
|
}
|
|
|
|
// Look for User by their Supplier ID with some suppliers
|
|
if (is_numeric($request->input('term')))
|
|
foreach (Account::select(['user_id','suppliers.name AS supplier_name','account_supplier.supplier_ref AS pivot_id'])
|
|
->join('account_supplier',['account_supplier.account_id'=>'accounts.id'])
|
|
->join('suppliers',['suppliers.id'=>'account_supplier.supplier_id'])
|
|
->whereIN('accounts.id',$account_ids)
|
|
->where('account_supplier.supplier_ref','like','%'.$request->input('term').'%')
|
|
->orderBy('company')
|
|
->limit(10)->get() as $o)
|
|
{
|
|
$result->push(['name'=>sprintf('%s (%s:%s)',$o->company,$o->supplier_name,$o->supplier_ref),'value'=>'/u/home/'.$o->user_id,'category'=>'Suppliers']);
|
|
}
|
|
|
|
// Look for Account
|
|
foreach (Account::Search($request->input('term'))
|
|
->whereIN('id',$account_ids)
|
|
->orderBy('company')
|
|
->limit(10)->get() as $o)
|
|
{
|
|
$result->push(['name'=>sprintf('%s (%s)',$o->name,$o->lid),'value'=>'/u/home/'.$o->user_id,'category'=>'Accounts']);
|
|
}
|
|
|
|
// Look for a Service
|
|
foreach (Service::Search($request->input('term'))
|
|
->whereIN('account_id',$account_ids)
|
|
->orderBy('id')
|
|
->limit(20)
|
|
->with(['product'])
|
|
->get() as $o)
|
|
{
|
|
$result->push(['name'=>sprintf('%s (%s) %s',$o->name,$o->lid,$o->active ? '' : '<small>INACT</small>'),'value'=>'/u/service/'.$o->id,'category'=>$o->product->category_name]);
|
|
}
|
|
|
|
// Look for an Invoice
|
|
foreach (Invoice::Search($request->input('term'))
|
|
->whereIN('account_id',$account_ids)
|
|
->orderBy('id')
|
|
->limit(10)->get() as $o)
|
|
{
|
|
$result->push(['name'=>sprintf('%s: %s',$o->lid,$o->account->name),'value'=>'/u/invoice/'.$o->id,'category'=>'Invoices']);
|
|
}
|
|
|
|
if (Gate::any(['wholesaler'],new Payment)) {
|
|
// Look for Payments
|
|
foreach (Payment::Search($request->input('term'))
|
|
->whereIN('account_id',$account_ids)
|
|
->limit(10)->get() as $o)
|
|
{
|
|
$result->push(['name'=>sprintf('%s: %s $%s',$o->lid,$o->account->name,number_format($o->total,2)),'value'=>'/r/payment/addedit/'.$o->id,'category'=>'Payments']);
|
|
}
|
|
}
|
|
|
|
return $result
|
|
->sortBy(fn($item)=>$item['category'].$item['name'])
|
|
->values();
|
|
}
|
|
} |