Fix: Update settlements was broken and would remove the Amount and Roundoff settlements

Chore: SalesAnalysis report refactored
This commit is contained in:
tanshu
2014-11-11 15:53:54 +05:30
parent c52f382ec2
commit e3f92da5ad
13 changed files with 394 additions and 352 deletions

View File

@ -401,7 +401,6 @@ namespace Tanshu.Accounts.PointOfSale
return; return;
IDictionary<SettleOption, decimal> options; IDictionary<SettleOption, decimal> options;
var amount = -1 * _billInfo.Kots.Sum(x => x.Inventories.Sum(y => y.Amount)); var amount = -1 * _billInfo.Kots.Sum(x => x.Inventories.Sum(y => y.Amount));
VoucherSettlementBI.UpdateSettlements(_billInfo.Settlements, amount);
using (var frm = new SettleChoicesForm(Math.Round(amount) * -1, _billInfo.VoucherType)) using (var frm = new SettleChoicesForm(Math.Round(amount) * -1, _billInfo.VoucherType))
{ {
frm.ShowDialog(); frm.ShowDialog();

View File

@ -26,7 +26,7 @@ namespace Tanshu.Accounts.PointOfSale
if (_loading) return; if (_loading) return;
if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit")) if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit"))
return; return;
_list = new SalesAnalysisBI().GetBillDetails(dtpStart.Value, dtpFinish.Value); _list = new ReportsBI().GetBillDetails(dtpStart.Value, dtpFinish.Value);
dgvSale.AutoGenerateColumns = true; dgvSale.AutoGenerateColumns = true;
dgvSale.DataSource = _list; dgvSale.DataSource = _list;
dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

View File

@ -23,7 +23,7 @@ namespace Tanshu.Accounts.PointOfSale
{ {
if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit")) if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit"))
return; return;
_list = new SalesAnalysisBI().DiscountReport(dtpStart.Value, dtpFinish.Value); _list = new ReportsBI().DiscountReport(dtpStart.Value, dtpFinish.Value);
dgvSale.AutoGenerateColumns = true; dgvSale.AutoGenerateColumns = true;
dgvSale.DataSource = _list; dgvSale.DataSource = _list;
dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

View File

@ -41,7 +41,7 @@ namespace Tanshu.Accounts.PointOfSale
!Session.IsAllowed("Accounts Audit")) !Session.IsAllowed("Accounts Audit"))
return; return;
_list = new SalesAnalysisBI().GetSale(dtpStart.Value, dtpFinish.Value); _list = new SalesAnalysisBI().GetSaleAnalysis(dtpStart.Value, dtpFinish.Value);
dgvSale.AutoGenerateColumns = true; dgvSale.AutoGenerateColumns = true;
dgvSale.DataSource = _list; dgvSale.DataSource = _list;

View File

@ -23,7 +23,7 @@ namespace Tanshu.Accounts.PointOfSale
{ {
if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit")) if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit"))
return; return;
_list = new SalesAnalysisBI().GetSaleDetail(dtpStart.Value, dtpFinish.Value); _list = new ReportsBI().GetSaleDetail(dtpStart.Value, dtpFinish.Value);
dgvSale.AutoGenerateColumns = true; dgvSale.AutoGenerateColumns = true;
dgvSale.DataSource = _list; dgvSale.DataSource = _list;
dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

View File

@ -43,6 +43,9 @@
this.dgvSale.AllowUserToAddRows = false; this.dgvSale.AllowUserToAddRows = false;
this.dgvSale.AllowUserToDeleteRows = false; this.dgvSale.AllowUserToDeleteRows = false;
this.dgvSale.AllowUserToResizeRows = false; this.dgvSale.AllowUserToResizeRows = false;
this.dgvSale.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dgvSale.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dgvSale.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvSale.Location = new System.Drawing.Point(12, 41); this.dgvSale.Location = new System.Drawing.Point(12, 41);
this.dgvSale.MultiSelect = false; this.dgvSale.MultiSelect = false;

View File

@ -24,7 +24,7 @@ namespace Tanshu.Accounts.PointOfSale
{ {
if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit")) if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit"))
return; return;
_list = new SalesAnalysisBI().VoidOrReprintedBillsList(dtpStart.Value, dtpFinish.Value); _list = new ReportsBI().VoidOrReprintedBillsList(dtpStart.Value, dtpFinish.Value);
dgvSale.AutoGenerateColumns = true; dgvSale.AutoGenerateColumns = true;
dgvSale.DataSource = _list; dgvSale.DataSource = _list;
dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

View File

@ -157,7 +157,7 @@ order by v.Date desc
} }
query = @" query = @"
select isnull(v.BillID + 1, 1) select coalesce(v.BillID + 1, 1)
from Voucher v from Voucher v
where v.Date < :startDate and v.Void = false and v.VoucherType = :nc where v.Date < :startDate and v.Void = false and v.VoucherType = :nc
order by v.Date desc order by v.Date desc

View File

@ -0,0 +1,234 @@
using System;
using System.Collections.Generic;
using Tanshu.Accounts.Contracts;
using Tanshu.Accounts.Entities;
using Tanshu.Common;
using Tanshu.Common.Helpers;
using System.Linq;
using NHibernate.Transform;
using NHibernate.Criterion;
namespace Tanshu.Accounts.Repository
{
public class ReportsBI
{
public IList<SalesAnalysisDetail> GetSaleDetail(DateTime startDate, DateTime finishDate)
{
startDate = startDate.Date.AddHours(6);
finishDate = finishDate.Date.AddDays(1).AddHours(5);
if (finishDate <= startDate)
return new List<SalesAnalysisDetail>();
using (var session = SessionManager.Session)
{
#region Sale
var query = @"
select concat(p.Name, ' ', p.Units) as Product, Sum(i.Quantity) as Amount
from Voucher v
inner join v.Kots k
inner join k.Inventories i
inner join i.Product p
inner join p.ProductGroup pg
where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v
and vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff)
group by concat(p.Name, ' ', p.Units), p.ProductGroup, pg.GroupType
order by pg.GroupType, p.ProductGroup, concat(p.Name, ' ', p.Units)
";
var list = session
.CreateQuery(query)
.SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge)
.SetParameter("unsettled", SettleOption.Unsettled)
.SetParameter("amount", SettleOption.Amount)
.SetParameter("roundoff", SettleOption.RoundOff)
.SetParameter("staff", SettleOption.Staff)
.List<object[]>();
var outList = new OrderedDictionary<string, SalesAnalysisDetail>();
foreach (var item in list)
outList.Add((string)item[0], new SalesAnalysisDetail() { Product = (string)item[0], Sale = (decimal)item[1] });
#endregion
#region NC
query = @"
select concat(p.Name, ' ', p.Units) as Product, Sum(i.Quantity) as Amount
from Voucher v
inner join v.Kots k
inner join k.Inventories i
inner join i.Product p
where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v and vs.Settled = :noCharge)
group by concat(p.Name, ' ', p.Units), p.ProductGroup
order by p.ProductGroup, concat(p.Name, ' ', p.Units)
";
list = session
.CreateQuery(query)
.SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge)
.List<object[]>();
foreach (var item in list)
if (outList.ContainsKey((string)item[0]))
outList[(string)item[0]].NC = (decimal)item[1];
else
outList.Add((string)item[0], new SalesAnalysisDetail() { Product = (string)item[0], NC = (decimal)item[1] });
#endregion
#region Staff
query = @"
select concat(p.Name, ' ', p.Units) as Product, Sum(i.Quantity) as Amount
from Voucher v
inner join v.Kots k
inner join k.Inventories i
inner join i.Product p
where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v and vs.Settled = :staff)
group by concat(p.Name, ' ', p.Units), p.ProductGroup
order by p.ProductGroup, concat(p.Name, ' ', p.Units)
";
list = session
.CreateQuery(query)
.SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate)
.SetParameter("staff", SettleOption.Staff)
.List<object[]>();
foreach (var item in list)
if (outList.ContainsKey((string)item[0]))
outList[(string)item[0]].Staff = (decimal)item[1];
else
outList.Add((string)item[0], new SalesAnalysisDetail() { Product = (string)item[0], Staff = (decimal)item[1] });
#endregion
return outList.Values.ToList();
}
}
public IList<BillDetail> GetBillDetails(DateTime startDate, DateTime finishDate)
{
startDate = startDate.Date.AddHours(6);
finishDate = finishDate.Date.AddDays(1).AddHours(5);
if (finishDate <= startDate)
return new List<BillDetail>();
using (var session = SessionManager.Session)
{
Voucher vAlias = null;
VoucherSettlement vsAlias = null;
var list = session.QueryOver<Voucher>(() => vAlias)
.Left.JoinAlias(x => x.Settlements, () => vsAlias)
.Where(x => x.Date >= startDate && x.Date <= finishDate)
.OrderBy(x => x.VoucherType).Asc
.ThenBy(x => x.BillID).Asc
.TransformUsing(Transformers.DistinctRootEntity)
.List();
var outList = new List<BillDetail>();
foreach (var item in list)
{
if (item.Void)
outList.Add(new BillDetail()
{
Date = item.Date,
BillID = item.FullBillID,
Settlement = string.Format("Void: {0}", item.VoidReason),
Amount = Math.Round(item.Settlements.Single(x => x.Settled == SettleOption.Amount).Amount * -1, 2)
});
else
{
foreach (var so in item.Settlements.Where(x => x.Settled.Visible()))
{
outList.Add(new BillDetail()
{
Date = item.Date,
BillID = item.FullBillID,
Settlement = so.Settled.Display(),
Amount = Math.Round(so.Amount, 2)
});
}
}
}
return outList;
}
}
public IList<SalesAnalysis> DiscountReport(DateTime startDate, DateTime finishDate)
{
startDate = startDate.Date.AddHours(6);
finishDate = finishDate.Date.AddDays(1).AddHours(5);
if (finishDate <= startDate)
return new List<SalesAnalysis>();
using (var session = SessionManager.Session)
{
const string query = @"
select pg.GroupType, sum(i.Quantity * i.Price * i.Discount)
from Inventory i
inner join i.Kot k
inner join k.Voucher v
inner join i.Product p
inner join p.ProductGroup pg
where v.Date >= :startDate and v.Date <= :finishDate and i.Discount != 0
and v not in (select Voucher from VoucherSettlement vs where vs.Voucher = v and (vs.Settled = :noCharge or vs.Settled = :staff))
group by pg.GroupType
order by pg.GroupType
";
var list = session
.CreateQuery(query)
.SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge)
.SetParameter("staff", SettleOption.Staff)
.List<object[]>();
return list.Select(item => new SalesAnalysis()
{
GroupType = (string)item[0],
Amount = (decimal)item[1]
}).ToList();
}
}
public IList<BillDetail> VoidOrReprintedBillsList(DateTime startDate, DateTime finishDate)
{
startDate = startDate.Date.AddHours(6);
finishDate = finishDate.Date.AddDays(1).AddHours(5);
if (finishDate <= startDate)
return new List<BillDetail>();
using (var session = SessionManager.Session)
{
Voucher vAlias = null;
VoucherSettlement vsAlias = null;
ICriterion amount = Restrictions.Where<VoucherSettlement>(x => x.Settled == SettleOption.Amount);
var listVoids = session.QueryOver<Voucher>(() => vAlias)
.Left.JoinAlias(x => x.Settlements, () => vsAlias, amount)
.Where(x => x.Date >= startDate && x.Date <= finishDate && x.Void == true)
.OrderBy(x => x.VoucherType).Asc
.ThenBy(x => x.BillID).Asc
.TransformUsing(Transformers.DistinctRootEntity)
.List();
var outList = new List<BillDetail>();
foreach (var item in listVoids)
{
outList.Add(new BillDetail()
{
Date = item.Date,
BillID = item.FullBillID,
Settlement = string.Format("Void: {0}", item.VoidReason),
Amount = Math.Round(item.Settlements.SingleOrDefault().Amount * -1, 2)
});
}
var listReprint = session.QueryOver<Reprint>()
.Where(x => x.Date >= startDate && x.Date <= finishDate)
.List();
foreach (var item in listReprint)
{
outList.Add(new BillDetail()
{
Date = item.Date,
BillID = item.Voucher.FullBillID,
Settlement = string.Format("Reprinted by {0}", item.User.Name),
Amount = item.Voucher.Settlements.Single(x => x.Settled == SettleOption.Amount).Amount * -1
});
}
return outList;
}
}
}
}

View File

@ -7,107 +7,41 @@ using Tanshu.Common.Helpers;
using System.Linq; using System.Linq;
using NHibernate.Transform; using NHibernate.Transform;
using NHibernate.Criterion; using NHibernate.Criterion;
using NHibernate;
namespace Tanshu.Accounts.Repository namespace Tanshu.Accounts.Repository
{ {
public class SalesAnalysisBI public class SalesAnalysisBI
{ {
public IList<SalesAnalysisDetail> GetSaleDetail(DateTime startDate, DateTime finishDate) protected readonly ISession _session;
public SalesAnalysisBI()
{ {
startDate = startDate.Date.AddHours(6); _session = SessionManager.Session;
finishDate = finishDate.Date.AddDays(1).AddHours(5);
if (finishDate <= startDate)
return new List<SalesAnalysisDetail>();
using (var session = SessionManager.Session)
{
#region Sale
var query = @"
select concat(p.Name, ' ', p.Units) as Product, Sum(i.Quantity) as Amount
from Voucher v
inner join v.Kots k
inner join k.Inventories i
inner join i.Product p
where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v
and vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff)
group by concat(p.Name, ' ', p.Units), p.ProductGroup
order by p.ProductGroup, concat(p.Name, ' ', p.Units)
";
var list = session
.CreateQuery(query)
.SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge)
.SetParameter("unsettled", SettleOption.Unsettled)
.SetParameter("amount", SettleOption.Amount)
.SetParameter("roundoff", SettleOption.RoundOff)
.SetParameter("staff", SettleOption.Staff)
.List<object[]>();
var outList = new OrderedDictionary<string, SalesAnalysisDetail>();
foreach (var item in list)
outList.Add((string)item[0], new SalesAnalysisDetail() { Product = (string)item[0], Sale = (decimal)item[1] });
#endregion
#region NC
query = @"
select concat(p.Name, ' ', p.Units) as Product, Sum(i.Quantity) as Amount
from Voucher v
inner join v.Kots k
inner join k.Inventories i
inner join i.Product p
where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v and vs.Settled = :noCharge)
group by concat(p.Name, ' ', p.Units), p.ProductGroup
order by p.ProductGroup, concat(p.Name, ' ', p.Units)
";
list = session
.CreateQuery(query)
.SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge)
.List<object[]>();
foreach (var item in list)
if (outList.ContainsKey((string)item[0]))
outList[(string)item[0]].NC = (decimal)item[1];
else
outList.Add((string)item[0], new SalesAnalysisDetail() { Product = (string)item[0], NC = (decimal)item[1] });
#endregion
#region Staff
query = @"
select concat(p.Name, ' ', p.Units) as Product, Sum(i.Quantity) as Amount
from Voucher v
inner join v.Kots k
inner join k.Inventories i
inner join i.Product p
where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v and vs.Settled = :staff)
group by concat(p.Name, ' ', p.Units), p.ProductGroup
order by p.ProductGroup, concat(p.Name, ' ', p.Units)
";
list = session
.CreateQuery(query)
.SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate)
.SetParameter("staff", SettleOption.Staff)
.List<object[]>();
foreach (var item in list)
if (outList.ContainsKey((string)item[0]))
outList[(string)item[0]].Staff = (decimal)item[1];
else
outList.Add((string)item[0], new SalesAnalysisDetail() { Product = (string)item[0], Staff = (decimal)item[1] });
#endregion
return outList.Values.ToList();
}
} }
public IList<SalesAnalysis> GetSale(DateTime startDate, DateTime finishDate)
public IList<SalesAnalysis> GetSaleAnalysis(DateTime startDate, DateTime finishDate)
{ {
startDate = startDate.Date.AddHours(6); var start = startDate.Date.AddHours(6);
finishDate = finishDate.Date.AddDays(1).AddHours(5); var finish = finishDate.Date.AddDays(1).AddHours(5);
if (finishDate <= startDate) List<SalesAnalysis> list = new List<SalesAnalysis>();
return new List<SalesAnalysis>(); if (finish <= start)
using (var session = SessionManager.Session) return list;
{ list.AddRange(GetSale(start, finish));
const string query = @" list.Add(new SalesAnalysis() { GroupType = " -- ", Amount = 0 });
list.AddRange(GetSettlements(start, finish));
list.Add(new SalesAnalysis() { GroupType = " -- ", Amount = 0 });
var sc = GetServiceCharge(start, finish);
if (sc != null)
list.Add(sc);
var st = GetServiceTax(start, finish);
if (st != null)
list.Add(st);
list.AddRange(GetVat(start, finish));
return list;
}
private IList<SalesAnalysis> GetSale(DateTime startDate, DateTime finishDate)
{
const string query = @"
select g.GroupType as GroupType, Sum(i.Quantity * i.Price * (1 - i.Discount)) as Amount select g.GroupType as GroupType, Sum(i.Quantity * i.Price * (1 - i.Discount)) as Amount
from Voucher v from Voucher v
inner join v.Kots k inner join v.Kots k
@ -120,166 +54,29 @@ and vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amou
group by g.GroupType group by g.GroupType
order by g.GroupType order by g.GroupType
"; ";
var list = session var list = _session
.CreateQuery(query) .CreateQuery(query)
.SetParameter("startDate", startDate) .SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate) .SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge) .SetParameter("noCharge", SettleOption.NoCharge)
.SetParameter("unsettled", SettleOption.Unsettled) .SetParameter("unsettled", SettleOption.Unsettled)
.SetParameter("amount", SettleOption.Amount) .SetParameter("amount", SettleOption.Amount)
.SetParameter("roundoff", SettleOption.RoundOff) .SetParameter("roundoff", SettleOption.RoundOff)
.SetParameter("staff", SettleOption.Staff) .SetParameter("staff", SettleOption.Staff)
.List<object[]>(); .List<object[]>();
var outList = new List<SalesAnalysis>(); var outList = new List<SalesAnalysis>();
decimal amount = 0; decimal amount = 0;
foreach (var item in list) foreach (var item in list)
{
amount += (decimal)item[1];
outList.Add(new SalesAnalysis() { GroupType = (string)item[0], Amount = (decimal)item[1] });
}
outList.Add(new SalesAnalysis() { GroupType = "Total Settled", Amount = amount });
return GetSettlement(outList, startDate, finishDate);
}
}
public IList<BillDetail> GetBillDetails(DateTime startDate, DateTime finishDate)
{
startDate = startDate.Date.AddHours(6);
finishDate = finishDate.Date.AddDays(1).AddHours(5);
if (finishDate <= startDate)
return new List<BillDetail>();
using (var session = SessionManager.Session)
{ {
Voucher vAlias = null; amount += (decimal)item[1];
VoucherSettlement vsAlias = null; outList.Add(new SalesAnalysis() { GroupType = (string)item[0], Amount = (decimal)item[1] });
var list = session.QueryOver<Voucher>(() => vAlias)
.Left.JoinAlias(x => x.Settlements, () => vsAlias)
.Where(x => x.Date >= startDate && x.Date <= finishDate)
.OrderBy(x => x.VoucherType).Asc
.ThenBy(x => x.BillID).Asc
.TransformUsing(Transformers.DistinctRootEntity)
.List();
var outList = new List<BillDetail>();
foreach (var item in list)
{
if (item.Void)
outList.Add(new BillDetail()
{
Date = item.Date,
BillID = item.FullBillID,
Settlement = string.Format("Void: {0}", item.VoidReason),
Amount = Math.Round(item.Settlements.Single(x => x.Settled == SettleOption.Amount).Amount * -1, 2)
});
else
{
foreach (var so in item.Settlements.Where(x => x.Settled.Visible()))
{
outList.Add(new BillDetail()
{
Date = item.Date,
BillID = item.FullBillID,
Settlement = so.Settled.Display(),
Amount = Math.Round(so.Amount, 2)
});
}
}
}
return outList;
} }
outList.Add(new SalesAnalysis() { GroupType = "Total Settled", Amount = amount });
return outList;
} }
public IList<SalesAnalysis> DiscountReport(DateTime startDate, DateTime finishDate) private IList<SalesAnalysis> GetSettlements(DateTime startDate, DateTime finishDate)
{ {
startDate = startDate.Date.AddHours(6); const string query = @"
finishDate = finishDate.Date.AddDays(1).AddHours(5);
if (finishDate <= startDate)
return new List<SalesAnalysis>();
using (var session = SessionManager.Session)
{
const string query = @"
select pg.GroupType, sum(i.Quantity * i.Price * i.Discount)
from Inventory i
inner join i.Kot k
inner join k.Voucher v
inner join i.Product p
inner join p.ProductGroup pg
where v.Date >= :startDate and v.Date <= :finishDate and i.Discount != 0
and v not in (select Voucher from VoucherSettlement vs where vs.Voucher = v and (vs.Settled = :noCharge or vs.Settled = :staff))
group by pg.GroupType
order by pg.GroupType
";
var list = session
.CreateQuery(query)
.SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge)
.SetParameter("staff", SettleOption.Staff)
.List<object[]>();
return list.Select(item => new SalesAnalysis()
{
GroupType = (string)item[0],
Amount = (decimal)item[1]
}).ToList();
}
}
public IList<BillDetail> VoidOrReprintedBillsList(DateTime startDate, DateTime finishDate)
{
startDate = startDate.Date.AddHours(6);
finishDate = finishDate.Date.AddDays(1).AddHours(5);
if (finishDate <= startDate)
return new List<BillDetail>();
using (var session = SessionManager.Session)
{
Voucher vAlias = null;
VoucherSettlement vsAlias = null;
ICriterion amount = Restrictions.Where<VoucherSettlement>(x => x.Settled == SettleOption.Amount);
var listVoids = session.QueryOver<Voucher>(() => vAlias)
.Left.JoinAlias(x => x.Settlements, () => vsAlias, amount)
.Where(x => x.Date >= startDate && x.Date <= finishDate && x.Void == true)
.OrderBy(x => x.VoucherType).Asc
.ThenBy(x => x.BillID).Asc
.TransformUsing(Transformers.DistinctRootEntity)
.List();
var outList = new List<BillDetail>();
foreach (var item in listVoids)
{
outList.Add(new BillDetail()
{
Date = item.Date,
BillID = item.FullBillID,
Settlement = string.Format("Void: {0}", item.VoidReason),
Amount = Math.Round(item.Settlements.SingleOrDefault().Amount * -1, 2)
});
}
var listReprint = session.QueryOver<Reprint>()
.Where(x => x.Date >= startDate && x.Date <= finishDate)
.List();
foreach (var item in listReprint)
{
outList.Add(new BillDetail()
{
Date = item.Date,
BillID = item.Voucher.FullBillID,
Settlement = string.Format("Reprinted by {0}", item.User.Name),
Amount = item.Voucher.Settlements.Single(x => x.Settled == SettleOption.Amount).Amount * -1
});
}
return outList;
}
}
private static IList<SalesAnalysis> GetSettlement(IList<SalesAnalysis> outList, DateTime startDate, DateTime finishDate)
{
outList.Add(new SalesAnalysis() { GroupType = " -- ", Amount = 0 });
if (finishDate <= startDate)
return new List<SalesAnalysis>();
using (var session = SessionManager.Session)
{
const string query = @"
select s.Settled, Sum(s.Amount) select s.Settled, Sum(s.Amount)
from Voucher v from Voucher v
inner join v.Settlements s inner join v.Settlements s
@ -287,31 +84,25 @@ where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
group by s.Settled group by s.Settled
order by s.Settled order by s.Settled
"; ";
var list = session var list = _session
.CreateQuery(query) .CreateQuery(query)
.SetParameter("startDate", startDate) .SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate) .SetParameter("finishDate", finishDate)
.List<object[]>(); .List<object[]>();
decimal amount = 0; var outList = new List<SalesAnalysis>();
foreach (var item in list) decimal amount = 0;
{ foreach (var item in list)
amount += (decimal)item[1];
outList.Add(new SalesAnalysis() { GroupType = ((SettleOption)item[0]).Display(), Amount = (decimal)item[1] });
}
outList.Add(new SalesAnalysis() { GroupType = "Total", Amount = amount });
return GetOtherDetails(outList, startDate, finishDate);
}
}
private static IList<SalesAnalysis> GetOtherDetails(IList<SalesAnalysis> outList, DateTime startDate, DateTime finishDate)
{
outList.Add(new SalesAnalysis() { GroupType = " -- ", Amount = 0 });
if (finishDate <= startDate)
return new List<SalesAnalysis>();
using (var session = SessionManager.Session)
{ {
#region Service Charge amount += (decimal)item[1];
var query = @" outList.Add(new SalesAnalysis() { GroupType = ((SettleOption)item[0]).Display(), Amount = (decimal)item[1] });
select Sum(i.Quantity * i.Price * (1 - i.Discount) * i.ServiceCharge) }
outList.Add(new SalesAnalysis() { GroupType = "Total", Amount = amount });
return outList;
}
private SalesAnalysis GetServiceCharge(DateTime startDate, DateTime finishDate)
{
var query = @"
select coalesce(Sum(i.Quantity * i.Price * (1 - i.Discount) * i.ServiceCharge), 0)
from Voucher v from Voucher v
inner join v.Kots k inner join v.Kots k
inner join k.Inventories i inner join k.Inventories i
@ -319,21 +110,24 @@ where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v
and vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff) and vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff)
"; ";
var amt = session var amt = _session
.CreateQuery(query) .CreateQuery(query)
.SetParameter("startDate", startDate) .SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate) .SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge) .SetParameter("noCharge", SettleOption.NoCharge)
.SetParameter("unsettled", SettleOption.Unsettled) .SetParameter("unsettled", SettleOption.Unsettled)
.SetParameter("amount", SettleOption.Amount) .SetParameter("amount", SettleOption.Amount)
.SetParameter("roundoff", SettleOption.RoundOff) .SetParameter("roundoff", SettleOption.RoundOff)
.SetParameter("staff", SettleOption.Staff) .SetParameter("staff", SettleOption.Staff)
.UniqueResult() ?? 0M; .UniqueResult<decimal>();
outList.Add(new SalesAnalysis() { GroupType = "Service Charge", Amount = (decimal)amt }); if (amt != 0)
#endregion return new SalesAnalysis() { GroupType = "Service Charge", Amount = amt };
#region Service Tax return null;
query = @" }
select Sum(i.Quantity * i.Price * (1 - i.Discount) * (1 + case when i.IsScTaxable then i.ServiceCharge else 0 end) * i.ServiceTaxRate) private SalesAnalysis GetServiceTax(DateTime startDate, DateTime finishDate)
{
var query = @"
select coalesce(Sum(i.Quantity * i.Price * (1 - i.Discount) * (1 + case when i.IsScTaxable then i.ServiceCharge else 0 end) * i.ServiceTaxRate), 0)
from Voucher v from Voucher v
inner join v.Kots k inner join v.Kots k
inner join k.Inventories i inner join k.Inventories i
@ -341,44 +135,48 @@ where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v
and vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff) and vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff)
"; ";
amt = session var amt = _session
.CreateQuery(query) .CreateQuery(query)
.SetParameter("startDate", startDate) .SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate) .SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge) .SetParameter("noCharge", SettleOption.NoCharge)
.SetParameter("unsettled", SettleOption.Unsettled) .SetParameter("unsettled", SettleOption.Unsettled)
.SetParameter("amount", SettleOption.Amount) .SetParameter("amount", SettleOption.Amount)
.SetParameter("roundoff", SettleOption.RoundOff) .SetParameter("roundoff", SettleOption.RoundOff)
.SetParameter("staff", SettleOption.Staff) .SetParameter("staff", SettleOption.Staff)
.UniqueResult() ?? 0M; .UniqueResult<decimal>();
outList.Add(new SalesAnalysis() { GroupType = "Service Tax", Amount = (decimal)amt }); if (amt != 0)
#endregion return new SalesAnalysis() { GroupType = "Service Tax", Amount = amt };
#region Vat return null;
query = @" }
select i.VatRate, Sum(i.Quantity * i.Price * (1 - i.Discount) * (1 + case when i.IsScTaxable then i.ServiceCharge else 0 end) * i.VatRate) private IList<SalesAnalysis> GetVat(DateTime startDate, DateTime finishDate)
{
var outList = new List<SalesAnalysis>();
var query = @"
select va.Name, i.VatRate, coalesce(Sum(i.Quantity * i.Price * (1 - i.Discount) * (1 + case when i.IsScTaxable then i.ServiceCharge else 0 end) * i.VatRate), 0)
from Voucher v from Voucher v
inner join v.Kots k inner join v.Kots k
inner join k.Inventories i inner join k.Inventories i
inner join i.Vat va
where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false where v.Date >= :startDate and v.Date <= :finishDate and v.Void = false
and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v and exists (select Voucher from VoucherSettlement vs where vs.Voucher = v
and vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff) and vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff)
group by i.VatRate group by i.VatRate, va.Name
"; ";
var list = session var list = _session
.CreateQuery(query) .CreateQuery(query)
.SetParameter("startDate", startDate) .SetParameter("startDate", startDate)
.SetParameter("finishDate", finishDate) .SetParameter("finishDate", finishDate)
.SetParameter("noCharge", SettleOption.NoCharge) .SetParameter("noCharge", SettleOption.NoCharge)
.SetParameter("unsettled", SettleOption.Unsettled) .SetParameter("unsettled", SettleOption.Unsettled)
.SetParameter("amount", SettleOption.Amount) .SetParameter("amount", SettleOption.Amount)
.SetParameter("roundoff", SettleOption.RoundOff) .SetParameter("roundoff", SettleOption.RoundOff)
.SetParameter("staff", SettleOption.Staff) .SetParameter("staff", SettleOption.Staff)
.List<object[]>(); .List<object[]>();
foreach (var item in list) foreach (var item in list)
outList.Add(new SalesAnalysis() { GroupType = string.Format("Tax {0:P}", (decimal)item[0]), Amount = (decimal)item[1] }); if ((decimal)item[2] != 0)
#endregion outList.Add(new SalesAnalysis() { GroupType = string.Format("{0} - {1:#.##%}", (string)item[0], (decimal)item[1]), Amount = (decimal)item[2] });
return outList; return outList;
}
} }
} }
} }

View File

@ -65,6 +65,7 @@
<ItemGroup> <ItemGroup>
<Compile Include="CheckoutBI.cs" /> <Compile Include="CheckoutBI.cs" />
<Compile Include="Cache.cs" /> <Compile Include="Cache.cs" />
<Compile Include="ReportsBI.cs" />
<Compile Include="GroupBI.cs" /> <Compile Include="GroupBI.cs" />
<Compile Include="CustomerBI.cs" /> <Compile Include="CustomerBI.cs" />
<Compile Include="FoodTableBI.cs" /> <Compile Include="FoodTableBI.cs" />

View File

@ -95,7 +95,7 @@ namespace Tanshu.Accounts.Repository
foreach (var settlement in voucher.Settlements) foreach (var settlement in voucher.Settlements)
{ {
settlement.Voucher = voucher; settlement.Voucher = voucher;
if (settlement.Amount == 0 && settlement.Settled != SettleOption.Amount) if (settlement.Amount == 0)
{ {
if (settlement.VoucherSettlementID != Guid.Empty) if (settlement.VoucherSettlementID != Guid.Empty)
_session.Delete(settlement); _session.Delete(settlement);

View File

@ -30,20 +30,41 @@ namespace Tanshu.Accounts.Repository
if (balance != 0) if (balance != 0)
list.Add(new VoucherSettlement() { Amount = balance, Settled = SettleOption.Unsettled }); list.Add(new VoucherSettlement() { Amount = balance, Settled = SettleOption.Unsettled });
} }
else else
list.Single(x => x.Settled == SettleOption.Unsettled).Amount = balance; list.Single(x => x.Settled == SettleOption.Unsettled).Amount = balance;
} }
public void SettleVoucher(User user, Guid voucherID, IDictionary<SettleOption, decimal> values) public void SettleVoucher(User user, Guid voucherID, IDictionary<SettleOption, decimal> values)
{ {
var voucher = _session.Get<Voucher>(voucherID); 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--) for (var i = voucher.Settlements.Count - 1; i >= 0; i--)
{ {
var item = voucher.Settlements[i]; var item = voucher.Settlements[i];
if (item.Settled == SettleOption.Amount || item.Settled == SettleOption.RoundOff || item.Settled == SettleOption.Unsettled) if (!values.ContainsKey(item.Settled) || (values[item.Settled] == 0 && item.Settled != SettleOption.Amount))
_session.Update(item);
if (!values.ContainsKey(item.Settled))
{ {
voucher.Settlements.Remove(item); voucher.Settlements.Remove(item);
_session.Delete(item); _session.Delete(item);
@ -52,31 +73,17 @@ namespace Tanshu.Accounts.Repository
{ {
item.Amount = values[item.Settled]; item.Amount = values[item.Settled];
_session.Update(item); _session.Update(item);
values.Remove(item.Settled);
} }
} }
}
private void AddNew(Voucher voucher, IDictionary<SettleOption, decimal> values)
{
foreach (var item in values) foreach (var item in values)
{ {
if (voucher.Settlements.Count(x => x.Settled == item.Key) == 0) var set = new VoucherSettlement { Settled = item.Key, Amount = item.Value, Voucher = voucher };
{ voucher.Settlements.Add(set);
var set = new VoucherSettlement { Settled = item.Key, Amount = item.Value, Voucher = voucher }; _session.Save(set);
voucher.Settlements.Add(set);
_session.Save(set);
}
}
voucher.User = user;
_session.Update(voucher);
if (voucher.Settlements.Count(x => x.Settled == SettleOption.Unsettled) == 0 || voucher.Void)
{
var table = _session.QueryOver<FoodTable>()
.Where(x => x.FoodTableID == voucher.Table.FoodTableID && x.VoucherID == voucher.VoucherID)
.SingleOrDefault();
if (table != null)
{
table.VoucherID = null;
table.Status = null;
_session.Update(table);
}
} }
} }
} }