argument('schedule_type'); $plantId = (int) $this->argument('plant'); $mailRules = AlertMailRule::where('module', 'ProcessOrder') ->where('rule_name', 'ProcessOrderMail') ->where('schedule_type', $scheduleType) ->where('plant', $plantId) ->get(); $plants = ($plantId == 0) ? Plant::all() : Plant::where('id', $plantId)->get(); $plantCodes = $plants->pluck('name', 'id'); if ($plants->isEmpty()) { $this->error('No valid plant(s) found.'); return; } if (strtolower($scheduleType) == 'daily') { $startDate = now()->subDay()->setTime(8, 0, 0); $endDate = now()->setTime(8, 0, 0); } $query = ProcessOrder::whereBetween('created_at', [$startDate, $endDate]); if ($plantId != 0) { $query->where('plant_id', $plantId); } $tableData = []; $no = 1; foreach ($plants as $plant) { $receivedSummary = ProcessOrder::query() ->where('plant_id', $plant->id) ->whereBetween('created_at', [$startDate, $endDate]) ->groupBy('process_order') ->select('process_order', DB::raw('SUM(received_quantity) as total_received')) ->pluck('total_received', 'process_order'); // $latestRecords = ProcessOrder::query() // ->where('plant_id', $plant->id) // ->whereBetween('created_at', [$startDate, $endDate]) // ->orderBy('process_order') // ->orderByDesc('created_at') // ->distinct('process_order') // ->selectRaw('MAX(coil_number) as max_coil_number') // ->with(['line', 'item']) // ->get(); $latestRecords = ProcessOrder::query() ->where('plant_id', $plant->id) ->whereBetween('created_at', [$startDate, $endDate]) ->whereIn('id', function ($query) use ($plant, $startDate, $endDate) { $query->selectRaw('MAX(id)') ->from('process_orders') ->where('plant_id', $plant->id) ->whereBetween('created_at', [$startDate, $endDate]) ->groupBy('process_order'); }) ->with(['line', 'item']) ->orderBy('process_order') ->get(); foreach ($latestRecords as $order) { $tableData[] = [ 'no' => $no++, 'plant' => $plant->name, 'line' => $order->line?->name ?? '-', 'machineName' => $order->machine_name, 'item' => $order->item?->code ?? '-', 'processOrder' => $order->process_order, 'coilNo' => $order->coil_number, 'orderQuan' => $order->order_quantity, 'recQuan' => $receivedSummary[$order->process_order] ?? 0, 'scrapQuan' => $order->scrap_quantity, 'sfgNo' => $order->sfg_number, ]; } } $noNotOk = 1; $NotOkData = []; foreach ($plants as $plant) { $processOrderTotals = DB::table('process_orders') ->where('plant_id', $plant->id) ->where('coil_number', '!=', 0) ->selectRaw(' process_order, COUNT(*) AS total_count ') ->groupBy('process_order') ->get() ->keyBy('process_order'); $statusCounts = DB::table('characteristic_values') ->where('plant_id', $plant->id) ->whereBetween('created_at', [$startDate, $endDate]) ->selectRaw(" process_order, SUM(CASE WHEN status = 'NotOk' THEN 1 ELSE 0 END) AS notok_count, SUM(CASE WHEN status = 'Ok' THEN 1 ELSE 0 END) AS ok_count ") ->groupBy('process_order') ->get() ->keyBy('process_order'); $latestRecords = CharacteristicValue::query() ->where('plant_id', $plant->id) ->whereBetween('created_at', [$startDate, $endDate]) ->orderBy('process_order') ->orderByDesc('created_at') ->distinct('process_order') ->with(['line', 'item']) ->get(); foreach ($latestRecords as $order) { $processOrder = $order->process_order; $total = $processOrderTotals[$processOrder]->total_count ?? 0; $notOk = $statusCounts[$processOrder]->notok_count ?? 0; $ok = $statusCounts[$processOrder]->ok_count ?? 0; $notOkPerc = $total > 0 ? round(($notOk / $total) * 100, 2) : 0; $okPerc = $total > 0 ? round(($ok / $total) * 100, 2) : 0; $NotOkData[] = [ 'no' => $noNotOk++, 'plant' => $plant->name, 'line' => $order->line?->name ?? '-', 'machineName' => $order->machine_name, 'item' => $order->item?->code ?? '-', 'processOrder' => $order->process_order, 'NotOkPerc' => $notOkPerc . '%', 'OkPerc' => $okPerc . '%', ]; } } $mail = new ProcessOrderMail($scheduleType, $tableData, $NotOkData); $contentVars = $mail->content()->with; foreach ($mailRules as $rule) { $toEmails = collect(explode(',', $rule->email)) ->map(fn ($e) => trim($e)) ->filter() ->unique() ->values() ->toArray(); $ccEmails = collect(explode(',', $rule->cc_emails)) ->map(fn ($e) => trim($e)) ->filter() ->unique() ->values() ->toArray(); if (empty($toEmails)) { $this->warn("Skipping rule ID {$rule->id} — no valid To emails found."); continue; } \Mail::to($toEmails)->cc($ccEmails)->send($mail); $this->info("Mail sent for rule ID {$rule->id} → To: ".implode(', ', $toEmails).($ccEmails ? ' | CC: '.implode(', ', $ccEmails) : '')); } } }