using System; using System.Collections.Generic; using System.Linq.Expressions; using Tanshu.Accounts.Entities; using Tanshu.Common.Helpers; using NHibernate; using System.Linq; using Tanshu.Accounts.Contracts; namespace Tanshu.Accounts.Repository { public class VoucherBI : UnitOfWork { public new Guid Insert(Voucher voucher) { _session.Save(voucher); Kot addedKot = null; foreach (var item in voucher.Kots.Where(item => item.KotID == Guid.Empty)) { addedKot = item; item.Voucher = voucher; item.Printed = true; item.Table = voucher.Table; item.User = voucher.User; UpdateBillType(voucher); _session.Save(item); foreach (var inv in item.Inventories) { inv.Kot = item; _session.Save(inv); foreach (var modifier in inv.InventoryModifier) { modifier.Inventory = inv; _session.Save(modifier); } } } var amount = -1 * voucher.Kots.Sum(x => x.Inventories.Sum(y => y.Amount)); VoucherSettlementBI.UpdateSettlements(voucher.Settlements, amount); foreach (var settlement in voucher.Settlements.Where(x => x.Amount != 0 || x.Settled == SettleOption.Amount)) { settlement.Voucher = voucher; _session.Save(settlement); } return addedKot == null ? Guid.Empty : addedKot.KotID; } public Guid Insert(Voucher voucher, bool updateTable) { var kotID = Insert(voucher); if (updateTable) { var table = _session.QueryOver().Where(x => x.FoodTableID == voucher.Table.FoodTableID).SingleOrDefault(); if (table.VoucherID.HasValue) throw new ValidationException("A bill exists on this table, cannot overwrite"); var status = !voucher.Printed ? "running" : "printed"; table.VoucherID = voucher.VoucherID; table.Status = status; _session.Update(table); } return kotID; } public new Guid? Update(Voucher voucher) { _session.Update(voucher); Kot addedKot = null; foreach (var item in voucher.Kots.Where(item => item.KotID == Guid.Empty)) { addedKot = item; item.Voucher = voucher; item.Printed = true; item.Table = voucher.Table; item.User = voucher.User; _session.Save(item); foreach (var inv in item.Inventories) { inv.Kot = item; _session.Save(inv); foreach (var modifier in inv.InventoryModifier) { modifier.Inventory = inv; _session.Save(modifier); } } } UpdateBillType(voucher); var amount = -1 * voucher.Kots.Sum(x => x.Inventories.Sum(y => y.Amount)); VoucherSettlementBI.UpdateSettlements(voucher.Settlements, amount); foreach (var settlement in voucher.Settlements) { settlement.Voucher = voucher; if (settlement.Amount == 0 && settlement.Settled != SettleOption.Amount) { if (settlement.VoucherSettlementID != Guid.Empty) _session.Delete(settlement); } else if (settlement.VoucherSettlementID == Guid.Empty) _session.Save(settlement); else _session.Update(settlement); } return addedKot == null ? (Guid?)null : addedKot.KotID; } public Guid? Update(Voucher voucher, bool updateTable) { var kotID = Update(voucher); if (updateTable) { var table = _session.QueryOver().Where(x => x.FoodTableID == voucher.Table.FoodTableID).SingleOrDefault(); var status = !voucher.Printed ? "running" : "printed"; table.VoucherID = voucher.VoucherID; table.Status = status; _session.Update(table); } return kotID; } public new Voucher Get(Expression> query) { var voucher = _session.QueryOver() .Where(query) .SingleOrDefault(); if (voucher == null) return voucher; NHibernateUtil.Initialize(voucher.Customer); NHibernateUtil.Initialize(voucher.Waiter); NHibernateUtil.Initialize(voucher.User); NHibernateUtil.Initialize(voucher.Table); foreach (var kot in voucher.Kots) { NHibernateUtil.Initialize(kot); NHibernateUtil.Initialize(kot.User); foreach (var item in kot.Inventories) { NHibernateUtil.Initialize(item); NHibernateUtil.Initialize(item.Product); NHibernateUtil.Initialize(item.Product.ProductGroup); foreach (var inmod in item.InventoryModifier) NHibernateUtil.Initialize(inmod.Modifier); } } foreach (var item in voucher.Settlements) NHibernateUtil.Initialize(item); return voucher; } public void VoidBill(Guid voucherID, string reason, bool updateTable) { var voucher = _session.Get(voucherID); voucher.Void = true; voucher.VoidReason = reason; _session.Update(voucher); if (updateTable) { var table = _session.QueryOver().Where(x => x.FoodTableID == voucher.Table.FoodTableID).SingleOrDefault(); table.VoucherID = null; table.Status = null; _session.Update(table); } } public Guid MergeKot(Guid kotID, string tableName) { var kot = _session.Get(kotID); var oldVoucher = kot.Voucher; var table = _session.QueryOver().Where(x => x.Name == tableName).SingleOrDefault(); var newVoucher = _session.Get(table.VoucherID); oldVoucher.Kots.Remove(kot); kot.Voucher = newVoucher; newVoucher.Kots.Add(kot); _session.Update(kot); _session.Update(oldVoucher); _session.Update(newVoucher); return newVoucher.VoucherID; } public Guid MergeTables(Guid voucherID, string tableName) { var newTable = _session.QueryOver().Where(x => x.Name == tableName).SingleOrDefault(); var newVoucher = _session.Get(newTable.VoucherID); var oldVoucher = _session.Get(voucherID); for (var i = oldVoucher.Kots.Count - 1; i >= 0; i--) { var kot = oldVoucher.Kots[i]; oldVoucher.Kots.Remove(kot); kot.Voucher = newVoucher; newVoucher.Kots.Add(kot); _session.Update(kot); } _session.Update(newVoucher); var oldTable = _session.QueryOver().Where(x => x.FoodTableID == oldVoucher.Table.FoodTableID).SingleOrDefault(); foreach (var item in oldVoucher.Settlements) { _session.Delete(item); } _session.Delete(oldVoucher); oldTable.VoucherID = null; oldTable.Status = null; _session.Update(oldTable); return newVoucher.VoucherID; } private void UpdateBillType(Voucher voucher) { switch (voucher.VoucherType) { case VoucherType.Regular: break; case VoucherType.NoCharge: foreach (var item in voucher.Kots.SelectMany(kot => kot.Inventories)) { item.ServiceCharge = 0; item.ServiceTaxRate = 0; item.VatRate = 0; if (item.InventoryID != Guid.Empty) _session.Update(item); } break; case VoucherType.TakeAway: foreach (var item in voucher.Kots.SelectMany(kot => kot.Inventories)) { item.ServiceCharge = 0; item.ServiceTaxRate = 0; if (item.InventoryID != Guid.Empty) _session.Update(item); } break; case VoucherType.Staff: foreach (var item in voucher.Kots.SelectMany(kot => kot.Inventories)) { item.ServiceCharge = 0; item.ServiceTaxRate = 0; item.VatRate = 0; if (item.InventoryID != Guid.Empty) _session.Update(item); } break; } } public Guid MoveKot(Guid kotID, Guid tableID) { var kot = _session.Get(kotID); var oldVoucher = _session.Get(kot.Voucher.VoucherID); var table = _session.QueryOver().Where(x => x.FoodTableID == tableID).SingleOrDefault(); var newVoucher = new Voucher(Session.User, oldVoucher.Customer, table, oldVoucher.Waiter, false, false, ""); Insert(newVoucher); table.VoucherID = newVoucher.VoucherID; table.Status = "running"; _session.Update(table); oldVoucher.Kots.Remove(kot); kot.Voucher = newVoucher; newVoucher.Kots.Add(kot); _session.Update(kot); _session.Update(oldVoucher); _session.Update(newVoucher); return newVoucher.VoucherID; } public void SplitBill(Guid oldVoucherID, Voucher first, Voucher second) { var oldVoucher = _session.Get(oldVoucherID); oldVoucher.User = Session.User; oldVoucher.Void = true; oldVoucher.VoidReason = "Bill Split"; Insert(first); Insert(second); Update(oldVoucher); var status = oldVoucher.Printed ? "printed" : "running"; var tableFirst = _session.QueryOver().Where(x => x.FoodTableID == first.Table.FoodTableID).SingleOrDefault(); if (tableFirst.VoucherID.HasValue) throw new ValidationException("A bill exists on this table, cannot overwrite"); tableFirst.VoucherID = first.VoucherID; tableFirst.Status = status; _session.Update(tableFirst); var tableSecond = _session.QueryOver().Where(x => x.FoodTableID == second.Table.FoodTableID).SingleOrDefault(); tableSecond.VoucherID = second.VoucherID; tableSecond.Status = status; _session.Update(tableFirst); } public void DiscountPrintedBill(Guid oldVoucherID, Voucher newVoucher) { var oldVoucher = _session.Get(oldVoucherID); oldVoucher.User = Session.User; oldVoucher.Void = true; oldVoucher.VoidReason = string.Format("Bill Discounted / Changed. New Bill ID is {0}", newVoucher.FullBillID); Insert(newVoucher); Update(oldVoucher); var table = _session.QueryOver().Where(x => x.FoodTableID == oldVoucher.Table.FoodTableID).SingleOrDefault(); table.VoucherID = newVoucher.VoucherID; table.Status = "printed"; _session.Update(table); } public Guid Move(Guid oldTableID, Guid newTableID) { var oldTable = _session.QueryOver().Where(x => x.FoodTableID == oldTableID).SingleOrDefault(); var newTable = _session.QueryOver().Where(x => x.FoodTableID == newTableID).SingleOrDefault(); var voucher = _session.Get(oldTable.VoucherID); newTable.Status = oldTable.Status; newTable.VoucherID = oldTable.VoucherID; oldTable.Status = null; oldTable.VoucherID = null; voucher.Table = newTable; _session.Update(newTable); _session.Update(oldTable); _session.Update(voucher); return voucher.VoucherID; } } }