appTitle !== '' ? $this->appTitle : appTitle(); } private function resolveAppUrl(string $path = ''): string { if ($this->appUrl !== '') { return rtrim($this->appUrl, '/') . ($path !== '' ? '/' . ltrim($path, '/') : ''); } return appUrl($path); } /** * Notify the assignee that a handover was assigned to them. * * @param array $handover Row from HandoverRepository::findById (includes joined user fields) */ public function notifyAssigned(array $handover): void { $toEmail = trim((string) ($handover['assigned_to_email'] ?? '')); if ($toEmail === '') { return; } $assigneeName = trim((string) ($handover['assigned_to_label'] ?? $toEmail)); $assignedByName = trim((string) ($handover['assigned_by_label'] ?? '')); $debitorName = trim((string) ($handover['debitor_name'] ?? '')); $domainUrl = trim((string) ($handover['domain_url'] ?? '')); $dueDate = trim((string) ($handover['due_date'] ?? '')); $handoverId = (int) ($handover['id'] ?? 0); $handoverUrl = $this->resolveAppUrl('helpdesk/handovers/edit/' . $handoverId); $vars = [ 'assignee_name' => $assigneeName, 'assigned_by_name' => $assignedByName, 'debitor_name' => $debitorName !== '' ? $debitorName : '—', 'domain_url' => $domainUrl !== '' ? $domainUrl : '—', 'due_date' => $dueDate !== '' ? $dueDate : '—', 'handover_url' => $handoverUrl, 'app_name' => $this->resolveAppTitle(), ]; $subject = sprintf('[%s] Ihnen wurde eine Übergabe zugewiesen', $this->resolveAppTitle()); $this->mailService->sendTemplate('handover_assigned', $vars, $toEmail, $subject); } /** * Notify managers that a handover was submitted for review. * Sends to the person who assigned (assigned_by), falling back to created_by. * * @param array $handover */ public function notifyReviewRequested(array $handover): void { // Notify the assigning manager (assigned_by) — email not directly stored, use created_by as fallback // We send to assigned_by_email if it was joined; otherwise notify created_by_email. // Since the repository joins assigned_by as assigned_by_label but not email, // we notify the assignee's manager via a generic approach: send to created_by. // This is intentionally simple — the manager who assigned will get the email. $toEmail = trim((string) ($handover['assigned_by_email'] ?? '')); if ($toEmail === '') { return; } $managerName = trim((string) ($handover['assigned_by_label'] ?? $toEmail)); $assigneeName = trim((string) ($handover['assigned_to_label'] ?? '')); $debitorName = trim((string) ($handover['debitor_name'] ?? '')); $domainUrl = trim((string) ($handover['domain_url'] ?? '')); $handoverId = (int) ($handover['id'] ?? 0); $handoverUrl = $this->resolveAppUrl('helpdesk/handovers/edit/' . $handoverId); $vars = [ 'manager_name' => $managerName, 'assignee_name' => $assigneeName !== '' ? $assigneeName : '—', 'debitor_name' => $debitorName !== '' ? $debitorName : '—', 'domain_url' => $domainUrl !== '' ? $domainUrl : '—', 'handover_url' => $handoverUrl, 'app_name' => $this->resolveAppTitle(), ]; $subject = sprintf('[%s] Übergabe wurde zur Prüfung eingereicht', $this->resolveAppTitle()); $this->mailService->sendTemplate('handover_review_requested', $vars, $toEmail, $subject); } }