· 4 years ago · Aug 17, 2021, 02:10 PM
1<?php
2
3namespace App\Http\Controllers\Api;
4
5use App\Onu;
6use App\House;
7use App\Port;
8use Carbon\Carbon;
9use App\Utilities\HuaweiAPI;
10use Datatables;
11use Illuminate\Http\Request;
12use App\Http\Controllers\Controller;
13use App\Utilities\CalixAPI;
14use App\Utilities\NokiaAPI;
15use App\Http\Resources\Onu\Find as OnuFind;
16
17class OnuController extends Controller
18{
19 public function dt()
20 {
21 $data = Onu::with('house', 'house.state', 'house.country');
22
23 return Datatables::of($data)
24 ->addIndexColumn()
25 ->addColumn('full_address', function ($row) {
26 if ($row->house) {
27 return $row->house->full_address;
28 } else {
29 return null;
30 }
31 })
32 ->addColumn('port_available', function ($row) {
33 return $row->ports()->count();
34 })
35 ->addColumn('action', function ($row) {
36 $btn = '<a href="' . route('products.onus.show', $row->id) . '" class="btn btn-sm btn-clean btn-icon btn-icon-md">
37 <i data-toggle="tooltip" title="View" class="la la-eye"></i>
38 </a>';
39 $btn = $btn . '<a href="#" onclick="deleteItem(' . $row->id . ')" class="btn btn-sm btn-clean btn-icon btn-icon-md">
40 <i data-toggle="tooltip" title="Delete" class="la la-trash"></i>
41 </a>';
42 return $btn;
43 })
44 ->rawColumns(['action'])
45 ->make(true);
46 }
47
48 public function find_available(Request $request)
49 {
50 $term = $request[0];
51 if (empty($term)) {
52 return response()->json(['data' => []], 200);
53 }
54 $onus = Onu::where('serial_number', 'LIKE', "%{$term}%")->doesntHave('house')->limit(5)->get();
55 return OnuFind::collection($onus);
56 }
57
58 public function getOnt(Request $request, $type = 'external')
59 {
60 $onu = $request->input('onu');
61 $data = null;
62
63
64 if ($onu['manufacturer'] == 'calix') {
65 $api = new CalixAPI();
66 if ($onu['network_area'] != null && $onu['onu_id'] != null) {
67 $data = $api->getOnt($onu['network_area'], $onu['onu_id']);
68 }
69 $data = $data[0] ?? null;
70 } else if ($onu['manufacturer'] == 'nokia') {
71 $api = new NokiaAPI();
72
73 if( isset($onu['nokia_olt_id']) && ! is_null($onu['nokia_olt_id']) ) {
74 $api->setOltId($onu['nokia_olt_id']);
75 }
76
77 if (!empty($onu['rack_no']) && !empty($onu['subrack_no']) && !empty($onu['lt_no']) && !empty($onu['pon_no']) && !empty($onu['onu_id'])) {
78 $data = collect($api->getOnt($onu['rack_no'], $onu['subrack_no'], $onu['lt_no'], $onu['pon_no'], $onu['onu_id']))
79 ->flatMap(function($field) {
80 return $field;
81 })
82 ->toArray();
83
84 if( isset($data['bponOntEquipId']) ) {
85 $data['bponOntEquipId'] = str_replace("_", "", $data['bponOntEquipId']);
86 }
87 }
88 } else if ($onu['manufacturer'] === 'huawei') {
89 if (!isset($onu['huawei_device_id']) || !isset($onu['huawei_device_name'])) {
90 abort(422, 'Please input device_id and device_name');
91 }
92
93 $data = array_merge(
94 (new HuaweiAPI)->queryOntDetail($onu['huawei_device_id'], $onu['huawei_device_name'])->toArray(request()),
95 (new HuaweiAPI)->queryOntOSDetail($onu['huawei_device_id'], $onu['huawei_device_name'])->toArray(request()),
96 (new HuaweiAPI)->queryOntOpticalDetail($onu['huawei_device_id'], $onu['huawei_device_name'])->toArray(request())
97 );
98
99 if( isset($data['LSTUPTIME']) ) {
100 try {
101 $sysStatus = strtoupper($data['RUNSTAT']) == 'UP' ? Carbon::parse($data['LSTUPTIME']) : Carbon::parse($data['LSTDOWNTIME']);
102 $today = Carbon::today();
103
104 $days = $sysStatus->diffInDays($today);
105 $hours = $sysStatus->copy()->addDays($days)->diffInHours($today);
106 $minutes = $sysStatus->copy()->addDays($days)->addHours($hours)->diffInMinutes($today);
107
108 $data['LSTUPTIME'] = sprintf("%s. %s day(s), %s hour(s) & %s minute(s).", strtoupper($data['RUNSTAT']), $days, $hours, $minutes);
109 } catch(\Exception $e) {
110 \Log::error('Failed to generate LSTUPTIME date diff, due to: ' . $e->getMessage());
111 }
112 }
113
114 if( isset($data['OPTICSRXPOWER']) ) {
115 $data['OPTICSRXPOWER'] = (float) sprintf('%s.%s',
116 substr($data['OPTICSRXPOWER'], 0, strlen($data['OPTICSRXPOWER'])-2),
117 substr($data['OPTICSRXPOWER'], -2)
118 );
119
120 }
121
122 }
123
124 if($type == 'internal'){
125 return $data;
126 }
127
128 return response()->json([
129 'data' => $data
130 ]);
131 }
132
133 /**
134 * Display a listing of the resource.
135 *
136 * @return \Illuminate\Http\Response
137 */
138 public function index()
139 {
140 // ont card NOKIA DEFAULT = 1
141 // OLT Port No.
142 // PT No.
143 }
144
145 /**
146 * Show the form for creating a new resource.
147 *
148 * @return \Illuminate\Http\Response
149 */
150 public function create()
151 {
152 //
153 }
154
155 /**
156 * Store a newly created resource in storage.
157 *
158 * @param \Illuminate\Http\Request $request
159 * @return \Illuminate\Http\Response
160 */
161 public function store(Request $request)
162 {
163 $onu = new Onu;
164 $onu->serial_number = $request->onu['serial_number'];
165 $onu->registration_number = $request->onu['serial_number'];
166 $onu->splitter_id = $request->onu['splitter_id'];
167 $onu->location = $request->onu['location'];
168 $onu->area = $request->onu['area'];
169 $onu->manufacturer = $request->onu['manufacturer'];
170 $onu->model = $request->onu['model'];
171 $onu->version = $request->onu['version'];
172 $onu->status = $request->onu['status'];
173 $onu->fsan = $request->onu['fsan'];
174 $onu->registration_id = $request->onu['registration_id'];
175 $onu->onu_mac = $request->onu['onu_mac'];
176 $onu->system_uptime = $request->onu['system_uptime'];
177 $onu->optical_signal_level = $request->onu['optical_signal_level'];
178 $onu->optical_signal_olt = $request->onu['optical_signal_olt'];
179 $onu->data_services = $request->onu['data_services'];
180 $onu->network_area = $request->onu['network_area'];
181 $onu->onu_id = $request->onu['onu_id'];
182
183 $onu->save();
184
185 for ($x = 1; $x <= $request->onu['port_number']; $x++) {
186 $onu->ports()->create([
187 'serial' => $x,
188 'description' => null
189 ]);
190 }
191
192 return $onu;
193 }
194
195 /**
196 * Display the specified resource.
197 *
198 * @param \App\Onu $onu
199 * @return \Illuminate\Http\Response
200 */
201 public function show($id)
202 {
203 $onus = Onu::find($id)->load('house', 'ports', 'ports.companies');
204
205 return $onus;
206 }
207
208 /**
209 * Show the form for editing the specified resource.
210 *
211 * @param \App\Onu $onu
212 * @return \Illuminate\Http\Response
213 */
214 public function edit(Onu $onus)
215 {
216 //save RSP on port status
217 }
218
219 /**
220 * Update the specified resource in storage.
221 *
222 * @param \Illuminate\Http\Request $request
223 * @param \App\Onu $onu
224 * @return \Illuminate\Http\Response
225 */
226 public function update(Request $request, $id)
227 {
228 // $onus->serial_number = $request->input('onu.serial_number', null);
229 // $onus->splitter_id = $request->input('onu.splitter_id', null);
230 // $onus->network_area = $request->input('onu.network_area', null);
231 // $onus->onu_id = $request->input('onu.onu_id', null);
232 // $onus->splitter_id = $request->input('onu.splitter_id', null);
233 // $onus->registration_id = $request->input('onu.registration_id', null);
234 $onus = Onu::find($id);
235
236 $keys = array_keys($request->input('onu'));
237
238 $required = [
239 'network_area',
240 'onu_id',
241 'serial_number',
242 'registration_number',
243 'splitter_id',
244 'fcn_id',
245 'fbd_id',
246 'registration_id',
247 'rack_no',
248 'subrack_no',
249 'lt_no',
250 'pon_no',
251 'c_no',
252 'manufacturer',
253 'huawei_device_id',
254 'huawei_device_name',
255 'nokia_olt_id'
256 ];
257
258 foreach ($keys as $key) {
259 if (in_array($key, $required)) {
260 $onus->$key = $request->onu[$key];
261 } else {
262 continue;
263 }
264 }
265
266
267 if ($request->house['id']) {
268 // Clear Old House
269 if ($request->onu['house']['id']) {
270 $house = House::find($request->onu['house']['id']);
271 $house->onu_id = null;
272 $house->save();
273 }
274
275 // Will update using syncing row
276 // New Save
277 $house = House::find($request->house['id']);
278 $house->onu_id = $onus->id;
279
280 if(
281 isset($request->onu['fcn_id']) &&
282 isset($request->onu['fbd_id'])
283 ) {
284 $house->fdp_no = $request->onu['fbd_id'];
285 $house->fdc_no = $request->onu['fcn_id'];
286 }
287
288 $house->save();
289 }
290
291 collect($request->onu['ports'])->each(function ($item) {
292 Port::find($item['id'])->update([
293 'serial' => $item['serial'],
294 'status' => boolval($item['status']),
295 'is_hidden' => boolval($item['is_hidden']),
296 // 'remark' => $item['remark'] ?? null,
297 ]);
298 });
299
300 // dd($request);
301
302 $onuData = $this->getOnt($request, 'internal');
303
304 if($request->onu['manufacturer'] == 'calix'){
305 $onus->serial_number = $onuData->data->serial->serno;
306 $onus->registration_id = $onuData->data->serial['reg-id'];
307 $onus->registration_number = $onuData->data->serial['reg-id'];
308 $onus->status = $onuData->data['op-stat'];
309 } else if ($request->onu['manufacturer'] == 'nokia'){
310 $onus->status = $onuData['ifOperStatus'];
311 $onus->registration_id = $onuData['bponOntSubscriberLocId'];
312 $onus->registration_number = $onuData['bponOntSubscriberLocId'];
313 } else if ($request->onu['manufacturer'] == 'huawei'){
314 // return gettype($onuData);
315 $onus->status = $onuData['ont_status'];
316 $onus->registration_number = $onuData['password'];
317 $onus->serial_number = $onuData['serial_number'];
318 }
319
320 $onus->save();
321
322 return $onus;
323 }
324
325 /**
326 * Remove the specified resource from storage.
327 *
328 * @param \App\Onu $onu
329 * @return \Illuminate\Http\Response
330 */
331 public function destroy($id)
332 {
333 $onus = Onu::find($id);
334 $onus->delete();
335
336 return response()->json(['Success']);
337 }
338
339 public function all(Request $request)
340 {
341 if ($request->get('all')) {
342 return Onu::select('id', 'serial_number')
343 ->doesntHave('house')
344 ->where('serial_number', 'LIKE', "%{$request->search}%")
345 ->take(100)
346 ->get();
347 }
348
349 return Onu::all();
350 }
351
352 public function onu_house(Onu $onus)
353 {
354 return House::where('onu_id', $onus->id)->first();
355 }
356
357 public function add_port(Onu $onus)
358 {
359 $count = $onus->ports()->count() + 1;
360
361 $onus->ports()->create([
362 'serial' => $count,
363 'description' => null
364 ]);
365
366 $onus->increment('port', 1);
367
368 return $onus;
369 }
370
371 public function delete_port(Onu $onus)
372 {
373 $port = $onus->ports()->whereDoesntHave('countCompanyPort')->first();
374 $port->delete();
375
376 $onus->decrement('port', 1);
377 return 'Success';
378 }
379}
380