2010-03-02 17:56:21 +00:00
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 ) ;
2011-12-05 09:23:02 +00:00
cmd . Parameters . Add ( "@Code" , SqlDbType . Int ) ;
cmd . Parameters [ "@Code" ] . Direction = ParameterDirection . Output ;
2010-03-02 17:56:21 +00:00
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 ) ;
2011-12-05 09:23:02 +00:00
cmd . Parameters . Add ( "@timestamp" , SqlDbType . Timestamp ) ;
2010-03-02 17:56:21 +00:00
cmd . Parameters . AddWithValue ( "@SortOrder" , product . SortOrder ) ;
2011-12-05 09:23:02 +00:00
cmd . Parameters [ "@timestamp" ] . Direction = ParameterDirection . Output ;
2010-03-02 17:56:21 +00:00
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 < ProductBO > . 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 < ProductBO > . 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 = ' 955F 847 B - EFDF - 4 AFA - 897 C - 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 = ' 955F 847 B - EFDF - 4 AFA - 897 C - 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 < ProductDisplayBO > 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 < ProductDisplayBO > . GetBusinessObjects ( connection . ExecuteReader ( cmd ) ) ;
}
public List < ProductDisplaySmallBO > GetFilteredProducts ( Dictionary < string , string > filter )
{
List < ProductDisplaySmallBO > list = new List < ProductDisplaySmallBO > ( ) ;
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 < string , string > 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 < ProductBO > list = BusinessObjectDAO < ProductBO > . 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 < ProductTypeBO > GetProductTypes ( )
{
SqlCommand cmd = new SqlCommand ( "SELECT * FROM ProductTypes ORDER BY Name" ) ;
return BusinessObjectDAO < ProductTypeBO > . GetBusinessObjects ( connection . ExecuteReader ( cmd ) ) ;
}
public List < ProductDisplayBO > 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 < ProductDisplayBO > . GetBusinessObjects ( connection . ExecuteReader ( query ) ) ;
}
}
}