diff --git a/csharp/App/Backend/Controller.cs b/csharp/App/Backend/Controller.cs index 8e1edc6f5..4a9aa699a 100644 --- a/csharp/App/Backend/Controller.cs +++ b/csharp/App/Backend/Controller.cs @@ -2134,6 +2134,31 @@ public class Controller : ControllerBase }); } + var assigneeChanged = ticket.AssigneeId != existing.AssigneeId + && ticket.AssigneeId.HasValue; + + if (assigneeChanged) + { + var assignee = Db.GetUserById(ticket.AssigneeId); + + Db.Create(new TicketTimelineEvent + { + TicketId = ticket.Id, + EventType = (Int32)TimelineEventType.Assigned, + Description = $"Ticket assigned to {assignee?.Name ?? "unknown"}.", + ActorType = (Int32)TimelineActorType.Human, + ActorId = user.Id, + CreatedAt = DateTime.UtcNow + }); + + if (assignee is not null) + _ = Task.Run(async () => + { + try { await assignee.SendTicketAssignedEmail(ticket); } + catch (Exception ex) { Console.WriteLine($"Failed to send ticket assignment email: {ex}"); } + }); + } + return Db.Update(ticket) ? ticket : StatusCode(500, "Update failed."); } diff --git a/csharp/App/Backend/DataTypes/Methods/User.cs b/csharp/App/Backend/DataTypes/Methods/User.cs index 5792993e6..9448176df 100644 --- a/csharp/App/Backend/DataTypes/Methods/User.cs +++ b/csharp/App/Backend/DataTypes/Methods/User.cs @@ -297,5 +297,66 @@ public static class UserMethods return user.SendEmail(subject, body); } - + + public static Task SendTicketAssignedEmail(this User user, Ticket ticket) + { + var ticketLink = $"https://monitor.inesco.energy/tickets/{ticket.Id}"; + var priority = (TicketPriority)ticket.Priority; + var category = (TicketCategory)ticket.Category; + + var (subject, body) = (user.Language ?? "en") switch + { + "de" => ( + $"inesco Energy – Ticket #{ticket.Id} wurde Ihnen zugewiesen", + $"Sehr geehrte/r {user.Name},\n\n" + + $"Ein Ticket wurde Ihnen zugewiesen:\n\n" + + $"Ticket: #{ticket.Id}\n" + + $"Betreff: {ticket.Subject}\n" + + $"Priorität: {priority}\n" + + $"Kategorie: {category}\n\n" + + $"Beschreibung:\n{ticket.Description}\n\n" + + $"Öffnen Sie das Ticket hier: {ticketLink}\n\n" + + "Mit freundlichen Grüssen\ninesco Energy Monitor" + ), + "fr" => ( + $"inesco Energy – Le ticket #{ticket.Id} vous a été attribué", + $"Cher/Chère {user.Name},\n\n" + + $"Un ticket vous a été attribué :\n\n" + + $"Ticket : #{ticket.Id}\n" + + $"Objet : {ticket.Subject}\n" + + $"Priorité : {priority}\n" + + $"Catégorie : {category}\n\n" + + $"Description :\n{ticket.Description}\n\n" + + $"Ouvrir le ticket : {ticketLink}\n\n" + + "Cordialement,\ninesco Energy Monitor" + ), + "it" => ( + $"inesco Energy – Il ticket #{ticket.Id} le è stato assegnato", + $"Gentile {user.Name},\n\n" + + $"Le è stato assegnato un ticket:\n\n" + + $"Ticket: #{ticket.Id}\n" + + $"Oggetto: {ticket.Subject}\n" + + $"Priorità: {priority}\n" + + $"Categoria: {category}\n\n" + + $"Descrizione:\n{ticket.Description}\n\n" + + $"Aprire il ticket: {ticketLink}\n\n" + + "Cordiali saluti,\ninesco Energy Monitor" + ), + _ => ( + $"inesco Energy – Ticket #{ticket.Id} has been assigned to you", + $"Dear {user.Name},\n\n" + + $"A ticket has been assigned to you:\n\n" + + $"Ticket: #{ticket.Id}\n" + + $"Subject: {ticket.Subject}\n" + + $"Priority: {priority}\n" + + $"Category: {category}\n\n" + + $"Description:\n{ticket.Description}\n\n" + + $"Open the ticket: {ticketLink}\n\n" + + "Best regards,\ninesco Energy Monitor" + ) + }; + + return user.SendEmail(subject, body); + } + } \ No newline at end of file