From 642053653c914d655210ef0eee3fc1a9622ced3b Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Sat, 12 Jul 2025 09:15:42 +0530 Subject: [PATCH] Added module production order controller get api --- .../ModuleProductionOrderDataController.php | 402 ++++++++++++++++++ routes/api.php | 10 + 2 files changed, 412 insertions(+) create mode 100644 app/Http/Controllers/ModuleProductionOrderDataController.php diff --git a/app/Http/Controllers/ModuleProductionOrderDataController.php b/app/Http/Controllers/ModuleProductionOrderDataController.php new file mode 100644 index 0000000..b26f870 --- /dev/null +++ b/app/Http/Controllers/ModuleProductionOrderDataController.php @@ -0,0 +1,402 @@ +header('Authorization'); + // $expectedToken = $expectedUser . ':' . $expectedPw; + + // if ("Bearer " . $expectedToken != $header_auth) { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => 'Invalid authorization token!' + // ], 403); + // } + + // $requiredHeaders = [ + // 'module-name', + // 'chart-name', + // 'plant-name', + // 'line-name', + // 'production-order', + // 'filter-name', + // ]; + + // $missingHeaders = []; + + // foreach ($requiredHeaders as $header) { + // if (empty($request->header($header))) { + // $missingHeaders[] = $header; + // } + // } + + // if (!empty($missingHeaders)) { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => 'Missing required headers: ' . implode(', ', $missingHeaders) + // ], 404); + // } + + // $validFilters = ['Today', 'Yesterday', 'This Week', 'This Month']; + // $filterHeader = $request->header('filter-name'); + + // if (!in_array($filterHeader, $validFilters)) { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters) + // ], 404); + // } + + // $plantName = $request->header('plant-name'); + // $lineName = $request->header('line-name'); + // $orderValue = $request->header('production-order'); + // $filterName = strtolower(trim($request->header('filter-name'))); + + // $plant = Plant::where('name', $plantName)->first(); + // if (!$plant) { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => "Plant '{$plantName}' not found!" + // ], 404); + // } + // $line = Line::where('name', $lineName)->where('plant_id', $plant->id)->first(); + + // if (!$line) { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => 'Line not found!' + // ], 404); + // } + + // $lineType = $line->type; + + // if ($lineType === 'FG Line') + // { + // $table = 'quality_validations'; + // } + // else + // { + // $table = 'production_quantities'; + // } + + // // Time Range + // if ($filterName == 'yesterday') { + // $startDate = now()->subDay()->setTime(8, 0, 0); + // $endDate = now()->setTime(8, 0, 0); + // $groupBy = "EXTRACT(HOUR FROM $table.created_at)"; + // } elseif ($filterName == 'this week') { + // $startDate = now()->startOfWeek()->setTime(8, 0, 0); + // $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0); + // $groupBy = "EXTRACT(DOW FROM $table.created_at)"; + // } elseif ($filterName == 'this month') { + // $startDate = now()->startOfMonth(); + // $endDate = now()->endOfMonth(); + // $groupBy = "FLOOR((EXTRACT(DAY FROM $table.created_at) - 1) / 7) + 1"; + // } else { + // $startDate = now()->setTime(8, 0, 0); + // $endDate = now()->copy()->addDay()->setTime(8, 0, 0); + // $groupBy = "EXTRACT(HOUR FROM $table.created_at)"; + // } + + // $query = \DB::table($table) + // ->join('plants', "$table.plant_id", '=', 'plants.id') + // ->join('lines', "$table.line_id", '=', 'lines.id') + // ->selectRaw("$groupBy AS time_unit, count(*) AS total_quantity") + // ->whereBetween("$table.created_at", [$startDate, $endDate]) + // ->where('plants.id', $plant->id) + // ->where('lines.id', $line->id) + // ->where("$table.production_order", $orderValue) + // ->groupByRaw($groupBy) + // ->orderByRaw($groupBy) + // ->pluck('total_quantity', 'time_unit') + // ->toArray(); + + // if ($filterName == 'this month') { + // $weeksCount = ceil($endDate->day / 7); + // $allWeeks = array_fill(1, $weeksCount, 0); + // $data = array_replace($allWeeks, $query); + + // $labels = []; + // for ($i = 1; $i <= $weeksCount; $i++) { + // $weekStart = $startDate->copy()->addDays(($i - 1) * 7)->format('d M'); + // $weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate)->format('d M'); + // $labels[] = "Week $i ($weekStart - $weekEnd)"; + // } + + // $orderedData = array_values($data); + // } elseif ($filterName === 'this week') { + // $labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; + // $data = array_fill(0, 7, 0); + // foreach ($query as $dow => $count) { + // $data[$dow] = $count; + // } + + // $orderedData = [ + // $data[1] ?? 0, $data[2] ?? 0, $data[3] ?? 0, + // $data[4] ?? 0, $data[5] ?? 0, $data[6] ?? 0, + // $data[0] ?? 0, + // ]; + // } else { + // $allHours = array_fill(0, 24, 0); + // $data = array_replace($allHours, $query); + + // $shiftedData = []; + // foreach ($data as $hour => $count) { + // $nextHour = ($hour + 1) % 24; + // $shiftedData[$nextHour] = $count; + // } + + // $shiftedKeys = array_merge(range(9, 23), range(0, 8)); + // $orderedData = array_map(fn($hour) => $shiftedData[$hour] ?? 0, $shiftedKeys); + // $labels = array_map(fn ($hour) => date("g A", strtotime("$hour:00")), $shiftedKeys); + // } + + // $orderedData = array_map(function ($value) { + // return ($value == 0 || is_null($value)) ? null : $value; + // }, $orderedData); + + // return response()->json([ + // 'status_code' => 'SUCCESS', + // 'datasets' => [ + // [ + // 'label' => match ($filterName) { + // 'this week' => $lineType == 'FG Line' ? "Daily Fg Production Order Count This Week" : "Daily Production Order Count This Week", + // 'this month' => $lineType == 'FG Line' ? "Weekly Fg Production Order Count This Month" : "Weekly Production Order Count This Month", + // 'yesterday' => $lineType == 'FG Line' ? "Yesterday's Hourly Fg Order Count Production" : "Yesterday's Hourly Order Count Production", + // default => $lineType == 'FG Line' ? "Today's Hourly Fg Production Order Count" : "Today's Hourly Production Order Count", + // }, + // 'data' => $orderedData, + // 'borderColor' => 'rgba(75, 192, 192, 1)', + // 'backgroundColor' => 'rgba(75, 192, 192, 0.2)', + // 'fill' => false, + // 'tension' => 0.3, + // ] + // ], + // 'labels' => $labels + // ], 200); + // } + + public function get_moduleProductionOrder(Request $request) + { + $expectedUser = env('API_AUTH_USER'); + $expectedPw = env('API_AUTH_PW'); + + $header_auth = $request->header('Authorization'); + $expectedToken = $expectedUser . ':' . $expectedPw; + + if ("Bearer " . $expectedToken != $header_auth) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Invalid authorization token!' + ], 403); + } + + $requiredHeaders = [ + 'module-name', 'chart-name', 'plant-name', + 'line-name', 'production-order', 'filter-name' + ]; + + $missingHeaders = []; + foreach ($requiredHeaders as $header) { + if (empty($request->header($header))) { + $missingHeaders[] = $header; + } + } + + if (!empty($missingHeaders)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Missing required headers: ' . implode(', ', $missingHeaders) + ], 404); + } + + $filterHeader = $request->header('filter-name'); + $validFilters = ['Today', 'Yesterday', 'This Week', 'This Month']; + if (!in_array($filterHeader, $validFilters)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters) + ], 404); + } + + $plantName = $request->header('plant-name'); + $lineName = $request->header('line-name'); + $orderVal = $request->header('production-order'); + $filter = strtolower($filterHeader); + + $plant = Plant::where('name', $plantName)->first(); + if (!$plant) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant '{$plantName}' not found!" + ], 404); + } + + $line = Line::where('name', $lineName)->where('plant_id', $plant->id)->first(); + if (!$line) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Line '{$lineName}' not found!" + ], 404); + } + + $lineType = $line->type; + $table = ($lineType == 'FG Line') ? 'quality_validations' : 'production_quantities'; + + if ($filter == 'today' || $filter == 'yesterday') { + $hourlyCounts = []; + + $hourStart = $filter == 'today' + ? now()->setTime(8, 0, 0) + : now()->subDay()->setTime(8, 0, 0); + $hourEndFinal = $hourStart->copy()->addDay(); + + while ($hourStart < $hourEndFinal) { + $hourEnd = $hourStart->copy()->addHour(); + $label = $hourStart->format('g:i A') . ' to ' . $hourEnd->format('g:i A'); + + $count = DB::table($table) + ->where('plant_id', $plant->id) + ->where('line_id', $line->id) + ->where('production_order', $orderVal) + ->whereBetween('created_at', [$hourStart, $hourEnd]) + ->count(); + + $hourlyCounts[$label] = $count; + $hourStart = $hourEnd; + } + + return response()->json([ + 'status_code' => 'SUCCESS', + 'datasets' => [ + [ + 'label' => $filter == 'yesterday' + ? "Yesterday's Hourly Production Order Count" + : "Today's Hourly Production Order Count", + 'data' => $hourlyCounts + ] + ] + ], 200); + } + + // Weekly or Monthly + if ($filter == 'this week') { + $startDate = now()->startOfWeek()->setTime(8, 0, 0); + $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0); + $groupBy = "EXTRACT(DOW FROM $table.created_at)"; + } else { + $startDate = now()->startOfMonth(); + $endDate = now()->endOfMonth(); + $groupBy = "FLOOR((EXTRACT(DAY FROM $table.created_at) - 1) / 7) + 1"; + } + + $query = DB::table($table) + ->where('plant_id', $plant->id) + ->where('line_id', $line->id) + ->where('production_order', $orderVal) + ->whereBetween('created_at', [$startDate, $endDate]) + ->selectRaw("$groupBy as group_key, COUNT(*) as total") + ->groupByRaw("group_key") + ->pluck('total', 'group_key') + ->toArray(); + + if ($filter == 'this week') { + $labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; + $data = array_fill(0, 7, 0); + + foreach ($query as $dow => $count) { + $data[$dow] = $count; + } + + $orderedData = [ + $data[1] ?? 0, $data[2] ?? 0, $data[3] ?? 0, + $data[4] ?? 0, $data[5] ?? 0, $data[6] ?? 0, + $data[0] ?? 0, + ]; + } else { + $weeksCount = ceil($endDate->day / 7); + $allWeeks = array_fill(1, $weeksCount, 0); + $data = array_replace($allWeeks, $query); + + $labels = []; + for ($i = 1; $i <= $weeksCount; $i++) { + $weekStart = $startDate->copy()->addDays(($i - 1) * 7)->format('d M'); + $weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate)->format('d M'); + $labels[] = "Week $i ($weekStart - $weekEnd)"; + } + + $orderedData = array_values($data); + } + + return response()->json([ + 'status_code' => 'SUCCESS', + 'datasets' => [ + [ + 'label' => match ($filter) { + 'this week' => $lineType == 'FG Line' + ? "Daily Fg Production Order Count This Week" + : "Daily Production Order Count This Week", + 'this month' => $lineType == 'FG Line' + ? "Weekly Fg Production Order Count This Month" + : "Weekly Production Order Count This Month", + }, + 'data' => $orderedData + ] + ], + 'labels' => $labels ?? [] + ], 200); + } + + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/routes/api.php b/routes/api.php index ad95c31..ed1f2a8 100644 --- a/routes/api.php +++ b/routes/api.php @@ -5,8 +5,10 @@ use App\Http\Controllers\ModuleChartController; use App\Http\Controllers\ModuleController; use App\Http\Controllers\ModuleFilterController; use App\Http\Controllers\ModuleFilterDataController; +use App\Http\Controllers\ModuleInvoiceDataController; use App\Http\Controllers\ModulePlantController; use App\Http\Controllers\ModulePlantLineController; +use App\Http\Controllers\ModuleProductionOrderDataController; use App\Http\Controllers\ObdController; use App\Http\Controllers\PalletController; use App\Http\Controllers\PlantController; @@ -68,6 +70,8 @@ Route::get('laser/item/get-master-data', [StickerMasterController::class, 'get_m Route::get('/download-qr-pdf/{palletNo}', [PalletController::class, 'downloadQrPdf'])->name('download-qr-pdf'); +//Production Dashboard Controller + Route::get('get/module-name/data', [ModuleController::class, 'get_module']); Route::get('get/modulechart-name/data', [ModuleChartController::class, 'get_moduleChart']); @@ -80,3 +84,9 @@ Route::get('get/module-line-filter-name/data', [ModuleFilterController::class, ' Route::get('get/module-filter-value/data', [ModuleFilterDataController::class, 'get_moduleFilterData']); +Route::get('get/module-production-order/data', [ModuleProductionOrderDataController::class, 'get_moduleProductionOrder']); + +//Invoice Dashboard Controller + +Route::get('get/module-invoice-type/data', [ModuleInvoiceDataController::class, 'get_invoiceData']); +