227 lines
8.4 KiB
PHP
227 lines
8.4 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Mail\InvoiceDataMail;
|
|
use App\Models\Line;
|
|
use App\Models\Plant;
|
|
use App\Models\ProductionPlan;
|
|
use App\Models\ProductionQuantity;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\Mail;
|
|
|
|
class SendInvoiceDataReport extends Command
|
|
{
|
|
/**
|
|
* The name and signature of the console command.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $signature = 'send:invoice-data-report {schedule_type} {plant}';
|
|
|
|
/**
|
|
* The console command description.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $description = 'Command description';
|
|
|
|
/**
|
|
* Execute the console command.
|
|
*/
|
|
|
|
public function handle()
|
|
{
|
|
$scheduleType = $this->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')->filter()->unique()->toArray();
|
|
|
|
$ccEmails = $mailRules->pluck('cc_emails')
|
|
->filter() // remove null or empty
|
|
->flatMap(function ($emails) {
|
|
return array_map('trim', explode(',', $emails));
|
|
})
|
|
->filter()
|
|
->unique()
|
|
->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(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 //
|
|
// 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.');
|
|
}
|
|
}
|
|
|
|
}
|