<?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="1120">
      <Name>Object Knowledge Base</Name>
      <Description>In the Object page, adds the Knowledge base tab displaying knowledge base articles that contain the manufacturer and model of the object.</Description>
      <UniqueId>214062b8-f15a-45d5-8faa-88aded06418a</UniqueId>
      <Version>2</Version>
      <AdvancedSettings />
      <Scripts>
        <Script id="2869">
          <Name>Localization</Name>
          <Code>using System.Linq;
using System.Collections.Generic;
using Microsoft.Data.SqlClient;
using Alvao.API.Common;

public class Localization 
{
    public static List&lt;LocalizationItem&gt; Localizations {get {
        return new List&lt;LocalizationItem&gt;() {
            new LocalizationItem(1029, "TabName", "Báze znalostí"),
            new LocalizationItem(1031, "TabName", "Wissensdatenbank"),
            new LocalizationItem(1033, "TabName", "Knowledge base"),            
            new LocalizationItem(1045, "TabName", "Baza wiedzy"),
            new LocalizationItem(1051, "TabName", "Báza znalostí")
        };
    } }

    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()
    {
        var locale = Person.GetCultureInfoOrDefault(new Alvao.API.Common.Model.Database.tPerson()).LCID;
        return locale;
    }

    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>
          <Codesign>MgBy+XsKa/0nhodzYr+Gzt/6SUD+/SQU91bsw8/OazVsBuTOe8Jhw6WEYvnT46CAXhoX5Yu/XOeXA1eymqLJDJOCuuM6HMueauJmoEEIr5xw/d2FwH1DRrGFjGVpgI9KmeNpJQ9pz8G1vE3Ihl/Nh9n8QEZOWwWGJE/sBw/nsXU9MCX7DwNUOkcxdWLxS6iJSA+65xN+N3qs3QtQx8ZnUgoxferMIE9rWgnUzcgxKxXlFodQtKzRdxp8rJJuEM4FPoWHXTqxvWKUvNVvFmk6wKGFWcWoaTtZYnGeaqCRSHMuuSLvhzFcOaEnjlO9mGWW9zofxDiRR6Q+JKCXlJIjww==</Codesign>
        </Script>
        <Script id="2870">
          <Name>ObjectKnowledgeBaseTab</Name>
          <Code>using System;
using System.Data;
using Alvao.Global;
using Alvao.API.Common;
using Alvao.API.Common.Model.CustomApps;
using Alvao.Apps.API;
using Alvao.Context;
using Dapper;

public class ObjectKnowledgeBaseTab : IEntityTab
{
    public string Id { get; set; }
    public Entity Entity { get; set; }

    public ObjectKnowledgeBaseTab()
    {
        Id = "ObjectKnowledgeBase";
        Entity = Entity.Object;
    }

    public EntityTabShowResult Show(int entityId, int personId)
    {
        bool show = false;
        string name = Localization.GetLocalization(personId, "TabName");
        string url = string.Empty;

        try
        {
            using (var scope = AlvaoContext.GetConnectionScope())
            {
                //Retrieving the required object data from the database.
                var objectModel = scope.Connection.QueryFirstOrDefault&lt;ObjectKnowledgeBaseModel&gt;(@"
                  select
                    Manufacturer,
                    Model
                  from NodeCust
                  where NodeId = @objectId", new { objectId = entityId }
            );

            if (objectModel == null)
            {
            return new EntityTabShowResult(show, name, url);
            };

            //Check if the object has filled properties.
            if (!string.IsNullOrEmpty(objectModel.Manufacturer) || !string.IsNullOrEmpty(objectModel.Model))
            {
            string webAppUrl = DbProperty.WebAppUrl;
            if (!string.IsNullOrEmpty(webAppUrl))
            {
            //Address of tab with articles from knowledge base
            url = webAppUrl + "/KnowledgeBase?searchedText=" + objectModel.Manufacturer + " " + objectModel.Model;
            show = true;
            }
            }
            }
            }
            catch
            {
            return new EntityTabShowResult(show, name, url);
            }

            return new EntityTabShowResult(show, name, url);
            }
            }

            public class ObjectKnowledgeBaseModel
            {
            public string Manufacturer { get; set; }
            public string Model { get; set; }
            }</Code>
          <IsLibCode>false</IsLibCode>
          <Codesign>t3r+Y5/s7CSPtbsuf4wb4Ia/h4Fn8NZUdAQpb+33dJgu+ZTQjsWNtf6oQzoDUDUpKndKjCaT3tUL4Rxu7SOMfspAGsYfMQcuCRXqoAoaMQsC9tMg6G1EG5PCOC8OoHHTh1SMI/VbYmgCzBdKqdv/UcpVaWdaJuB5TfId53NySHcf2L82PomKKU3rQJulWbkfmbFwNqeDT7LoNBvlpUrddHFlpbs2nNS3NvrgGDXlDkd/NQR9TL/s3KNWgHTCfWZara78GcsL9RSIP9vmZb0KrQTDiDB2meo8y7VMGEbtO0ohfJwS+Vnu3KMF7YiYU2W3M1OowqBMy3q/YaZLCU0/fw==</Codesign>
        </Script>
      </Scripts>
    </Application>
  </Applications>
</AlvaoApplication>