narsil/Tanshu.Accounts.Repository/BusinessLayer/SalesAnalysisBI.cs
unknown d8ecec8bb6 Added inverse Attribute to ProductGroup.
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.
2011-06-23 18:17:48 +05:30

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;
}
}
}
}