Mini Kabibi Habibi
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;
}
}
}