'loadProductionData', 'loadData1' => 'exportProductionData', ]; public function getMonthDates($month, $year) { $start = Carbon::createFromDate($year, $month, 1); $days = $start->daysInMonth; $dates = []; for ($i = 1; $i <= $days; $i++) { $dates[] = Carbon::createFromDate($year, $month, $i) ->format('Y-m-d'); } return $dates; } public function loadProductionData($plantId, $lineId, $month, $year){ if (!$plantId || !$lineId || !$month || !$year) { $this->records = []; $this->dates = []; $this->leaveDates = []; return; } $this->dates = $this->getMonthDates($month, $year); $data = 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.created_at', 'production_plans.operator_id', 'plants.name as plant', 'items.code as item_code', 'items.description as item_description', 'lines.name as line_name', 'production_plans.leave_dates' ) ->first(); if ($data && $data->leave_dates) { $this->leaveDates = array_map('trim', explode(',', $data->leave_dates)); } $producedData = ProductionQuantity::selectRaw(" plant_id, line_id, item_id, DATE(created_at) as prod_date, COUNT(*) as total_qty ") ->where('plant_id', $plantId) ->where('line_id', $lineId) ->whereMonth('created_at', $month) ->whereYear('created_at', $year) ->groupBy('plant_id', 'line_id', 'item_id', DB::raw('DATE(created_at)')) ->get() ->groupBy(function ($row) { return $row->plant_id . '_' . $row->line_id . '_' . $row->item_id; }) ->map(function ($group) { return $group->keyBy('prod_date'); }); $this->records = 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', 'items.code as item_code', 'items.description as item_description', 'lines.name as line_name', 'plants.name as plant_name' ) ->get() // ->map(function ($row) use ($producedData) { // $row = $row->toArray(); // $row['daily_target'] = ($row['working_days'] > 0) // ? round($row['plan_quantity'] / $row['working_days'], 2) // : 0; // // $key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id']; // // foreach ($this->dates as $date) { // // $found = $producedData[$key][$date] ?? null; // // $row['produced_quantity'][$date] = $found->total_qty ?? 0; // // } // $remainingDays = $row['working_days']; // $pendingQty = 0; // $row['daily_target_dynamic'] = []; // $row['produced_quantity'] = []; // $key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id']; // foreach ($this->dates as $date) { // $found = $producedData[$key][$date] ?? null; // $producedQty = $found->total_qty ?? 0; // // today's adjusted target // $todayTarget = $baseDailyTarget; // if ($remainingDays > 1 && $pendingQty > 0) { // $todayTarget += $pendingQty / $remainingDays; // } // $row['daily_target_dynamic'][$date] = round($todayTarget, 2); // $row['produced_quantity'][$date] = $producedQty; // // calculate today's shortfall // $pendingQty += ($todayTarget - $producedQty); // if ($pendingQty < 0) { // $pendingQty = 0; // } // $remainingDays--; // } // return $row; // }) ->map(function ($row) use ($producedData) { $row = $row->toArray(); $remainingQty = $row['plan_quantity']; $remainingDays = $row['working_days']; $row['daily_target_dynamic'] = []; $row['produced_quantity'] = []; $key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id']; foreach ($this->dates as $date) { // Skip leave dates if (in_array($date, $this->leaveDates)) { $row['daily_target_dynamic'][$date] = '-'; $row['produced_quantity'][$date] = '-'; continue; } $todayTarget = $remainingDays > 0 ? round($remainingQty / $remainingDays, 2) : 0; //$todayTarget = $remainingDays > 0 // ? $remainingQty / $remainingDays // : 0; $producedQty = isset($producedData[$key][$date]) ? $producedData[$key][$date]->total_qty : 0; $row['daily_target_dynamic'][$date] = $todayTarget; $row['produced_quantity'][$date] = $producedQty; // Carry forward pending $remainingQty -= $producedQty; if ($remainingQty < 0) { $remainingQty = 0; } $remainingDays--; } return $row; }) ->toArray(); } public function exportProductionData() { return Excel::download( new ProductionPlanExport($this->records, $this->dates), 'production_plan_data.xlsx' ); } public function render() { // return view('livewire.production-target-plan'); return view('livewire.production-target-plan', [ 'records' => $this->records, 'dates' => $this->dates, ]); } }