narsil/Tanshu.Accounts.SqlDAO/SaleVoucherMixDAO.cs

250 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using Tanshu.Accounts.Contracts;
using System.Data.SqlClient;
using Tanshu.Data.DAO;
namespace Tanshu.Accounts.SqlDAO
{
public class SaleVoucherMixDAO : BaseDAO
{
public SaleVoucherMixDAO(IConnectionDAO connection)
: base(connection)
{ }
public SalesBillItemBO GetDefaultSaleBillItem(Guid productID)
{
const string query = @"
SELECT p.ProductID, p.Name + ' (' + p.Units +')', p.SalePrice, tv.Rate, ts.Rate, p.ProductGroupID
FROM Products p INNER JOIN Tax tv ON p.VatID = tv.TaxID
INNER JOIN Tax ts ON p.ServiceTaxID = ts.TaxID
WHERE p.ProductID = @ProductID
";
using (var cmd = new SqlCommand(query))
{
cmd.Parameters.AddWithValue("@ProductID", productID);
using (var dr = connection.ExecuteReader(cmd))
{
dr.Read();
var mySale = new SalesBillItemBO
{
productID = dr.GetGuid(0),
Name = dr.GetString(1),
Price = dr.GetDecimal(2),
Vat = dr.GetDecimal(3),
ServiceTax = dr.GetDecimal(4),
Discount = 0,
location = "",
Printed = 0,
Quantity = 1
};
return mySale;
}
}
}
public decimal GetProductDiscountLimit(Guid productID)
{
const string query = @"SELECT t.DiscountLimit FROM ProductGroups t INNER JOIN Products p ON t.ProductGroupID = p.ProductGroupID WHERE p.ProductID = @ProductID";
decimal discountLimit;
using (var cmd = new SqlCommand(query))
{
cmd.Parameters.AddWithValue("@ProductID", productID);
discountLimit = (decimal)connection.ExecuteScalar(cmd);
}
return discountLimit;
}
public bool IsBillPrinted(Guid voucherID)
{
const string query = @"SELECT Printed FROM SaleVoucher WHERE VoucherID = @VoucherID";
using (var cmd = new SqlCommand(query))
{
cmd.Parameters.AddWithValue("@VoucherID", voucherID);
return (bool)connection.ExecuteScalar(cmd);
}
}
public List<PendingBillsBO> GetPendingBills(PendingType list, int floor)
{
var query = @"
SELECT t.VoucherID, s.Alarm AS Alarm, s.TableID AS TableID,
(SELECT SUM(Amount) FROM Inventory WHERE VoucherID = t.VoucherID) AS Amount,
s.BillID, t.CreationDate, u.Name, CAST(0 AS bit), s.KotID, t.LastEditDate, s.Printed, s.AdvanceID
FROM Vouchers t INNER JOIN SaleVoucher s ON t.VoucherID = s.VoucherID AND s.PaidStatus = @PaidStatus
INNER JOIN Users u ON t.UserID = u.UserID
";
if (list == PendingType.Alarms)
query += "WHERE s.Alarm IS NOT NULL ";
else
query += "WHERE s.Alarm IS NULL ";
if (floor != 0)
query += "AND s.Floor = @Floor ";
if (list == PendingType.Today)
query += string.Format("AND t.LastEditDate >= '{0:dd-MMM-yyyy} 00:00:00' ", DateTime.Now);
else if (list == PendingType.Week)
query += string.Format("AND t.LastEditDate >= '{0:dd-MMM-yyyy} 00:00:00' ", DateTime.Now.AddDays(-7));
query += "ORDER BY t.CreationDate ";
using (var cmd = new SqlCommand(query))
{
cmd.Parameters.AddWithValue("@PaidStatus", (int)PaidStatus.Pending);
if (floor != 0)
cmd.Parameters.AddWithValue("@Floor", floor);
using (var dr = connection.ExecuteReader(cmd))
{
var outList = new List<PendingBillsBO>();
while (dr.Read())
{
var local = new PendingBillsBO();
local.voucherID = dr.GetGuid(0);
local.Alarm = !dr.IsDBNull(1);
if (local.Alarm)
local.AlarmTime = dr.GetDateTime(1);
local.TableID = dr.GetString(2);
if (!dr.IsDBNull(3))
local.Amount = dr.GetDecimal(3);
local.BillNo = dr.GetString(4);
local.BookingTime = dr.GetDateTime(5);
local.Cashier = dr.GetString(6);
local.Important = dr.GetBoolean(7);
local.Kot = dr.GetString(8);
local.LastEdited = dr.GetDateTime(9);
local.Printed = dr.GetBoolean(10);
if (!dr.IsDBNull(11))
local.AdvanceID = dr.GetGuid(11);
outList.Add(local);
}
return outList;
}
}
}
public Guid? GetPendingVoucherID(string tableID, int floor)
{
var query = "SELECT VoucherID FROM SaleVoucher where TableID = @TableID and PaidStatus = @PaidStatus";
if (floor != 0)
query += " AND Floor = @Floor ";
using (var cmd = new SqlCommand(query))
{
cmd.Parameters.AddWithValue("@TableID", tableID);
cmd.Parameters.AddWithValue("@PaidStatus", (int)PaidStatus.Pending);
if (floor != 0)
cmd.Parameters.AddWithValue("@Floor", floor);
using (var dr = connection.ExecuteReader(cmd))
{
if (dr.Read())
{
return dr.GetGuid(0);
}
return null;
}
}
}
public List<InventoryBO> SaleInventory(Dictionary<BillItemKey, SalesBillItemBO>.ValueCollection list, Guid? voucherID)
{
var localList = new Dictionary<Guid, InventoryBO>();
foreach (var item in list)
{
var temp = new InventoryBO();
if (localList.ContainsKey(item.productID))
{
temp = localList[item.productID];
temp.Quantity += item.Quantity;
}
else
{
if (voucherID.HasValue)
temp.VoucherID = voucherID.Value;
temp.InventoryID = Guid.NewGuid();
temp.Discount = item.Discount;
temp.ProductID = item.productID;
temp.Quantity = item.Quantity;
temp.Rate = item.Price;
temp.Vat = item.Vat;
temp.ServiceTax = item.ServiceTax;
localList.Add(item.productID, temp);
}
}
var outList = new List<InventoryBO>();
foreach (var item in localList)
outList.Add(item.Value);
return outList;
}
private class BillPaidClass
{
public Guid VoucherID { get; set; }
public string KotID { get; set; }
public bool Printed { get; set; }
}
public void DeclareBillsPaid(Guid userID, List<Guid> billList, PaidStatus paidStatus)
{
var removeItems = new List<Guid>();
var query = "SELECT VoucherID, KotID, Printed FROM SaleVoucher WHERE VoucherID IN (";
foreach (var voucherID in billList)
{
query += string.Format("'{0}', ", voucherID);
}
query = query.Substring(0, query.Length - 2) + ")";
var pbc = new List<BillPaidClass>();
using (var cmd = new SqlCommand(query))
{
using (var dr = connection.ExecuteReader(cmd))
{
while (dr.Read())
{
pbc.Add(new BillPaidClass
{
VoucherID = dr.GetGuid(0),
KotID = dr.GetString(1),
Printed = dr.GetBoolean(2)
});
}
}
}
foreach (var item in pbc)
{
//if ((item.Printed != false) || (MessageBox.Show("Pay unprinted bill No.: " + item.KotID + " ?", "Pay unprinted bill", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes))
if (!item.Printed)
continue;
using (var cmd = new SqlCommand("UPDATE SaleVoucher SET PaidStatus = @PaidStatus WHERE VoucherID = @VoucherID; UPDATE Vouchers SET UserID = @UserID, LastEditDate = GETDATE() WHERE VoucherID = @VoucherID"))
{
cmd.Parameters.AddWithValue("@VoucherID", item.VoucherID);
cmd.Parameters.AddWithValue("@UserID", userID);
cmd.Parameters.AddWithValue("@PaidStatus", (int)paidStatus);
connection.ExecuteNonQuery(cmd);
}
removeItems.Add(item.VoucherID);
}
foreach (var item in removeItems)
billList.Remove(item);
}
#region ISaleVoucherMixDAO Members
public decimal Amount(Guid voucherID)
{
decimal amount;
using (var cmd = new SqlCommand("SELECT SUM(Amount) FROM Inventory WHERE VoucherID = @VoucherID"))
{
cmd.Parameters.AddWithValue("@VoucherID", voucherID);
amount = (decimal)connection.ExecuteScalar(cmd);
}
object advanceID;
using (var cmd = new SqlCommand("SELECT AdvanceID FROM SaleVoucher WHERE VoucherID = @VoucherID"))
{
cmd.Parameters.AddWithValue("@VoucherID", voucherID);
advanceID = connection.ExecuteScalar(cmd);
if (advanceID == DBNull.Value)
return amount;
}
using (var cmd = new SqlCommand("SELECT Amount FROM Advances WHERE AdvanceID = @AdvanceID"))
{
cmd.Parameters.AddWithValue("@AdvanceID", (Guid)advanceID);
return amount - (decimal)connection.ExecuteScalar(cmd);
}
}
#endregion
}
}