Selamlar, Bir önceki yazımda C# ile örnek sipariş modülü konusuna ufak bir uygulama ile giriş yapmıştık. O projemizde kullandığmız Sale.Library küpüthanemizi bu çalışmamızda biraz daha geliştireceğiz. Bir sipariş nesnesine ürün ekleme, indirim ekleme, ödeme ekleme methodlarını ekliycez. Ve bu eklemeler sonucu oluşan değerlerin hesaplamasını yapacağız. Bu projemizde arayüz olarak Asp.net MVC 3 Razor Page kullanacağız. Şuan için bunun bir önemi yok. Bu sebeble arayüze pek özenmedim. Önemli olan şuan Sale.Library tarafını iyice anlamamız. Projeyi buraya tıklayarak indirebilirsiz.

Projeyi açtığınızda ilk olarak Sale.Library bölümüne dikkatinizi verin. Görüldüğü üzere SaleModel, Product, Payment, Discount classlarımız var. Temel classımız SaleModel'dir. SaleModel içerisinde diğer nesneler List halinde propertyler halinde eklenmiştir. Bu List propertylerine item eklemek için ise methodlarımız mevcut. İlk olarak SaleModel.cs dosyasını inceliyelim.

   //Samet ÇINAR > Sale Model
    public class SaleModel
    {
        /// SaleModel instance alındığında list tipinde olan özellikler null olmaması için cons kullandım.
        /// Aynı zamanda burda tabi ki farklı işlemlerde yapılabilir..
        public SaleModel()
        {
            Products = new List();
            Payments = new List();
            Discounts = new List();
        }
        #region Properties
        public string Code { get; set; }
        public List Products { get; set; }
        public decimal GrandTotal
        {
            get
            {
                return Products.Sum(s => s.Price);
            }
        }
        public decimal TotalQuantity
        {
            get
            {
                if (Products.Any())
                    return Products.Sum(s => s.Quantity);

                return decimal.Zero;
            }
        }
        public List Payments { get; set; }
        
        /// Yapılan ödemelerin toplamı
        public decimal TotalPayment
        {
            get
            {
                if (Payments.Any())
                    return Payments.Sum(s => s.Price);
                return decimal.Zero;
            }
        }
        public List Discounts { get; set; }
        
        /// Yapılan indirimlerin toplamı
        public decimal TotalDiscount
        {
            get
            {
                if (Discounts.Any())
                    return Discounts.Sum(s => s.Price);
                return decimal.Zero;
            }
        }
        
        /// Yapılan ödemeler ile toplam tutarın farkı.
        /// Kalan tutar
        
        public decimal RemainingPrice
        {
            get
            {
                return GrandTotal - (TotalPayment + TotalDiscount);
            }
        }
        #endregion
        #region Methods
        
        /// İlgili SaleModel'e bir satır ürün ekler..
        
        public void AddProduct(Product product)
        {
            this.Products.Add(product);
        }
        
        /// İlgili SaleModel'e bir satır ödeme ekler..
        
        public void AddPayment(Payment payment)
        {
            this.Payments.Add(payment);
        }
        
        /// İlgili SaleModel'e bir satır indirim ekler..
        
        public void AddDiscount(Discount discount)
        {
            this.Discounts.Add(discount);
        }
        #endregion
    }
	

Anlaşılır olması açısından propertylerin üstüne yorum satırları ekledim bunları okumanızda fayda var. Aynı zamanda burda ki yapılanları özetliyelim. Bir SaleModel'imiz var. Bu model içerisinde product, discount, payment nesnelerinden listeler barındırıyor. Product nesnelerinin price toplamlarına göre ortaya çıkan GrandTotal. Discount ve Payment nesnelerinin price toplamı ile GrandTotal arasında farkı bulunan RemainingPrice yani kalan tutar bulunuyor.

Methodlarımız aynı class içerisinde olduğundan bize güzel bir kullanım şekli sağlacak. Instance aldığımız SaleModel'i kullanırken "AddProduct" diyerek yeni ürün ekleyip. Buna bağlı ödeme ve indirimleri saleModel.AddPayment, saleModel.AddDiscount gibi kullanabileceğiz. Product, Discount ve Payment nesnelerimiz ise şu şekilde ;

  public class Product
    {
        public string Name { get; set; }
        public string Barcode { get; set; }
        public decimal Price { get; set; }
        public int Quantity { get; set; }
    }
    public class Discount
    {
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
    public class Payment
    {
        public string Name { get; set; }
        public decimal Price { get; set; }
    }

Ben bu nesnelerde ki özellikleri en temel haliyle yazdım. Siz talep, isteklere göre bunu genişletebilirsiniz. Yukarda anlattığımız olaylar sonucunda bir nesneye ürün ekleyip ödeme ve indirimleri girebilir hale getirdik. Bundan sonra nesnemizi saklama ve istediğimizde cağırma işlemlerini yapacağımız bir class yazalım. Bu classın adına "SaleController" diyorum. Arayüz olarak web ortamı kullanacağımız için nesnemizi Session'a yazıp. İstediğimiz zaman ordan geri çekicez. Bu SaleController.cs ise şu şekilde ;

 public static class SaleController
    {
        /// Session üzerinde SaleModel varsa eğer onu döner yoksa yeni bir nesne oluşturur..
        public static SaleModel GetSale()
        {
            if (System.Web.HttpContext.Current.Session["SaleModel"] != null)
                return (SaleModel)System.Web.HttpContext.Current.Session["SaleModel"];

            return new SaleModel();
        }
        /// İlgili SaleModel'de yapılan değişiklikleri kayıt eder..
        public static void SaveChanges(this SaleModel saleModel)
        {
            //Buralarda veritabanına yazma işlemleri yapılabilir tabi ki.
            //Biz şimdilik sadece Session üzerine yazıyoruz..
            System.Web.HttpContext.Current.Session["SaleModel"] = saleModel;
        }
    }

Burda SaleController nesnesi ile GetSale() dediğimiz session üzerinde SaleModel nesnesi varsa bize onu döndürücek. Yoksa eğer yeni SaleModel oluşturucak. SaveChanges() methodunu cağırdığımız ise SaleModel'in son halini Session'a atıcaktır. Bu methodu (this SaleModel saleModel) olarak extension halinde kullandım. Direk olarak instance aldığımız SaleModel nesnesine .SaveChanges() diyebilmek için. Yorum satırlarında da yazdığım burda ben sadece Session üzerinde işlem yaptım. Eğer bu sipariş modülü veritabanına kayıt yapılacaksa o işlemler burda olabilir.

Yada Sale.Data diye farklı katman yapıp burda veritabanına kayıt işlemleri yapılabilir. Bu tarzda bir çalışmayı sonra ki yazılarımda yapacağım. Asp.net MVC ile Sale.Web projesi açtım. Bunuda projeyi indirdiğinizde görüceksiniz. Burda da ürün ekleme, ödeme ekleme, indirim ekleme methodlarının kullanımını görüceksiniz. Bu bölümlerde html form post etme işlemleri var pek anlatıcak birşey yok.

Projeyi indirirseniz eğer rahatlıkla kullanımlarını inceleyebilirsiniz zaten. C# ile gerçekten güzel bir sipariş modülü yaptık. Bu modülü küçümsemeyin, temel olarak çok iyi bence. Bunun üstüne geliştirme yaparak projeler geliştirebilirsiniz benden söylemesi.

Samet ÇINAR Hakkında

2010 senesinden bu yana hem tam zamanlı hemde freelance olarak Yazılım Geliştirme Uzmanı olarak çalışmaktayım. Her gün daha güzel geliştirmeler yapmak için araştırıp öğrenmeyi, öğrendiklerimi aktarmayı çok seviyorum.

İLGİLİ YAZILAR

YORUMLAR

Ufuk

4.7.2015

hocam güzel bi giriş olmuş şahsen benim adıma iyi bir başlangıç ve eğitici oLdu baya diğer yazıları bilmem de bu yazının serisini bekliyorum :)

Yorum Yap