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_emails')->filter()->unique()->toArray(); // $this->info('Found emails: ' . implode(', ', $ccEmails)); $mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceDataReport') ->where('rule_name', 'InvoiceDataMail') ->where('schedule_type', $scheduleType) ->where('plant', $plantId) ->get(); // $toEmails = $mailRules->pluck('email') // ->flatMap(function ($emails) { // return array_map('trim', explode(',', $emails)); // }) // ->filter() // ->toArray(); // $ccEmails = $mailRules->pluck('cc_emails') // ->filter() // remove null or empty // ->flatMap(function ($emails) { // return array_map('trim', explode(',', $emails)); // }) // ->filter() // ->toArray(); $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(10, 0, 0);//8:00 // $endDate = now()->setTime(10, 0, 0);//8 // } if (strtolower($scheduleType) == 'daily') { $firstRecord = \App\Models\InvoiceDataValidation::orderBy('document_date', 'asc')->first(); $lastRecord = \App\Models\InvoiceDataValidation::orderBy('document_date', 'desc')->first(); if ($firstRecord && $lastRecord) { $startDate = \Carbon\Carbon::parse($firstRecord->document_date)->startOfDay(); $endDate = \Carbon\Carbon::parse($lastRecord->document_date)->endOfDay(); } else { $startDate = now()->startOfDay(); $endDate = now()->endOfDay(); } } 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', 'WOS']; // 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', 'Document Number', 'Document Date', 'Trade Name', 'Location', 'Status'],//'Distribution Type', 'Customer Code', // $tableData // ); // $this->info($contentVars['wishes'] ?? ''); // Send Mail // // if (!empty($emails)) { // foreach ($emails as $email){ // \Mail::to($email)->cc($ccEmails)->send(new InvoiceDataMail($scheduleType, $tableData)); // } // $this->info("Invoice data report sent to " . count($emails) . " recipient(s)."); // } // if (!empty($toEmails)) { // foreach ($toEmails as $email){ // \Mail::to($email)->cc($ccEmails)->send(new InvoiceDataMail($scheduleType, $tableData)); // } // $this->info("Invoice data report sent to " . count($toEmails) . " recipient(s)."); // } // else { // $this->warn('No recipients found for InvoiceDataMail.'); // } //.. foreach ($plants as $plant) { $tableData = []; $no = 1; $distributions = ['Direct Sale', 'Branch Sale', 'Internal Transfer', 'WOS']; 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', // ]; // } foreach ($pendingInvoices as $inv) { // $documentDate = \Carbon\Carbon::parse($inv->document_date); // $now = \Carbon\Carbon::now(); $endDate = now()->copy()->subDay()->setTime(10, 0, 0); //$hoursDiff = $documentDate->diffInHours($now); $statusColor = $endDate <= $inv->document_date ? 'status-pending-yellow' : 'status-pending-red'; $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', 'status_class' => $statusColor, ]; } } $mail = new InvoiceDataMail($scheduleType, $tableData); $contentVars = $mail->content()->with; $this->info($contentVars['greeting'] ?? 'Invoice Data Report'); $this->table( ['No', 'Plant', 'Document Number', 'Document Date', 'Trade Name', 'Location', 'Status'],//'Distribution Type', 'Customer Code', $tableData ); $this->info($contentVars['wishes'] ?? ''); 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) : '')); } } } }