forked from fa/breadcrumb-the-shire
- New statuses: under_review - New DB fields: assigned_to, assigned_by, assigned_at, due_date (migration 012) - HandoverNotificationService: emails on assign and review-request - HandoverService: assign(), submitForReview(), resendNotification() - Assign page: manager selects employee + due date, resend notification - Create wizard: manager can assign during creation (step 1) - Edit page: "Submit for review" button for assignee, assign link for manager - List page: open/closed tabs, non-managers see only their assigned handovers - Email templates: handover_assigned + handover_review_requested (de/en) - i18n keys added for de and en Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
88 lines
3.5 KiB
PHP
88 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace MintyPHP\Module\Helpdesk\Service;
|
|
|
|
use MintyPHP\Service\Mail\MailService;
|
|
|
|
class HandoverNotificationService
|
|
{
|
|
public function __construct(
|
|
private readonly MailService $mailService,
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* Notify the assignee that a handover was assigned to them.
|
|
*
|
|
* @param array<string, mixed> $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 = appUrl('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' => appTitle(),
|
|
];
|
|
|
|
$subject = sprintf('[%s] Ihnen wurde eine Übergabe zugewiesen', appTitle());
|
|
|
|
$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<string, mixed> $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 = appUrl('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' => appTitle(),
|
|
];
|
|
|
|
$subject = sprintf('[%s] Übergabe wurde zur Prüfung eingereicht', appTitle());
|
|
|
|
$this->mailService->sendTemplate('handover_review_requested', $vars, $toEmail, $subject);
|
|
}
|
|
}
|