using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; using Tanshu.Accounts.Contracts; using Tanshu.Data.DAO; using System.Data; using Tanshu.Accounts.DAOFactory; namespace Tanshu.Accounts.SqlDAO { public class ProductDAO : BaseDAO, IProductDAO { public ProductDAO(IConnectionDAO connection) : base(connection) { } public bool Insert(ProductBO product) { product.ProductID = Guid.NewGuid(); SqlCommand cmd = new SqlCommand(@" SELECT @Code = ISNULL(MAX(Code), 0) + 1 FROM Products; INSERT INTO Products (ProductID, Code, Name, Units, ProductTypeID, SaleLedgerID, SaleTaxID ,SalePrice , PurchaseLedgerID ,PurchaseTaxID , PurchasePrice, Discontinued, MinimumLevel, MaximumLevel, SortOrder) VALUES (@ProductID, @Code, @Name, @Units, @ProductTypeID, @SaleLedgerID, @SaleTaxID, @SalePrice ,@PurchaseLedgerID ,@PurchaseTaxID , @PurchasePrice, @Discontinued, @MinimumLevel, @MaximumLevel, @SortOrder); SELECT @timestamp = timestamp FROM Products WHERE ProductID = @ProductID;"); { cmd.Parameters.AddWithValue("@ProductID", product.ProductID); cmd.Parameters.Add("@Code", System.Data.SqlDbType.Int); cmd.Parameters["@Code"].Direction = System.Data.ParameterDirection.Output; cmd.Parameters.AddWithValue("@Code", product.Code); cmd.Parameters.AddWithValue("@Name", product.Name); cmd.Parameters.AddWithValue("@Units", product.Units); cmd.Parameters.AddWithValue("@ProductTypeID", product.ProductTypeID); cmd.Parameters.AddWithValue("@SaleLedgerID", product.SaleLedgerID); cmd.Parameters.AddWithValue("@SaleTaxID", product.SaleTaxID); cmd.Parameters.AddWithValue("@SalePrice", product.SalePrice); cmd.Parameters.AddWithValue("@PurchaseLedgerID", product.PurchaseLedgerID); cmd.Parameters.AddWithValue("@PurchaseTaxID", product.PurchaseTaxID); cmd.Parameters.AddWithValue("@PurchasePrice", product.PurchasePrice); cmd.Parameters.AddWithValue("@Discontinued", product.Discontinued); cmd.Parameters.AddWithValue("@MinimumLevel", product.MinimumLevel); cmd.Parameters.AddWithValue("@MaximumLevel", product.MaximumLevel); cmd.Parameters.Add("@timestamp", System.Data.SqlDbType.Timestamp); cmd.Parameters.AddWithValue("@SortOrder", product.SortOrder); cmd.Parameters["@timestamp"].Direction = System.Data.ParameterDirection.Output; connection.ExecuteNonQuery(cmd); product.timestamp = (byte[])cmd.Parameters["@timestamp"].Value; product.Code = (int)cmd.Parameters["@Code"].Value; return true; } } public ProductBO GetProduct(Guid productID) { SqlCommand cmd = new SqlCommand("SELECT * FROM Products WHERE ProductID = @ProductID"); cmd.Parameters.AddWithValue("@ProductID", productID); return BusinessObjectDAO.GetBusinessObject(connection.ExecuteReader(cmd)); } public bool Delete(Guid productID) { SqlCommand cmd = new SqlCommand("DELETE FROM Products WHERE ProductID = @ProductID"); cmd.Parameters.AddWithValue("@ProductID", productID); connection.ExecuteNonQuery(cmd); return true; } public bool Update(ProductBO product) { SqlCommand cmd = new SqlCommand(@"UPDATE Products SET Code = @Code ,Name = @Name ,Units = @Units ,ProductTypeID = @ProductTypeID ,SaleLedgerID = @SaleLedgerID ,SaleTaxID = @SaleTaxID ,SalePrice = @SalePrice ,PurchaseLedgerID = @PurchaseLedgerID ,PurchaseTaxID = @PurchaseTaxID ,PurchasePrice = @PurchasePrice ,Discontinued = @Discontinued ,MinimumLevel = @MinimumLevel ,MaximumLevel = @MaximumLevel, SortOrder=@SortOrder WHERE ProductID = @ProductID SELECT @timestamp = timestamp FROM Products WHERE ProductID = @ProductID;"); cmd.Parameters.AddWithValue("@ProductID", product.ProductID); cmd.Parameters.AddWithValue("@Code", product.Code); cmd.Parameters.AddWithValue("@Name", product.Name); cmd.Parameters.AddWithValue("@Units", product.Units); cmd.Parameters.AddWithValue("@ProductTypeID", product.ProductTypeID); cmd.Parameters.AddWithValue("@SaleLedgerID", product.SaleLedgerID); cmd.Parameters.AddWithValue("@SaleTaxID", product.SaleTaxID); cmd.Parameters.AddWithValue("@SalePrice", product.SalePrice); cmd.Parameters.AddWithValue("@PurchaseLedgerID", product.PurchaseLedgerID); cmd.Parameters.AddWithValue("@PurchaseTaxID", product.PurchaseTaxID); cmd.Parameters.AddWithValue("@PurchasePrice", product.PurchasePrice); cmd.Parameters.AddWithValue("@Discontinued", product.Discontinued); cmd.Parameters.AddWithValue("@MinimumLevel", product.MinimumLevel); cmd.Parameters.AddWithValue("@MaximumLevel", product.MaximumLevel); cmd.Parameters.Add("@timestamp", System.Data.SqlDbType.Timestamp); cmd.Parameters.AddWithValue("@SortOrder", product.SortOrder); cmd.Parameters["@timestamp"].Direction = System.Data.ParameterDirection.Output; connection.ExecuteNonQuery(cmd); product.timestamp = (byte[])cmd.Parameters["@timestamp"].Value; return true; } public ProductBO GetProduct(string nameAndUnits) { SqlCommand cmd = new SqlCommand("SELECT * FROM Products WHERE Name + ' (' + Units + ')' = @Name"); cmd.Parameters.AddWithValue("@Name", nameAndUnits); return BusinessObjectDAO.GetBusinessObject(connection.ExecuteReader(cmd)); } public decimal GetProductStock(DateTime date, Guid productID, Guid? voucherID) { // Add this to get product rate as well // , CASE WHEN SUM(CASE WHEN t.Type IN ('P', 'Z') THEN i.Quantity ELSE 0 END) = 0 THEN (SELECT PurchasePrice FROM Products p WHERE p.ProductID = i.ProductID) ELSE SUM(CASE WHEN t.Type IN ('P', 'Z') THEN i.Quantity * i.Rate ELSE 0 END) / SUM(CASE WHEN t.Type IN ('P', 'Z') THEN i.Quantity ELSE 0 END) END AS Rate string query; if (voucherID.HasValue) query = @" SELECT SUM(i.Quantity * j.Debit) AS Quantity FROM Vouchers t INNER JOIN Inventory i ON t.VoucherID = i.VoucherID INNER JOIN Journal j ON t.VoucherID = j.VoucherID INNER JOIN Products p ON p.ProductID = i.ProductID WHERE j.CostCenterID = '955F847B-EFDF-4AFA-897C-F0BAF15284A3' AND i.ProductID = @ProductID AND t.Date < @Date AND t.VoucherID <> @VoucherID GROUP BY i.ProductID"; else query = @" SELECT SUM(i.Quantity * j.Debit) AS Quantity FROM Vouchers t INNER JOIN Inventory i ON t.VoucherID = i.VoucherID INNER JOIN Journal j ON t.VoucherID = j.VoucherID INNER JOIN Products p ON p.ProductID = i.ProductID WHERE j.CostCenterID = '955F847B-EFDF-4AFA-897C-F0BAF15284A3' AND i.ProductID = @ProductID AND t.Date < @Date GROUP BY i.ProductID"; SqlCommand cmd = new SqlCommand(query); cmd.Parameters.AddWithValue("@Date", date); cmd.Parameters.AddWithValue("@ProductID", productID); if (voucherID.HasValue) cmd.Parameters.AddWithValue("@VoucherID", voucherID.Value); return (decimal)connection.ExecuteScalar(cmd); } public List GetProducts() { //SELECT p.ProductID, p.Picture, p.Code, p.Name, p.Units, p.ProductTypeID, p.SaleLedgerID, p.SaleTaxID, p.SalePrice, p.PurchaseLedgerID, p.PurchaseTaxID, p.PurchasePrice, p.Discontinued, p.MinimumLevel, p.MaximumLevel, p.timestamp, p.SortOrder, pt.Name AS Type FROM Products p INNER JOIN ProductTypes pt ON p.ProductTypeID = pt.ProductTypeID ORDER BY p.Name SqlCommand cmd = new SqlCommand("SELECT p.ProductID, p.Picture, p.Code, p.Name, p.Units, p.ProductTypeID, p.SaleLedgerID, p.SaleTaxID, p.SalePrice, p.PurchaseLedgerID, p.PurchaseTaxID, p.PurchasePrice, p.Discontinued, p.MinimumLevel, p.MaximumLevel, p.SortOrder, pt.Name AS Type FROM Products p INNER JOIN ProductTypes pt ON p.ProductTypeID = pt.ProductTypeID ORDER BY p.Name"); return BusinessObjectDAO.GetBusinessObjects(connection.ExecuteReader(cmd)); } public List GetFilteredProducts(Dictionary filter) { List list = new List(); string query = GetProductQuery(filter); using (IDataReader dr = connection.ExecuteReader(query)) { while (dr.Read()) { list.Add(new ProductDisplaySmallBO { Category = dr.GetString(4), Code = dr.GetInt32(1), Name = dr.GetString(2), Price = dr.GetDecimal(3), ProductID = dr.GetGuid(0) }); } dr.Close(); } return list; } private string GetProductQuery(Dictionary filter) { string query = @" SELECT p.ProductID, p.Code, p.Name + ' (' + p.Units + ') ' + ShortName AS Name, p.SalePrice * (1 + t.Rate) AS Price, pt.Name AS Category FROM Products p INNER JOIN Tax t ON p.SaleTaxID = t.TaxID INNER JOIN ProductTypes pt ON p.ProductTypeID = pt.ProductTypeID WHERE pt.IsForSale = 1 AND p.SalePrice > 0 AND p.Discontinued = 0 "; string[] n = filter["Name"].Split(" ".ToCharArray()); foreach (string n1 in n) if (n1 != null && n1 != string.Empty) query += string.Format("AND p.Name + ' (' + p.Units + ') ' + ShortName LIKE '%{0}%' \r\n", n1); n = filter["Type"].ToLower().Split(" ".ToCharArray()); foreach (string n1 in n) if (n1 != null && n1 != string.Empty) query += string.Format("AND pt.Name LIKE '%{0}%' \r\n", n1); query += "ORDER BY p.SortOrder DESC;"; return query; } public void UpdateShortName() { List list = BusinessObjectDAO.GetBusinessObjects(connection.ExecuteReader("SELECT * FROM Products")); foreach (var item in list) { using (SqlCommand cmd = new SqlCommand("UPDATE Products SET ShortName = @ShortName WHERE ProductID = @ProductID AND ShortName <> @ShortName")) { cmd.Parameters.AddWithValue("@ShortName", GetShortName(item.Name)); cmd.Parameters.AddWithValue("@ProductID", item.ProductID); connection.ExecuteScalar(cmd); } } } private string GetShortName(string name) { string[] t1 = name.Split(" ".ToCharArray()); if (t1.Length == 0) return ""; name = ""; foreach (string t in t1) { if ((!t.StartsWith("(")) && (t != "")) name += t.Substring(0, 1); } return name; } public List GetProducts(string name, int skip, int count) { string query = @" WITH ProductsRN AS (SELECT *, ROW_NUMBER() OVER(ORDER BY Name) AS RowNum FROM Products WHERE Name LIKE '%{0}%') SELECT TOP {1} p.*, pt.Name AS Type FROM ProductsRN p INNER JOIN ProductTypes pt ON p.ProductTypeID = pt.ProductTypeID WHERE RowNum > {2} "; query = string.Format(query, name, count, skip); return BusinessObjectDAO.GetBusinessObjects(connection.ExecuteReader(query)); } public List GetProducts(Guid productTypeID) { List list = new List(); string query = "SELECT ProductID, Code, Name + ' (' + Units + ')' AS Name, SalePrice AS Price, '' AS Category FROM Products WHERE ProductTypeID = @ProductTypeID ORDER BY Code;"; SqlCommand cmd = new SqlCommand(query); cmd.Parameters.AddWithValue("@ProductTypeID", productTypeID); using (IDataReader dr = connection.ExecuteReader(cmd)) { while (dr.Read()) { list.Add(new ProductDisplaySmallBO { Category = dr.GetString(4), Code = dr.GetInt32(1), Name = dr.GetString(2), Price = dr.GetDecimal(3), ProductID = dr.GetGuid(0) }); } dr.Close(); } return list; } } }