﻿<?xml version="1.0" encoding="utf-8"?>
<AlvaoApplication xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ModelVersion="1">
  <Applications>
    <Application id="58">
      <Name>Decline Message Send Custom Notification</Name>
      <Description>Modify the notification of message rejection because the sender does not have SLA.</Description>
      <Scripts>
        <Script id="2878">
          <Name>DeclineMessageSendCustomNotification</Name>
          <Code>using System;
using Microsoft.Data.SqlClient;
using System.Net.Mail;
using Alvao.API;
using Alvao.Apps.API;

public class DeclineMessageSendCustomNotification : IMailMessageAutoAction
{
    public string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public DeclineMessageSendCustomNotification()
    {
        name = "Send your own notification about request denial because of SLA reasons";
    }

    public bool OnMessageReceived(SqlConnection con, SqlTransaction trans, Rebex.Mail.MailMessage message, int sectionId, int ticketId, int fromPersonId)
    {       
        bool supportedService = Array.Exists(Settings.SupportedServices, element =&gt; element == sectionId);
        if (ticketId == 0 &amp;&amp; supportedService)
        {            
            if (!Helpers.UserHasSla(fromPersonId, sectionId, con, trans))
            {
                // Last two parameters are localization texts for HTML body message.
                // If you want to add more, or swap for different language, modify this method call and method GetMailBody in Helpers script.
                MailMessage msg = Helpers.GetMailBody(sectionId, message, fromPersonId, Settings.MailMessageCzech, Settings.MailMessageEnglish);
                Alvao.API.Common.Email.Queue(msg);
                return false;
            }
            return true;
        }
        else
        {
            return true;  
        }
    }
}</Code>
          <IsLibCode>false</IsLibCode>
        </Script>
        <Script id="2879">
          <Name>Settings</Name>
          <Code>using System;
using System.Collections.Generic;
using System.IO;

public static class Settings
{
    // Services on which the automatic action is triggered.
    // Enter service IDs, separated by commas.
    public static int[] SupportedServices = { }; // Example service IDs: 1, 2, 3

    // Example of mail message.
	public static string MailMessageCzech = 
		"Dobrý den, \r\n\r\n" +
		"odeslali jste zprávu na adresu, která slouží pouze pro komunikaci v rámci řešení požadavků v systému ALVAO.\r\n" +
		"Pro založení požadavku/nahlášení incidentu přejděte prosím na: https://servicedesk.contoso.com/Alvao/\r\n" +
		"V případě, že potřebujete kontaktovat oddělení, které má tuto oblast na starosti, použijte prosím kontakty dostupné na intranetu.\r\n\r\n" +
		"Děkujeme za pochopení,\r\n" + 
		"Tým ALVAO SD \r\n\r\n\r\n";

	public static string MailMessageEnglish = 
		"Hello, \r\n\r\n" +
		"You have sent a message to an address that is only used for communication within the ALVAO system.\r\n" +
		"To create a request/incident report, please go to: https://servicedesk.contoso.com/Alvao/\r\n" +
		"In case you need to contact the department in charge of this area, please use the contacts available on the intranet.\r\n\r\n" +
		"Thank you for your understanding,\r\n" + 
		"ALVAO SD team \r\n\r\n\r\n";
}</Code>
          <IsLibCode>true</IsLibCode>
        </Script>
        <Script id="2880">
          <Name>Helpers</Name>
          <Code>using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net.Mail;
using System.Web;
using Microsoft.Data.SqlClient;
using Alvao.Apps.API;
using Alvao.API.Common;
using Alvao.API.SD;
using Dapper;

public static class Helpers
{
	public static string MailMessageCzech;
	public static string MailMessageEnglish;

	// Chekcs if the user has SLA in the service.
	public static bool UserHasSla(int requesterId, int sectionId, SqlConnection con, SqlTransaction trans)
	{          
		var slaCount = con.QueryFirstOrDefault&lt;int?&gt;(@"SELECT COUNT(*) FROM vSlaAccess WHERE liSlaAccessPersonId = @requesterId AND liSlaAccessHdSectionId = @sectionId", 
		new { requesterId, sectionId }, trans);

		return slaCount.GetValueOrDefault(0) &gt; 0;
	}

	// Get e-mail service.
	public static string GetSectionEmail(int sectionId)
	{
		var section = Section.GetById(sectionId);
		return section?.sHdSectionEmail ?? string.Empty;
	}

		// Creation of message body.
	public static MailMessage GetMailBody(int sectionId, Rebex.Mail.MailMessage message, int fromPersonId, string mailMessageCzech, string mailMessageEnglish)
	{  	
		MailMessageCzech = mailMessageCzech; // Defined at the beginning of Helpers class. Used in Localization class.
		MailMessageEnglish = mailMessageEnglish; // Defined at the beginning of Helpers class. Used in Localization class.

		var replyMessage = new MailMessage();
	
		replyMessage.From = new System.Net.Mail.MailAddress(Helpers.GetSectionEmail(sectionId));                  
		replyMessage.To.Add(message.From.ToString());

		if (!message.Subject.StartsWith("Re:", StringComparison.OrdinalIgnoreCase))
			replyMessage.Subject = "Re: ";

		replyMessage.Subject += message.Subject;		

		string htmlBody = GetClearHtmlHead();
		htmlBody += Localization.GetLocalization(fromPersonId, "MailMessage");

		string newMessage = "&lt;hr noshade style=\"border: 0;color: #B5C4DF;background-color: #B5C4DF;height:1px;\"&gt;";
		newMessage += "&lt;span class=\"quoted_header_font\"&gt;";
		newMessage += "&lt;b&gt;" + HttpUtility.HtmlEncode(Localization.GetLocalization(fromPersonId, "From")) + ": &lt;/b&gt;" + HttpUtility.HtmlEncode(message.From) + "&lt;br /&gt;";
		newMessage += "&lt;b&gt;" + HttpUtility.HtmlEncode(Localization.GetLocalization(fromPersonId, "DateSent")) + ": &lt;/b&gt;" + HttpUtility.HtmlEncode(message.Date) + "&lt;br /&gt;";
		newMessage += "&lt;b&gt;" + HttpUtility.HtmlEncode(Localization.GetLocalization(fromPersonId, "To")) + ": &lt;/b&gt;" + HttpUtility.HtmlEncode(message.To) + "&lt;br /&gt;";
		newMessage += "&lt;b&gt;" + HttpUtility.HtmlEncode(Localization.GetLocalization(fromPersonId, "SubjectMail")) + ": &lt;/b&gt;" + HttpUtility.HtmlEncode(message.Subject) + "&lt;br /&gt;";

		newMessage += "&lt;/span&gt;&lt;br /&gt;&lt;span class=\"quoted_text_font\"&gt;";
		newMessage += HttpUtility.HtmlEncode(message.BodyText).Replace("\n", "&lt;br /&gt;");
		newMessage += "&lt;/span&gt;";
		htmlBody += newMessage;

		htmlBody += "&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;";
		htmlBody = htmlBody.Replace("\r\n", "&lt;br /&gt;");
		replyMessage.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(htmlBody, System.Text.Encoding.UTF8, "text/html"));

		return replyMessage;
	}

	public static string GetClearHtmlHead()
	{
		string head = "";
		string CSS = "";

		head += "&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;style&gt;";

		CSS = DbProperty.HTMLHeader;
		CSS = CSS.Replace("};.", "}.");
		CSS = CSS.Replace("\r\n", "");
		CSS += ".msgbodyform p{margin: 0px; padding: 0px;}";
		// Outlook styles.
		// Leave on one line, otherwise \n will be replaced later for &lt;br /&gt;.
		CSS += @"p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; margin-bottom:.0001pt; font-size:11.0pt; font-family:'Aptos','Calibri',sans-serif; mso-fareast-language:EN-US;}"; 
		CSS += @"p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph{mso-style-priority:34; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; margin-bottom:.0001pt; font-size:11.0pt; font-family:'Aptos','Calibri',sans-serif; mso-fareast-language:EN-US;}";
		head += CSS;
		head += "&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;table class=\"notification_border\"&gt;&lt;tr width=\"600px\" style=\"width:600px\"&gt;&lt;td width=\"600px\" style=\"width:600px\" class=\"base_font\"&gt;";

		return head;
	}
}

public class Localization 
{	
    public static List&lt;LocalizationItem&gt; Localizations {
		get {
			return new List&lt;LocalizationItem&gt;() {
				new LocalizationItem(1029, "From", "Od"),
				new LocalizationItem(1031, "From", "Von"),
				new LocalizationItem(1033, "From", "From"),
				new LocalizationItem(1038, "From", "Kezdete"),
				new LocalizationItem(1045, "From", "Z"),
				new LocalizationItem(1051, "From", "Od"),

				new LocalizationItem(1029, "DateSent", "Datum"),
				new LocalizationItem(1031, "DateSent", "Date"),
				new LocalizationItem(1033, "DateSent", "Datum"),
				new LocalizationItem(1038, "DateSent", "Dátum"),
				new LocalizationItem(1045, "DateSent", "Data"),
				new LocalizationItem(1051, "DateSent", "Dátum"),

				new LocalizationItem(1029, "To", "Komu"),
				new LocalizationItem(1031, "To", "Dem"),
				new LocalizationItem(1033, "To", "To"),
				new LocalizationItem(1038, "To", "Kit"),
				new LocalizationItem(1045, "To", "Kogo"),
				new LocalizationItem(1051, "To", "Komu"),
				
				new LocalizationItem(1029, "SubjectMail", "Předmět"),
				new LocalizationItem(1031, "SubjectMail", "Fach"),
				new LocalizationItem(1033, "SubjectMail", "Subject"),
				new LocalizationItem(1038, "SubjectMail", "Tantárgy"),
				new LocalizationItem(1045, "SubjectMail", "Przedmiot"),
				new LocalizationItem(1051, "SubjectMail", "Predmet"),
				
				new LocalizationItem(1029, "MailMessage", Helpers.MailMessageCzech),
				new LocalizationItem(1031, "MailMessage", Helpers.MailMessageEnglish),
				new LocalizationItem(1033, "MailMessage", Helpers.MailMessageEnglish),
				new LocalizationItem(1038, "MailMessage", Helpers.MailMessageEnglish),
				new LocalizationItem(1045, "MailMessage", Helpers.MailMessageEnglish),
				new LocalizationItem(1051, "MailMessage", Helpers.MailMessageCzech),

			};
		}
	}

    public static string GetLocalization(int personId, string name)
	{
        var localeId = GetPersonLocaleId(personId);
        var translation = FindInList(localeId, name);

        if (string.IsNullOrEmpty(translation))
		{
            localeId = GetDefaultLocaleId();
            translation = FindInList(localeId, name);
			if (string.IsNullOrEmpty(translation))
            {
                localeId = Locale.GetDatabaseLocaleId();
                translation = FindInList(localeId, name); 
            }
        }

        return translation;
    }

    private static string FindInList(int localeId, string name) 
	{
        return Localizations.FirstOrDefault(x=&gt;x.LocaleId == localeId &amp;&amp; x.Name == name)?.Translation;
	}

	private static int GetDefaultLocaleId()
	{
		return Person.GetCultureInfoOrDefault(new Alvao.API.Common.Model.Database.tPerson()).LCID;
	}

	private static int GetPersonLocaleId(int personId)
	{
		var locale = Person.GetById(personId).iPersonLocaleId;
		
		if (!locale.HasValue)
		{
			return GetDefaultLocaleId();
		}

		return locale.Value;
	}
}

public class LocalizationItem 
{
	public int LocaleId { get; set; }
	public string Name { get; set; }
	public string Translation { get; set; }

	public LocalizationItem (int localeId, string name, string translation) 
	{
		this.LocaleId = localeId;
		this.Name = name;
		this.Translation = translation;
	}
}</Code>
          <IsLibCode>true</IsLibCode>
        </Script>
      </Scripts>
    </Application>
  </Applications>
</AlvaoApplication>