CustomerSearchController::__invoke()   A
last analyzed

Complexity

Conditions 6
Paths 4

Size

Total Lines 18
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 9
c 2
b 0
f 0
dl 0
loc 18
rs 9.2222
cc 6
nc 4
nop 1
1
<?php
2
3
namespace App\Http\Controllers\Customers;
4
5
use App\Http\Controllers\Controller;
6
use Illuminate\Http\Request;
7
use Illuminate\Support\Arr;
8
use App\Models\Customer;
9
use App\Http\Requests\Customers\CustomerSearchRequest;
10
11
class CustomerSearchController extends Controller
12
{
13
    protected $perPage;
14
    protected $sortType;
15
    protected $sortField;
16
17
    /**
18
     *  Search for a customer
19
     */
20
    public function __invoke(CustomerSearchRequest $request)
21
    {
22
        //  Pagination parameters
23
        $this->perPage   = $request->perPage;
24
        $this->sortField = $request->sortField;
25
        $this->sortType  = $request->sortType == 'none' ? 'asc' : $request->sortType;
26
27
        //  If no search parameters are set, list all customers
28
        if(Arr::has($request->toArray(), ['city', 'name', 'equipment']) &&
29
            ($request->city == null &&
30
             $request->name == null &&
31
             $request->equipment == null)
32
            ) {
33
            return $this->getAllCustomers();
34
        }
35
36
        //  Search by given search parameters
37
        return $this->search($request->only(['city', 'name', 'equipment']));
38
    }
39
40
    /*
41
    *   Perform the actual search
42
    */
43
    protected function search($params)
44
    {
45
        return Customer::orderBy($this->sortField, $this->sortType)
46
            //  Search by equipment
47
            ->when(isset($params['equipment']), function($q) use ($params) {
48
                $q->whereHas('ParentEquipment', function($q2) use ($params) {
49
                    $q2->where('name', $params['equipment']);
50
                })
51
                ->orWhereHas('EquipmentType', function($q2) use ($params) {
52
                    $q2->where('name', $params['equipment']);
53
                });
54
            })
55
            //  Search by City
56
            ->when(isset($params['city']), function($q) use ($params) {
57
                $q->where('city', 'like', '%'.$params['city'].'%');
58
            })
59
            //  Search by Name or ID
60
            ->when(isset($params['name']), function($q) use ($params) {
61
                $q->where('name', 'like', '%'.$params['name'].'%')
62
                    ->orWhere('cust_id', 'like', '%'.$params['name'].'%')
63
                    ->orWhere('dba_name', 'like', '%'.$params['name'].'%');
64
            })
65
            ->with('CustomerEquipment')
66
            ->with('ParentEquipment')
67
            ->paginate($this->perPage);
68
    }
69
70
    /*
71
    *   Return pagination list of all customers
72
    */
73
    protected function getAllCustomers()
74
    {
75
        return Customer::orderBy($this->sortField, $this->sortType)
76
            ->with('CustomerEquipment')
77
            ->with('ParentEquipment')
78
            ->paginate($this->perPage);
79
    }
80
}
81