Atelier file implementation + following storage creation and check quantity of dresses in ateliers logic.

This commit is contained in:
Yuee Shiness 2023-05-30 21:36:51 +04:00
parent 651c29a9ea
commit 6e08782795
10 changed files with 269 additions and 4 deletions
DressAtelierBusinessLogic/BusinessLogic
DressAtelierContracts
BindingModels
BusinessLogicContracts
SearchModels
ViewModels
DressAtelierDataModels/Models
DressAtelierFileImplement
DressAtelierListImplement/Models

@ -9,6 +9,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
using System.Xml.Linq;
namespace DressAtelierBusinessLogic.BusinessLogic
@ -153,5 +154,38 @@ namespace DressAtelierBusinessLogic.BusinessLogic
}
return true;
}
public bool CheckGoods(DressBindingModel model, int quantity)
{
var ateliers = _atelierStorage.GetFilteredList(new AtelierSearchModel { DressID = model.ID});
int requiredQuantity = quantity;
using (TransactionScope scope = new TransactionScope())
{
try
{
foreach(var atelier in ateliers)
{
if (atelier.DressesList[model.ID].Item2 == requiredQuantity)
{
atelier.DressesList.Remove(model.ID);
scope.Complete();
return true;
}
requiredQuantity -= atelier.DressesList[model.ID].Item2;
atelier.DressesList.Remove(model.ID);
}
if(requiredQuantity > 0)
{
throw new Exception("Not enough dresses in ateliers");
}
}
catch(Exception ex)
{
return false;
}
}
return false;
}
}
}

@ -18,5 +18,7 @@ namespace DressAtelierContracts.BindingModels
public Dictionary<int, (IDressModel, int)> DressesList { get; set; } = new();
public int ID { get; set; }
public int MaxTotalOfDresses { get; set; }
}
}

@ -17,5 +17,6 @@ namespace DressAtelierContracts.BusinessLogicContracts
bool Create(AtelierBindingModel model);
bool Update(AtelierBindingModel model);
bool Delete(AtelierBindingModel model);
bool CheckGoods(DressBindingModel model, int quantity);
}
}

@ -10,5 +10,6 @@ namespace DressAtelierContracts.SearchModels
{
public int? ID { get; set; }
public string? Name { get; set; }
public int? DressID { get; set; }
}
}

@ -20,6 +20,6 @@ namespace DressAtelierContracts.ViewModels
public Dictionary<int, (IDressModel, int)> DressesList { get; set; } = new();
public int MaxTotalOfDresses { get; set; }
}
}

@ -12,5 +12,6 @@ namespace DressAtelierDataModels.Models
string Address { get; }
DateTime OpeningDate { get; }
Dictionary<int,(IDressModel,int)> DressesList { get; }
int MaxTotalOfDresses { get; }
}
}

@ -15,9 +15,11 @@ namespace DressAtelierFileImplement
private readonly string MaterialFileName = "Material.xml";
private readonly string OrderFileName = "Order.xml";
private readonly string DressFileName = "Dress.xml";
private readonly string AtelierFileName = "Atelier.xml";
public List<Material> Components { get; private set; }
public List<Order> Orders { get; private set; }
public List<Dress> Dresses { get; private set; }
public List<Atelier> Ateliers { get; private set; }
public static DataFileSingleton GetInstance()
{
if (instance == null)
@ -29,11 +31,13 @@ namespace DressAtelierFileImplement
public void SaveComponents() => SaveData(Components, MaterialFileName,"Components", x => x.GetXElement);
public void SaveDresses() => SaveData(Dresses, DressFileName,"Dresses", x => x.GetXElement);
public void SaveOrders() => SaveData(Orders, OrderFileName,"Orders", x => x.GetXElement);
public void SaveAteliers() => SaveData(Ateliers, AtelierFileName, "Atelier", x => x.GetXElement);
private DataFileSingleton()
{
Components = LoadData(MaterialFileName, "Component", x => Material.Create(x)!)!;
Dresses = LoadData(DressFileName, "Dress", x => Dress.Create(x)!)!;
Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
Ateliers = LoadData(AtelierFileName, "Atelier", x => Atelier.Create(x)!)!;
}
private static List<T>? LoadData<T>(string filename, string xmlNodeName,
Func<XElement, T> selectFunction)

@ -0,0 +1,101 @@
using DressAtelierContracts.BindingModels;
using DressAtelierContracts.SearchModels;
using DressAtelierContracts.StorageContracts;
using DressAtelierContracts.ViewModels;
using DressAtelierFileImplement.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DressAtelierFileImplement.Implements
{
public class AtelierStorage : IAtelierStorage
{
private readonly DataFileSingleton _source;
public AtelierStorage()
{
_source = DataFileSingleton.GetInstance();
}
public AtelierViewModel? Insert(AtelierBindingModel model)
{
model.ID = _source.Ateliers.Count() > 0 ? _source.Ateliers.Max(x => x.ID) + 1 : 1;
var newAtelier = Atelier.Create(model);
if(newAtelier == null)
{
return null;
}
_source.Ateliers.Add(newAtelier);
_source.SaveAteliers();
return newAtelier.GetViewModel;
}
public AtelierViewModel? Update(AtelierBindingModel model)
{
var atelier = _source.Ateliers.FirstOrDefault(x => x.ID == model.ID);
if(atelier == null)
{
return null;
}
atelier.Update(model);
_source.SaveAteliers();
return atelier.GetViewModel;
}
public AtelierViewModel? Delete(AtelierBindingModel model)
{
var atelier = _source.Ateliers.FirstOrDefault(x => x.ID == model.ID);
if (atelier == null)
{
return null;
}
_source.Ateliers.Remove(atelier);
_source.SaveAteliers();
return atelier.GetViewModel;
}
public AtelierViewModel? GetElement(AtelierSearchModel model)
{
if (string.IsNullOrEmpty(model.Name) && !model.ID.HasValue)
{
return null;
}
if(!string.IsNullOrEmpty(model.Name))
{
return _source.Ateliers.FirstOrDefault(x => x.Name.Equals(model.Name))?.GetViewModel;
}
if (model.ID.HasValue)
{
return _source.Ateliers.FirstOrDefault(x => x.ID == model.ID)?.GetViewModel;
}
return null;
}
public List<AtelierViewModel> GetFilteredList(AtelierSearchModel model)
{
if (string.IsNullOrEmpty(model.Name) && !model.DressID.HasValue)
{
return new();
}
if(!string.IsNullOrEmpty(model.Name))
{
return _source.Ateliers.Where(x => x.Name.Equals(model.Name)).Select(x => x.GetViewModel).ToList();
}
return _source.Ateliers.Where(x => x.DressesList.ContainsKey((int)model.DressID)).Select(x => x.GetViewModel).ToList();
}
public List<AtelierViewModel> GetFullList()
{
return _source.Ateliers.Select(x => x.GetViewModel).ToList();
}
}
}

@ -0,0 +1,114 @@
using DressAtelierContracts.BindingModels;
using DressAtelierContracts.ViewModels;
using DressAtelierDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace DressAtelierFileImplement.Models
{
public class Atelier : IAtelierModel
{
public int ID { get; private set; }
public string Name { get; private set; } = string.Empty;
public string Address { get; private set; } = string.Empty;
public DateTime OpeningDate { get; private set; } = DateTime.Now;
public Dictionary<int, (IDressModel, int)> Dresses {
get
{
if(DressesList.Count == 0)
{
var source = DataFileSingleton.GetInstance();
DressesList = CurrentDresses.ToDictionary(x => x.Key, y => ((source.Dresses.FirstOrDefault(z => z.ID == y.Key) as IDressModel)!, y.Value));
}
return DressesList;
}
}
public Dictionary<int, (IDressModel, int)> DressesList { get; private set; } = new();
public int MaxTotalOfDresses { get; private set; }
public Dictionary<int, int> CurrentDresses { get; private set; } = new();
public int CurrentQuantity { get; private set; }
public static Atelier? Create(AtelierBindingModel? atelier)
{
if (atelier == null)
{
return null;
}
return new Atelier()
{
ID = atelier.ID,
Name = atelier.Name,
Address = atelier.Address,
OpeningDate = atelier.OpeningDate,
CurrentDresses = atelier.DressesList.ToDictionary(x => x.Key,x => x.Value.Item2),
DressesList = atelier.DressesList,
CurrentQuantity = atelier.DressesList.Count(),
MaxTotalOfDresses = atelier.MaxTotalOfDresses
};
}
public static Atelier? Create(XElement element)
{
if (element == null)
{
return null;
}
return new Atelier()
{
ID = Convert.ToInt32(element.Attribute("ID")!.Value),
Name = element.Element("Name")!.Value,
Address = element.Element("Address")!.Value,
OpeningDate = Convert.ToDateTime(element.Element("OpeningDate")!.Value),
CurrentDresses = element.Element("Dresses")!.Elements("Dress").ToDictionary(x => Convert.ToInt32(x.Element("Key")?.Value), x => Convert.ToInt32(x.Element("Value")?.Value)),
MaxTotalOfDresses = Convert.ToInt32(element.Element("MaxTotalOfDresses")!.Value),
CurrentQuantity = Convert.ToInt32(element.Element("CurrentDressesQuantity")!.Value)
};
}
public void Update(AtelierBindingModel? atelier)
{
if (atelier == null)
{
return;
}
Name = atelier.Name;
Address = atelier.Address;
CurrentDresses = atelier.DressesList.ToDictionary(x => x.Key, x => x.Value.Item2);
DressesList = null;
OpeningDate = atelier.OpeningDate;
MaxTotalOfDresses = atelier.MaxTotalOfDresses;
}
public AtelierViewModel GetViewModel => new()
{
ID = ID,
Name = Name,
Address = Address,
OpeningDate = OpeningDate,
DressesList = DressesList,
MaxTotalOfDresses = MaxTotalOfDresses
};
public XElement GetXElement => new("Atelier", new XAttribute("ID", ID),
new XElement("Name", Name),
new XElement("Address", Address),
new XElement("OpeningDate", OpeningDate.ToString()),
new XElement("Dresses", DressesList),
new XElement("MaxTotalOfDresses", MaxTotalOfDresses),
new XElement("CurrentDressesQuantity", CurrentQuantity));
}
}

@ -14,6 +14,8 @@ namespace DressAtelierListImplement.Models
public int ID { get; private set; }
public string Name { get; private set; } = string.Empty;
public string Address { get; private set; } = string.Empty;
public int MaxTotalOfDresses { get; private set; }
public int CurrentDressesQuantity { get; private set; }
public DateTime OpeningDate { get; private set; } = DateTime.Today;
public Dictionary<int, (IDressModel, int)> DressesList { get; private set; } = new Dictionary<int, (IDressModel, int)>();
@ -29,7 +31,9 @@ namespace DressAtelierListImplement.Models
Name = atelier.Name,
Address = atelier.Address,
OpeningDate = atelier.OpeningDate,
DressesList = atelier.DressesList
DressesList = atelier.DressesList,
MaxTotalOfDresses = atelier.MaxTotalOfDresses,
CurrentDressesQuantity = 0
};
}
@ -43,6 +47,8 @@ namespace DressAtelierListImplement.Models
Address = atelier.Address;
DressesList = atelier.DressesList;
OpeningDate = atelier.OpeningDate;
MaxTotalOfDresses = atelier.MaxTotalOfDresses;
CurrentDressesQuantity = DressesList.Count();
}
@ -52,7 +58,8 @@ namespace DressAtelierListImplement.Models
Name = Name,
Address = Address,
OpeningDate = OpeningDate,
DressesList = DressesList
DressesList = DressesList,
MaxTotalOfDresses = MaxTotalOfDresses
};
}
}