narsil/Tanshu.Accounts.Repository/VoucherSettlementBI.cs

91 lines
3.7 KiB
C#
Raw Normal View History

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<VoucherSettlement>
{
public static void UpdateSettlements(IList<VoucherSettlement> 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<SettleOption, decimal> values)
{
var voucher = _session.Get<Voucher>(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<FoodTable>()
.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<SettleOption, decimal> 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<SettleOption, decimal> 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);
}
}
}
}