info('Approval mail job started'); $records = RequestCharacteristic::whereNull('approver_status1') ->whereNull('approver_status2') ->whereNull('approver_status3') ->get(); if ($records->isEmpty()) { $this->info('No pending approvals'); return; } $grouped = $records->groupBy(function ($item) { return $item->plant_id . '|' . $item->machine_id . '|' . $item->aufnr . '|' . $item->work_flow_id; }); $rows = []; foreach ($grouped as $groupRecords) { $first = $groupRecords->first(); $approver = CharacteristicApproverMaster::where('plant_id', $first->plant_id) ->where('machine_id', $first->machine_id) ->where('id', $first->characteristic_approver_master_id) ->first(); if (!$approver) { continue; } $characteristics = $groupRecords->map(fn ($r) => [ 'work_flow_id' => $r->work_flow_id, 'characteristic_name' => $r->characteristic_name, 'current_value' => $r->current_value, 'update_value' => $r->update_value, ])->toArray(); $level = null; $mail = null; $name = null; $updateData = []; $now = Carbon::now(); // --- FIRST MAIL --- if (is_null($first->mail_status)){ $level = 1; $mail = $approver->mail1; $name = $approver->name1; $updateData['mail_status'] = 'Sent'; // $updateData['trigger_at'] = $approver->duration1 > 0 // ? $now->copy()->addMinutes($approver->duration1 * 10) // : null; if ($approver->duration1 > 0) { $duration = number_format((float)$approver->duration1, 2, '.', ''); [$hours, $minutes] = explode('.', $duration); $totalMinutes = ((int)$hours * 60) + (int)$minutes; $updateData['trigger_at'] = $now ->copy() ->addMinutes($totalMinutes) ->startOfMinute(); } else { $updateData['trigger_at'] = null; } } // --- SECOND MAIL --- elseif ( $first->mail_status == 'Sent' && is_null($first->approver_status1) && $first->trigger_at && \Carbon\Carbon::parse($first->trigger_at)->lte($now) // $first->trigger_at <= $now ) { $level = 2; $mail = $approver->mail2; $name = $approver->name2; // $updateData['trigger_at'] = $approver->duration2 > 0 // ? $now->copy()->addMinutes($approver->duration2 * 10) // : null; // $updateData['mail_status'] = 'Sent-Mail2'; if ($approver->duration2 > 0) { $duration = number_format((float)$approver->duration2, 2, '.', ''); [$hours, $minutes] = explode('.', $duration); $totalMinutes = ((int)$hours * 60) + (int)$minutes; // IMPORTANT: use NOW, not old trigger $updateData['trigger_at'] = $now->copy()->addMinutes($totalMinutes); } else { $updateData['trigger_at'] = null; } $updateData['mail_status'] = 'Sent-Mail2'; } // --- THIRD MAIL --- elseif ( $first->mail_status == 'Sent-Mail2' && is_null($first->approver_status1) && is_null($first->approver_status2) && $first->trigger_at && // $first->trigger_at <= $now \Carbon\Carbon::parse($first->trigger_at)->lte($now) ) { $level = 3; $mail = $approver->mail3; $name = $approver->name3; $updateData['trigger_at'] = null; $updateData['mail_status'] = 'Sent-Mail3'; } if (!$level || !$mail) { continue; } $pdfPath = 'uploads/LaserDocs/' . $first->work_flow_id . '.pdf'; Mail::to($mail)->send( new CharacteristicApprovalMail( $first, $name, $level, $pdfPath, $characteristics ) ); RequestCharacteristic::whereIn('id', $groupRecords->pluck('id')) ->update($updateData); $rows[] = [ $first->id, $first->plant_id, $first->machine_id, "Level $level", $mail, 'SENT' ]; } $this->table( ['ID', 'Plant', 'Machine', 'Level', 'Mail', 'Status'], $rows ); $this->info('Approval mail job completed'); } }