diff --git a/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAEmail.Table.al b/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAEmail.Table.al index 8925b2f1ac3..300fc4f6fa5 100644 --- a/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAEmail.Table.al +++ b/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAEmail.Table.al @@ -73,6 +73,9 @@ table 4585 "SOA Email" key(Key2; "Agent User Security ID", Processed) { } + key(Key3; "Task ID", "Task Message ID") + { + } } internal procedure SetAgentMessageFields(var AgentTaskMessage: Record "Agent Task Message") diff --git a/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAEmailMessage.Page.al b/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAEmailMessage.Page.al index e1bcef4c525..7de0b86d6f3 100644 --- a/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAEmailMessage.Page.al +++ b/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAEmailMessage.Page.al @@ -72,6 +72,18 @@ page 4404 "SOA Email Message" Editable = false; } } + group(CcGroup) + { + ShowCaption = false; + + field(MessageCc; GlobalCcRecipients) + { + Caption = 'Cc'; + ToolTip = 'Specifies the email CC recipients.'; + Editable = false; + Importance = Additional; + } + } group(UnknownContact) { ShowCaption = false; @@ -341,6 +353,7 @@ page 4404 "SOA Email Message" begin GlobalMessageText := AgentMessage.GetText(Rec); GlobalPreviousMessageText := SOATaskMessage.GetPreviousText(Rec); + GlobalCcRecipients := SOATaskMessage.GetMessageCcRecipients(Rec); PreviousMessagesVisible := GlobalPreviousMessageText <> ''; IsMessageEditable := AgentMessage.IsEditable(Rec); AttachmentCount := SOAEmailSetup.GetNumberOfAttachments(Rec); @@ -498,6 +511,7 @@ page 4404 "SOA Email Message" FromGroupVisible: Boolean; ToGroupVisible: Boolean; GlobalSendToAddress: Text; + GlobalCcRecipients: Text; GlobalMessageText: Text; GlobalPreviousMessageText: Text; PreviousMessagesVisible: Boolean; diff --git a/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOASendReply.Codeunit.al b/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOASendReply.Codeunit.al index e5dce88e07c..2229a64c5c7 100644 --- a/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOASendReply.Codeunit.al +++ b/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOASendReply.Codeunit.al @@ -14,6 +14,7 @@ using System.Telemetry; codeunit 4419 "SOA Send Reply" { Access = Internal; + Permissions = tabledata "Email Inbox" = r; InherentEntitlements = X; InherentPermissions = X; TableNo = "Agent Task Message"; @@ -111,6 +112,20 @@ codeunit 4419 "SOA Send Reply" exit(''); end; + [TryFunction] + internal procedure TryGetMappedReplyCcRecipients(InputAgentTaskMessage: Record "Agent Task Message"; var CCRecipients: List of [Text]; var IsMappedReply: Boolean) + var + ToRecipients: List of [Text]; + MappedContactEmail: Text; + begin + Clear(CCRecipients); + Clear(IsMappedReply); + MappedContactEmail := GetMappedContactEmail(InputAgentTaskMessage); + IsMappedReply := MappedContactEmail <> ''; + if IsMappedReply then + GetMappedReplyRecipients(InputAgentTaskMessage, MappedContactEmail, ToRecipients, CCRecipients); + end; + /// /// Ensures that a mapped reply belongs to the selected SOA setup and is sent by its configured owner or agent. /// Mapped replies redirect the original thread, so this check is enforced independently of the codeunit's internal access. diff --git a/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOATaskMessage.Codeunit.al b/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOATaskMessage.Codeunit.al index aa6d977712f..adac37583d5 100644 --- a/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOATaskMessage.Codeunit.al +++ b/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOATaskMessage.Codeunit.al @@ -7,10 +7,12 @@ namespace Microsoft.Agent.SalesOrderAgent; using Microsoft.CRM.Contact; using System.Agents; +using System.Email; codeunit 4398 "SOA Task Message" { Access = Internal; + Permissions = tabledata "Email Inbox" = r; InherentEntitlements = X; InherentPermissions = X; @@ -121,6 +123,56 @@ codeunit 4398 "SOA Task Message" exit(true); end; + internal procedure GetMessageCcRecipients(AgentTaskMessage: Record "Agent Task Message"): Text + var + SourceAgentTaskMessage: Record "Agent Task Message"; + SOAEmail: Record "SOA Email"; + EmailInbox: Record "Email Inbox"; + EmailMessage: Codeunit "Email Message"; + SOASendReply: Codeunit "SOA Send Reply"; + CcRecipients: List of [Text]; + IsMappedReply: Boolean; + begin + SourceAgentTaskMessage := AgentTaskMessage; + if AgentTaskMessage.Type = AgentTaskMessage.Type::Output then begin + if not SourceAgentTaskMessage.Get(AgentTaskMessage."Task ID", AgentTaskMessage."Input Message ID") then + exit(''); + if not SOASendReply.TryGetMappedReplyCcRecipients(SourceAgentTaskMessage, CcRecipients, IsMappedReply) then + exit(''); + if IsMappedReply then + exit(RecipientsToText(CcRecipients)); + end; + + SOAEmail.SetLoadFields("Email Inbox ID"); + SOAEmail.SetRange("Task ID", SourceAgentTaskMessage."Task ID"); + SOAEmail.SetRange("Task Message ID", SourceAgentTaskMessage.ID); + if not SOAEmail.FindFirst() then + exit(''); + + EmailInbox.SetLoadFields("Message Id"); + if not EmailInbox.Get(SOAEmail."Email Inbox ID") then + exit(''); + if not EmailMessage.Get(EmailInbox."Message Id") then + exit(''); + + EmailMessage.GetRecipients(Enum::"Email Recipient Type"::Cc, CcRecipients); + exit(RecipientsToText(CcRecipients)); + end; + + local procedure RecipientsToText(Recipients: List of [Text]): Text + var + Recipient: Text; + RecipientsTextBuilder: TextBuilder; + begin + foreach Recipient in Recipients do begin + if RecipientsTextBuilder.Length() > 0 then + RecipientsTextBuilder.Append(';'); + RecipientsTextBuilder.Append(Recipient); + end; + + exit(RecipientsTextBuilder.ToText()); + end; + internal procedure MessageRequiresReview(SOASetup: Record "SOA Setup"; SenderAddress: Text; IsFirstMessageInTask: Boolean): Boolean var SOAFiltersImpl: Codeunit "SOA Filters Impl.";