Passed
Push — develop ( b4818b...dcecff )
by Septianata
16:14
created

OrderController   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 3
eloc 29
c 1
b 0
f 0
dl 0
loc 68
ccs 0
cts 38
cp 0
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A export() 0 9 1
A datatable() 0 31 1
A index() 0 5 1
1
<?php
2
3
namespace App\Http\Controllers\Admin\Report;
4
5
use App\Exports\OrderExport;
6
use App\Http\Controllers\Controller;
7
use App\Http\Requests\Report\Order\SearchRequest;
8
use App\Http\Resources\DataTables\Report\OrderResource;
9
use App\Models\Item;
10
use App\Models\Order;
11
use Illuminate\Database\Eloquent\Builder;
12
use Yajra\DataTables\Facades\DataTables;
13
14
class OrderController extends Controller
15
{
16
    /**
17
     * Display a listing of the resource.
18
     *
19
     * @return \Illuminate\Contracts\Support\Renderable
20
     */
21
    public function index()
22
    {
23
        $this->authorize('viewAny', Order::class);
24
25
        return view('admin.report.order.index');
26
    }
27
28
    /**
29
     * Return datatable server side response.
30
     *
31
     * @param  \App\Http\Requests\Report\Order\SearchRequest  $request
32
     * @return \Illuminate\Http\JsonResponse
33
     */
34
    public function datatable(SearchRequest $request)
35
    {
36
        $this->authorize('viewAny', Order::class);
37
38
        $query = Order::query()->with('user:id,fullname')
39
            ->has('items')
40
            ->whereBetween('created_at', [$request->start_date, $request->end_date]);
41
42
        return DataTables::eloquent($query)
43
            ->setTransformer(fn ($model) => OrderResource::make($model)->resolve())
44
            ->orderColumn('customer_fullname', function ($query, $direction) {
45
                $query->join('customers', 'orders.customer_id', '=', 'customers.id')
46
                    ->select('orders.*', 'customers.id as customer_id', 'customers.fullname as customer_fullname')
47
                    ->orderBy('customers.fullname', $direction);
48
            })
49
            ->filterColumn('customer_fullname', function ($query, $keyword) {
50
                $query->whereHas('customer', function ($query) use ($keyword) {
51
                    $query->where('fullname', 'like', '%' . $keyword . '%');
52
                });
53
            })
54
            ->orderColumn('status', function ($query, $direction) {
55
                $query->join('order_statuses', 'order_statuses.order_id', '=', 'orders.id')
56
                    ->select('orders.*', 'order_statuses.id as order_status_id', 'order_statuses.status as order_status')
57
                    ->orderBy('order_statuses.status', $direction);
58
            })
59
            ->filterColumn('status', function ($query, $keyword) {
60
                $query->whereHas('latestStatus', function ($query) use ($keyword) {
61
                    $query->where('status', 'like', '%' . $keyword . '%');
62
                });
63
            })
64
            ->toJson();
65
    }
66
67
    /**
68
     * Return excel export download response.
69
     *
70
     * @param  \App\Http\Requests\Report\Order\SearchRequest  $request
71
     * @return \App\Exports\OrderExport
72
     */
73
    public function export(SearchRequest $request)
74
    {
75
        $query = Item::query()
76
            ->with('order.user', 'order.customer', 'denomination')
77
            ->whereHas('order', function (Builder $query) use ($request) {
78
                $query->whereBetween('created_at', [$request->start_date, $request->end_date]);
79
            });
80
81
        return new OrderExport($query);
82
    }
83
}
84