Passed
Push — develop ( c02995...7d7bf0 )
by Septianata
18:18
created

OrderStatusController::create()   B

Complexity

Conditions 7
Paths 7

Size

Total Lines 47
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 56

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 31
c 1
b 0
f 0
dl 0
loc 47
ccs 0
cts 30
cp 0
rs 8.4906
cc 7
nc 7
nop 3
crap 56
1
<?php
2
3
namespace App\Http\Controllers\Admin;
4
5
use App\Enum\OrderStatus as EnumOrderStatus;
6
use App\Events\OrderStatusCreated;
7
use App\Http\Controllers\Controller;
8
use App\Http\Requests\OrderStatus\StoreScheduledRequest;
9
use App\Models\Order;
10
use App\Models\OrderStatus as ModelsOrderStatus;
11
use App\Models\User;
12
use Illuminate\Database\Eloquent\Builder;
13
use Illuminate\Http\Request;
14
use Illuminate\Http\Response;
15
use Illuminate\Support\Facades\Auth;
16
use Illuminate\Support\Facades\Event;
17
use Illuminate\Support\Facades\Session;
18
19
class OrderStatusController extends Controller
20
{
21
    /**
22
     * Create a new instance class.
23
     *
24
     * @param  \Illuminate\Http\Request  $request
25
     * @return void
26
     *
27
     * @throws \Symfony\Component\HttpKernel\Exception\HttpException
28
     */
29
    public function __construct(Request $request)
30
    {
31
        if ($enumOrderStatus = $request->route('enumOrderStatus')) {
32
            /** @var \App\Enum\OrderStatus $enumOrderStatus */
33
            $enumOrderStatus = EnumOrderStatus::from($enumOrderStatus);
34
35
            if (EnumOrderStatus::draft()->equals($enumOrderStatus)) {
36
                Session::flash('alert', [
37
                    'type' => 'alert-danger',
38
                    'message' => 'Status pesanan tidak valid',
39
                ]);
40
41
                abort(Response::HTTP_UNPROCESSABLE_ENTITY);
42
            }
43
        }
44
    }
45
46
    /**
47
     * Show the form for creating a new resource.
48
     *
49
     * @param  \Illuminate\Http\Request  $request
50
     * @param  \App\Models\Order  $order
51
     * @param  \App\Enum\OrderStatus  $enumOrderStatus
52
     * @return \Illuminate\Contracts\Support\Renderable|\Illuminate\Http\RedirectResponse
53
     */
54
    public function create(Request $request, Order $order, EnumOrderStatus $enumOrderStatus)
55
    {
56
        switch ($enumOrderStatus) {
57
            case EnumOrderStatus::on_progress():
58
                if ($order->items->isEmpty()) {
59
                    Session::flash('alert', [
60
                        'type' => 'alert-danger',
61
                        'message' => 'Detail pesanan tidak boleh kosong',
62
                    ]);
63
64
                    return redirect()->route('admin.order.show', $order);
65
                    abort(Response::HTTP_UNPROCESSABLE_ENTITY);
0 ignored issues
show
Unused Code introduced by
abort(Illuminate\Http\Re...P_UNPROCESSABLE_ENTITY) is not reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
66
                }
67
68
                $title = trans('Finish Draft');
69
                break;
70
71
            case EnumOrderStatus::scheduled():
72
                $title = trans('Create :name', ['name' => __('Schedule Date')]);
73
                break;
74
75
            case EnumOrderStatus::rescheduled():
76
                $title = trans('Create :name', ['name' => __('Reschedule Date')]);
77
                break;
78
79
            case EnumOrderStatus::canceled():
80
                $title = trans('Cancel Order');
81
                break;
82
83
            case EnumOrderStatus::finished():
84
                $title = trans('Finish Order');
85
                break;
86
        }
87
88
        $icon = $enumOrderStatus->getIcon();
89
90
        $url = route('admin.order.status.create', compact('order', 'enumOrderStatus'));
91
92
        $optionUsers = User::when($order->branch, function (Builder $query) use ($order) {
93
            $query->whereHas('branch', function (Builder $query) use ($order) {
94
                $query->whereKey($order->branch->getKey());
0 ignored issues
show
Bug introduced by
The method getKey() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

94
                $query->whereKey($order->branch->/** @scrutinizer ignore-call */ getKey());

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
95
            });
96
        })->pluck('fullname', 'id');
97
98
        return view('admin.order_status.create', compact(
99
            'order', 'enumOrderStatus', 'optionUsers',
100
            'url', 'icon', 'title'
101
        ));
102
    }
103
104
    /**
105
     * Store a newly created resource in storage.
106
     *
107
     * @param  \App\Http\Requests\OrderStatus\StoreScheduledRequest  $request
108
     * @param  \App\Models\Order  $order
109
     * @param  \App\Enum\OrderStatus  $enumOrderStatus
110
     * @return \Illuminate\Http\RedirectResponse
111
     */
112
    public function store(StoreScheduledRequest $request, Order $order, EnumOrderStatus $enumOrderStatus)
113
    {
114
        if (EnumOrderStatus::scheduled()->equals($enumOrderStatus) ||
115
            EnumOrderStatus::rescheduled()->equals($enumOrderStatus)) {
116
            $order
117
                ->setAttribute('schedule_date', $request->getScheduleDate())
118
                ->setBranchRelationValue($request->getBranchFromRequest())
119
                ->setUserRelationValue($request->getUserFromRequest())
120
                ->save();
121
        }
122
123
        $order->statuses()->save(ModelsOrderStatus::make([
0 ignored issues
show
Bug introduced by
It seems like App\Models\OrderStatus::...t\Facades\Auth::user()) can also be of type Illuminate\Database\Eloquent\Builder; however, parameter $model of Illuminate\Database\Eloq...ns\HasOneOrMany::save() does only seem to accept Illuminate\Database\Eloquent\Model, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

123
        $order->statuses()->save(/** @scrutinizer ignore-type */ ModelsOrderStatus::make([
Loading history...
124
            'status' => $enumOrderStatus,
125
            'note' => $request->input('order_status.note'),
126
        ])->setIssuerableRelationValue(Auth::user()));
127
128
        Event::dispatch(new OrderStatusCreated($order));
129
130
        return redirect()->route('admin.order.show', $order)->with([
131
            'alert' => [
132
                'type' => 'alert-success',
133
                'message' => trans('The :resource was updated!', ['resource' => trans('admin-lang.order')]),
134
            ],
135
        ]);
136
    }
137
138
    /**
139
     * Remove the specified resource from storage.
140
     *
141
     * @param  \App\Models\Order  $order
142
     * @param  \App\Models\OrderStatus  $status
143
     * @return \Illuminate\Contracts\Support\Renderable
144
     */
145
    public function destroy(Order $order, ModelsOrderStatus $status)
146
    {
147
        if (EnumOrderStatus::on_progress()->equals($status->status) ||
148
            EnumOrderStatus::draft()->equals($status->status)) {
149
            Session::flash('alert', [
150
                'type' => 'alert-danger',
151
                'message' => 'Status pesanan tidak bisa dihapus',
152
            ]);
153
154
            abort(Response::HTTP_UNPROCESSABLE_ENTITY);
155
        }
156
157
        $status->delete();
158
159
        return redirect()->route('admin.order.show', $order)->with([
0 ignored issues
show
Bug Best Practice introduced by
The expression return redirect()->route...ns('Order Status')))))) returns the type Illuminate\Http\RedirectResponse which is incompatible with the documented return type Illuminate\Contracts\Support\Renderable.
Loading history...
160
            'alert' => [
161
                'type' => 'alert-success',
162
                'message' => trans('The :resource was deleted!', ['resource' => trans('Order Status')]),
163
            ],
164
        ]);
165
    }
166
}
167