using System; using System.Collections.Generic; using Tanshu.Accounts.Entities; using Tanshu.Accounts.Entities.Auth; using NHibernate; using System.Linq; using Tanshu.Common.Helpers; namespace Tanshu.Accounts.Repository { public class VoucherSettlementBI : UnitOfWork { public static void UpdateSettlements(IList list, decimal amount) { amount = Math.Round(amount, 5); if (list.Count(x => x.Settled == SettleOption.Amount) == 0) list.Add(new VoucherSettlement() { Amount = amount, Settled = SettleOption.Amount }); else list.Single(x => x.Settled == SettleOption.Amount).Amount = amount; var roundoff = Math.Round(amount) - amount; if (list.Count(x => x.Settled == SettleOption.RoundOff) == 0) list.Add(new VoucherSettlement() { Amount = roundoff, Settled = SettleOption.RoundOff }); else list.Single(x => x.Settled == SettleOption.RoundOff).Amount = roundoff; var balance = list.Where(x => x.Settled != SettleOption.Unsettled).Sum(x => x.Amount) * -1; if (list.Count(x => x.Settled == SettleOption.Unsettled) == 0) { if (balance != 0) list.Add(new VoucherSettlement() { Amount = balance, Settled = SettleOption.Unsettled }); } else list.Single(x => x.Settled == SettleOption.Unsettled).Amount = balance; } public void SettleVoucher(User user, Guid voucherID, IDictionary values) { var voucher = _session.Get(voucherID); var amount = Math.Round(-1 * voucher.Kots.Sum(x => x.Inventories.Sum(y => y.Amount)), 5); values.Add(SettleOption.Amount, Math.Round(amount, 5)); var roundoff = Math.Round(amount) - amount; if (roundoff != 0) values.Add(SettleOption.RoundOff, roundoff); var unsettled = values.Sum(x => x.Value) * -1; if (unsettled != 0) values.Add(SettleOption.Unsettled, unsettled); UpdateOld(voucher, values); AddNew(voucher, values); voucher.User = user; _session.Update(voucher); var table = _session.QueryOver() .Where(x => x.FoodTableID == voucher.Table.FoodTableID && x.VoucherID == voucher.VoucherID) .SingleOrDefault(); table.VoucherID = null; table.Status = null; _session.Update(table); } private void UpdateOld(Voucher voucher, IDictionary values) { for (var i = voucher.Settlements.Count - 1; i >= 0; i--) { var item = voucher.Settlements[i]; if (!values.ContainsKey(item.Settled) || (values[item.Settled] == 0 && item.Settled != SettleOption.Amount)) { voucher.Settlements.Remove(item); _session.Delete(item); } else { item.Amount = values[item.Settled]; _session.Update(item); values.Remove(item.Settled); } } } private void AddNew(Voucher voucher, IDictionary values) { foreach (var item in values) { var set = new VoucherSettlement { Settled = item.Key, Amount = item.Value, Voucher = voucher }; voucher.Settlements.Add(set); _session.Save(set); } } } }