/*************************************************************
(C) ISEP 2004
(C) Professores de ADAV 2004
O ISEP, na qualidade de autor do presente software, garante
o direito de utilização, alteração, evolução e distribuição
do mesmo sem qualquer tipo de restrições, excepto:
- esta mensagem não pode ser retirada
- os nomes das classes não podem ser alterados
*************************************************************/
using System;
using System.Data;
using System.Data.OleDb;
namespace ShopClassLibrary
{
public interface ISale
{
DataSet CreateDetails(string user, string pass);
ShopStatus Add(string user, string pass, int customerId, DateTime date, DataSet rsDetails);
}
public interface ISale2 : ISale
{
DataSet GetByCustomer(string user, string pass, int customerId);
DataSet GetAll(string user, string pass);
}
///
/// Summary description for Sale.
///
internal class Sale : ISale2
{
#region ISale
///
/// pesquisa clientes por nome
///
/// username de login na aplicação
/// password de login na aplicação
/// um dataset vazio para a palicação cliente preencher
public DataSet CreateDetails(string User, string Pass)
{
OleDbConnection conn = null;
DataSet ds;
try
{
//
// criar objecto de conexão à base de dados e abrir a conexão
//
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
//
// validar o utilizador
//
if( UtilDB.ValidateUser(conn, null, User, Pass) != ShopStatus.Ok )
return null;
//
// criar o dataset
//
ds = UtilDB.GetById(conn, null, "SaleDetails", "SaleID", -1);;
if (ds == null)
return null;
//
// configurar as colunas para utilização
//
ds.Tables["SaleDetails"].Columns["SaleID"].AllowDBNull = true;
}
catch(OleDbException ex)
{
//
// tratar a excepção!!!!
//
System.Console.WriteLine("EXCEPÇÃO no método da classe 'Sale': " + ex.Message);
return null;
}
finally
{
//
// fechar a conexão
//
if (conn.State == ConnectionState.Open)
conn.Close();
}
return ds;
}
///
/// adiciona uma venda ao sistema
///
/// username de login na aplicação
/// password de login na aplicação
/// um dataset com as linhas de detalhe da venda
/// o código de status relativo à operação
public ShopStatus Add(string user, string pass, int customerId, DateTime date, DataSet rsDetails)
{
OleDbConnection conn = null;
OleDbTransaction tx = null;
ShopStatus ret = ShopStatus.NotOk;
try
{
//
// criar objecto de conexão à base de dados
//
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
//
// iniciar transacção
//
tx = conn.BeginTransaction();
//
// validar o utilizador
//
if (UtilDB.ValidateUser(conn, tx, user, pass) != ShopStatus.Ok)
return ShopStatus.InvalidLogOn;
//
// validar cliente
//
// <--- CODIGO EM FALTA --->
DataSet dsCust = UtilDB.GetById(conn, tx, "Customers", "CustomerID", customerId);
if (dsCust.Tables["Customers"].Rows.Count == 0)
return ShopStatus.InvalidCustomerId;
//<---
//
// validar os produtos e quantidades pedidas
//
// <--- CODIGO EM FALTA --->
//IProduct p = Factory.CreateProductService();//new Product();
Product p = new Product();
//<--
int[] listaProd = new int[rsDetails.Tables["SaleDetails"].Rows.Count];
int i = 0;
foreach (DataRow regDetails in rsDetails.Tables["SaleDetails"].Rows)
{
//
// verificar se este produto tem quantidade suficiente em stock
// e se existe!
//
// <--- CODIGO EM FALTA --->
if (regDetails.IsNull("ProductID"))
return ShopStatus.InvalidArgument;
if (regDetails.IsNull("Quantity"))
return ShopStatus.InvalidArgument;
//ret = p.InStock(user, pass, (int)regDetails["ProductID"], (int)regDetails["Quantity"]);
ret = p.InStock(conn, tx, (int)regDetails["ProductID"], (int)regDetails["Quantity"]);
if (ret != ShopStatus.Ok)
return ret;
//<---
//
// guardar o código de produto para pesquisa
//
listaProd[i++] = (int)regDetails["ProductID"];
}
//
// criar um DataSet de produtos e preencher apenas com os produtos desejados
//
DataSet pDS = UtilDB.GetById(conn, tx, "Products", "ProductID", listaProd);
if (pDS == null)
return ShopStatus.InvalidProductId;
//
// calcular custo por linha
//
foreach (DataRow regDetails in rsDetails.Tables["SaleDetails"].Rows)
{
//
// procurar o produto desejado
//
DataRow[] row = pDS.Tables["Products"].Select("ProductId = " + regDetails["ProductID"].ToString());
//
// calcular custo desta linha da venda
//
regDetails["TotalCost"] = (int)regDetails["Quantity"] * (float)row[0]["UnitPrice"];
/**
//
// actualizar stock no DataSet para posterior update à BD
//
row[0]["StockQtd"] = (int)row[0]["StockQtd"] - (int)regDetails["Quantity"];
**/
}
// ======================================
//
// tratar das inserções
//
// ======================================
//
// criar comando para inserção
//
OleDbCommand cmd = new OleDbCommand("INSERT INTO sales (customerid, dateofsale) VALUES (?, ?)", conn);
cmd.Transaction = tx;
cmd.Parameters.Add("custid", customerId);
OleDbParameter parm = cmd.Parameters.Add("dt", OleDbType.Date);
parm.Value = date;
//
// inserir registo
//
cmd.ExecuteNonQuery();
//
// obter id autogerado
//
OleDbCommand cmd2 = new OleDbCommand("SELECT @@IDENTITY", conn);
cmd2.Transaction = tx;
int id = (int)cmd2.ExecuteScalar();
//
// inserir chave estrangeira nas linhas de detalhe
//
foreach (DataRow regDetails in rsDetails.Tables["SaleDetails"].Rows)
{
regDetails["SaleID"] = id;
}
//
// inserir linhas de detalhe
//
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM SaleDetails", conn);
da.SelectCommand.Transaction = tx;
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
da.Update(rsDetails, "SaleDetails");
//
// actualizar quantidades de produto em stock
//
OleDbCommand cmd3 = new OleDbCommand("UPDATE Products SET StockQtd=StockQtd-? WHERE ProductId=?", conn);
cmd3.Transaction = tx;
OleDbParameter p1 = cmd3.Parameters.Add("qtd", OleDbType.Integer);
OleDbParameter p2 = cmd3.Parameters.Add("pid", OleDbType.Integer);
foreach (DataRow regDetails in rsDetails.Tables["SaleDetails"].Rows)
{
p1.Value = regDetails["Quantity"];
p2.Value = regDetails["ProductID"];
cmd3.ExecuteNonQuery();
}
//
// fechar transacção
//
tx.Commit();
}
catch(OleDbException ex)
{
//
// descartar mudanças efectuadas
//
if (tx != null)
tx.Rollback();
//
// tratar a excepção!!!!
//
System.Console.WriteLine("EXCEPÇÃO no método da classe 'Sale': " + ex.Message);
}
finally
{
conn.Close();
}
return ret;
}
#endregion
#region ISale2
///
///
///
///
///
///
///
public DataSet GetByCustomer(string user, string pass, int customerId)
{
DataSet ds = null;
OleDbConnection conn = null;
try
{
//
// criar objecto DataSet
//
ds = new DataSet();
//
// criar objecto de conexão à base de dados e abrir a conexão
//
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
//
// validar o utilizador
//
if (UtilDB.ValidateUser(conn, null, user, pass) != ShopStatus.Ok)
return null;
//
// criar um Datadapter para executar o comando e devolver o dataset
// cabeçalhos das vendas
//
string sSqlCmd = "Select * From vwTotalBySale Where CustomerID = ?";
OleDbDataAdapter oAdapter = new OleDbDataAdapter(sSqlCmd, conn);
oAdapter.SelectCommand.Parameters.Add("custid", customerId);
//
// executar o comando e preencher um Dataset
//
oAdapter.Fill(ds, "Sales");
//
// criar um Datadapter para executar o comando e devolver o dataset
// linhas de detalhe
//
sSqlCmd = "SELECT * FROM vwExpandedSaleDetails WHERE SaleId IN (SELECT SaleID FROM Sales WHERE CustomerId=?)";
oAdapter = new OleDbDataAdapter(sSqlCmd, conn);
oAdapter.SelectCommand.Parameters.Add("custid", customerId);
//
// executar o comando e preencher um Dataset
//
oAdapter.Fill(ds, "SaleDetails");
//
// criar relação entre tabelas
//
ds.Relations.Add("Details", ds.Tables["Sales"].Columns["SaleId"], ds.Tables["SaleDetails"].Columns["SaleId"]);
}
catch(OleDbException ex)
{
//
// tratar a excepção!!!!
//
System.Console.WriteLine("EXCEPÇÃO no método 'GetByCustomer': " + ex.Message);
ds = null;
}
finally
{
//
// fechar a conexão
//
if (conn.State == ConnectionState.Open)
conn.Close();
}
return ds;
}
///
///
///
///
///
///
public DataSet GetAll(string User, string Pass)
{
//
// validar o utilizador
//
if (UtilDB.ValidateUser(User, Pass) != ShopStatus.Ok)
{
return null;
}
DataSet ds = null;
OleDbConnection conn = null;
try
{
//
// criar objecto DataSet
//
ds = new DataSet();
//
// criar objecto de conexão à base de dados e abrir a conexão
//
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
//
// criar um Datadapter para executar o comando e devolver o dataset
// cabeçalhos das vendas
//
string sSqlCmd = "Select * From vwTotalBySale";
OleDbDataAdapter oAdapter = new OleDbDataAdapter(sSqlCmd, conn);
//
// executar o comando e preencher um Dataset
//
oAdapter.Fill(ds, "Sales");
//
// criar um Datadapter para executar o comando e devolver o dataset
// linhas de detalhe
//
sSqlCmd = "Select * From vwExpandedSaleDetails";
oAdapter = new OleDbDataAdapter(sSqlCmd, conn);
//
// executar o comando e preencher um Dataset
//
oAdapter.Fill(ds, "SaleDetails");
//
// criar relação entre tabelas
//
ds.Relations.Add("Details", ds.Tables["Sales"].Columns["SaleId"], ds.Tables["SaleDetails"].Columns["SaleId"]);
}
catch(OleDbException ex)
{
//
// tratar a excepção!!!!
//
System.Console.WriteLine("EXCEPÇÃO no método 'GetAll': " + ex);
ds = null;
}
finally
{
//
// fechar a conexão
//
if (conn.State == ConnectionState.Open)
conn.Close();
}
return ds;
}
#endregion
}
}