diff --git a/app/Livewire/ProductionNonPlanned.php b/app/Livewire/ProductionNonPlanned.php new file mode 100644 index 00000000..4f5eb9fb --- /dev/null +++ b/app/Livewire/ProductionNonPlanned.php @@ -0,0 +1,278 @@ + 'loadProductionData', + 'loadDataCategory' => 'loadProductionCategoryData' + ]; + + public function loadProductionData($date, $plantId, $lineId) + { + $this->dates = []; + $this->leaveDates = []; + + $this->nonPlannedRecords = []; + $this->nonPlannedCount = 0; + $this->nonPlannedQuantity = 0; + + if (!$plantId || !$lineId || !$date) { + return; + } + + $selectedDate = Carbon::parse($date); + + $date = $selectedDate->toDateString(); + $month = $selectedDate->month; + $year = $selectedDate->year; + + $startDate = Carbon::parse($date)->setTime(8, 0, 0); + $endDate = $startDate->copy()->addDay(); + + $plans = ProductionPlan::query() + ->join('items', 'items.id', '=', 'production_plans.item_id') + ->join('lines', 'lines.id', '=', 'production_plans.line_id') + ->join('plants', 'plants.id', '=', 'production_plans.plant_id') + ->where('production_plans.plant_id', $plantId) + ->where('production_plans.line_id', $lineId) + ->whereMonth('production_plans.created_at', $month) + ->whereYear('production_plans.created_at', $year) + ->select( + 'production_plans.item_id', + 'production_plans.plant_id', + 'production_plans.line_id', + 'production_plans.plan_quantity', + 'production_plans.working_days', + 'production_plans.leave_dates', + 'items.code as item_code', + 'items.category as category', + 'items.description as item_description', + 'items.hourly_quantity as hourly_quantity', + 'lines.name as line_name', + 'plants.name as plant_name' + ) + ->get(); + + $plannedItemIds = $plans + ->pluck('item_id') + ->filter(fn ($id) => $id != null) + ->unique() + ->values(); + + $leaveDates = []; + + if ($plans->isNotEmpty() && $plans->first()->leave_dates) { + $leaveDates = array_map( + 'trim', + explode(',', $plans->first()->leave_dates) + ); + } + + $this->leaveDates = $leaveDates; + + $nonPlannedQuery = QualityValidation::query() + ->join( + 'sticker_masters', + 'sticker_masters.id', + '=', + 'quality_validations.sticker_master_id' + ) + ->join( + 'items', + 'items.id', + '=', + 'sticker_masters.item_id' + ) + ->where('quality_validations.plant_id', $plantId) + ->where('quality_validations.line_id', $lineId) + ->where('quality_validations.created_at', '>=', $startDate) + ->where('quality_validations.created_at', '<', $endDate); + + if ($plannedItemIds->isNotEmpty()) { + $nonPlannedQuery->whereNotIn( + 'sticker_masters.item_id', + $plannedItemIds + ); + } + + $nonPlannedData = $nonPlannedQuery + ->selectRaw(" + sticker_masters.item_id, + items.code as item_code, + items.description as item_description, + items.category as item_category, + COUNT(*) as total_qty + ") + ->groupBy( + 'sticker_masters.item_id', + 'items.code', + 'items.description', + 'items.category' + ) + ->get(); + + $this->nonPlannedRecords = $nonPlannedData->toArray(); + + $this->nonPlannedCount = $nonPlannedData->count(); + + $this->nonPlannedQuantity = (int) $nonPlannedData->sum('total_qty'); + } + + public function loadProductionCategoryData($date, $plantId, $lineId, $category) + { + $this->dates = []; + $this->leaveDates = []; + + $this->nonPlannedRecords = []; + $this->nonPlannedCount = 0; + $this->nonPlannedQuantity = 0; + + if (!$plantId || !$lineId || !$date) { + return; + } + + $selectedDate = Carbon::parse($date); + + $date = $selectedDate->toDateString(); + $month = $selectedDate->month; + $year = $selectedDate->year; + + $startDate = Carbon::parse($date)->setTime(8, 0, 0); + $endDate = $startDate->copy()->addDay(); + + $plans = ProductionPlan::query() + ->join('items', 'items.id', '=', 'production_plans.item_id') + ->join('lines', 'lines.id', '=', 'production_plans.line_id') + ->join('plants', 'plants.id', '=', 'production_plans.plant_id') + ->where('production_plans.plant_id', $plantId) + ->where('production_plans.line_id', $lineId) + ->where('items.category', $category) + ->whereMonth('production_plans.created_at', $month) + ->whereYear('production_plans.created_at', $year) + ->select( + 'production_plans.item_id', + 'production_plans.plant_id', + 'production_plans.line_id', + 'production_plans.plan_quantity', + 'production_plans.working_days', + 'production_plans.leave_dates', + 'items.code as item_code', + 'items.category as category', + 'items.description as item_description', + 'items.hourly_quantity as hourly_quantity', + 'lines.name as line_name', + 'plants.name as plant_name' + ) + ->get(); + + $plannedItemIds = $plans + ->pluck('item_id') + ->filter(fn ($id) => $id != null) + ->unique() + ->values(); + + $leaveDates = []; + + if ($plans->isNotEmpty() && $plans->first()->leave_dates) { + $leaveDates = array_map( + 'trim', + explode(',', $plans->first()->leave_dates) + ); + } + + $this->leaveDates = $leaveDates; + + $nonPlannedQuery = QualityValidation::query() + ->join( + 'sticker_masters', + 'sticker_masters.id', + '=', + 'quality_validations.sticker_master_id' + ) + ->join( + 'items', + 'items.id', + '=', + 'sticker_masters.item_id' + ) + ->where('quality_validations.plant_id', $plantId) + ->where('quality_validations.line_id', $lineId) + ->where('items.category', $category) + ->where('quality_validations.created_at', '>=', $startDate) + ->where('quality_validations.created_at', '<', $endDate); + + if ($plannedItemIds->isNotEmpty()) { + $nonPlannedQuery->whereNotIn( + 'sticker_masters.item_id', + $plannedItemIds + ); + } + + $nonPlannedData = $nonPlannedQuery + ->selectRaw(" + sticker_masters.item_id, + items.code as item_code, + items.description as item_description, + items.category as item_category, + COUNT(*) as total_qty + ") + ->groupBy( + 'sticker_masters.item_id', + 'items.code', + 'items.description', + 'items.category' + ) + ->get(); + + $this->nonPlannedRecords = $nonPlannedData->toArray(); + + $this->nonPlannedCount = $nonPlannedData->count(); + + $this->nonPlannedQuantity = (int) $nonPlannedData->sum('total_qty'); + } + + public function render() + { + // return view('livewire.production-non-planned'); + return view('livewire.production-non-planned', [ + 'records' => $this->records, + 'monthlyRecords' => $this->monthlyRecords, + 'monthlyActualRecords' => $this->monthlyActualQuantity, + 'monthlyEfficiency' => $this->efficiency, + 'dates' => $this->dates, + ]); + } +} diff --git a/resources/views/livewire/production-non-planned.blade.php b/resources/views/livewire/production-non-planned.blade.php new file mode 100644 index 00000000..440e2b6f --- /dev/null +++ b/resources/views/livewire/production-non-planned.blade.php @@ -0,0 +1,30 @@ +
+
+

+ NON PLANNED PRODUCTION: +

+ +
+ + + + + + + + + + + @foreach ($nonPlannedRecords as $index => $item) + + + + + + + @endforeach + +
NoItem CodeCategoryNon Planned Quantity
{{ $index + 1 }}{{ $item['item_code'] }}{{ $item['item_category'] }}{{ $item['total_qty'] }}
+
+
+