From fd6956d4db5af4f4b68b353e087d1e77a107fef8 Mon Sep 17 00:00:00 2001 From: Nicolas Felipe Date: Sat, 27 Jun 2026 22:39:33 -0300 Subject: [PATCH] 27/06/2026 - DAL (DALItensLotes - Parte 8.1 - 8.5 concluidas). --- DAL/DALItensLotes.cs | 1032 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1032 insertions(+) create mode 100644 DAL/DALItensLotes.cs diff --git a/DAL/DALItensLotes.cs b/DAL/DALItensLotes.cs new file mode 100644 index 0000000..76b223f --- /dev/null +++ b/DAL/DALItensLotes.cs @@ -0,0 +1,1032 @@ +using Microsoft.Data.SqlClient; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DAL +{ + public class DALItensLotes + { + private readonly string connectionString; + + public DALItensLotes(string conexao) + { + connectionString = conexao; + }//Constructor + + #region CRUD - Create, Read, Update, Delete + public bool Inserir(ModeloItensLotes modelo) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + INSERT INTO Itens_Lotes + ( + COD_ITEM, + LOTE, + QUANTIDADE, + DATA_FABRICACAO, + DATA_VALIDADE, + NUMERO_NF, + FORNECEDOR, + OBSERVACAO, + ATIVO, + DATA_CADASTRO, + DATA_ALTERACAO + ) + VALUES + ( + @COD_ITEM, + @LOTE, + @QUANTIDADE, + @DATA_FABRICACAO, + @DATA_VALIDADE, + @NUMERO_NF, + @FORNECEDOR, + @OBSERVACAO, + @ATIVO, + @DATA_CADASTRO, + @DATA_ALTERACAO + )"; + + using SqlCommand cmd = new(sql, conn); + + PreencherParametros(cmd, modelo); + + conn.Open(); + + return cmd.ExecuteNonQuery() > 0; + }//Inserir + public bool Alterar(ModeloItensLotes modelo) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + UPDATE Itens_Lotes + SET COD_ITEM=@COD_ITEM, + LOTE=@LOTE, + QUANTIDADE=@QUANTIDADE, + DATA_FABRICACAO=@DATA_FABRICACAO, + DATA_VALIDADE=@DATA_VALIDADE, + NUMERO_NF=@NUMERO_NF, + FORNECEDOR=@FORNECEDOR, + OBSERVACAO=@OBSERVACAO, + ATIVO=@ATIVO, + DATA_ALTERACAO=@DATA_ALTERACAO + WHERE ID_ITEM_LOTE=@ID_ITEM_LOTE"; + + using SqlCommand cmd = new(sql, conn); + + PreencherParametros(cmd, modelo); + + cmd.Parameters.AddWithValue("@ID_ITEM_LOTE", modelo.ID_ITEM_LOTE); + + conn.Open(); + + return cmd.ExecuteNonQuery() > 0; + }//Alterar + public bool Excluir(int id) + { + using SqlConnection conn = new(connectionString); + + string sql = + @"DELETE FROM Itens_Lotes + WHERE ID_ITEM_LOTE=@ID"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@ID", id); + + conn.Open(); + + return cmd.ExecuteNonQuery() > 0; + }//Excluir + private static void PreencherParametros(SqlCommand cmd, ModeloItensLotes modelo) + { + cmd.Parameters.AddWithValue("@COD_ITEM", modelo.COD_ITEM); + + cmd.Parameters.AddWithValue("@LOTE", modelo.LOTE); + + cmd.Parameters.AddWithValue("@QUANTIDADE", modelo.QUANTIDADE); + + cmd.Parameters.AddWithValue( + "@DATA_FABRICACAO", + (object?)modelo.DATA_FABRICACAO ?? DBNull.Value); + + cmd.Parameters.AddWithValue( + "@DATA_VALIDADE", + (object?)modelo.DATA_VALIDADE ?? DBNull.Value); + + cmd.Parameters.AddWithValue("@NUMERO_NF", modelo.NUMERO_NF); + + cmd.Parameters.AddWithValue("@FORNECEDOR", modelo.FORNECEDOR); + + cmd.Parameters.AddWithValue("@OBSERVACAO", modelo.OBSERVACAO); + + cmd.Parameters.AddWithValue("@ATIVO", modelo.ATIVO); + + cmd.Parameters.AddWithValue("@DATA_CADASTRO", modelo.DATA_CADASTRO); + + cmd.Parameters.AddWithValue( + "@DATA_ALTERACAO", + (object?)modelo.DATA_ALTERACAO ?? DBNull.Value); + }//PreencherParametros + + + #endregion + #region Carregar - Load + public ModeloItensLotes? Carregar(int id) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT * + FROM Itens_Lotes + WHERE ID_ITEM_LOTE=@ID"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@ID", id); + + conn.Open(); + + using SqlDataReader dr = cmd.ExecuteReader(); + + if (dr.Read()) + return PreencherModelo(dr); + + return null; + }//CarregarModeloPeloID + public ModeloItensLotes? CarregarPorCodigo(string codigo) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT * + FROM Itens_Lotes + WHERE CODIGO=@CODIGO"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@CODIGO", codigo); + + conn.Open(); + + using SqlDataReader dr = cmd.ExecuteReader(); + + if (dr.Read()) + return PreencherModelo(dr); + + return null; + }//CarregarModeloPeloCodigo + public ModeloItensLotes? CarregarPorLote(string lote) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT * + FROM Itens_Lotes + WHERE LOTE=@LOTE"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@LOTE", lote); + + conn.Open(); + + using SqlDataReader dr = cmd.ExecuteReader(); + + if (dr.Read()) + return PreencherModelo(dr); + + return null; + }//CarregarModeloPeloLote + public bool ExisteCodigo(string codigo) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT COUNT(*) + FROM Itens_Lotes + WHERE CODIGO=@CODIGO"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@CODIGO", codigo); + + conn.Open(); + + return Convert.ToInt32(cmd.ExecuteScalar()) > 0; + }//ExisteCodigo + public bool ExisteLote(string lote) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT COUNT(*) + FROM Itens_Lotes + WHERE LOTE=@LOTE"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@LOTE", lote); + + conn.Open(); + + return Convert.ToInt32(cmd.ExecuteScalar()) > 0; + }//ExisteLote + private static ModeloItensLotes PreencherModelo(SqlDataReader dr) + { + return new ModeloItensLotes + { + ID_ITEM_LOTE = Convert.ToInt32(dr["ID_ITEM_LOTE"]), + CODIGO = dr["CODIGO"]?.ToString() ?? string.Empty, + COD_ITEM = dr["COD_ITEM"]?.ToString() ?? string.Empty, + LOTE = dr["LOTE"]?.ToString() ?? string.Empty, + + QUANTIDADE = dr["QUANTIDADE"] != DBNull.Value + ? Convert.ToDecimal(dr["QUANTIDADE"]) + : 0, + + DATA_FABRICACAO = dr["DATA_FABRICACAO"] != DBNull.Value + ? Convert.ToDateTime(dr["DATA_FABRICACAO"]) + : null, + + DATA_VALIDADE = dr["DATA_VALIDADE"] != DBNull.Value + ? Convert.ToDateTime(dr["DATA_VALIDADE"]) + : null, + + NUMERO_NF = dr["NUMERO_NF"]?.ToString() ?? string.Empty, + FORNECEDOR = dr["FORNECEDOR"]?.ToString() ?? string.Empty, + OBSERVACAO = dr["OBSERVACAO"]?.ToString() ?? string.Empty, + + ATIVO = dr["ATIVO"] != DBNull.Value && + Convert.ToBoolean(dr["ATIVO"]), + + DATA_CADASTRO = dr["DATA_CADASTRO"] != DBNull.Value + ? Convert.ToDateTime(dr["DATA_CADASTRO"]) + : DateTime.MinValue, + + DATA_ALTERACAO = dr["DATA_ALTERACAO"] != DBNull.Value + ? Convert.ToDateTime(dr["DATA_ALTERACAO"]) + : null + }; + }//PreencherModelo + + #endregion + #region Listar - List + public List Listar(string? codigo = null,string? codItem = null,string? lote = null,string? fornecedor = null, string? numeroNF = null, + bool? ativo = null,DateTime? fabricacaoInicial = null,DateTime? fabricacaoFinal = null,DateTime? validadeInicial = null, + DateTime? validadeFinal = null) + { + List lista = []; + + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT * + FROM Itens_Lotes + WHERE 1=1"; + + using SqlCommand cmd = new(); + + if (!string.IsNullOrWhiteSpace(codigo)) + { + sql += " AND CODIGO LIKE @CODIGO"; + cmd.Parameters.AddWithValue("@CODIGO", "%" + codigo + "%"); + } + + if (!string.IsNullOrWhiteSpace(codItem)) + { + sql += " AND COD_ITEM=@COD_ITEM"; + cmd.Parameters.AddWithValue("@COD_ITEM", codItem); + } + + if (!string.IsNullOrWhiteSpace(lote)) + { + sql += " AND LOTE LIKE @LOTE"; + cmd.Parameters.AddWithValue("@LOTE", "%" + lote + "%"); + } + + if (!string.IsNullOrWhiteSpace(fornecedor)) + { + sql += " AND FORNECEDOR LIKE @FORNECEDOR"; + cmd.Parameters.AddWithValue("@FORNECEDOR", "%" + fornecedor + "%"); + } + + if (!string.IsNullOrWhiteSpace(numeroNF)) + { + sql += " AND NUMERO_NF LIKE @NUMERO_NF"; + cmd.Parameters.AddWithValue("@NUMERO_NF", "%" + numeroNF + "%"); + } + + if (ativo.HasValue) + { + sql += " AND ATIVO=@ATIVO"; + cmd.Parameters.AddWithValue("@ATIVO", ativo.Value); + } + + if (fabricacaoInicial.HasValue) + { + sql += " AND DATA_FABRICACAO>=@FAB_INI"; + cmd.Parameters.AddWithValue("@FAB_INI", fabricacaoInicial.Value); + } + + if (fabricacaoFinal.HasValue) + { + sql += " AND DATA_FABRICACAO<=@FAB_FIM"; + cmd.Parameters.AddWithValue("@FAB_FIM", fabricacaoFinal.Value); + } + + if (validadeInicial.HasValue) + { + sql += " AND DATA_VALIDADE>=@VAL_INI"; + cmd.Parameters.AddWithValue("@VAL_INI", validadeInicial.Value); + } + + if (validadeFinal.HasValue) + { + sql += " AND DATA_VALIDADE<=@VAL_FIM"; + cmd.Parameters.AddWithValue("@VAL_FIM", validadeFinal.Value); + } + + sql += " ORDER BY DATA_VALIDADE"; + + cmd.Connection = conn; + cmd.CommandText = sql; + + conn.Open(); + + using SqlDataReader dr = cmd.ExecuteReader(); + + while (dr.Read()) + { + lista.Add(PreencherModelo(dr)); + } + + return lista; + }//Listar + + public List ListarPorProduto(string codigoProduto) + { + return Listar(codItem: codigoProduto); + }//ListarPorProduto + public List ListarPorFornecedor(string fornecedor) + { + return Listar(fornecedor: fornecedor); + }//ListarPorFornecedor + public List ListarPorNF(string numeroNF) + { + return Listar(numeroNF: numeroNF); + }//ListarPorNF + public List ListarPorLote(string lote) + { + return Listar(lote: lote); + }//ListarPorLote + public List ListarAtivos() + { + return Listar(ativo: true); + }//ListarAtivos + public List ListarInativos() + { + return Listar(ativo: false); + }//ListarInativos + public List ListarVencidos() + { + return Listar( + validadeFinal: DateTime.Today); + }//ListarVencidos + public List ListarAVencer() + { + return Listar( + validadeInicial: DateTime.Today, + validadeFinal: DateTime.Today.AddDays(30)); + }//ListarAVencer + public List ListarPorPeriodoValidade(DateTime inicio,DateTime fim) + { + return Listar( + validadeInicial: inicio, + validadeFinal: fim); + }//ListarPorPeriodoValidade + public List ListarPorPeriodoFabricacao(DateTime inicio,DateTime fim) + { + return Listar( + fabricacaoInicial: inicio, + fabricacaoFinal: fim); + }//ListarPorPeriodoFabricacao + + #endregion + #region Controle de estoque - Stock control + public bool SomarQuantidade(int idLote, decimal quantidade) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + UPDATE Itens_Lotes + SET QUANTIDADE = QUANTIDADE + @QUANTIDADE, + DATA_ALTERACAO = GETDATE() + WHERE ID_ITEM_LOTE = @ID"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@QUANTIDADE", quantidade); + cmd.Parameters.AddWithValue("@ID", idLote); + + conn.Open(); + + return cmd.ExecuteNonQuery() > 0; + }//SomarQuantidade + public bool BaixarQuantidade(int idLote, decimal quantidade) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + UPDATE Itens_Lotes + SET QUANTIDADE = QUANTIDADE - @QUANTIDADE, + DATA_ALTERACAO = GETDATE() + WHERE ID_ITEM_LOTE = @ID + AND QUANTIDADE >= @QUANTIDADE"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@QUANTIDADE", quantidade); + cmd.Parameters.AddWithValue("@ID", idLote); + + conn.Open(); + + return cmd.ExecuteNonQuery() > 0; + }//BaixarQuantidade + public bool Entrada(int idLote, decimal quantidade) + { + return SomarQuantidade(idLote, quantidade); + }//Entrada + public bool Saida(int idLote, decimal quantidade) + { + return BaixarQuantidade(idLote, quantidade); + }//Saida + public bool AjustarQuantidade(int idLote, decimal novaQuantidade) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + UPDATE Itens_Lotes + SET QUANTIDADE = @QUANTIDADE, + DATA_ALTERACAO = GETDATE() + WHERE ID_ITEM_LOTE = @ID"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@QUANTIDADE", novaQuantidade); + cmd.Parameters.AddWithValue("@ID", idLote); + + conn.Open(); + + return cmd.ExecuteNonQuery() > 0; + }//AjustarQuantidade + public bool ZerarLote(int idLote) + { + return AjustarQuantidade(idLote, 0); + }//ZerarLote + public bool ExisteSaldo(int idLote) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT COUNT(*) + FROM Itens_Lotes + WHERE ID_ITEM_LOTE = @ID + AND QUANTIDADE > 0"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@ID", idLote); + + conn.Open(); + + return Convert.ToInt32(cmd.ExecuteScalar()) > 0; + }//ExisteSaldo + public decimal SaldoLote(int idLote) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT ISNULL(QUANTIDADE,0) + FROM Itens_Lotes + WHERE ID_ITEM_LOTE = @ID"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@ID", idLote); + + conn.Open(); + + object valor = cmd.ExecuteScalar(); + + return valor != DBNull.Value + ? Convert.ToDecimal(valor) + : 0; + }//SaldoLote + public decimal SaldoProduto(string codigoProduto) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT ISNULL(SUM(QUANTIDADE),0) + FROM Itens_Lotes + WHERE COD_ITEM = @COD_ITEM + AND ATIVO = 1"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + + conn.Open(); + + object valor = cmd.ExecuteScalar(); + + return valor != DBNull.Value + ? Convert.ToDecimal(valor) + : 0; + }//SaldoProduto + public bool TransferirQuantidade(int loteOrigem, int loteDestino, decimal quantidade) + { + using SqlConnection conn = new(connectionString); + + conn.Open(); + + using SqlTransaction trans = conn.BeginTransaction(); + + try + { + SqlCommand cmd = new(@" + UPDATE Itens_Lotes + SET QUANTIDADE = QUANTIDADE - @QTD, + DATA_ALTERACAO = GETDATE() + WHERE ID_ITEM_LOTE = @ORIGEM + AND QUANTIDADE >= @QTD", conn, trans); + + cmd.Parameters.AddWithValue("@QTD", quantidade); + cmd.Parameters.AddWithValue("@ORIGEM", loteOrigem); + + if (cmd.ExecuteNonQuery() == 0) + { + trans.Rollback(); + return false; + } + + cmd = new SqlCommand(@" + UPDATE Itens_Lotes + SET QUANTIDADE = QUANTIDADE + @QTD, + DATA_ALTERACAO = GETDATE() + WHERE ID_ITEM_LOTE = @DESTINO", conn, trans); + + cmd.Parameters.AddWithValue("@QTD", quantidade); + cmd.Parameters.AddWithValue("@DESTINO", loteDestino); + + if (cmd.ExecuteNonQuery() == 0) + { + trans.Rollback(); + return false; + } + + trans.Commit(); + return true; + } + catch + { + trans.Rollback(); + throw; + } + }//TransferirQuantidade + + #endregion + #region Controle de Validade - Validity Control + public List LotesVencidos() + { + return Listar( + validadeFinal: DateTime.Today, + ativo: true); + }//LotesVencidos + public List LotesAVencer(int dias = 30) + { + return Listar( + validadeInicial: DateTime.Today, + validadeFinal: DateTime.Today.AddDays(dias), + ativo: true); + }//LotesAVencer + public List LotesValidos() + { + using SqlConnection conn = new(connectionString); + + List lista = []; + + string sql = @" + SELECT * + FROM Itens_Lotes + WHERE DATA_VALIDADE >= @DATA + AND ATIVO = 1 + ORDER BY DATA_VALIDADE"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@DATA", DateTime.Today); + + conn.Open(); + + using SqlDataReader dr = cmd.ExecuteReader(); + + while (dr.Read()) + lista.Add(PreencherModelo(dr)); + + return lista; + }//LotesValidos + public List LotesSemValidade() + { + using SqlConnection conn = new(connectionString); + + List lista = []; + + string sql = @" + SELECT * + FROM Itens_Lotes + WHERE DATA_VALIDADE IS NULL + ORDER BY CODIGO"; + + using SqlCommand cmd = new(sql, conn); + + conn.Open(); + + using SqlDataReader dr = cmd.ExecuteReader(); + + while (dr.Read()) + lista.Add(PreencherModelo(dr)); + + return lista; + }//LotesSemValidade + public int DiasParaVencer(int idLote) + { + ModeloItensLotes? lote = Carregar(idLote); + + if (lote == null) + return -1; + + if (!lote.DATA_VALIDADE.HasValue) + return int.MaxValue; + + return (lote.DATA_VALIDADE.Value.Date - DateTime.Today).Days; + }//DiasParaVencer + public int DiasVencido(int idLote) + { + ModeloItensLotes? lote = Carregar(idLote); + + if (lote == null) + return 0; + + if (!lote.DATA_VALIDADE.HasValue) + return 0; + + if (lote.DATA_VALIDADE.Value.Date >= DateTime.Today) + return 0; + + return (DateTime.Today - lote.DATA_VALIDADE.Value.Date).Days; + }//DiasVencido + public DateTime? PrimeiroVencimento(string codigoProduto) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT MIN(DATA_VALIDADE) + FROM Itens_Lotes + WHERE COD_ITEM=@COD_ITEM + AND DATA_VALIDADE IS NOT NULL + AND ATIVO=1"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + + conn.Open(); + + object valor = cmd.ExecuteScalar(); + + if (valor == DBNull.Value || valor == null) + return null; + + return Convert.ToDateTime(valor); + }//PrimeiroVencimento + public DateTime? UltimoVencimento(string codigoProduto) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT MAX(DATA_VALIDADE) + FROM Itens_Lotes + WHERE COD_ITEM=@COD_ITEM + AND DATA_VALIDADE IS NOT NULL + AND ATIVO=1"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + + conn.Open(); + + object valor = cmd.ExecuteScalar(); + + if (valor == DBNull.Value || valor == null) + return null; + + return Convert.ToDateTime(valor); + }//UltimoVencimento + public bool ExisteLoteVencido(string codigoProduto) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT COUNT(*) + FROM Itens_Lotes + WHERE COD_ITEM=@COD_ITEM + AND DATA_VALIDADE < @HOJE + AND ATIVO=1"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + cmd.Parameters.AddWithValue("@HOJE", DateTime.Today); + + conn.Open(); + + return Convert.ToInt32(cmd.ExecuteScalar()) > 0; + }//ExisteLoteVencido + public bool ExisteLoteAVencer(string codigoProduto, int dias = 30) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT COUNT(*) + FROM Itens_Lotes + WHERE COD_ITEM=@COD_ITEM + AND DATA_VALIDADE BETWEEN @HOJE AND @DATA + AND ATIVO=1"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + cmd.Parameters.AddWithValue("@HOJE", DateTime.Today); + cmd.Parameters.AddWithValue("@DATA", DateTime.Today.AddDays(dias)); + + conn.Open(); + + return Convert.ToInt32(cmd.ExecuteScalar()) > 0; + }//ExisteLoteAVencer + public decimal QuantidadeVencida(string codigoProduto) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT ISNULL(SUM(QUANTIDADE),0) + FROM Itens_Lotes + WHERE COD_ITEM=@COD_ITEM + AND DATA_VALIDADE < @HOJE + AND ATIVO=1"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + cmd.Parameters.AddWithValue("@HOJE", DateTime.Today); + + conn.Open(); + + return Convert.ToDecimal(cmd.ExecuteScalar()); + }//QuantidadeVencida + public decimal QuantidadeAVencer(string codigoProduto, int dias = 30) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT ISNULL(SUM(QUANTIDADE),0) + FROM Itens_Lotes + WHERE COD_ITEM=@COD_ITEM + AND DATA_VALIDADE BETWEEN @HOJE AND @DATA + AND ATIVO=1"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + cmd.Parameters.AddWithValue("@HOJE", DateTime.Today); + cmd.Parameters.AddWithValue("@DATA", DateTime.Today.AddDays(dias)); + + conn.Open(); + + return Convert.ToDecimal(cmd.ExecuteScalar()); + }//QuantidadeAVencer + public decimal QuantidadeValida(string codigoProduto) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT ISNULL(SUM(QUANTIDADE),0) + FROM Itens_Lotes + WHERE COD_ITEM=@COD_ITEM + AND DATA_VALIDADE >= @HOJE + AND ATIVO=1"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + cmd.Parameters.AddWithValue("@HOJE", DateTime.Today); + + conn.Open(); + + return Convert.ToDecimal(cmd.ExecuteScalar()); + }//QuantidadeValida + + #endregion + #region FEFO / FIFO - First Expired, First Out / First In, First Out + public ModeloItensLotes? ObterFEFO(string codigoProduto) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT TOP 1 * + FROM Itens_Lotes + WHERE COD_ITEM=@COD_ITEM + AND ATIVO=1 + AND QUANTIDADE_DISPONIVEL>0 + AND DATA_VALIDADE IS NOT NULL + ORDER BY DATA_VALIDADE ASC"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + + conn.Open(); + + using SqlDataReader dr = cmd.ExecuteReader(); + + if (dr.Read()) + return PreencherModelo(dr); + + return null; + }//ObterFEFO + public ModeloItensLotes? ObterFIFO(string codigoProduto) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT TOP 1 * + FROM Itens_Lotes + WHERE COD_ITEM=@COD_ITEM + AND ATIVO=1 + AND QUANTIDADE_DISPONIVEL>0 + AND DATA_FABRICACAO IS NOT NULL + ORDER BY DATA_FABRICACAO ASC"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@COD_ITEM", codigoProduto); + + conn.Open(); + + using SqlDataReader dr = cmd.ExecuteReader(); + + if (dr.Read()) + return PreencherModelo(dr); + + return null; + }//ObterFIFO + public decimal QuantidadeDisponivel(int idLote) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT QUANTIDADE_DISPONIVEL + FROM Itens_Lotes + WHERE ID_ITEM_LOTE=@ID"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@ID", idLote); + + conn.Open(); + + object valor = cmd.ExecuteScalar(); + + return valor != DBNull.Value + ? Convert.ToDecimal(valor) + : 0; + }//QuantidadeDisponivel + public decimal QuantidadeReservada(int idLote) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + SELECT QUANTIDADE_RESERVADA + FROM Itens_Lotes + WHERE ID_ITEM_LOTE=@ID"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@ID", idLote); + + conn.Open(); + + object valor = cmd.ExecuteScalar(); + + return valor != DBNull.Value + ? Convert.ToDecimal(valor) + : 0; + }//QuantidadeReservada + public bool ReservarLote(int idLote, decimal quantidade) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + UPDATE Itens_Lotes + SET QUANTIDADE_RESERVADA = + QUANTIDADE_RESERVADA + @QTD, + DATA_ALTERACAO = GETDATE() + WHERE ID_ITEM_LOTE=@ID + AND QUANTIDADE_DISPONIVEL>=@QTD"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@ID", idLote); + cmd.Parameters.AddWithValue("@QTD", quantidade); + + conn.Open(); + + return cmd.ExecuteNonQuery() > 0; + }//ReservarLote + public bool LiberarLote(int idLote, decimal quantidade) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + UPDATE Itens_Lotes + SET QUANTIDADE_RESERVADA = + QUANTIDADE_RESERVADA - @QTD, + DATA_ALTERACAO = GETDATE() + WHERE ID_ITEM_LOTE=@ID + AND QUANTIDADE_RESERVADA>=@QTD"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@ID", idLote); + cmd.Parameters.AddWithValue("@QTD", quantidade); + + conn.Open(); + + return cmd.ExecuteNonQuery() > 0; + }//LiberarLote + public bool ConsumirReserva(int idLote, decimal quantidade) + { + using SqlConnection conn = new(connectionString); + + string sql = @" + UPDATE Itens_Lotes + SET QUANTIDADE = QUANTIDADE - @QTD, + QUANTIDADE_RESERVADA = QUANTIDADE_RESERVADA - @QTD, + DATA_ALTERACAO = GETDATE() + WHERE ID_ITEM_LOTE=@ID + AND QUANTIDADE_RESERVADA>=@QTD"; + + using SqlCommand cmd = new(sql, conn); + + cmd.Parameters.AddWithValue("@ID", idLote); + cmd.Parameters.AddWithValue("@QTD", quantidade); + + conn.Open(); + + return cmd.ExecuteNonQuery() > 0; + }//ConsumirReserva + public bool PodeAtenderVenda(int idLote, decimal quantidade) + { + return QuantidadeDisponivel(idLote) >= quantidade; + }//PodeAtenderVenda + public ModeloItensLotes? MelhorLote(string codigoProduto) + { + return ObterFEFO(codigoProduto); + }//MelhorLote + + #endregion + + + + + + + //Parte 8.1 -> Concluida + //Parte 8.2 -> Concluida + //Parte 8.3 -> Concluida + //Parte 8.4 -> Concluida + //Parte 8.5 -> Concluida + //Parte 8.6 + //Parte 8.7 + //Parte 8.8 + //Parte 8.9 + //Parte 8.10 + } +}