Added all modules with fg count logic
This commit is contained in:
@@ -57,7 +57,7 @@ class ModuleController extends Controller
|
|||||||
], 404);
|
], 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
$headerValue = $request->header('module-name');
|
$headerValue = $request->header('module-name');
|
||||||
|
|
||||||
if ($headerValue != 'Module List') {
|
if ($headerValue != 'Module List') {
|
||||||
return response()->json([
|
return response()->json([
|
||||||
|
|||||||
106
app/Http/Controllers/ModuleFGLineController.php
Normal file
106
app/Http/Controllers/ModuleFGLineController.php
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\Line;
|
||||||
|
use App\Models\ModuleList;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class ModuleFGLineController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get_moduleFGFilter(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);
|
||||||
|
}
|
||||||
|
|
||||||
|
$lineName = $request->header('line-name');
|
||||||
|
|
||||||
|
if (empty($lineName))
|
||||||
|
{
|
||||||
|
return response()->json([
|
||||||
|
'status_code' => 'ERROR',
|
||||||
|
'status_description' => "Line name can't be empty!"
|
||||||
|
], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$line = Line::where('name', $lineName)->first();
|
||||||
|
|
||||||
|
if (!$line) {
|
||||||
|
return response()->json([
|
||||||
|
'status_code' => 'ERROR',
|
||||||
|
'status_description' => "Line '{$lineName}' not found!"
|
||||||
|
], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($line->type !== 'FG Line') {
|
||||||
|
return response()->json([
|
||||||
|
'status_code' => 'ERROR',
|
||||||
|
'status_description' => "Line '{$lineName}' is not of type FG Line."
|
||||||
|
], 400);
|
||||||
|
}
|
||||||
|
// Default logic to return filter names
|
||||||
|
$filterNames = ModuleList::orderBy('created_at', 'asc')
|
||||||
|
->get()
|
||||||
|
->unique('filter_name')
|
||||||
|
->pluck('filter_name')
|
||||||
|
->filter()
|
||||||
|
->values();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'status_code' => 'SUCCESS',
|
||||||
|
'status_description' => $filterNames
|
||||||
|
], 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)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -40,7 +40,26 @@ class ModuleFilterController extends Controller
|
|||||||
'status_description' => "Line name can't be empty!"
|
'status_description' => "Line name can't be empty!"
|
||||||
], 404);
|
], 404);
|
||||||
}
|
}
|
||||||
|
// If 'line-name' is 'FG Lines', return actual FG Line names
|
||||||
|
if (strtolower(trim($lineName)) === 'fg lines') {
|
||||||
|
$fgLines = \App\Models\Line::where('type', 'FG Line')
|
||||||
|
->orderBy('created_at', 'asc')
|
||||||
|
->pluck('name');
|
||||||
|
|
||||||
|
if ($fgLines->isEmpty()) {
|
||||||
|
return response()->json([
|
||||||
|
'status_code' => 'ERROR',
|
||||||
|
'status_description' => 'No FG Lines found!'
|
||||||
|
], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'status_code' => 'SUCCESS',
|
||||||
|
'status_description' => $fgLines
|
||||||
|
], 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default logic to return filter names
|
||||||
$filterNames = ModuleList::orderBy('created_at', 'asc')
|
$filterNames = ModuleList::orderBy('created_at', 'asc')
|
||||||
->get()
|
->get()
|
||||||
->unique('filter_name')
|
->unique('filter_name')
|
||||||
@@ -48,10 +67,22 @@ class ModuleFilterController extends Controller
|
|||||||
->filter()
|
->filter()
|
||||||
->values();
|
->values();
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status_code' => 'SUCCESS',
|
'status_code' => 'SUCCESS',
|
||||||
'status_description' => $filterNames
|
'status_description' => $filterNames
|
||||||
], 200);
|
], 200);
|
||||||
|
|
||||||
|
// $filterNames = ModuleList::orderBy('created_at', 'asc')
|
||||||
|
// ->get()
|
||||||
|
// ->unique('filter_name')
|
||||||
|
// ->pluck('filter_name')
|
||||||
|
// ->filter()
|
||||||
|
// ->values();
|
||||||
|
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'SUCCESS',
|
||||||
|
// 'status_description' => $filterNames
|
||||||
|
// ], 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ use App\Models\Line;
|
|||||||
use App\Models\Plant;
|
use App\Models\Plant;
|
||||||
use App\Models\ProductionQuantity;
|
use App\Models\ProductionQuantity;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class ModuleFilterDataController extends Controller
|
class ModuleFilterDataController extends Controller
|
||||||
{
|
{
|
||||||
@@ -110,6 +111,238 @@ class ModuleFilterDataController extends Controller
|
|||||||
// ], 200);
|
// ], 200);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
// public function get_moduleFilterData(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',
|
||||||
|
// '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');
|
||||||
|
// $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);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Set date filter range
|
||||||
|
// if ($filterName == 'yesterday') {
|
||||||
|
// $startDate = now()->subDay()->setTime(8, 0, 0);
|
||||||
|
// $endDate = now()->setTime(8, 0, 0);
|
||||||
|
// } elseif ($filterName == 'this week') {
|
||||||
|
// $startDate = now()->startOfWeek()->setTime(8, 0, 0);
|
||||||
|
// $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
|
||||||
|
// } elseif ($filterName == 'this month') {
|
||||||
|
// $startDate = now()->startOfMonth();
|
||||||
|
// $endDate = now()->endOfMonth();
|
||||||
|
// } else {
|
||||||
|
// $startDate = now()->setTime(8, 0, 0);
|
||||||
|
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Handle All Lines
|
||||||
|
// if (strtolower(trim($lineName)) == 'all lines') {
|
||||||
|
// $lines = Line::where('plant_id', $plant->id)->pluck('id', 'name');
|
||||||
|
|
||||||
|
// if ($lines->isEmpty()) {
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'ERROR',
|
||||||
|
// 'status_description' => "No lines found for plant '{$plantName}'"
|
||||||
|
// ], 404);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $lineCounts = [];
|
||||||
|
|
||||||
|
// foreach ($lines as $name => $id) {
|
||||||
|
// $count = ProductionQuantity::where('plant_id', $plant->id)
|
||||||
|
// ->where('line_id', $id)
|
||||||
|
// ->whereBetween('created_at', [$startDate, $endDate])
|
||||||
|
// ->count();
|
||||||
|
|
||||||
|
// $lineCounts[$name] = $count;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'SUCCESS',
|
||||||
|
// 'status_description' => $lineCounts
|
||||||
|
// ], 200);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Handle single line
|
||||||
|
// $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 for plant '{$plantName}'"
|
||||||
|
// ], 404);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $rowCount = ProductionQuantity::where('plant_id', $plant->id)
|
||||||
|
// ->where('line_id', $line->id)
|
||||||
|
// ->whereBetween('created_at', [$startDate, $endDate])
|
||||||
|
// ->count();
|
||||||
|
|
||||||
|
// $chartName = $request->header('chart-name');
|
||||||
|
|
||||||
|
// if ($chartName == 'Production Hourly Count')
|
||||||
|
// {
|
||||||
|
|
||||||
|
// if ($filterHeader == 'Today' || $filterHeader == 'Yesterday') {
|
||||||
|
// $hourlyCounts = [];
|
||||||
|
|
||||||
|
// $hourStart = now()->startOfDay()->addHours(8); // Today 8:00 AM
|
||||||
|
// if ($filterHeader == 'Yesterday') {
|
||||||
|
// $hourStart->subDay(); // Yesterday 8:00 AM
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $hourEndFinal = $hourStart->copy()->addDay(); // +1 day = 24 hourly slots
|
||||||
|
|
||||||
|
// while ($hourStart < $hourEndFinal) {
|
||||||
|
// $hourEnd = $hourStart->copy()->addHour();
|
||||||
|
|
||||||
|
// $label = $hourStart->format('g:i A') . ' to ' . $hourEnd->format('g:i A');
|
||||||
|
|
||||||
|
// $count = ProductionQuantity::where('plant_id', $plant->id)
|
||||||
|
// ->where('line_id', $line->id)
|
||||||
|
// ->whereBetween('created_at', [$hourStart, $hourEnd])
|
||||||
|
// ->count();
|
||||||
|
|
||||||
|
// $hourlyCounts[$label] = $count;
|
||||||
|
|
||||||
|
// $hourStart = $hourEnd;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'SUCCESS',
|
||||||
|
// 'hourly_data' => $hourlyCounts
|
||||||
|
// ], 200);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // THIS WEEK: group by weekdays (Mon to Sun)
|
||||||
|
// if ($filterHeader == 'This Week') {
|
||||||
|
// $dowCounts = ProductionQuantity::selectRaw('EXTRACT(DOW FROM created_at) as dow, COUNT(*) as total')
|
||||||
|
// ->where('plant_id', $plant->id)
|
||||||
|
// ->where('line_id', $line->id)
|
||||||
|
// ->whereBetween('created_at', [$startDate, $endDate])
|
||||||
|
// ->groupBy('dow')
|
||||||
|
// ->pluck('total', 'dow');
|
||||||
|
|
||||||
|
// $labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
|
||||||
|
// $data = array_fill(0, 7, 0);
|
||||||
|
|
||||||
|
// foreach ($dowCounts as $dow => $count) {
|
||||||
|
// $data[$dow] = $count;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Reorder from Monday (1) to Sunday (0)
|
||||||
|
// $orderedData = [
|
||||||
|
// $data[1] ?? 0,
|
||||||
|
// $data[2] ?? 0,
|
||||||
|
// $data[3] ?? 0,
|
||||||
|
// $data[4] ?? 0,
|
||||||
|
// $data[5] ?? 0,
|
||||||
|
// $data[6] ?? 0,
|
||||||
|
// $data[0] ?? 0
|
||||||
|
// ];
|
||||||
|
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'SUCCESS',
|
||||||
|
// 'weekly_labels' => $labels,
|
||||||
|
// 'weekly_counts' => $orderedData
|
||||||
|
// ], 200);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //THIS MONTH: group by weeks
|
||||||
|
// if ($filterHeader == 'This Month') {
|
||||||
|
// // Count records grouped by week number
|
||||||
|
// $weekCounts = ProductionQuantity::selectRaw("FLOOR((EXTRACT(DAY FROM created_at) - 1) / 7) + 1 as week_number, COUNT(*) as total")
|
||||||
|
// ->where('plant_id', $plant->id)
|
||||||
|
// ->where('line_id', $line->id)
|
||||||
|
// ->whereBetween('created_at', [$startDate, $endDate])
|
||||||
|
// ->groupBy('week_number')
|
||||||
|
// ->pluck('total', 'week_number');
|
||||||
|
|
||||||
|
// $weeksCount = ceil($endDate->day / 7); // Total number of weeks in month
|
||||||
|
// $allWeeks = array_fill(1, $weeksCount, 0);
|
||||||
|
// $data = array_replace($allWeeks, $weekCounts->toArray());
|
||||||
|
|
||||||
|
// // Prepare labels like Week 1 (01 Jul - 07 Jul)
|
||||||
|
// $labels = [];
|
||||||
|
// for ($i = 1; $i <= $weeksCount; $i++) {
|
||||||
|
// $weekStart = $startDate->copy()->addDays(($i - 1) * 7);
|
||||||
|
// $weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate);
|
||||||
|
|
||||||
|
// $labels[] = "Week $i ({$weekStart->format('d M')} - {$weekEnd->format('d M')})";
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $orderedData = array_values($data);
|
||||||
|
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'SUCCESS',
|
||||||
|
// 'monthly_labels' => $labels,
|
||||||
|
// 'monthly_counts' => $orderedData
|
||||||
|
// ], 200);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if ($chartName == 'Production Line Count')
|
||||||
|
// {
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'SUCCESS',
|
||||||
|
// 'status_description' => $rowCount
|
||||||
|
// ], 200);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function get_moduleFilterData(Request $request)
|
public function get_moduleFilterData(Request $request)
|
||||||
{
|
{
|
||||||
$expectedUser = env('API_AUTH_USER');
|
$expectedUser = env('API_AUTH_USER');
|
||||||
@@ -126,15 +359,10 @@ class ModuleFilterDataController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$requiredHeaders = [
|
$requiredHeaders = [
|
||||||
'module-name',
|
'module-name', 'chart-name', 'plant-name', 'line-name', 'filter-name'
|
||||||
'chart-name',
|
|
||||||
'plant-name',
|
|
||||||
'line-name',
|
|
||||||
'filter-name',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$missingHeaders = [];
|
$missingHeaders = [];
|
||||||
|
|
||||||
foreach ($requiredHeaders as $header) {
|
foreach ($requiredHeaders as $header) {
|
||||||
if (empty($request->header($header))) {
|
if (empty($request->header($header))) {
|
||||||
$missingHeaders[] = $header;
|
$missingHeaders[] = $header;
|
||||||
@@ -161,6 +389,7 @@ class ModuleFilterDataController extends Controller
|
|||||||
$plantName = $request->header('plant-name');
|
$plantName = $request->header('plant-name');
|
||||||
$lineName = $request->header('line-name');
|
$lineName = $request->header('line-name');
|
||||||
$filterName = strtolower(trim($request->header('filter-name')));
|
$filterName = strtolower(trim($request->header('filter-name')));
|
||||||
|
$chartName = $request->header('chart-name');
|
||||||
|
|
||||||
$plant = Plant::where('name', $plantName)->first();
|
$plant = Plant::where('name', $plantName)->first();
|
||||||
if (!$plant) {
|
if (!$plant) {
|
||||||
@@ -170,176 +399,146 @@ class ModuleFilterDataController extends Controller
|
|||||||
], 404);
|
], 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set date filter range
|
$isAllLines = strtolower(trim($lineName)) == 'all lines';
|
||||||
if ($filterName == 'yesterday') {
|
|
||||||
$startDate = now()->subDay()->setTime(8, 0, 0);
|
if ($isAllLines) {
|
||||||
$endDate = now()->setTime(8, 0, 0);
|
$lines = Line::where('plant_id', $plant->id)->get();
|
||||||
} elseif ($filterName == 'this week') {
|
$fgLineIds = $lines->where('type', 'FG Line')->pluck('id')->toArray();
|
||||||
$startDate = now()->startOfWeek()->setTime(8, 0, 0);
|
$nonFgLineIds = $lines->where('type', '!=', 'FG Line')->pluck('id')->toArray();
|
||||||
$endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
|
|
||||||
} elseif ($filterName == 'this month') {
|
|
||||||
$startDate = now()->startOfMonth();
|
|
||||||
$endDate = now()->endOfMonth();
|
|
||||||
} else {
|
} else {
|
||||||
$startDate = now()->setTime(8, 0, 0);
|
$line = Line::where('name', $lineName)->where('plant_id', $plant->id)->first();
|
||||||
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
|
if (!$line) {
|
||||||
}
|
|
||||||
|
|
||||||
// Handle All Lines
|
|
||||||
if (strtolower(trim($lineName)) == 'all lines') {
|
|
||||||
$lines = Line::where('plant_id', $plant->id)->pluck('id', 'name');
|
|
||||||
|
|
||||||
if ($lines->isEmpty()) {
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status_code' => 'ERROR',
|
'status_code' => 'ERROR',
|
||||||
'status_description' => "No lines found for plant '{$plantName}'"
|
'status_description' => "Line '{$lineName}' not found for plant '{$plantName}'"
|
||||||
], 404);
|
], 404);
|
||||||
}
|
}
|
||||||
|
$lineIds = [$line->id];
|
||||||
|
$isFgLine = $line->type == 'FG Line';
|
||||||
|
$baseTable = $isFgLine ? 'quality_validations' : 'production_quantities';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($filterName == 'yesterday') {
|
||||||
|
$startDate = now()->subDay()->setTime(8, 0, 0);
|
||||||
|
$endDate = now()->setTime(8, 0, 0);
|
||||||
|
$groupBy = 'EXTRACT(HOUR FROM 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 created_at)';
|
||||||
|
} elseif ($filterName == 'this month') {
|
||||||
|
$startDate = now()->startOfMonth();
|
||||||
|
$endDate = now()->endOfMonth();
|
||||||
|
$groupBy = "FLOOR((EXTRACT(DAY FROM created_at) - 1) / 7) + 1";
|
||||||
|
} else {
|
||||||
|
$startDate = now()->setTime(8, 0, 0);
|
||||||
|
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
|
||||||
|
$groupBy = 'EXTRACT(HOUR FROM created_at)';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($chartName == 'Production Line Count' && $isAllLines) {
|
||||||
$lineCounts = [];
|
$lineCounts = [];
|
||||||
|
foreach ($lines as $line) {
|
||||||
foreach ($lines as $name => $id) {
|
$table = ($line->type == 'FG Line') ? 'quality_validations' : 'production_quantities';
|
||||||
$count = ProductionQuantity::where('plant_id', $plant->id)
|
$count = DB::table($table)
|
||||||
->where('line_id', $id)
|
->where('plant_id', $plant->id)
|
||||||
|
->where('line_id', $line->id)
|
||||||
->whereBetween('created_at', [$startDate, $endDate])
|
->whereBetween('created_at', [$startDate, $endDate])
|
||||||
->count();
|
->count();
|
||||||
|
$lineCounts[$line->name] = $count;
|
||||||
$lineCounts[$name] = $count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status_code' => 'SUCCESS',
|
'status_code' => 'SUCCESS',
|
||||||
'status_description' => $lineCounts
|
'lines' => $lineCounts
|
||||||
], 200);
|
], 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle single line
|
if (!$isAllLines)
|
||||||
$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 for plant '{$plantName}'"
|
|
||||||
], 404);
|
|
||||||
}
|
|
||||||
|
|
||||||
$rowCount = ProductionQuantity::where('plant_id', $plant->id)
|
|
||||||
->where('line_id', $line->id)
|
|
||||||
->whereBetween('created_at', [$startDate, $endDate])
|
|
||||||
->count();
|
|
||||||
|
|
||||||
$chartName = $request->header('chart-name');
|
|
||||||
|
|
||||||
if ($chartName == 'Production Hourly Count')
|
|
||||||
{
|
{
|
||||||
|
$rowCount = DB::table($baseTable)
|
||||||
|
->where('plant_id', $plant->id)
|
||||||
|
->where('line_id', $line->id)
|
||||||
|
->whereBetween('created_at', [$startDate, $endDate])
|
||||||
|
->count();
|
||||||
|
|
||||||
if ($filterHeader == 'Today' || $filterHeader == 'Yesterday') {
|
$query = DB::table($baseTable)
|
||||||
$hourlyCounts = [];
|
->selectRaw("$groupBy AS time_unit, COUNT(*) AS total_quantity")
|
||||||
|
->where('created_at', '>=', $startDate)
|
||||||
|
->where('created_at', '<', $endDate)
|
||||||
|
->where('plant_id', $plant->id)
|
||||||
|
->where('line_id', $line->id)
|
||||||
|
->groupByRaw($groupBy)
|
||||||
|
->orderByRaw($groupBy)
|
||||||
|
->pluck('total_quantity', 'time_unit')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
$hourStart = now()->startOfDay()->addHours(8); // Today 8:00 AM
|
if ($chartName == 'Production Hourly Count') {
|
||||||
if ($filterHeader == 'Yesterday') {
|
if ($filterName === 'this month') {
|
||||||
$hourStart->subDay(); // Yesterday 8:00 AM
|
$weeksCount = ceil($endDate->day / 7);
|
||||||
}
|
$allWeeks = array_fill(1, $weeksCount, 0);
|
||||||
|
$data = array_replace($allWeeks, $query);
|
||||||
$hourEndFinal = $hourStart->copy()->addDay(); // +1 day = 24 hourly slots
|
$labels = [];
|
||||||
|
for ($i = 1; $i <= $weeksCount; $i++) {
|
||||||
while ($hourStart < $hourEndFinal) {
|
$weekStart = $startDate->copy()->addDays(($i - 1) * 7)->format('d M');
|
||||||
$hourEnd = $hourStart->copy()->addHour();
|
$weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate)->format('d M');
|
||||||
|
$labels[] = "Week $i ($weekStart - $weekEnd)";
|
||||||
$label = $hourStart->format('g:i A') . ' to ' . $hourEnd->format('g:i A');
|
}
|
||||||
|
$orderedData = array_values($data);
|
||||||
$count = ProductionQuantity::where('plant_id', $plant->id)
|
} elseif ($filterName === 'this week') {
|
||||||
->where('line_id', $line->id)
|
$labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
|
||||||
->whereBetween('created_at', [$hourStart, $hourEnd])
|
$data = array_fill(0, 7, 0);
|
||||||
->count();
|
foreach ($query as $dow => $count) {
|
||||||
|
$data[$dow] = $count;
|
||||||
$hourlyCounts[$label] = $count;
|
}
|
||||||
|
$orderedData = [
|
||||||
$hourStart = $hourEnd;
|
$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(function ($hour) {
|
||||||
|
$prevHour = ($hour - 1 + 24) % 24;
|
||||||
|
return date("g:i A", strtotime("$prevHour:00")) . ' to ' . date("g:i A", strtotime("$hour:00"));
|
||||||
|
}, $shiftedKeys);
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status_code' => 'SUCCESS',
|
'status_code' => 'SUCCESS',
|
||||||
'hourly_data' => $hourlyCounts
|
'datasets' => [[
|
||||||
|
'label' => match ($filterName) {
|
||||||
|
'this week' => $isFgLine ? 'Daily FG Count This Week' : 'Daily Production This Week',
|
||||||
|
'this month' => $isFgLine ? 'Weekly FG Count This Month' : 'Weekly Production This Month',
|
||||||
|
'yesterday' => $isFgLine ? "Yesterday's FG Count" : "Yesterday's Hourly Production",
|
||||||
|
default => $isFgLine ? "Today's FG Count" : "Today's Hourly Production",
|
||||||
|
},
|
||||||
|
'data' => $orderedData
|
||||||
|
]],
|
||||||
|
'labels' => $labels,
|
||||||
], 200);
|
], 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
// THIS WEEK: group by weekdays (Mon to Sun)
|
if ($chartName == 'Production Line Count') {
|
||||||
if ($filterHeader == 'This Week') {
|
|
||||||
$dowCounts = ProductionQuantity::selectRaw('EXTRACT(DOW FROM created_at) as dow, COUNT(*) as total')
|
|
||||||
->where('plant_id', $plant->id)
|
|
||||||
->where('line_id', $line->id)
|
|
||||||
->whereBetween('created_at', [$startDate, $endDate])
|
|
||||||
->groupBy('dow')
|
|
||||||
->pluck('total', 'dow');
|
|
||||||
|
|
||||||
$labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
|
|
||||||
$data = array_fill(0, 7, 0);
|
|
||||||
|
|
||||||
foreach ($dowCounts as $dow => $count) {
|
|
||||||
$data[$dow] = $count;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reorder from Monday (1) to Sunday (0)
|
|
||||||
$orderedData = [
|
|
||||||
$data[1] ?? 0,
|
|
||||||
$data[2] ?? 0,
|
|
||||||
$data[3] ?? 0,
|
|
||||||
$data[4] ?? 0,
|
|
||||||
$data[5] ?? 0,
|
|
||||||
$data[6] ?? 0,
|
|
||||||
$data[0] ?? 0
|
|
||||||
];
|
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status_code' => 'SUCCESS',
|
'status_code' => 'SUCCESS',
|
||||||
'weekly_labels' => $labels,
|
'status_description' => $rowCount
|
||||||
'weekly_counts' => $orderedData
|
|
||||||
], 200);
|
], 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
//THIS MONTH: group by weeks
|
|
||||||
if ($filterHeader == 'This Month') {
|
|
||||||
// Count records grouped by week number
|
|
||||||
$weekCounts = ProductionQuantity::selectRaw("FLOOR((EXTRACT(DAY FROM created_at) - 1) / 7) + 1 as week_number, COUNT(*) as total")
|
|
||||||
->where('plant_id', $plant->id)
|
|
||||||
->where('line_id', $line->id)
|
|
||||||
->whereBetween('created_at', [$startDate, $endDate])
|
|
||||||
->groupBy('week_number')
|
|
||||||
->pluck('total', 'week_number');
|
|
||||||
|
|
||||||
$weeksCount = ceil($endDate->day / 7); // Total number of weeks in month
|
|
||||||
$allWeeks = array_fill(1, $weeksCount, 0);
|
|
||||||
$data = array_replace($allWeeks, $weekCounts->toArray());
|
|
||||||
|
|
||||||
// Prepare labels like Week 1 (01 Jul - 07 Jul)
|
|
||||||
$labels = [];
|
|
||||||
for ($i = 1; $i <= $weeksCount; $i++) {
|
|
||||||
$weekStart = $startDate->copy()->addDays(($i - 1) * 7);
|
|
||||||
$weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate);
|
|
||||||
|
|
||||||
$labels[] = "Week $i ({$weekStart->format('d M')} - {$weekEnd->format('d M')})";
|
|
||||||
}
|
|
||||||
|
|
||||||
$orderedData = array_values($data);
|
|
||||||
|
|
||||||
return response()->json([
|
|
||||||
'status_code' => 'SUCCESS',
|
|
||||||
'monthly_labels' => $labels,
|
|
||||||
'monthly_counts' => $orderedData
|
|
||||||
], 200);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($chartName == 'Production Line Count')
|
|
||||||
{
|
|
||||||
return response()->json([
|
|
||||||
'status_code' => 'SUCCESS',
|
|
||||||
'status_description' => $rowCount
|
|
||||||
], 200);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store a newly created resource in storage.
|
* Store a newly created resource in storage.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -16,6 +16,62 @@ class ModulePlantLineController extends Controller
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// public function get_modulePlantLine(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);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $plantName = $request->header('plant-name');
|
||||||
|
|
||||||
|
// if (empty($plantName))
|
||||||
|
// {
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'ERROR',
|
||||||
|
// 'status_description' => "Plant Name can't be empty!"
|
||||||
|
// ], 404);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $plant = Plant::where('name', $plantName)->first();
|
||||||
|
|
||||||
|
// if (!$plant) {
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'ERROR',
|
||||||
|
// 'status_description' => "Plant '{$plantName}' not found!"
|
||||||
|
// ], 404);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $lineNames = Line::where('plant_id', $plant->id)
|
||||||
|
// ->orderBy('created_at', 'asc')
|
||||||
|
// ->pluck('name');
|
||||||
|
|
||||||
|
// if ($lineNames->isEmpty()) {
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'ERROR',
|
||||||
|
// 'status_description' => "No lines found for plant '{$plantName}'"
|
||||||
|
// ], 404);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Prepend 'All Lines'
|
||||||
|
// $lineNames->prepend('All Lines')->values();
|
||||||
|
|
||||||
|
// return response()->json([
|
||||||
|
// 'status_code' => 'SUCCESS',
|
||||||
|
// 'status_description' => $lineNames,
|
||||||
|
// ], 200);
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
public function get_modulePlantLine(Request $request)
|
public function get_modulePlantLine(Request $request)
|
||||||
{
|
{
|
||||||
$expectedUser = env('API_AUTH_USER');
|
$expectedUser = env('API_AUTH_USER');
|
||||||
@@ -24,8 +80,7 @@ class ModulePlantLineController extends Controller
|
|||||||
$header_auth = $request->header('Authorization');
|
$header_auth = $request->header('Authorization');
|
||||||
$expectedToken = $expectedUser . ':' . $expectedPw;
|
$expectedToken = $expectedUser . ':' . $expectedPw;
|
||||||
|
|
||||||
if ("Bearer " . $expectedToken != $header_auth)
|
if ("Bearer " . $expectedToken != $header_auth) {
|
||||||
{
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status_code' => 'ERROR',
|
'status_code' => 'ERROR',
|
||||||
'status_description' => 'Invalid authorization token!'
|
'status_description' => 'Invalid authorization token!'
|
||||||
@@ -34,8 +89,7 @@ class ModulePlantLineController extends Controller
|
|||||||
|
|
||||||
$plantName = $request->header('plant-name');
|
$plantName = $request->header('plant-name');
|
||||||
|
|
||||||
if (empty($plantName))
|
if (empty($plantName)) {
|
||||||
{
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status_code' => 'ERROR',
|
'status_code' => 'ERROR',
|
||||||
'status_description' => "Plant Name can't be empty!"
|
'status_description' => "Plant Name can't be empty!"
|
||||||
@@ -51,39 +105,31 @@ class ModulePlantLineController extends Controller
|
|||||||
], 404);
|
], 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
// // Get line names for the plant
|
// Load only lines NOT equal to FG Line
|
||||||
// $lineNames = Line::where('plant_id', $plant->id)
|
$nonFgLines = Line::where('plant_id', $plant->id)
|
||||||
// ->orderBy('created_at', 'asc')
|
->where('type', '!=', 'FG Line')
|
||||||
// ->pluck('name')
|
|
||||||
// ->prepend('All Lines')
|
|
||||||
// ->values();
|
|
||||||
|
|
||||||
// return response()->json([
|
|
||||||
// 'status_code' => 'SUCCESS',
|
|
||||||
// 'status_description' => $lineNames,
|
|
||||||
// ], 200);
|
|
||||||
|
|
||||||
$lineNames = Line::where('plant_id', $plant->id)
|
|
||||||
->orderBy('created_at', 'asc')
|
->orderBy('created_at', 'asc')
|
||||||
->pluck('name');
|
->pluck('name')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
if ($lineNames->isEmpty()) {
|
if (empty($nonFgLines)) {
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status_code' => 'ERROR',
|
'status_code' => 'ERROR',
|
||||||
'status_description' => "No lines found for plant '{$plantName}'"
|
'status_description' => "No non-FG lines found for plant '{$plantName}'"
|
||||||
], 404);
|
], 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepend 'All Lines'
|
// Add "All Lines" to beginning and "FG Lines" at the end
|
||||||
$lineNames->prepend('All Lines')->values();
|
array_unshift($nonFgLines, 'All Lines');
|
||||||
|
$nonFgLines[] = 'FG Lines';
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status_code' => 'SUCCESS',
|
'status_code' => 'SUCCESS',
|
||||||
'status_description' => $lineNames,
|
'status_description' => $nonFgLines,
|
||||||
], 200);
|
], 200);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store a newly created resource in storage.
|
* Store a newly created resource in storage.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
use App\Http\Controllers\MachineController;
|
use App\Http\Controllers\MachineController;
|
||||||
use App\Http\Controllers\ModuleChartController;
|
use App\Http\Controllers\ModuleChartController;
|
||||||
use App\Http\Controllers\ModuleController;
|
use App\Http\Controllers\ModuleController;
|
||||||
|
use App\Http\Controllers\ModuleFGLineController;
|
||||||
use App\Http\Controllers\ModuleFilterController;
|
use App\Http\Controllers\ModuleFilterController;
|
||||||
use App\Http\Controllers\ModuleFilterDataController;
|
use App\Http\Controllers\ModuleFilterDataController;
|
||||||
use App\Http\Controllers\ModuleInvoiceDataController;
|
use App\Http\Controllers\ModuleInvoiceDataController;
|
||||||
@@ -82,6 +83,8 @@ Route::get('get/module-plantline-name/data', [ModulePlantLineController::class,
|
|||||||
|
|
||||||
Route::get('get/module-line-filter-name/data', [ModuleFilterController::class, 'get_moduleFilter']);
|
Route::get('get/module-line-filter-name/data', [ModuleFilterController::class, 'get_moduleFilter']);
|
||||||
|
|
||||||
|
Route::get('get/module-fgline-filter-name/data', [ModuleFGLineController::class, 'get_moduleFGFilter']);
|
||||||
|
|
||||||
Route::get('get/module-filter-value/data', [ModuleFilterDataController::class, 'get_moduleFilterData']);
|
Route::get('get/module-filter-value/data', [ModuleFilterDataController::class, 'get_moduleFilterData']);
|
||||||
|
|
||||||
Route::get('get/module-production-order/data', [ModuleProductionOrderDataController::class, 'get_moduleProductionOrder']);
|
Route::get('get/module-production-order/data', [ModuleProductionOrderDataController::class, 'get_moduleProductionOrder']);
|
||||||
|
|||||||
Reference in New Issue
Block a user