BillInventory Renamed. Refactored Bill to be more usable. Added Bill Detail Report. Added Open Bill and Bill Details Roles. Zero Rate Products have Yellow background Color. Refactored UserBI, FoodTableBI, ModifierBI, PrintLocationBI, ProductBI, ProductGroupBI, TaxBI, UserBI, Cached the Products List. Product and Product Group Form Working.
235 lines
10 KiB
C#
235 lines
10 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Tanshu.Accounts.Contracts;
|
|
using Tanshu.Accounts.Entities;
|
|
using Tanshu.Common;
|
|
using Tanshu.Common.Helpers;
|
|
|
|
namespace Tanshu.Accounts.Repository
|
|
{
|
|
public class SalesAnalysisBI
|
|
{
|
|
public ICollection<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)
|
|
{
|
|
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)
|
|
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)
|
|
.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] });
|
|
|
|
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] });
|
|
|
|
return outList.Values;
|
|
}
|
|
}
|
|
public IList<SalesAnalysis> GetSale(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 g.GroupType as GroupType, Sum(i.Quantity * i.Rate * (1 - i.Discount)) as Amount
|
|
from Voucher v
|
|
inner join v.Kots k
|
|
inner join k.Inventories i
|
|
inner join i.Product p
|
|
inner join p.ProductGroup g
|
|
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)
|
|
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)
|
|
.List<object[]>();
|
|
var outList = new List<SalesAnalysis>();
|
|
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<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)
|
|
{
|
|
const string query = @"
|
|
select v.Date, v.BillID, s.Settled, s.Amount
|
|
from Voucher v
|
|
inner join v.Settlements s
|
|
where v.Date >= :startDate and v.Date <= :finishDate
|
|
order by v.BillID, s.Settled
|
|
";
|
|
var list = session
|
|
.CreateQuery(query)
|
|
.SetParameter("startDate", startDate)
|
|
.SetParameter("finishDate", finishDate)
|
|
.List<object[]>();
|
|
var outList = new List<BillDetail>();
|
|
foreach (var item in list)
|
|
{
|
|
outList.Add(new BillDetail()
|
|
{
|
|
Date = (DateTime)item[0],
|
|
BillID = (string)item[1],
|
|
Settlement = ((SettleOption)item[2]).Display(),
|
|
Amount = (decimal)item[3]
|
|
});
|
|
}
|
|
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)
|
|
{
|
|
//select v.Settled, Sum(i.Quantity * i.Rate * (1 - i.Discount) * (1 + i.ServiceCharge) * (1 + i.Tax)) as Amount
|
|
const string query = @"
|
|
select s.Settled, Sum(s.Amount)
|
|
from Voucher v
|
|
inner join v.Settlements s
|
|
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<object[]>();
|
|
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
|
|
var query = @"
|
|
select Sum(i.Quantity * i.Rate * (1 - i.Discount) * i.ServiceCharge)
|
|
from Voucher v
|
|
inner join v.Kots k
|
|
inner join k.Inventories i
|
|
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)
|
|
";
|
|
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)
|
|
.UniqueResult() ?? 0M;
|
|
outList.Add(new SalesAnalysis() { GroupType = "Service Charge", Amount = (decimal)amt });
|
|
#endregion
|
|
#region Tax
|
|
query = @"
|
|
select i.Tax, Sum(i.Quantity * i.Rate * (1 - i.Discount) * (1 + i.ServiceCharge) * i.Tax)
|
|
from Voucher v
|
|
inner join v.Kots k
|
|
inner join k.Inventories i
|
|
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)
|
|
group by i.Tax
|
|
";
|
|
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)
|
|
.List<object[]>();
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|