private void cmb_Firma_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Firma seçimi değiştikten sonra
            // şubeler firmaya göre tekrardan ayarlanır.

            List <string> firmaDonemAdlari = new List <string>();

            // firma_donem_sube listesi içerisinde gezilir. Firma bulunur ve dönemleri getirilir.
            foreach (dynamic firma_sube_donem in Sabitler.firma_sube_donem_listesi)
            {
                // Combodaki isim ile ilgili olan firma_sube_donem bulunur
                if (firma_sube_donem.firmaadi == cmb_Firma.Text)
                {
                    // dönemler adları hazırlanır
                    // donem adları gorunendonem, baslangictarihi, bitistarihi seklinde hazırlanır
                    // aralarına 3'er boşluk bırakılır daha sonra boşluklara göre parse edileceklerdir.

                    if (Sabitler.HasAttr(firma_sube_donem, "donemler"))
                    {
                        foreach (dynamic donem in firma_sube_donem.donemler)
                        {
                            string donemAdi = donem.gorunendonemkodu;
                            donemAdi += "   ";
                            donemAdi += donem.baslangictarihi;
                            donemAdi += "   ";
                            donemAdi += donem.bitistarihi;
                            firmaDonemAdlari.Add(donemAdi);
                        }
                    }
                }
            }

            cmb_Donem.Items.Clear();
            cmb_Donem.Items.AddRange(firmaDonemAdlari.ToArray());
        }
        private void bakiyeSorgula_Click(object sender, EventArgs e)
        {
            dynamic request = new ExpandoObject();

            request.sis_kontor_sorgula            = new ExpandoObject();
            request.sis_kontor_sorgula.session_id = Sabitler.session_id;

            dynamic response = Sabitler.sendMessageToServer(request, Sabitler.sisEk);

            // Server ile iletişim hatası
            if (response == null)
            {
                MessageBox.Show("İşlem gerçekleştirilirken bir hata oluştu");
            }
            // silme işlemi başarılı
            // gridview içerisinden silinmek istenen satır silinir.
            // Sabitler içerisindeki carikart dictionary'sinden silinir.
            else if (response.code == "200")
            {
                MessageBox.Show("Kontör Sayısı: " + response.result._kontorsayisi);
            }
            else
            {
                MessageBox.Show("İşlem gerçekleştirilirken bir hata oluştu.\n"
                                + "Code: " + response.code + " Message: " + response.msg);
            }
        }
        /// <summary>
        /// Server ile iletişim kurarak carikart için yeni carikodu üretir.
        /// </summary>
        private void btn_KodGetir_Click(object sender, EventArgs e)
        {
            dynamic request = new ExpandoObject();

            request.sis_numara_getir               = new ExpandoObject();
            request.sis_numara_getir.session_id    = Sabitler.session_id;
            request.sis_numara_getir.firma_kodu    = Sabitler.seciliFirmaKodu;
            request.sis_numara_getir.donem_kodu    = Sabitler.seciliDonemKodu;
            request.sis_numara_getir.table_name    = "scf_carikart";
            request.sis_numara_getir.column_name   = "carikartkodu";
            request.sis_numara_getir.template_type = "CARIKART_KODU";
            request.sis_numara_getir.statu         = 1;

            dynamic response = Sabitler.sendMessageToServer(request, Sabitler.sisEk);

            if (response == null)
            {
                MessageBox.Show("Cariler getirilirken, bağlantı hatası oluştu.");
                return;
            }
            else if (response.code == "200")
            {
                txt_Kodu.Text = response.result.kod;
            }
            // Yeterli kontör bulunmadığında gelen uyarı.
            else if (response.code == "406")
            {
                MessageBox.Show("Yeterli kontörünüz bulunmamaktadır. Code: " + response.code + " Message: " + response.msg);
            }
            else
            {
                MessageBox.Show("Yeni kod getirilirken bir hata oluştu. Code: " + response.code + " Message: " + response.msg);
                return;
            }
        }
        /// <summary>
        /// Server ile iletişim kurarak _key bilgisi verilen carikart'ı döndürür.
        /// </summary>
        /// <param name="_key_scf_carikart"></param>
        /// <returns></returns>
        private dynamic cari_kart_getir(string _key_scf_carikart)
        {
            dynamic request = new ExpandoObject();

            request.scf_carikart_getir            = new ExpandoObject();
            request.scf_carikart_getir.session_id = Sabitler.session_id;
            request.scf_carikart_getir.firma_kodu = Sabitler.seciliFirmaKodu;
            request.scf_carikart_getir.donem_kodu = Sabitler.seciliDonemKodu;
            request.scf_carikart_getir.key        = _key_scf_carikart;

            dynamic response = Sabitler.sendMessageToServer(request, Sabitler.scfEk);

            // Server ile iletişim başarısız
            if (response == null)
            {
                return(null);
            }
            // Sesrver ile iletişim başarılı, işlem başarılı
            else if (response.code == "200")
            {
                return(response.result);
            }
            // Yeterli kontör bulunmadığında gelen uyarı.
            else if (response.code == "406")
            {
                MessageBox.Show("Yeterli kontörünüz bulunmamaktadır. Code: " + response.code + " Message: " + response.msg);
            }
            // İletişim başarılı, işlem başarısız
            else
            {
                MessageBox.Show("Cari getirilirken bir hata oluştu. Code: " + response.code + " Message: " + response.msg);
            }
            return(null);
        }
        private string subeAdiGetir(long firmaKodu, string key)
        {
            // firma_sube_donem listesi, login olduktan sonra Sabitler içerisinde set edilmişti.
            foreach (dynamic firma_sube_donem in Sabitler.firma_sube_donem_listesi)
            {
                // İlgili firma bulundu.
                if (firma_sube_donem.firmakodu == firmaKodu)
                {
                    // Firma içerisindeki şubelerde geizilir ve şubenin adı bulunur
                    if (Sabitler.HasAttr(firma_sube_donem, "subeler"))
                    {
                        foreach (dynamic sube in firma_sube_donem.subeler)
                        {
                            if (("" + sube._key) == key)
                            {
                                return(sube.subeadi);
                            }
                        }
                    }
                    break;
                }
            }

            return("");
        }
        private long subeKeyGetir(long firmaKodu, string subeAdi)
        {
            // firma_sube_donem listesi, login olduktan sonra Sabitler içerisinde kaydetilmişti.
            foreach (dynamic firma_sube_donem in Sabitler.firma_sube_donem_listesi)
            {
                // İlgili firma bulundu.
                if (firma_sube_donem.firmakodu == firmaKodu)
                {
                    // Firma içerisindeki şubelerde gezilir ve key bilgisi bulunur
                    if (Sabitler.HasAttr(firma_sube_donem, "subeler"))
                    {
                        foreach (dynamic sube in firma_sube_donem.subeler)
                        {
                            if (sube.subeadi == subeAdi)
                            {
                                return(sube._key);
                            }
                        }
                    }
                    break;
                }
            }

            return(0);
        }
        private void btn_Baglan_Click(object sender, EventArgs e)
        {
            // Login requesti için gerekli objeyi oluşturuyoruz
            dynamic request = new ExpandoObject();

            request.login                      = new ExpandoObject();
            request.login.username             = this.txt_KullaniciKodu.Text;
            request.login.password             = this.txt_Sifre.Text;
            request.login.disconnect_same_user = "******";
            request.login.lang                 = "tr";
            Sabitler.sunucuAdresi              = this.txt_Sunucu.Text;

            // sendMessageToServer fonksiyonu dinamik objenin json'a çevrilmesi ve
            // verilen ek adrese göre json'un server'a gönderilmesinden sorumludur.
            // Gelen cevap ExpandoObject classindandir.
            dynamic response = Sabitler.sendMessageToServer(request, Sabitler.sisEk);

            // sonucun null olması server ile iletişimde hata olduğu anlamına gelmektedir.
            if (response == null)
            {
                MessageBox.Show("Bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.");
            }
            // Login basarili oldugunda yapilacak islemler.
            else if (response.code == "200")
            {
                Console.WriteLine("Login başarılı oldu. session_id: " + response.msg);

                // Session id kaydedilir. Daha sonraki server ile iletişimde
                // bu id gonderilecektir.
                Sabitler.session_id = response.msg;


                // Login sayfasi kapatilir
                this.Hide();

                // Cari Kart sayfasi acilir
                Form_CariKartListesi form_ck = new Form_CariKartListesi();
                form_ck.Show();
            }
            // Login basarisiz oldugunda yapilacak islemler.
            else
            {
                MessageBox.Show("Giriş yaparken bir hata oluştu. Code: " + response.code + " Message: " + response.msg);
            }
        }
        private void initilizeFirmaCombo()
        {
            // Firmalar listesini server'dan alıyoruz
            dynamic request = new ExpandoObject();

            request.sis_yetkili_firma_donem_sube_depo            = new ExpandoObject();
            request.sis_yetkili_firma_donem_sube_depo.session_id = Sabitler.session_id;

            dynamic response = Sabitler.sendMessageToServer(request, Sabitler.sisEk);

            // Hata oluştu
            if (response == null)
            {
                MessageBox.Show("Bağlantı hatası oluştu. Lütfen daha sonra tekrar deneyiniz.");
                return;
            }
            // Yeterli kontör bulunmadığında gelen uyarı.
            else if (response.code == "406")
            {
                MessageBox.Show("Yeterli kontörünüz bulunmamaktadır. Code: " + response.code + " Message: " + response.msg);
            }
            else if (response.code != "200")
            {
                MessageBox.Show("Firmalar getirilirken bir hata oluştu. Code: " + response.code + " Message: " + response.msg);
                return;
            }

            // Firma listesini daha sonrada kullanabilmek için kaydediyoruz
            Sabitler.firma_sube_donem_listesi = response.result;

            // Firma combo'sunda gözükecek olan firma adları
            List <string> firmaAdlari = new List <string>();

            // Her bir firma_sube_donem sonucu içerisinden firmaadi  alani getirilir.
            foreach (dynamic firma_sube_donem in Sabitler.firma_sube_donem_listesi)
            {
                firmaAdlari.Add(firma_sube_donem.firmaadi);
            }

            // combo hazırlanır
            cmb_Firma.Items.Clear();
            cmb_Firma.Items.AddRange(firmaAdlari.ToArray());
        }
        /// <summary>
        /// Server ile iletişim kurarak ekrandaki bilgilere göre yeni carikart ekler.
        /// </summary>
        private dynamic yeniCarikartEkle()
        {
            // Carikart eklemesi yapılır
            dynamic request = new ExpandoObject();

            request.scf_carikart_ekle            = new ExpandoObject();
            request.scf_carikart_ekle.session_id = Sabitler.session_id;
            request.scf_carikart_ekle.firma_kodu = Sabitler.seciliFirmaKodu;
            request.scf_carikart_ekle.donem_kodu = Sabitler.seciliDonemKodu;
            request.scf_carikart_ekle.kart       = ekrandakiBilgilerdenCariİstekOlustur();

            // Kart içerisinde olmazsa hata aldığımız alanlar.
            // Bu alandaki bilgileri hata durumuna göre default değerler verebiliriz.
            request.scf_carikart_ekle.kart._key_sis_ozelkod2 = 0;
            request.scf_carikart_ekle.kart.efaturasenaryosu  = "";

            dynamic response = Sabitler.sendMessageToServer(request, Sabitler.scfEk);

            return(response);
        }
        /// <summary>
        /// Server ile iletişim kurarak şehirleri getirir.
        /// </summary>
        public void initiliazeSehirler()
        {
            dynamic request = new ExpandoObject();

            request.sis_sehirler_listele            = new ExpandoObject();
            request.sis_sehirler_listele.firma_kodu = Sabitler.seciliFirmaKodu;
            request.sis_sehirler_listele.donem_kodu = Sabitler.seciliDonemKodu;
            request.sis_sehirler_listele.session_id = Sabitler.session_id;

            dynamic response = Sabitler.sendMessageToServer(request, Sabitler.sisEk);

            if (response == null)
            {
                MessageBox.Show("Sehirler getirilirken, bağlantı hatası oluştu.");
                return;
            }
            else if (response.code == "200")
            {
                this.sehirler = response.result;

                List <string> sehirAdlariCombo = new List <string>();

                foreach (dynamic sehir in response.result)
                {
                    sehirAdlariCombo.Add(sehir.sehiradi);
                }

                cmb_Sehirler.Items.Clear();
                cmb_Sehirler.Items.AddRange(sehirAdlariCombo.ToArray());
            }
            // Yeterli kontör bulunmadığında gelen uyarı.
            else if (response.code == "406")
            {
                MessageBox.Show("Yeterli kontörünüz bulunmamaktadır. Code: " + response.code + " Message: " + response.msg);
            }
            else
            {
                MessageBox.Show("Sehir adları getirilirken bir hata oluştu. Code: " + response.code + " Message: " + response.msg);
            }
        }
        /// <summary>
        /// Seçili firma bilgisine göre firmanın şubelerini listeler
        /// </summary>
        public void initiliazeSubeler()
        {
            List <string> subeAdlari = new List <string>();

            foreach (dynamic firma_sube_donem in Sabitler.firma_sube_donem_listesi)
            {
                // İlgili firma bulundu.
                if (firma_sube_donem.firmakodu == Sabitler.seciliFirmaKodu)
                {
                    if (Sabitler.HasAttr(firma_sube_donem, "subeler"))
                    {
                        foreach (dynamic sube in firma_sube_donem.subeler)
                        {
                            subeAdlari.Add(sube.subeadi);
                        }
                        break;
                    }
                }
            }

            cmb_Sube.Items.Clear();
            cmb_Sube.Items.AddRange(subeAdlari.ToArray());
        }
        /// <summary>
        /// Server ile iletişim kurarak ekrandaki bilgilere göre carikart'ı günceller.
        /// </summary>
        private dynamic carikartGuncelle()
        {
            // Carikart güncellemesi eklemesi yapılır
            dynamic request = new ExpandoObject();

            request.scf_carikart_guncelle            = new ExpandoObject();
            request.scf_carikart_guncelle.session_id = Sabitler.session_id;
            request.scf_carikart_guncelle.firma_kodu = Sabitler.seciliFirmaKodu;
            request.scf_carikart_guncelle.donem_kodu = Sabitler.seciliDonemKodu;
            request.scf_carikart_guncelle.kart       = ekrandakiBilgilerdenCariİstekOlustur();
            request.scf_carikart_guncelle.kart._key  = this.carikart._key;

            // Kart içerisinde olmazsa hata aldığımız alanlar.
            // Bu alandaki bilgileri hata durumuna göre default değerler verebiliriz.

            if (this.carikart._key_sis_ozelkod2 != null && this.carikart._key_sis_ozelkod2.GetType() == typeof(ExpandoObject))
            {
                // Bu alanın daha iyi anlaşılabilmesi için carikart getir servis fonksiyonun döndüğü değerlere bakılmalıdır.
                request.scf_carikart_guncelle.kart._key_sis_ozelkod2 = this.carikart._key_sis_ozelkod2._key;
            }
            else
            {
                request.scf_carikart_guncelle.kart._key_sis_ozelkod2 = 0;
            }

            request.scf_carikart_guncelle.kart.efaturasenaryosu = this.carikart.efaturasenaryosu;

            string jsonWS = JsonConvert.SerializeObject(request);

            // Oluşan json örenğini test etmek için alttaki satırın comemnti kaldırılabilir
            // Console.WriteLine("json: " + jsonWS);

            dynamic response = Sabitler.sendMessageToServer(request, Sabitler.scfEk);

            return(response);
        }
        private void btn_Sil_Click(object sender, EventArgs e)
        {
            // seçilen satır
            DataGridViewSelectedRowCollection rows = gbx_CariListe.SelectedRows;

            if (rows.Count == 0)
            {
                MessageBox.Show("Lütfen önce bir Cari seçiniz.");
                return;
            }

            // Tablo üzerinde multi row select kapalı oldugu için, tek satır seçildiğinden eminiz
            DataGridViewRow row = rows[0];

            // gridview'de kolonlar oluşturulurken, _key için gizli bir kolon oluşturulmuştu.
            // Bu kolon sayesinde silinecek carikart'in _key'i bilinir.
            string _key_scf_carikart = (string)row.Cells["_key"].Value;
            string unvan             = (string)row.Cells["unvan"].Value;

            DialogResult dialogResult = MessageBox.Show(unvan + " ünvanlı carikart kaydını silmek istediğinize emin misiniz?", "Uyarı", MessageBoxButtons.YesNo);

            if (dialogResult == DialogResult.Yes)
            {
                // silme fonksiyonuna _key gonderilir
                dynamic request = new ExpandoObject();
                request.scf_carikart_sil            = new ExpandoObject();
                request.scf_carikart_sil.session_id = Sabitler.session_id;
                request.scf_carikart_sil.firma_kodu = Sabitler.seciliFirmaKodu;
                request.scf_carikart_sil.donem_kodu = Sabitler.seciliDonemKodu;
                request.scf_carikart_sil.key        = _key_scf_carikart;

                dynamic response = Sabitler.sendMessageToServer(request, Sabitler.scfEk);

                // Server ile iletişim hatası
                if (response == null)
                {
                    MessageBox.Show("Silme işlemi gerçekleştirilirken bir hata oluştu.\nLütfen daha sonra tekrar deneyiniz.");
                }
                // silme işlemi başarılı
                // gridview içerisinden silinmek istenen satır silinir.
                // Sabitler içerisindeki carikart dictionary'sinden silinir.
                else if (response.code == "200")
                {
                    MessageBox.Show("Silme işlemi başarılı.");
                    gbx_CariListe.Rows.Remove(row);

                    // Sunucu başarı ile silme işlemini yaptı. Tablo üzerinden de biz siliyoruz.
                    for (int i = 0; i < Sabitler.carikartlistesi.Count; i++)
                    {
                        if ((string)Sabitler.carikartlistesi[i]._key == _key_scf_carikart)
                        {
                            Sabitler.carikartlistesi.RemoveAt(i);
                            break;
                        }
                    }
                }
                // Yeterli kontör bulunmadığında gelen uyarı.
                else if (response.code == "406")
                {
                    MessageBox.Show("Yeterli kontörünüz bulunmamaktadır. Code: " + response.code + " Message: " + response.msg);
                }
                // Server ile iletişim başarılı. İşlem başarısız.
                else
                {
                    MessageBox.Show("Silme işlemi gerçekleştirilirken bir hata oluştu.\n"
                                    + "Code: " + response.code + " Message: " + response.msg);
                }
            }
        }
        public void btn_Getir_Click(object sender, EventArgs e)
        {
            // Firma ve donem seçili olmalıdır.
            if (cmb_Firma.Text == "" || cmb_Donem.Text == "")
            {
                MessageBox.Show("Lütfen firma ve dönem seçiniz.");
                return;
            }

            long firmaKodu = -1;
            long donemKodu = -1;

            // firma_sube_donem listesi üzerinde gezilir
            // Firmakodu ve donemkodu getirilir.
            foreach (dynamic firma_sube_donem in Sabitler.firma_sube_donem_listesi)
            {
                // Firma bulundu
                if (firma_sube_donem.firmaadi == cmb_Firma.Text)
                {
                    firmaKodu = firma_sube_donem.firmakodu;

                    // donem kombosu içerisindeki text gorunendonem, baslangictarihi, bitistarihi
                    // degerleri arasına 3'er boşluk bırakılmış şekilde hazırlanmıştı.

                    // combo içerisindeki text split edilir
                    // arr[0] -> gorunendonemkodu, arr[1] -> baslangictarihi, arr[2] -> bitistarihi
                    string[] arr = cmb_Donem.Text.Split(new[] { "   " }, StringSplitOptions.None);

                    // Firma içerisindeki dönemlerde gezilir.
                    if (Sabitler.HasAttr(firma_sube_donem, "donemler"))
                    {
                        foreach (dynamic donem in firma_sube_donem.donemler)
                        {
                            if (donem.gorunendonemkodu == arr[0] &&
                                donem.baslangictarihi == arr[1] &&
                                donem.bitistarihi == arr[2])
                            {
                                // Dönem bulundu
                                donemKodu = donem.donemkodu;
                                break;
                            }
                        }
                    }
                }
            }

            // seçilen firma ve doneme gore cariler serverdan getirilir.
            dynamic request = new ExpandoObject();

            request.scf_carikart_listele            = new ExpandoObject();
            request.scf_carikart_listele.session_id = Sabitler.session_id;
            request.scf_carikart_listele.firma_kodu = firmaKodu;
            request.scf_carikart_listele.donem_kodu = donemKodu;
            request.scf_carikart_listele.limit      = Sabitler.CARI_LISTELEME_LIMIT;

            dynamic response = Sabitler.sendMessageToServer(request, Sabitler.scfEk);

            if (response == null)
            {
                MessageBox.Show("Cariler getirilirken, bağlantı hatası oluştu.");
                return;
            }
            // sonuc başarılı, firmakodu ve donemkodu daha sonraki islemlerde kullanılmasına karşı kaydedilir
            else if (response.code == "200")
            {
                // Daha sonra firma ve donem koduna hızlı erişebilmek için
                // Sabitler içerisinde firmaKodu ve donemKodu kaydedilir.
                Sabitler.seciliFirmaKodu = firmaKodu;
                Sabitler.seciliDonemKodu = donemKodu;
                Sabitler.carikartlistesi = response.result;
                // cariler listelenir.
                carileriListele(response.result);
            }
            // Yeterli kontör bulunmadığında gelen uyarı.
            else if (response.code == "406")
            {
                MessageBox.Show("Yeterli kontörünüz bulunmamaktadır. Code: " + response.code + " Message: " + response.msg);
            }
            else
            {
                MessageBox.Show("Cariler getirilirken bir hata oluştu. Code: " + response.code + " Message: " + response.msg);
                return;
            }
        }