Test Failed
Push — dev5 ( 054b32...4c0df5 )
by Ron
12:54
created

SystemsController::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1.125

Importance

Changes 0
Metric Value
cc 1
eloc 4
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 6
ccs 2
cts 4
cp 0.5
crap 1.125
rs 10
1
<?php
2
3
namespace App\Http\Controllers\Installer;
4
5
use App\SystemTypes;
6
use App\SystemDataFields;
7
use App\SystemCategories;
8
use Illuminate\Http\Request;
9
use App\SystemDataFieldTypes;
10
use Illuminate\Validation\Rule;
11
use Illuminate\Support\Facades\Log;
12
use Illuminate\Support\Facades\Auth;
13
use App\Http\Controllers\Controller;
14
use Illuminate\Support\Facades\Route;
15
16
class SystemsController extends Controller
17
{
18 64
    public function __construct()
19
    {
20 64
        $this->middleware('auth');
21
        $this->middleware(function ($request, $next) {
22
            $this->authorize('hasAccess', 'Manage Equipment');
23
            return $next($request);
24 64
        });
25 64
    }
26
27
    //  List the systems that can be modified
28
    public function index()
29
    {
30
        $systems = SystemCategories::with('SystemTypes')->get();
31
32
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
33
        Log::debug('Fetched Data - ', $systems->toArray());
34
        return view('installer.systemsList', [
35
            'systems' => $systems
36
        ]);
37
    }
38
39
    //  Open the form to create a new system
40
    // public function create()
41
    // {
42
    //     $categories = SystemCategories::all();
43
    //     $dataTypes  = SystemCustDataTypes::orderBy('name', 'ASC')->get();
44
45
    //     $dropDown = [];
46
    //     foreach($dataTypes as $type)
47
    //     {
48
    //         $dropDown[] = [
49
    //             'value' => $type->data_type_id,
50
    //             'label' => $type->name
51
    //         ];
52
    //     }
53
54
    //     Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
55
    //     return view('installer.newSystem', [
56
    //         'categories' => $categories,
57
    //         'dropDown'   => $dropDown
58
    //     ]);
59
    // }
60
61
    //  Store the new system type
62
    public function store(Request $request)
63
    {
64
        $request->validate([
65
            'category' => 'required|numeric',
66
            'name' => [
67
                    'required',
68
                    'string',
69
                    Rule::unique('system_types'),
70
                    'regex:/^[a-zA-Z0-9_ ]*$/'
71
                ],
72
            'dataOptions' => 'required'
73
74
        ]);
75
76
        $sysData = SystemTypes::create([
77
            'cat_id'          => $request->category,
78
            'name'            => $request->name,
79
            'folder_location' => str_replace(' ', '_', $request->name)
80
        ]);
81
        $sysID = $sysData->sys_id;
82
        $i = 0;
83
84
        foreach($request->dataOptions as $field)
85
        {
86
            if(!empty($field))
87
            {
88
                if(isset($field['data_type_id']))
89
                {
90
                    $id = $field['data_type_id'];
91
                }
92
                else
93
                {
94
                    $newField = SystemDataFieldTypes::create([
95
                        'name' => $field['name']
96
                    ]);
97
                    $id = $newField->data_type_id;
98
                }
99
100
                SystemDataFields::create([
101
                    'sys_id' => $sysID,
102
                    'data_type_id' => $id,
103
                    'order' => $i
104
                ]);
105
                $i++;
106
            }
107
        }
108
109
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
110
        Log::debug('Submitted Data - ', $request->toArray());
111
        Log::notice('New System Created', ['cat_id' => $request->catName, 'sys_name' => $request->name, 'user_id' => Auth::user()->user_id]);
112
        $request->session()->flash('success', 'New System Created');
113
114
        return response()->json(['success' => true]);
115
    }
116
117
    //  Open the form to add equipment for the sepcified category
118
    public function show($cat)
119
    {
120
        $fields = SystemDataFieldTypes::all();
121
        $cat = SystemCategories::where('name', str_replace('-', ' ', $cat))->first();
122
123
        Log::debug('Route ' . Route::currentRouteName() . ' visited by User ID-' . Auth::user()->user_id);
124
        return view('installer.newSystem', [
125
            'cat'      => $cat,
126
            'dataList' => $fields,
127
        ]);
128
    }
129
130
    //  Edit an existing system
131
    public function edit($id)
132
    {
133
        $fields = SystemDataFieldTypes::all();
134
        $system = SystemTypes::where('sys_id', $id)->with(['SystemDataFields' => function($query)
135
        {
136
            $query->join('system_data_field_types', 'system_data_fields.data_type_id', '=', 'system_data_field_types.data_type_id');
137
        }])->withCount('SystemDataFields')->first();
138
139
        Log::debug('Route ' . Route::currentRouteName() . ' visited by User ID-' . Auth::user()->user_id);
140
        return view('installer.editSystem', [
141
            'system'   => $system,
142
            'dataList' => $fields,
143
        ]);
144
    }
145
146
    //  Update the system data
147
    public function update(Request $request, $id)
148
    {
149
        $request->validate([
150
            'name'     => [
151
                    'required',
152
                    'string',
153
                    Rule::unique('system_types')->ignore($id, 'sys_id'),
154
                    'regex:/^[-a-zA-Z0-9_ ]*$/'
155
            ],
156
            'dataOptions' => 'required',
157
        ]);
158
159
        //  Update the system name
160
        SystemTypes::find($id)->update([
161
            'name' => $request->name
162
        ]);
163
164
        //  Update the order of the existing data fields
165
        $i = 0;
166
        foreach($request->dataOptions as $data)
167
        {
168
            SystemDataFields::where('sys_id', $id)->where('data_type_id', $data['data_type_id'])->update([
169
                'order' => $i
170
            ]);
171
172
            $i++;
173
        }
174
        //  Process any new data fields
175
        if(!empty($request->newOptions))
176
        {
177
            foreach($request->newOptions as $field)
178
            {
179
                if(!empty($field))
180
                {
181
                    if(isset($field['data_type_id']))
182
                    {
183
                        $dataID = $field['data_type_id'];
184
                    }
185
                    else
186
                    {
187
                        $newField = SystemDataFieldTypes::create([
188
                            'name' => $field['name']
189
                        ]);
190
                        $dataID = $newField->data_type_id;
191
                    }
192
193
                    SystemDataFields::create([
194
                        'sys_id' => $id,
195
                        'data_type_id' => $dataID,
196
                        'order' => $i
197
                    ]);
198
                    $i++;
199
                }
200
            }
201
        }
202
203
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
204
        Log::debug('Submitted Data - ', $request->toArray());
205
        Log::notice('System Updated', ['sys_name' => $request->name, 'user_id' => Auth::user()->user_id]);
206
        $request->session()->flash('success', 'System Updated');
207
208
        return response()->json(['success' => true]);
209
    }
210
211
    //  Delete an existing system - note this will fail if the system has any customers or tech tips assigned to it
212
   public function destroy($id)
213
   {
214
       //
215
       try {
216
            SystemTypes::find($id)->delete();
217
            return response()->json(['success' => true, 'reason' => 'Equipment Successfully Deleted']);
218
        }
219
        catch (\Illuminate\Database\QueryException $e)
220
        {
221
            return response()->json(['success' => false, 'reason' => 'Cannot delete this equipment.  It has Customers or Tech Tips assigned to it.  Please delete those first.']);
222
        }
223
   }
224
}
225