diff --git a/Tanshu.Accounts.PointOfSale/Controllers/BillController.cs b/Tanshu.Accounts.PointOfSale/Controllers/BillController.cs index ed7e3a8..9b3db58 100644 --- a/Tanshu.Accounts.PointOfSale/Controllers/BillController.cs +++ b/Tanshu.Accounts.PointOfSale/Controllers/BillController.cs @@ -401,7 +401,6 @@ namespace Tanshu.Accounts.PointOfSale return; IDictionary options; 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)) { frm.ShowDialog(); diff --git a/Tanshu.Accounts.PointOfSale/Reports/BillDetailsForm.cs b/Tanshu.Accounts.PointOfSale/Reports/BillDetailsForm.cs index f5e8014..d393b28 100644 --- a/Tanshu.Accounts.PointOfSale/Reports/BillDetailsForm.cs +++ b/Tanshu.Accounts.PointOfSale/Reports/BillDetailsForm.cs @@ -26,7 +26,7 @@ namespace Tanshu.Accounts.PointOfSale if (_loading) return; if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit")) return; - _list = new SalesAnalysisBI().GetBillDetails(dtpStart.Value, dtpFinish.Value); + _list = new ReportsBI().GetBillDetails(dtpStart.Value, dtpFinish.Value); dgvSale.AutoGenerateColumns = true; dgvSale.DataSource = _list; dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; diff --git a/Tanshu.Accounts.PointOfSale/Reports/DiscountReportForm.cs b/Tanshu.Accounts.PointOfSale/Reports/DiscountReportForm.cs index 30bf0c8..98fcd87 100644 --- a/Tanshu.Accounts.PointOfSale/Reports/DiscountReportForm.cs +++ b/Tanshu.Accounts.PointOfSale/Reports/DiscountReportForm.cs @@ -23,7 +23,7 @@ namespace Tanshu.Accounts.PointOfSale { if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit")) return; - _list = new SalesAnalysisBI().DiscountReport(dtpStart.Value, dtpFinish.Value); + _list = new ReportsBI().DiscountReport(dtpStart.Value, dtpFinish.Value); dgvSale.AutoGenerateColumns = true; dgvSale.DataSource = _list; dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; diff --git a/Tanshu.Accounts.PointOfSale/Reports/SaleAnalysisForm.cs b/Tanshu.Accounts.PointOfSale/Reports/SaleAnalysisForm.cs index 10e18da..e2f6610 100644 --- a/Tanshu.Accounts.PointOfSale/Reports/SaleAnalysisForm.cs +++ b/Tanshu.Accounts.PointOfSale/Reports/SaleAnalysisForm.cs @@ -41,7 +41,7 @@ namespace Tanshu.Accounts.PointOfSale !Session.IsAllowed("Accounts Audit")) return; - _list = new SalesAnalysisBI().GetSale(dtpStart.Value, dtpFinish.Value); + _list = new SalesAnalysisBI().GetSaleAnalysis(dtpStart.Value, dtpFinish.Value); dgvSale.AutoGenerateColumns = true; dgvSale.DataSource = _list; diff --git a/Tanshu.Accounts.PointOfSale/Reports/SaleDetail.cs b/Tanshu.Accounts.PointOfSale/Reports/SaleDetail.cs index c1fabfd..55f47ed 100644 --- a/Tanshu.Accounts.PointOfSale/Reports/SaleDetail.cs +++ b/Tanshu.Accounts.PointOfSale/Reports/SaleDetail.cs @@ -23,7 +23,7 @@ namespace Tanshu.Accounts.PointOfSale { if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit")) return; - _list = new SalesAnalysisBI().GetSaleDetail(dtpStart.Value, dtpFinish.Value); + _list = new ReportsBI().GetSaleDetail(dtpStart.Value, dtpFinish.Value); dgvSale.AutoGenerateColumns = true; dgvSale.DataSource = _list; dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; diff --git a/Tanshu.Accounts.PointOfSale/Reports/SaleDetail.designer.cs b/Tanshu.Accounts.PointOfSale/Reports/SaleDetail.designer.cs index a2d1b55..f338ed1 100644 --- a/Tanshu.Accounts.PointOfSale/Reports/SaleDetail.designer.cs +++ b/Tanshu.Accounts.PointOfSale/Reports/SaleDetail.designer.cs @@ -43,6 +43,9 @@ this.dgvSale.AllowUserToAddRows = false; this.dgvSale.AllowUserToDeleteRows = 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.Location = new System.Drawing.Point(12, 41); this.dgvSale.MultiSelect = false; diff --git a/Tanshu.Accounts.PointOfSale/Reports/VoidReprintedForm.cs b/Tanshu.Accounts.PointOfSale/Reports/VoidReprintedForm.cs index a30fd06..0b6e2ee 100644 --- a/Tanshu.Accounts.PointOfSale/Reports/VoidReprintedForm.cs +++ b/Tanshu.Accounts.PointOfSale/Reports/VoidReprintedForm.cs @@ -24,7 +24,7 @@ namespace Tanshu.Accounts.PointOfSale { if (DateTime.Today.Subtract(dtpStart.Value.Date).Days > 5 && !Session.IsAllowed("Accounts Audit")) return; - _list = new SalesAnalysisBI().VoidOrReprintedBillsList(dtpStart.Value, dtpFinish.Value); + _list = new ReportsBI().VoidOrReprintedBillsList(dtpStart.Value, dtpFinish.Value); dgvSale.AutoGenerateColumns = true; dgvSale.DataSource = _list; dgvSale.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; diff --git a/Tanshu.Accounts.Repository/ManagementBI.cs b/Tanshu.Accounts.Repository/ManagementBI.cs index 0b5b08b..12d4756 100644 --- a/Tanshu.Accounts.Repository/ManagementBI.cs +++ b/Tanshu.Accounts.Repository/ManagementBI.cs @@ -157,7 +157,7 @@ order by v.Date desc } query = @" -select isnull(v.BillID + 1, 1) +select coalesce(v.BillID + 1, 1) from Voucher v where v.Date < :startDate and v.Void = false and v.VoucherType = :nc order by v.Date desc diff --git a/Tanshu.Accounts.Repository/ReportsBI.cs b/Tanshu.Accounts.Repository/ReportsBI.cs new file mode 100644 index 0000000..8b2cd6c --- /dev/null +++ b/Tanshu.Accounts.Repository/ReportsBI.cs @@ -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 GetSaleDetail(DateTime startDate, DateTime finishDate) + { + startDate = startDate.Date.AddHours(6); + finishDate = finishDate.Date.AddDays(1).AddHours(5); + if (finishDate <= startDate) + return new List(); + + 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(); + var outList = new OrderedDictionary(); + 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(); + 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(); + 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 GetBillDetails(DateTime startDate, DateTime finishDate) + { + startDate = startDate.Date.AddHours(6); + finishDate = finishDate.Date.AddDays(1).AddHours(5); + if (finishDate <= startDate) + return new List(); + using (var session = SessionManager.Session) + { + Voucher vAlias = null; + VoucherSettlement vsAlias = null; + + var list = session.QueryOver(() => 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(); + 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 DiscountReport(DateTime startDate, DateTime finishDate) + { + startDate = startDate.Date.AddHours(6); + finishDate = finishDate.Date.AddDays(1).AddHours(5); + if (finishDate <= startDate) + return new List(); + 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(); + return list.Select(item => new SalesAnalysis() + { + GroupType = (string)item[0], + Amount = (decimal)item[1] + }).ToList(); + } + } + public IList VoidOrReprintedBillsList(DateTime startDate, DateTime finishDate) + { + startDate = startDate.Date.AddHours(6); + finishDate = finishDate.Date.AddDays(1).AddHours(5); + if (finishDate <= startDate) + return new List(); + using (var session = SessionManager.Session) + { + Voucher vAlias = null; + VoucherSettlement vsAlias = null; + ICriterion amount = Restrictions.Where(x => x.Settled == SettleOption.Amount); + + var listVoids = session.QueryOver(() => 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(); + 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() + .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; + } + } + } +} diff --git a/Tanshu.Accounts.Repository/SalesAnalysisBI.cs b/Tanshu.Accounts.Repository/SalesAnalysisBI.cs index 4771d26..2510754 100644 --- a/Tanshu.Accounts.Repository/SalesAnalysisBI.cs +++ b/Tanshu.Accounts.Repository/SalesAnalysisBI.cs @@ -7,107 +7,41 @@ using Tanshu.Common.Helpers; using System.Linq; using NHibernate.Transform; using NHibernate.Criterion; +using NHibernate; namespace Tanshu.Accounts.Repository { public class SalesAnalysisBI { - public IList GetSaleDetail(DateTime startDate, DateTime finishDate) + protected readonly ISession _session; + public SalesAnalysisBI() { - startDate = startDate.Date.AddHours(6); - finishDate = finishDate.Date.AddDays(1).AddHours(5); - if (finishDate <= startDate) - return new List(); - - 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(); - var outList = new OrderedDictionary(); - 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(); - 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(); - 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(); - } + _session = SessionManager.Session; } - public IList GetSale(DateTime startDate, DateTime finishDate) + + public IList GetSaleAnalysis(DateTime startDate, DateTime finishDate) { - startDate = startDate.Date.AddHours(6); - finishDate = finishDate.Date.AddDays(1).AddHours(5); - if (finishDate <= startDate) - return new List(); - using (var session = SessionManager.Session) - { - const string query = @" + var start = startDate.Date.AddHours(6); + var finish = finishDate.Date.AddDays(1).AddHours(5); + List list = new List(); + if (finish <= start) + return list; + list.AddRange(GetSale(start, finish)); + 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 GetSale(DateTime startDate, DateTime finishDate) + { + const string query = @" select g.GroupType as GroupType, Sum(i.Quantity * i.Price * (1 - i.Discount)) as Amount from Voucher v 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 order by g.GroupType "; - 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(); - var outList = new List(); - decimal amount = 0; - 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 GetBillDetails(DateTime startDate, DateTime finishDate) - { - startDate = startDate.Date.AddHours(6); - finishDate = finishDate.Date.AddDays(1).AddHours(5); - if (finishDate <= startDate) - return new List(); - using (var session = SessionManager.Session) + 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(); + var outList = new List(); + decimal amount = 0; + foreach (var item in list) { - Voucher vAlias = null; - VoucherSettlement vsAlias = null; - - var list = session.QueryOver(() => 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(); - 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; + 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 outList; } - public IList DiscountReport(DateTime startDate, DateTime finishDate) + private IList GetSettlements(DateTime startDate, DateTime finishDate) { - startDate = startDate.Date.AddHours(6); - finishDate = finishDate.Date.AddDays(1).AddHours(5); - if (finishDate <= startDate) - return new List(); - 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(); - return list.Select(item => new SalesAnalysis() - { - GroupType = (string)item[0], - Amount = (decimal)item[1] - }).ToList(); - } - } - public IList VoidOrReprintedBillsList(DateTime startDate, DateTime finishDate) - { - startDate = startDate.Date.AddHours(6); - finishDate = finishDate.Date.AddDays(1).AddHours(5); - if (finishDate <= startDate) - return new List(); - using (var session = SessionManager.Session) - { - Voucher vAlias = null; - VoucherSettlement vsAlias = null; - ICriterion amount = Restrictions.Where(x => x.Settled == SettleOption.Amount); - - var listVoids = session.QueryOver(() => 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(); - 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() - .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 GetSettlement(IList outList, DateTime startDate, DateTime finishDate) - { - outList.Add(new SalesAnalysis() { GroupType = " -- ", Amount = 0 }); - if (finishDate <= startDate) - return new List(); - using (var session = SessionManager.Session) - { - const string query = @" + const string query = @" select s.Settled, Sum(s.Amount) from Voucher v 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 order by s.Settled "; - var list = session - .CreateQuery(query) - .SetParameter("startDate", startDate) - .SetParameter("finishDate", finishDate) - .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 GetOtherDetails(IList outList, DateTime startDate, DateTime finishDate) - { - outList.Add(new SalesAnalysis() { GroupType = " -- ", Amount = 0 }); - if (finishDate <= startDate) - return new List(); - using (var session = SessionManager.Session) + var list = _session + .CreateQuery(query) + .SetParameter("startDate", startDate) + .SetParameter("finishDate", finishDate) + .List(); + var outList = new List(); + decimal amount = 0; + foreach (var item in list) { - #region Service Charge - var query = @" -select Sum(i.Quantity * i.Price * (1 - i.Discount) * i.ServiceCharge) + 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 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 inner join v.Kots k 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 vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff) "; - var amt = 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) - .UniqueResult() ?? 0M; - outList.Add(new SalesAnalysis() { GroupType = "Service Charge", Amount = (decimal)amt }); - #endregion - #region Service Tax - query = @" -select Sum(i.Quantity * i.Price * (1 - i.Discount) * (1 + case when i.IsScTaxable then i.ServiceCharge else 0 end) * i.ServiceTaxRate) + var amt = _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) + .UniqueResult(); + if (amt != 0) + return new SalesAnalysis() { GroupType = "Service Charge", Amount = amt }; + return null; + } + 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 inner join v.Kots k 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 vs.Settled != :noCharge and vs.Settled != :unsettled and vs.Settled != :amount and vs.Settled != :roundoff and vs.Settled != :staff) "; - amt = 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) - .UniqueResult() ?? 0M; - outList.Add(new SalesAnalysis() { GroupType = "Service Tax", Amount = (decimal)amt }); - #endregion - #region Vat - 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) + var amt = _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) + .UniqueResult(); + if (amt != 0) + return new SalesAnalysis() { GroupType = "Service Tax", Amount = amt }; + return null; + } + private IList GetVat(DateTime startDate, DateTime finishDate) + { + var outList = new List(); + 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 inner join v.Kots k inner join k.Inventories i +inner join i.Vat va 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 i.VatRate +group by i.VatRate, va.Name "; - 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(); - foreach (var item in list) - outList.Add(new SalesAnalysis() { GroupType = string.Format("Tax {0:P}", (decimal)item[0]), Amount = (decimal)item[1] }); - #endregion - return outList; - } + 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(); + foreach (var item in list) + if ((decimal)item[2] != 0) + outList.Add(new SalesAnalysis() { GroupType = string.Format("{0} - {1:#.##%}", (string)item[0], (decimal)item[1]), Amount = (decimal)item[2] }); + return outList; } } } diff --git a/Tanshu.Accounts.Repository/Tanshu.Accounts.Repository.csproj b/Tanshu.Accounts.Repository/Tanshu.Accounts.Repository.csproj index b2b496c..d830f07 100644 --- a/Tanshu.Accounts.Repository/Tanshu.Accounts.Repository.csproj +++ b/Tanshu.Accounts.Repository/Tanshu.Accounts.Repository.csproj @@ -65,6 +65,7 @@ + diff --git a/Tanshu.Accounts.Repository/VoucherBI.cs b/Tanshu.Accounts.Repository/VoucherBI.cs index 39245c0..52dd6d1 100644 --- a/Tanshu.Accounts.Repository/VoucherBI.cs +++ b/Tanshu.Accounts.Repository/VoucherBI.cs @@ -95,7 +95,7 @@ namespace Tanshu.Accounts.Repository foreach (var settlement in voucher.Settlements) { settlement.Voucher = voucher; - if (settlement.Amount == 0 && settlement.Settled != SettleOption.Amount) + if (settlement.Amount == 0) { if (settlement.VoucherSettlementID != Guid.Empty) _session.Delete(settlement); diff --git a/Tanshu.Accounts.Repository/VoucherSettlementBI.cs b/Tanshu.Accounts.Repository/VoucherSettlementBI.cs index 5cf9003..dd8659b 100644 --- a/Tanshu.Accounts.Repository/VoucherSettlementBI.cs +++ b/Tanshu.Accounts.Repository/VoucherSettlementBI.cs @@ -30,20 +30,41 @@ namespace Tanshu.Accounts.Repository if (balance != 0) list.Add(new VoucherSettlement() { Amount = balance, Settled = SettleOption.Unsettled }); } - else + 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 (item.Settled == SettleOption.Amount || item.Settled == SettleOption.RoundOff || item.Settled == SettleOption.Unsettled) - _session.Update(item); - if (!values.ContainsKey(item.Settled)) + if (!values.ContainsKey(item.Settled) || (values[item.Settled] == 0 && item.Settled != SettleOption.Amount)) { voucher.Settlements.Remove(item); _session.Delete(item); @@ -52,31 +73,17 @@ namespace Tanshu.Accounts.Repository { item.Amount = values[item.Settled]; _session.Update(item); + values.Remove(item.Settled); } } + } + private void AddNew(Voucher voucher, IDictionary 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); - _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() - .Where(x => x.FoodTableID == voucher.Table.FoodTableID && x.VoucherID == voucher.VoucherID) - .SingleOrDefault(); - if (table != null) - { - table.VoucherID = null; - table.Status = null; - _session.Update(table); - } + var set = new VoucherSettlement { Settled = item.Key, Amount = item.Value, Voucher = voucher }; + voucher.Settlements.Add(set); + _session.Save(set); } } }