Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXTREME 13.1 Demos/DXSK8/DXSK8.Service/
Upload File :
Current File : C:/Users/Public/Documents/DXTREME 13.1 Demos/DXSK8/DXSK8.Service/SK8Data.cs

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.EntityClient;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using System.Data.Services;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.Web;
using System.Collections.Generic;
using System.Data;

namespace DXSK8.Service
{
    public partial class SK8DataContainer : ObjectContext {
        private const int NotificationQuantityThreshold = 5;
        protected override void Dispose(bool disposing) {
            base.Dispose(disposing);
        }
        private void CheckInventoriesForNotification(List<Inventory> inventories) {
            var notifier = new PushNotifications();
            foreach(var inventory in inventories) {
                if(inventory.Quantity < NotificationQuantityThreshold) {
                    NotifyForInventory(inventory, notifier);
                }
            }
        }
        public void NotifyForInventory(Inventory inventory, PushNotifications notifier) {
            foreach(var channel in this.NotificationChannels) {
                var notificationContent = GetInventoryNotificationXml(inventory);
                notifier.Notify(channel.Url, notificationContent);
            }
        }
        private string GetInventoryNotificationXml(Inventory inventory) {
            string text;
            if(inventory.Quantity == 0) {
                text = inventory.Product.Name + ". Item is out of stock!";
            }
            else if(inventory.Quantity == 1) {
                text = inventory.Product.Name + ". Only one item in stock!";
            }
            else {
                text = inventory.Product.Name + ". Only " + inventory.Quantity + " items in stock!";
            }
            var imageSrc = "http://demos.devexpress.com/DXTREME/DXSK8_static/Images/Types/" + inventory.Product.Type.Name.Replace(" ", "").Replace("&", "") + ".png";
            var launchString = string.Format("{0};{1};{2};{3};{4}", inventory.Product.Brand.Name, inventory.Store.Address.Address1, inventory.Product.Name, inventory.Quantity, imageSrc);
            return string.Format(@"<?xml version='1.0' encoding='utf-8'?>
                    <toast launch='{0}'>
                        <visual lang='en-US'>
                            <binding template='ToastImageAndText01'>
                                <image id='1' src='{1}' />
                                <text id='1'>{2}</text>
                            </binding>
                        </visual>
                    </toast>
                ", launchString, imageSrc, text);

        }
        private void UpdateOrderState( ) {
            var changerOrderItems = this.ObjectStateManager
                .GetObjectStateEntries(EntityState.Modified)
                .Select(entry => entry.Entity)
                .OfType<OrderItem>().ToList();
            changerOrderItems.ForEach(orderItem => {
                if(orderItem.State == 1) {
                    var completedCount = orderItem.Order.OrderItems.Count(item => item.State == 1);
                    orderItem.Order.State = (int)(completedCount == orderItem.Order.OrderItems.Count ? OrderState.Completed : OrderState.Inprogress);
                    UpdateInventory(orderItem.Product.Inventories.First(x => x.Store.Id == 1), orderItem.Order.Id);
                }
            });
        }
        private static void UpdateInventory(Inventory inventory, int OrderId) {
            if(inventory.Quantity == 0) {
                throw new Exception(inventory.Product.Name + " is out of stock");
            }
            else {
                inventory.Quantity = inventory.Quantity - 1;
                if(inventory.Quantity == 0) {
                    var orders = inventory.Product.OrderItems
                        .Where(x => (x.Order.State != ((int)OrderState.Completed) && x.State != 1))
                        .Select(x => x.Order)
                        .Distinct().ToList();

                    orders.ForEach(
                        
                        x => {
                            x.State = ((int)OrderState.OutOfStock);
                        
                        }
                    );

                }
            }
        }
        public override int SaveChanges(SaveOptions options) {
            UpdateOrderState();
            List<Inventory> inventories =
                this.ObjectStateManager
                    .GetObjectStateEntries(EntityState.Modified)
                    .Select(entry => entry.Entity)
                    .OfType<Inventory>().ToList();

            var result = base.SaveChanges(options);
            CheckInventoriesForNotification(inventories);
            return result;
        }
    }
    public enum OrderState : int {
        Draft = 0,
        New = 1,
        Inprogress = 2,
        Completed = 3,
        OutOfStock = 4
    }
  
    public partial class Product : IImageSource {
        #region IImageSource Members

        byte[] IImageSource.Image {
            get { return Image.Image; }
        }

        #endregion
    }

    [IgnoreProperties("Logo")]
    public partial class Brand : IImageSource {
        byte[] IImageSource.Image {
            get { return Logo.Image; }
        }
    }

    [IgnoreProperties("Avatar")]
    public partial class Login : IImageSource {
        #region IImageSource Members

        public byte[] Image {
            get { return Avatar.Image; }
        }

        #endregion
    }

    public partial class ImageSource {
        public void SetImage(byte[] image) {
            Image = image;
        }
    }
}