argument('schedule_type'); $plantId = (int) $this->argument('plant'); // cast to int for safety // Fetch mail rules based on schedule type $mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceDataReport') ->where('rule_name', 'InvoiceDataMail') ->where('schedule_type', $scheduleType) ->where('plant', $plantId) ->get(); $emails = $mailRules->pluck('email')->unique()->toArray(); //$ccEmails = $mailRules->pluck('cc_email')->filter()->unique()->toArray(); //$this->info('Found emails: ' . implode(', ', $emails)); $plants = $plantId == 0 ? Plant::all() : Plant::where('id', $plantId)->get(); 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); } else { $startDate = now()->setTime(8, 0, 0); $endDate = now()->copy()->addDay()->setTime(8, 0, 0); } // $tableData = []; // $no = 1; // foreach ($plants as $plant) { // $distributions = ['Direct Sale', 'Branch Sale', 'Internal Transfer']; // foreach ($distributions as $selectedDistribution) { // // Get invoice records // $invoices = \App\Models\InvoiceDataValidation::where('plant_id', $plant->id) // ->where('distribution_channel_desc', $selectedDistribution) // ->whereBetween('document_date', [$startDate, $endDate]) // ->select('customer_code', 'document_number', 'document_date', 'customer_trade_name', 'customer_location') // ->distinct('document_number') // ->get(); // if ($invoices->isEmpty()) { // $tableData[] = [ // 'no' => $no++, // 'plant' => $plant->name, // 'distribution_type' => $selectedDistribution, // 'customer_code' => '-', // 'document_number' => '-', // 'document_date' => '-', // 'customer_trade_name' => '-', // 'customer_location' => '-', // 'status' => 'No Invoices', // ]; // continue; // } // // Fetch which invoices actually went out // $wentOutInvoices = \App\Models\InvoiceOutValidation::where('plant_id', $plant->id) // ->whereIn('qr_code', $invoices->pluck('document_number')->toArray()) // ->whereBetween('scanned_at', [$startDate, $endDate]) // ->distinct('qr_code') // ->pluck('qr_code') // ->toArray(); // foreach ($invoices as $inv) { // $status = in_array($inv->document_number, $wentOutInvoices) // ? 'Went Out' // : 'Pending'; // $tableData[] = [ // 'no' => $no++, // 'plant' => $plant->name, // 'distribution_type' => $selectedDistribution, // 'customer_code' => $inv->customer_code, // 'document_number' => $inv->document_number, // 'document_date' => $inv->document_date, // 'customer_trade_name' => $inv->customer_trade_name, // 'customer_location' => $inv->customer_location, // 'status' => $status, // ]; // } // } // } $tableData = []; $no = 1; foreach ($plants as $plant) { $distributions = ['Direct Sale', 'Branch Sale', 'Internal Transfer']; foreach ($distributions as $selectedDistribution) { $invoices = \App\Models\InvoiceDataValidation::where('plant_id', $plant->id) ->where('distribution_channel_desc', $selectedDistribution) ->whereBetween('document_date', [$startDate, $endDate]) ->select('customer_code', 'document_number', 'document_date', 'customer_trade_name', 'customer_location') ->distinct('document_number') ->get(); if ($invoices->isEmpty()) { continue; } $wentOutInvoices = \App\Models\InvoiceOutValidation::where('plant_id', $plant->id) ->whereIn('qr_code', $invoices->pluck('document_number')->toArray()) ->whereBetween('scanned_at', [$startDate, $endDate]) ->distinct('qr_code') ->pluck('qr_code') ->toArray(); $pendingInvoices = $invoices->filter(function ($inv) use ($wentOutInvoices) { return !in_array($inv->document_number, $wentOutInvoices); }); if ($pendingInvoices->isEmpty()) { continue; } foreach ($pendingInvoices as $inv) { $tableData[] = [ 'no' => $no++, 'plant' => $plant->name, 'distribution_type' => $selectedDistribution, 'customer_code' => $inv->customer_code, 'document_number' => $inv->document_number, 'document_date' => $inv->document_date, 'customer_trade_name' => $inv->customer_trade_name, 'customer_location' => $inv->customer_location, 'status' => 'Pending', ]; } } } $mail = new InvoiceDataMail($scheduleType, $tableData); $contentVars = $mail->content()->with; $this->info($contentVars['greeting'] ?? 'Invoice Data Report'); $this->table( ['No', 'Plant', 'Distribution Type', 'Customer Code', 'Document Number', 'Document Date', 'Trade Name', 'Location', 'Status'], $tableData ); $this->info($contentVars['wishes'] ?? ''); // Send Mail //->cc($ccEmails) if (!empty($emails)) { foreach ($emails as $email){ \Mail::to($email)->send(new InvoiceDataMail($scheduleType, $tableData)); } $this->info("Invoice data report sent to " . count($emails) . " recipient(s)."); } else { $this->warn('No recipients found for InvoiceDataMail.'); } } }