diff --git a/app/Console/Commands/Scheduler.php b/app/Console/Commands/Scheduler.php index e32a451..6d75a9a 100644 --- a/app/Console/Commands/Scheduler.php +++ b/app/Console/Commands/Scheduler.php @@ -284,6 +284,40 @@ class Scheduler extends Command break; } } + + $vehicleReports = AlertMailRule::where('module', 'VehicleReport') + ->where('rule_name', 'VehicleReportMail') + ->select('plant', 'schedule_type') + ->distinct() + ->get(); + + foreach ($vehicleReports as $rule) { + switch ($rule->schedule_type) { + case 'Live': + // Run every minute + \Artisan::call('send:vehicle-report', [ + 'schedule_type' => $rule->schedule_type, + 'plant' => $rule->plant, + ]); + break; + case 'Hourly': + if (now()->minute == 0) { + \Artisan::call('send:vehicle-report', [ + 'schedule_type' => $rule->schedule_type, + 'plant' => $rule->plant, + ]); + } + break; + case 'Daily': + if (now()->format('H:i') == '07:59') { + \Artisan::call('send:vehicle-report', [ + 'schedule_type' => $rule->schedule_type, + 'plant' => $rule->plant, + ]); + } + break; + } + } } /** diff --git a/app/Console/Commands/SendVehicleReport.php b/app/Console/Commands/SendVehicleReport.php new file mode 100644 index 0000000..f255d42 --- /dev/null +++ b/app/Console/Commands/SendVehicleReport.php @@ -0,0 +1,132 @@ +argument('schedule_type'); + $plantId = (int) $this->argument('plant'); + + $mailRules = AlertMailRule::where('module', 'VehicleReport') + ->where('rule_name', 'VehicleReportMail') + ->where('schedule_type', $scheduleType) + ->get(); + + $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); + } + + foreach ($plants as $plant) { + + $vehicleEntries = VehicleEntry::select([ + 'vehicle_number', + 'entry_time', + 'exit_time', + 'duration', + 'type', + ]) + ->where('plant_id', $plant->id) + ->whereBetween('created_at', [$startDate, $endDate]) + ->get(); + + if ($vehicleEntries->isEmpty()) { + $this->warn("No records for {$plant->name}"); + continue; + } + + $tableData = []; + $no = 1; + + foreach ($vehicleEntries as $vehicleEntry) { + $tableData[] = [ + 'no' => $no++, + 'plant' => $plant->name, + 'vehicleNumber' => $vehicleEntry->vehicle_number, + 'entryTime' => $vehicleEntry->entry_time, + 'exitTime' => $vehicleEntry->exit_time, + 'duration' => $vehicleEntry->duration, + 'type' => $vehicleEntry->type, + ]; + } + + if ($plantId == 0) { + $rule = $mailRules->first(); + } else { + $rule = $mailRules->where('plant', $plant->id)->first(); + } + + if (!$rule) { + $this->warn("No mail rule for {$plant->name}"); + continue; + } + + $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(); + + $mail = new VehicleEntryMail( + $scheduleType, + $tableData, + 'Daily Vehicle Transit Report' + ); + + Mail::to($toEmails)->cc($ccEmails)->send($mail); + + $this->info("Mail sent for {$plant->name}"); + } + + } + + +} diff --git a/app/Mail/VehicleEntryMail.php b/app/Mail/VehicleEntryMail.php new file mode 100644 index 0000000..77aa42f --- /dev/null +++ b/app/Mail/VehicleEntryMail.php @@ -0,0 +1,90 @@ +scheduleType = $scheduleType; + $this->tableData = $tableData ?? []; + $this->mailSubject = $mailSubject ?? 'Vehicle Entry Report'; + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + return new Envelope( + subject: 'Vehicle Entry Mail', + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + $greeting = 'Dear Sir'; + + //$greeting1 = 'Dear C.R.I Branch Team,

Please follow and ensure the same'; + + if ($this->scheduleType == 'Daily') { + $reportPeriod = ""; + $greeting .= $reportPeriod; + } + + if ($this->scheduleType == 'Hourly') { + $now = now(); + $fromHour = $now->copy()->subHour()->format('H:i:s'); + $toHour = $now->format('H:i:s'); + $reportDate = $now->format('d/m/Y'); + $greeting .= "from: $reportDate, $fromHour to $toHour.

Please arrange to receipt the same immediately."; + } + + if ($this->scheduleType == 'Live') { + $now = now(); + $fromMinute = $now->copy()->subMinute()->format('d/m/Y H:i:s'); + $toMinute = $now->format('d/m/Y H:i:s'); + $greeting .= "from: $fromMinute to $toMinute.

Please arrange to receipt the same immediately."; + } + + return new Content( + view: 'mail.vehicle_entry_report', + with: [ + 'company' => 'CRI Digital Manufacturing Solutions', + 'greeting' => $greeting, + 'tableData' => $this->tableData, + 'wishes' => 'Thanks & Regards,
CRI Digital Manufacturing Solutions', + ], + ); + } + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/resources/views/mail/vehicle_entry_report.blade.php b/resources/views/mail/vehicle_entry_report.blade.php new file mode 100644 index 0000000..75a9d11 --- /dev/null +++ b/resources/views/mail/vehicle_entry_report.blade.php @@ -0,0 +1,92 @@ + + + + + Vehicle Entry Report + + + +
+ {{ $company }} +
+
+

{!! $greeting !!}

+
+ @if(empty($tableData)) +

No vehicle entry data available.

+ @else + + + + + + + + + + + + + + @foreach ($tableData as $row) + + + + + + + + + + @endforeach + +
NoPlant NameVehicle NumberEntry TimeExit TimeDurationType
{{ $loop->iteration }}{{ $row['plant'] }}{{ $row['vehicleNumber'] }}{{ $row['entryTime'] }}{{ $row['exitTime'] }}{{ $row['duration'] }}{{ $row['type'] }}
+ @endif +

{!! $wishes !!}

+
+ +