Passed
Push — dev6 ( edb7de...3fa4bc )
by Ron
15:53
created

CustomerSearchController::search()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 30
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 21
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 15
c 2
b 0
f 0
dl 0
loc 30
ccs 21
cts 21
cp 1
rs 9.7666
cc 1
nc 1
nop 1
crap 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 7
    public function __invoke(CustomerSearchRequest $request)
21
    {
22
        //  Pagination parameters
23 7
        $this->perPage   = $request->perPage;
24 7
        $this->sortField = $request->sortField;
25 7
        $this->sortType  = $request->sortType == 'none' ? 'asc' : $request->sortType;
26
27
        //  If no search parameters are set, list all customers
28 7
        if(Arr::has($request->toArray(), ['city', 'name', 'equipment']) &&
29 1
            ($request->city == null &&
30 1
             $request->name == null &&
31 7
             $request->equipment == null)
32
            )
33
        {
34 1
            return $this->getAllCustomers();
35
        }
36
37
        //  Search by given search parameters
38 6
        return $this->search($request->only(['city', 'name', 'equipment']));
39
    }
40
41
    /*
42
    *   Perform the actual search
43
    */
44 6
    protected function search($params)
45
    {
46 6
        return Customer::orderBy($this->sortField, $this->sortType)
47
            //  Search by equipment
48 6
            ->when(isset($params['equipment']), function($q) use ($params)
49
            {
50 1
                $q->whereHas('ParentEquipment', function($q2) use ($params)
51
                {
52 1
                    $q2->where('name', $params['equipment']);
53 1
                })
54 1
                ->orWhereHas('EquipmentType', function($q2) use ($params)
55
                {
56 1
                    $q2->where('name', $params['equipment']);
57 1
                });
58 6
            })
59
            //  Search by City
60 6
            ->when(isset($params['city']), function($q) use ($params)
61
            {
62 2
                $q->where('city', 'like', '%'.$params['city'].'%');
63 6
            })
64
            //  Search by Name or ID
65 6
            ->when(isset($params['name']), function($q) use ($params)
66
            {
67 3
                $q->where('name', 'like', '%'.$params['name'].'%')
68 3
                    ->orWhere('cust_id', 'like', '%'.$params['name'].'%')
69 3
                    ->orWhere('dba_name', 'like', '%'.$params['name'].'%');
70 6
            })
71 6
            ->with('CustomerEquipment')
72 6
            ->with('ParentEquipment')
73 6
            ->paginate($this->perPage);
74
    }
75
76
    /*
77
    *   Return pagination list of all customers
78
    */
79 1
    protected function getAllCustomers()
80
    {
81 1
        return Customer::orderBy($this->sortField, $this->sortType)
82 1
            ->with('CustomerEquipment')
83 1
            ->with('ParentEquipment')
84 1
            ->paginate($this->perPage);
85
    }
86
}
87