info('Approval mail job started'); // .. Characteristic Mail trigger logic // $records = RequestCharacteristic::whereNull('approver_status1') // ->whereNull('approver_status2') // ->whereNull('approver_status3') // ->get(); $records = RequestCharacteristic::where(function ($q) { $q->whereNull('approver_status1') ->orWhere('approver_status1', 'Hold'); }) ->where(function ($q) { $q->whereNull('approver_status2') ->orWhere('approver_status2', 'Hold'); }) ->where(function ($q) { $q->whereNull('approver_status3') ->orWhere('approver_status3', 'Hold'); }) ->get(); $records = $records->filter(function ($item) { $approver = CharacteristicApproverMaster::find($item->characteristic_approver_master_id); return $approver && $approver->approver_type == 'Characteristic'; }); if ($records->isEmpty()) { $this->info('No pending approvals'); return; } $grouped = $records->groupBy(function ($item) { $this->wfId = $item->work_flow_id; return $item->plant_id . '|' . $item->machine_id . '|' . $item->aufnr . '|' . $item->work_flow_id; }); $pendingApprovers = RequestCharacteristic::where('work_flow_id', $this->wfId)->latest()->first(); $this->info($pendingApprovers->approver_status1, $pendingApprovers->approver_status2); $approverNameFromMaster = null; if ($pendingApprovers && $pendingApprovers->characteristic_approver_master_id) { $approverNameFromMaster = CharacteristicApproverMaster::find($pendingApprovers->characteristic_approver_master_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'; 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->approver_status1 == 'Hold') && $first->trigger_at && \Carbon\Carbon::parse($first->trigger_at)->lte($now) ) { $this->info( "mail_status: {$first->mail_status}, ". "approver_status1: {$first->approver_status1}, ". "trigger_at: {$first->trigger_at}, ". "now: {$now}" ); $level = 2; $mail = $approver->mail2; $name = $approver->name2; if ($approver->duration2 > 0) { $duration = number_format((float)$approver->duration2, 2, '.', ''); [$hours, $minutes] = explode('.', $duration); $totalMinutes = ((int)$hours * 60) + (int)$minutes; $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) || $first->approver_status1 == 'Hold') && (is_null($first->approver_status2) || $first->approver_status2 == 'Hold') && $first->trigger_at && \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'; $subjectLine = 'Characteristic Approval Mail'; Mail::to($mail)->send( new CharacteristicApprovalMail( $first, $name, $level, $pdfPath, $pendingApprovers, $approverNameFromMaster, $subjectLine, $characteristics ) ); RequestCharacteristic::whereIn('id', $groupRecords->pluck('id')) ->update($updateData); $rows[] = [ $first->id, $first->plant_id, $first->machine_id, "Level $level", $mail, 'SENT' ]; } // .. Quality Mail trigger logic $qualityRecords = RequestCharacteristic::where(function ($q) { $q->whereNull('approver_status1') ->orWhere('approver_status1', 'Hold'); }) ->where(function ($q) { $q->whereNull('approver_status2') ->orWhere('approver_status2', 'Hold'); }) ->where(function ($q) { $q->whereNull('approver_status3') ->orWhere('approver_status3', 'Hold'); }) ->get(); $qualityRecords = $qualityRecords->filter(function ($item) { $approver = CharacteristicApproverMaster::find($item->characteristic_approver_master_id); return $approver && $approver->approver_type == 'Quality'; }); if ($qualityRecords->isEmpty()) { $this->info('No quality pending approvals'); return; } $grouped = $qualityRecords->groupBy(function ($item) { $this->wfId = $item->work_flow_id; return $item->plant_id . '|' . $item->machine_id . '|' . $item->aufnr . '|' . $item->work_flow_id; }); $pendingApprovers = RequestCharacteristic::where('work_flow_id', $this->wfId)->latest()->first(); $approverNameFromMaster = null; if ($pendingApprovers && $pendingApprovers->characteristic_approver_master_id) { $approverNameFromMaster = CharacteristicApproverMaster::find($pendingApprovers->characteristic_approver_master_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; } $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'; 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->approver_status1 == 'Hold') && $first->trigger_at && \Carbon\Carbon::parse($first->trigger_at)->lte($now) ) { $level = 2; $mail = $approver->mail2; $name = $approver->name2; 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) || $first->approver_status1 == 'Hold') && (is_null($first->approver_status2) || $first->approver_status2 == 'Hold') && $first->trigger_at && \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 = ($f = glob(storage_path('app/private/uploads/LaserDocs/' . $first->work_flow_id . '.*'))) ? 'uploads/LaserDocs/' . basename($f[0]) : null; $this->info( $pdfPath); $subjectLine = 'Quality Approval Mail'; Mail::to($mail)->send( new CharacteristicApprovalMail( $first, $name, $level, $pdfPath, $pendingApprovers, $approverNameFromMaster, $subjectLine, $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'); } }