$latestMail['id'], 'subject' => $latestMail['subject'], 'from_name' => $latestMail['from_name'], 'from_email' => $latestMail['from_email'], 'received_human' => $latestMail['received_human'], 'web_link' => $latestMail['web_link'] ?? '/mail.php', ]; } } // 2. Jira Tickets Controle (rekening houdend met persoonlijke toewijzing & default queue filter zoals DX of SD) $userFilterCode = $user['default_jira_filter_code'] ?? ''; $jiraData = jira_get_user_issues($userId); $assignedIssues = $jiraData['assigned_issues'] ?? ($jiraData['issues'] ?? []); $teamIssues = $jiraData['team_issues'] ?? []; $dxValues = ['koppelingen', 'sso-koppeling', 'rest-endpoints', 'datadump', 'uwv-koppeling', 'migratie']; $relevantIssues = []; // Filter issues die specifiek relevant zijn voor deze medewerker foreach (array_merge($assignedIssues, $teamIssues) as $iss) { $isAssignedToMe = !empty($iss['assignee_name']) && (stripos($iss['assignee_name'], $user['name']) !== false || stripos($iss['assignee_name'], 'Niek') !== false); $ol = strtolower(trim($iss['onderwerp_logging'] ?? '')); $isQueueMatch = false; if (!empty($userFilterCode)) { if ($userFilterCode === 'DX' && in_array($ol, $dxValues)) { $isQueueMatch = true; } elseif ($userFilterCode === 'SD' && ($ol === '' || $ol === 'empty' || !in_array($ol, $dxValues))) { $isQueueMatch = true; } } if ($isAssignedToMe || $isQueueMatch) { $relevantIssues[$iss['key']] = $iss; } } $hasNewJira = false; $newJiraPayload = []; $newestJiraKey = ''; if (!empty($relevantIssues)) { // Pak het nieuwste ticket $newest = reset($relevantIssues); $newestJiraKey = $newest['key']; if (!empty($clientLastJiraKey) && $newestJiraKey !== $clientLastJiraKey) { $hasNewJira = true; $newJiraPayload = [ 'key' => $newest['key'], 'summary' => $newest['summary'], 'priority' => $newest['priority'] ?? 'Medium', 'issue_type' => $newest['issue_type'] ?? 'Taak', 'project' => $newest['project'] ?? 'SD', 'url' => $newest['url'] ?? ('/jira.php?highlight=' . $newest['key']), ]; } } // 3. Outlook Agenda Controle (Tijdlijn events van vandaag) $calendarChanged = false; $todayEvents = []; $stmtInt = $db->prepare("SELECT * FROM integrations WHERE user_id = ? AND provider = 'OUTLOOK' AND is_enabled = 1"); $stmtInt->execute([$userId]); $outlookInt = $stmtInt->fetch(); if ($outlookInt && !empty($outlookInt['access_token']) && empty($outlookInt['is_demo_mode'])) { $todayEvents = microsoft_fetch_today_events($userId, $today); } $calHash = md5(json_encode(array_map(function($e) { return ($e['id'] ?? '') . ($e['start'] ?? '') . ($e['end'] ?? '') . ($e['subject'] ?? ''); }, $todayEvents))); if (!empty($clientCalendarHash) && $calHash !== $clientCalendarHash) { $calendarChanged = true; } // 4. Update sync timestamps in database $stmtUpdate = $db->prepare("UPDATE users SET last_mail_check_at = NOW(), last_jira_check_at = NOW() WHERE id = ?"); $stmtUpdate->execute([$userId]); echo json_encode([ 'success' => true, 'server_time' => date('H:i:s'), 'mail' => [ 'has_new' => $hasNewMail, 'unread_count' => $unreadCount, 'latest_id' => $latestMail['id'] ?? '', 'new_mail' => $newMailPayload, ], 'jira' => [ 'has_new' => $hasNewJira, 'newest_key' => $newestJiraKey, 'new_issue' => $newJiraPayload, ], 'calendar' => [ 'has_changes' => $calendarChanged, 'hash' => $calHash, 'count' => count($todayEvents), ], ]); exit; } catch (Throwable $e) { http_response_code(500); echo json_encode([ 'success' => false, 'error' => $e->getMessage(), ]); }