350 lines
15 KiB
C#
350 lines
15 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using Tanshu.Accounts.Contracts;
|
|
using System.Data.SqlClient;
|
|
using System.Data;
|
|
//using System.Windows.Forms;
|
|
using Tanshu.Data.DAO;
|
|
using Tanshu.Accounts.DAOFactory;
|
|
|
|
|
|
namespace Tanshu.Accounts.SqlDAO
|
|
{
|
|
public class SaleVoucherMixDAO : BaseDAO, ISaleVoucherMixDAO
|
|
{
|
|
public SaleVoucherMixDAO(IConnectionDAO connection)
|
|
:base (connection)
|
|
{}
|
|
public SalesBillItemBO GetDefaultSaleBillItem(Guid productID)
|
|
{
|
|
bool isComplex;
|
|
using (SqlCommand cmd = new SqlCommand("SELECT Count(*) FROM Products WHERE ProductID = @ProductID"))
|
|
{
|
|
cmd.Parameters.AddWithValue("@ProductID", productID);
|
|
if ((int)connection.ExecuteScalar(cmd) != 0)
|
|
isComplex = false;
|
|
else
|
|
isComplex = true;
|
|
}
|
|
if (!isComplex)
|
|
{
|
|
string query = @"
|
|
SELECT p.ProductID, p.Name + ' (' + p.Units +')',
|
|
p.SalePrice, p.SaleTaxID, t.Rate AS TaxRate,
|
|
p.SaleLedgerID, l.CostCenterID
|
|
FROM Products p INNER JOIN Tax t ON p.SaleTaxID = t.TaxID INNER JOIN Ledgers l ON p.SaleLedgerID = l.LedgerID
|
|
WHERE p.ProductID = @ProductID
|
|
";
|
|
using (SqlCommand cmd = new SqlCommand(query))
|
|
{
|
|
cmd.Parameters.AddWithValue("@ProductID", productID);
|
|
using (IDataReader dr = connection.ExecuteReader(cmd))
|
|
{
|
|
dr.Read();
|
|
SalesBillItemBO mySale = new SalesBillItemBO
|
|
{
|
|
productID = dr.GetGuid(0),
|
|
Name = dr.GetString(1),
|
|
Price = dr.GetDecimal(2),
|
|
Tax = dr.GetDecimal(4),
|
|
Discount = 0,
|
|
Printed = 0,
|
|
Quantity = 1
|
|
};
|
|
return mySale;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string query = @"
|
|
SELECT c.ComplexProductID, c.Name + ' (' + c.Units +')' AS Name,
|
|
c.SalePrice, c.SaleTaxID, t.Rate AS TaxRate
|
|
FROM ComplexProducts c INNER JOIN Tax t ON c.SaleTaxID = t.TaxID
|
|
WHERE c.ComplexProductID = @ProductID
|
|
GROUP BY c.ComplexProductID, c.Name + ' (' + c.Units +')' ,
|
|
c.SalePrice, c.SaleTaxID, t.Rate
|
|
";
|
|
using (SqlCommand cmd = new SqlCommand(query))
|
|
{
|
|
cmd.Parameters.AddWithValue("@ProductID", productID);
|
|
using (IDataReader dr = connection.ExecuteReader(cmd))
|
|
{
|
|
dr.Read();
|
|
SalesBillItemBO mySale = new SalesBillItemBO
|
|
{
|
|
productID = dr.GetGuid(0),
|
|
Name = dr.GetString(1),
|
|
Price = dr.GetDecimal(2),
|
|
Tax = dr.GetDecimal(4),
|
|
Discount = 0,
|
|
Printed = 0,
|
|
Quantity = 1
|
|
};
|
|
return mySale;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
public decimal GetProductDiscountLimit(Guid productID)
|
|
{
|
|
string query = @"SELECT t.DiscountLimit FROM ProductTypes t INNER JOIN Products p
|
|
ON t.ProductTypeID = p.ProductTypeID WHERE p.ProductID = @ProductID";
|
|
|
|
decimal discountLimit = 0;
|
|
using (SqlCommand cmd = new SqlCommand(query))
|
|
{
|
|
cmd.Parameters.AddWithValue("@ProductID", productID);
|
|
discountLimit = (decimal)connection.ExecuteScalar(cmd);
|
|
}
|
|
|
|
return discountLimit;
|
|
}
|
|
public bool IsBillPrinted(Guid voucherID)
|
|
{
|
|
string query = @"SELECT Printed FROM SaleVoucher WHERE VoucherID = @VoucherID";
|
|
bool printed = true;
|
|
using (SqlCommand cmd = new SqlCommand(query))
|
|
{
|
|
cmd.Parameters.AddWithValue("@VoucherID", voucherID);
|
|
printed = (bool)connection.ExecuteScalar(cmd);
|
|
}
|
|
return printed;
|
|
}
|
|
|
|
|
|
|
|
public List<PendingBillsBO> GetPendingBills(PendingType list)
|
|
{
|
|
string 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
|
|
FROM Vouchers t INNER JOIN SaleVoucher s ON t.VoucherID = s.VoucherID AND s.Paid = 0 AND s.Void = 0
|
|
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 (list == PendingType.Important)
|
|
query += "AND s.IsImportant = 1 ";
|
|
else
|
|
query += "AND s.IsImportant = 0 ";
|
|
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 (IDataReader dr = connection.ExecuteReader(query))
|
|
{
|
|
List<PendingBillsBO> outList = new List<PendingBillsBO>();
|
|
while (dr.Read())
|
|
{
|
|
PendingBillsBO 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);
|
|
outList.Add(local);
|
|
}
|
|
return outList;
|
|
}
|
|
|
|
}
|
|
public Nullable<Guid> GetPendingVoucherID(string tableID)
|
|
{
|
|
|
|
string query = "SELECT VoucherID FROM SaleVoucher where TableID = @TableID and Paid = 0 and Void = 0";
|
|
Guid? voucherID;
|
|
using (SqlCommand cmd = new SqlCommand(query))
|
|
{
|
|
cmd.Parameters.AddWithValue("@TableID", tableID);
|
|
using (IDataReader dr = connection.ExecuteReader(cmd))
|
|
{
|
|
if (dr.Read())
|
|
{
|
|
voucherID = dr.GetGuid(0);
|
|
dr.Close();
|
|
dr.Dispose();
|
|
return voucherID;
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
public List<InventoryBO> SaleInventory(Dictionary<BillItemKey, SalesBillItemBO>.ValueCollection list, Guid? voucherID)
|
|
{
|
|
Dictionary<Guid, InventoryBO> localList = new Dictionary<Guid, InventoryBO>();
|
|
foreach (SalesBillItemBO item in list)
|
|
{
|
|
InventoryBO temp = new InventoryBO();
|
|
#region Complex
|
|
//if (item.location == "complex")
|
|
//{
|
|
// decimal balance;
|
|
// string query = "SELECT SUM(Quantity * p.SalePrice) FROM ComplexProducts c INNER JOIN Products p ON c.ProductID = p.ProductID WHERE ComplexProductID = @ComplexProductID";
|
|
// using (SqlCommand cmd = new SqlCommand(query))
|
|
// {
|
|
// cmd.Parameters.AddWithValue("@ComplexProductID", item.productID);
|
|
// balance = (decimal)connection.ExecuteScalar(cmd);
|
|
// balance = (item.Price - balance) / balance;
|
|
// }
|
|
// query = "SELECT c.ProductID, c.Quantity, p.SalePrice FROM ComplexProducts c INNER JOIN Products p ON c.ProductID = p.ProductID WHERE ComplexProductID = @ComplexProductID";
|
|
// using (SqlCommand cmd = new SqlCommand(query))
|
|
// {
|
|
// cmd.Parameters.AddWithValue("@ComplexProductID", item.productID);
|
|
// SqlDataReader dr = connection.ExecuteReader(cmd);
|
|
// while (dr.Read())
|
|
// {
|
|
// InventoryBO temp = new InventoryBO();
|
|
// if (voucherID.HasValue)
|
|
// temp.VoucherID = voucherID.Value;
|
|
// temp.InventoryID = Guid.NewGuid();
|
|
// temp.Discount = item.Discount;
|
|
// temp.IsRateFinal = true;
|
|
// temp.ComplexProductID = item.productID;
|
|
// temp.ProductID = dr.GetGuid(0);
|
|
// temp.Quantity = item.Quantity * dr.GetDecimal(1);
|
|
// temp.Rate = dr.GetDecimal(2) * (1 + balance);
|
|
// temp.Tax = item.Tax;
|
|
// localList.Add(temp);
|
|
// }
|
|
// dr.Close();
|
|
// dr.Dispose();
|
|
// }
|
|
|
|
//}
|
|
//else
|
|
//{
|
|
// Add the lower loop here
|
|
//}
|
|
#endregion
|
|
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.IsRateFinal = true;
|
|
temp.ComplexProductID = null;
|
|
temp.ProductID = item.productID;
|
|
temp.Quantity = item.Quantity;
|
|
temp.Rate = item.Price;
|
|
temp.Tax = item.Tax;
|
|
localList.Add(item.productID, temp);
|
|
}
|
|
}
|
|
List<InventoryBO> outList = new List<InventoryBO>();
|
|
foreach (var item in localList)
|
|
outList.Add(item.Value);
|
|
return outList;
|
|
}
|
|
public void GetComplexBillInformation(Guid voucherID, Guid complexProductID, ref decimal rate, ref decimal quantity, ref string name)
|
|
{
|
|
|
|
string query = @"
|
|
SELECT TOP 1 i.Quantity / c.Quantity FROM Inventory i INNER JOIN ComplexProducts c ON i.ComplexProductID = c.ComplexProductID AND i.ProductID = c.ProductID
|
|
WHERE i.VoucherID = @VoucherID
|
|
AND c.ComplexProductID = @ComplexProductID
|
|
";
|
|
using (SqlCommand cmd = new SqlCommand(query))
|
|
{
|
|
cmd.Parameters.AddWithValue("@VoucherID", voucherID);
|
|
cmd.Parameters.AddWithValue("@ComplexProductID", complexProductID);
|
|
quantity = (decimal)connection.ExecuteScalar(cmd);
|
|
}
|
|
using (SqlCommand cmd = new SqlCommand("SELECT TOP 1 SalePrice, Name FROM ComplexProducts WHERE ComplexProductID = @ComplexProductID"))
|
|
{
|
|
cmd.Parameters.AddWithValue("@VoucherID", voucherID);
|
|
cmd.Parameters.AddWithValue("@ComplexProductID", complexProductID);
|
|
using (IDataReader dr = connection.ExecuteReader(cmd))
|
|
{
|
|
dr.Read();
|
|
rate = dr.GetDecimal(0);
|
|
name = dr.GetString(1);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
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, bool creditCard)
|
|
{
|
|
List<Guid> removeItems = new List<Guid>();
|
|
string query = "SELECT VoucherID, KotID, Printed FROM SaleVoucher WHERE VoucherID IN (";
|
|
foreach (Guid voucherID in billList)
|
|
{
|
|
query += string.Format("'{0}', ", voucherID);
|
|
}
|
|
query = query.Substring(0, query.Length - 2) + ")";
|
|
|
|
List<BillPaidClass> pbc = new List<BillPaidClass>();
|
|
using (SqlCommand cmd = new SqlCommand(query))
|
|
{
|
|
using (IDataReader dr = connection.ExecuteReader(cmd))
|
|
{
|
|
while (dr.Read())
|
|
{
|
|
pbc.Add(new BillPaidClass
|
|
{
|
|
VoucherID = dr.GetGuid(0),
|
|
KotID = dr.GetString(1),
|
|
Printed = dr.GetBoolean(2)
|
|
});
|
|
}
|
|
}
|
|
}
|
|
foreach (BillPaidClass 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 != false)
|
|
{
|
|
using (SqlCommand cmd = new SqlCommand("UPDATE SaleVoucher SET Paid = 1, CreditCard = @CreditCard 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("@CreditCard", creditCard);
|
|
connection.ExecuteNonQuery(cmd);
|
|
}
|
|
removeItems.Add(item.VoucherID);
|
|
}
|
|
}
|
|
|
|
foreach (Guid item in removeItems)
|
|
billList.Remove(item);
|
|
}
|
|
|
|
public void ToggleImportant(Guid voucherID)
|
|
{
|
|
using (SqlCommand cmd = new SqlCommand("UPDATE SaleVoucher SET IsImportant= CASE WHEN IsImportant = 0 THEN 1 ELSE 0 END FROM SaleVoucher WHERE VoucherID = @VoucherID"))
|
|
{
|
|
cmd.Parameters.AddWithValue("@VoucherID", voucherID);
|
|
connection.ExecuteNonQuery(cmd);
|
|
}
|
|
}
|
|
}
|
|
}
|