Organizasyon Şeması Senkronizasyonu
    • 13 Dec 2021
    • 8 Minutes to read
    • Dark
      Light

    Organizasyon Şeması Senkronizasyonu

    • Dark
      Light

    Article summary

    Organizasyon şemaları dış sistemler ile senkronize edilebilir. Aşağıdaki Organizasyon şeması görselinde Root, Departman ve Kullanıcı ifadelerinin neye karşılık geldiği belirtilmiştir.

    Aşağıdaki kod blokları ODInfoModelde model tanımlanmıştır ve organizasyon şeması bu modele göre oluşmuştur.

    using Paperwork.Connect;
    using Paperwork.Library;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace OrganizasyonSemasiOlusturma
    {
        public class Program
        {
            /// <summary>
            /// NAME : Organizasyon şemasına verilen isimdir. PW_ORGANIZATION tablosunda NAME kolonunda tutulur. 
            /// ROOT_ID : Organizasyon şemasının isminden otomatik üretilir. PW_ORGANIZATION tablosunda ROOT_ID kolonunda tutulur.
            /// Organizasyon şeması oluşturulduğunda organizasyon şemasının isminin Türkçe karakterlerinin değiştirilmesi, 
            /// boşlukların “_” karakteri ile değiştirilmesi ve tüm harflerin büyütülmesi ile oluşan data ROOT_ID alanına yazılmaktadır.
            /// Örneğin  “GGSOFT Yazılım” isimli organizasyon şemasının name ve root_Id bilgisi;
            /// NAME : “GGSOFT Yazılım” olrak girilirse RootId aşağıdaki gibi olur;
            /// ROOT_ID: “GGSOFT_YAZILIM”
            /// 
            /// Organizasyon şemasında ROOT şablonun en başında durur. Departmanlar ve kullanıcılar ROOT'a bağlı olarak birbirlerine belirtilen sıra ile bağlanır.
            /// Şemanın detayında belirli 7 adet özellik mevcuttur. (ORGANIZATION_ID,MEMBER_ID,MANAGER_ID,DEPARTMENT,TITLE,DEPARTMENT_TYPE,MANAGER_NAME)
            /// ORGANIZATION_ID: Organizasyon şemasının nesne numarası tutulur.
            /// MEMBER_ID: Root,departman ve kullanıcıların nesne isimleri tutulur. Kısacası şemaya eklenen her kaydın nesne adıdır(OBJECT_NAME). Root ise şemaya verilen ismin objectName i, 
            /// departman ise departman adı, kullanıcı ise kullanıcı giriş adı yazılır.
            /// MANAGER_ID: Altına eklenmiş olduğu kaydın nesne adını yani MEMBER_ID kolonundaki değerini tutar. Root için bu alan boş olmalıdır. Örnek verirsek Root un altına eklenmiş bir kaydın
            /// MANAGER_ID alanındaki değeri root un MEMBER_ID alanındaki değer olmalıdır.
            /// DEPARTMENT: Eklenen kaydın bağlı olduğu departman adı yazılır. Root için bu alan boş olmalıdır. 
            /// DEPARTMENT_TYPE: 0 ise root olduğunu belirtir. 1 ise departman olduğunu belirtir. 2 ise kullanıcı olduğunu belirtir.
            /// TITLE: Root için bu alan boş olmalıdır. Kayıt departman ise (DEPARTMENT_TYPE = 1) departmanın yöneticisinin pozisyon bilgisi yazılır. Departmanın yönetisici ise kaydın MANAGER_NAME
            /// alanında yazmaktadır. Kayıt kullanıcı ise (DEPARTMENT_TYPE = 2) kullanıcının pozisyon bilgisi yazılır.
            /// MANAGER_NAME: Yöneticinin giriş adı yazılır. Root için bu alan boş olmalıdır. Departmanın yöneticisinin giriş adı yazılır. Bu departmana bağlı olan kullanıcıların MANAGER_NAME alanında da
            /// aynı yöneticinin giriş adı yazılır.
            /// </summary>
            private static OrganizationSchemas orgSchema;
            public static Productivity p;
    
            static void Main(string[] args)
            {
                p = new Productivity(ClientTypes.ProductivityLayer, true, @"C:\Argus\Source\Binaries\Cer\ggsoft.cer");
                p.InitRemObjects("argustest.g-gsoft.com", "8099");
                a_LoginInfo retval = p.rLogin.Login("trainer", "gg", "Organization Schemas Sampe Client", "tr", 1000, "000");
                if (retval.ErrorCode != "0")
                    throw new Exception(retval.LMessage);
                Console.WriteLine("bağlantı kuruldu.");
    
                //organizasyon şeması ismi
                string orgSchema = "Şema 1";
    
                //Bu isimde bir organizasyon şeması ismi var mı yok mu kontrol edecek olan metotdur.
                //Eğer bu isimde bir organizasyon şeması varsa o zaman onu siler.
                new OrganizationSchemas(p).GetOrganizations(orgSchema);
    
                //Oluşturulacak olan şemaya verilen isim uygun şekle aşağıdaki şekilde çevrilebilir;
                string rootId = karakterCevir(orgSchema).Replace(" ", "_").ToUpper();
    
                //organizasyon şeması nesnesi oluşturulur. Nesne oluşturulurken şemanın adını Name alanına isminden oluşturulan root ise rootId alanına eklenir.
                //Organizasyon şeması kaydedilirken yeni id alması için OrganizationId alanı boş bırakılır. Oluşan bu kayıt PW_ORGANIZATION tablosunda yer alır.
                // Sornaki adımlarda eklenen şema elemanları bu nesnenin detayını oluşturacaktır. Detayı ise PW_ORGANIZATION_DETAIL tablosunda yer alır. OrganizationID ile kayıtlar filtrelenebilir.
                a_Organization org0 = new a_Organization();
                {
                    org0.Name = orgSchema;
                    org0.OrganizationId = string.Empty;
                    org0.Status = string.Empty;
                    org0.RootId = rootId;
                }
                ODInfoModel modelCreate = new ODInfoModel();
                //CreateModel metoduna verilen rooId parametresi ile(rootId =>organizasyon şemasının adıdır.) bu metotta yer alan demo nesnelerle organizasyon şeması nesneleri oluşturulur.
                var model = modelCreate.CreateModel(rootId);
                modelCreate.CreateOrg(model, org0);
    
                //root oluşturmak için organizasyon şemasına ilk root değerlerini ekleriz.
                org0.Items.Add(new a_OrgPerson() { DepartmentType = 0, Department = string.Empty, MemberID = rootId, ManagerName = string.Empty, ManagerID = string.Empty, Title = string.Empty });
    
                //En son işlem olarak root ile birlikte bize verilen listeye göre organizasyon şemasını kayıt ederiz.
                a_GenericResult organization2 = p.rAdmin.SaveOrganization(org0);
                if (organization2.ErrorCode != 0)
                    throw new Exception(organization2.Message);
            }
            public static string karakterCevir(string kelime)
            {
                string mesaj = kelime;
                char[] oldValue = new char[] { 'ö', 'Ö', 'ü', 'Ü', 'ç', 'Ç', 'İ', 'ı', 'Ğ', 'ğ', 'Ş', 'ş' };
                char[] newValue = new char[] { 'o', 'O', 'u', 'U', 'c', 'C', 'I', 'i', 'G', 'g', 'S', 's' };
                for (int sayac = 0; sayac < oldValue.Length; sayac++)
                {
                    mesaj = mesaj.Replace(oldValue[sayac], newValue[sayac]);
                }
                return mesaj;
            }
        }
    }
    
    /********** Modelin class'ı aşağıdaki gibidir. **********/
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace OrganizasyonSemasiOlusturma
    {
        /// <summary>
        /// ODInfo organizasyon şemasında yer alan departman ve kullanıcı nesnelerinin property lerini tanımladığımız clasımızdır.
        /// DepartmentType datası eğer 1 ise bu nesnenin departman nesnesi olduğunu bildirir.
        /// Eğer DepartmentType datası 2 ise bu nesnenin kullanıcı nesnesini olduğunu bildirir.
        /// Department  =>  Departman adıdır.
        /// MemberID    =>  Eğer bir departman nesnesi ise o Departmanın adıdır. Eğer kullanıcı nesnesi ise kullanıcının login adıdır.
        /// ManagerName =>  Eğer bir departman nesnesi ise o deparmanın yöneticisinin login adıdır. Eğer kullanıcı nesnesi ise o kullanıcının yer aldığı departmanın yöneticisinin lgin adıdır.
        /// ManagerID   =>  Eğer bir departman nesnesi ise o departmanın parent departmanının adıdır. Eğer kullanıcı nesnesi ise kullanıcı nesnesini yer aldığı departman adıdır.
        /// Title       =>  Açıklama alanıdır.
        /// </summary>
        public class ODInfo
        {
            public int DepartmentType { get; set; }
            public string Department { get; set; }
            public string MemberID { get; set; }
            public string ManagerName { get; set; }
            public string ManagerID { get; set; }
            public string Title { get; set; }
        }
    }
    
    /********** Modelimiz aşağıdaki gibidir. *********/
    
    using Paperwork.Library;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace OrganizasyonSemasiOlusturma
    {
        public class ODInfoModel
        {
            /// <summary>
            /// NAME : Organizasyon şemasına verilen isimdir. PW_ORGANIZATION tablosunda NAME kolonunda tutulur. 
            /// ROOT_ID : Organizasyon şemasının isminden otomatik üretilir. PW_ORGANIZATION tablosunda ROOT_ID kolonunda tutulur.
            /// Organizasyon şeması oluşturulduğunda organizasyon şemasının isminin Türkçe karakterlerinin değiştirilmesi, 
            /// boşlukların “_” karakteri ile değiştirilmesi ve tüm harflerin büyütülmesi ile oluşan data ROOT_ID alanına yazılmaktadır.
    
            /// Örneğin  “GGSOFT Yazılım” isimli organizasyon şemasının name ve root_Id bilgisi;
            /// NAME : “GGSOFT Yazılım” olrak girilirse RootId aşağıdaki gibi olur;
            /// ROOT_ID: “GGSOFT_YAZILIM”
            /// 
            /// Organizasyon şemasında ROOT şablonun en başında durur. Departmanlar ve kullanıcılar ROOT'a bağlı olarak birbirlerine belirtilen sıra ile bağlanır.
            /// Şemanın detayında belirli 7 adet özellik mevcuttur. (ORGANIZATION_ID,MEMBER_ID,MANAGER_ID,DEPARTMENT,TITLE,DEPARTMENT_TYPE,MANAGER_NAME)
            /// ORGANIZATION_ID: Organizasyon şemasının nesne numarası tutulur.
            /// MEMBER_ID: Root,departman ve kullanıcıların nesne isimleri tutulur. Kısacası şemaya eklenen her kaydın nesne adıdır(OBJECT_NAME). Root ise şemaya verilen ismin objectName i, 
            /// departman ise departman adı, kullanıcı ise kullanıcı giriş adı yazılır.
            /// MANAGER_ID: Altına eklenmiş olduğu kaydın nesne adını yani MEMBER_ID kolonundaki değerini tutar. Root için bu alan boş olmalıdır. Örnek verirsek Root un altına eklenmiş bir kaydın
            /// MANAGER_ID alanındaki değeri root un MEMBER_ID alanındaki değer olmalıdır.
            /// DEPARTMENT: Eklenen kaydın bağlı olduğu departman adı yazılır. Root için bu alan boş olmalıdır. 
            /// DEPARTMENT_TYPE: 0 ise root olduğunu belirtir. 1 ise departman olduğunu belirtir. 2 ise kullanıcı olduğunu belirtir.
            /// TITLE: Root için bu alan boş olmalıdır. Kayıt departman ise (DEPARTMENT_TYPE = 1) departmanın yöneticisinin pozisyon bilgisi yazılır. Departmanın yönetisici ise kaydın MANAGER_NAME
            /// alanında yazmaktadır. Kayıt kullanıcı ise (DEPARTMENT_TYPE = 2) kullanıcının pozisyon bilgisi yazılır.
            /// MANAGER_NAME: Yöneticinin giriş adı yazılır. Root için bu alan boş olmalıdır. Departmanın yöneticisinin giriş adı yazılır. Bu departmana bağlı olan kullanıcıların MANAGER_NAME alanında da
            /// aynı yöneticinin giriş adı yazılır.
            /// </summary>
            public List<ODInfo> CreateModel(string rootID)
            {
                List<ODInfo> nesne = new List<ODInfo>();
                //DepartmentType = 1 ise departman, DepartmentType = 2 ise kullanıcıdır. 
                //Bir nesnenin üstünde bulunan nesnenin MemberID si o nesnenin ManagerID sidir.
                nesne.Add(new ODInfo() { DepartmentType = 1, Department = "Sistem Destek", MemberID = "Sistem Destek", ManagerName = "oozden", ManagerID = rootID, Title = "Bu bir departmenttir." });
                nesne.Add(new ODInfo() { DepartmentType = 1, Department = "Personel", MemberID = "Personel", ManagerName = "mbercin", ManagerID = rootID, Title = "Bu bir departmenttir." });
                nesne.Add(new ODInfo() { DepartmentType = 1, Department = "Muhasebe", MemberID = "Muhasebe", ManagerName = "fsimsek", ManagerID = "Sistem Destek", Title = "Bu bir departmenttir." });
                nesne.Add(new ODInfo() { DepartmentType = 2, Department = "Sistem Destek", MemberID = "gsaka", ManagerName = "oozden", ManagerID = "Sistem Destek", Title = "Bu bir departmentmana ait kişidir." });
                nesne.Add(new ODInfo() { DepartmentType = 2, Department = "Personel", MemberID = "dboya", ManagerName = "mbercin", ManagerID = "Personel", Title = "Bu bir departmentmana ait kişidir." });
                return nesne;
            }
    
            // ODInfo nesnelerini tek tek organizasyon şeması nesneleri olacak şekilde organizasyon şemasına eklenir.
            public void CreateOrg(List<ODInfo> models, a_Organization org0)
            {
                foreach (var item in models)
                {
                    org0.Items.Add(new a_OrgPerson()
                    { DepartmentType = item.DepartmentType, Department = item.Department, MemberID = item.MemberID, ManagerName = item.ManagerName, ManagerID = item.ManagerID, Title = item.Title }
                    );
                }
            }
        }
    }
    
    /********** Organizasyon şeması kontrolü aşağıdaki gibidir. **********/
    
    using Paperwork.Connect;
    using Paperwork.Library;
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace OrganizasyonSemasiOlusturma
    {
        /// <summary>
        /// //Productivity Layer da daha önce oluşturulmuş olan organizasyon şemalarının adlarını kullanıcını girdiği organizasyon name alanına göre kontrol eder.
        //Eğer daha önce böyle bir organizasyon şeması oluşturulmuş ise bize başka bir isimde organizasyon şeması adıyla şemayı oluşturmamızı sağlar.
        /// </summary>
        public class OrganizationSchemas
        {
            private Productivity p;
            public OrganizationSchemas()
            {
            }
            public OrganizationSchemas(Productivity p_)
            {
                p = p_;
            }
    
            //OrgName adıyla verilen parametre ile organizasyon şemasında böyle bir şema var mı yok mu o kontrol edilir. 
            //Eğer böyle bir şema varsa DeleteOrganization(string orgName) metodu çağırılarak bu şema silinir.
            public bool GetOrganizations(string OrgName)
            {
                bool isNotFound = true;
                string orgName = OrgName;
                int page_index = -1;
                a_OrganizationList organization = p.rAdmin.GetOrganizations(page_index);
                var orgNa = organization.Items.FirstOrDefault(k => k.Name.Equals(orgName));
                if (orgNa == null)
                {
                    isNotFound = true;
                    return isNotFound;
                }
                else
                {
                    isNotFound = false;
                }
                if (!isNotFound)
                {
                    DeleteOrganization(OrgName);
                }
    
                return isNotFound;
            }
    
            //Eğer verilen organizasyon name adında bir organizasyon şeması varsa o eski şemayı siler.
            public void DeleteOrganization(string orgName)
            {
                bool activeOnly = false;
                ObservableCollection<LookupItem> getorganization = p.rLookup.GetOrganizations(activeOnly);
                foreach (LookupItem org in getorganization)
                {
                    if (org.Name == orgName)
                    {
                        string org_id = org.ObjectId;
                        a_GenericResult retval = p.rAdmin.DeleteOrganization(org_id);
                        if (retval.ErrorCode != 0)
                            throw new Exception(retval.Message);
                    }
                }
            }
        }
    }

    Aşağıdaki Organizasyon şeması görselinde Root, Departman ve Kullanıcı ifadelerinin neye karşılık geldiği belirtilmiştir.

    Departman Görselinde bilgilerin açıklamaları belirtilmiştir.