public int Save(int IDPedidoVenda, int IDCompany, int IDUser, DateTime DataVenda, PedidoVendaStatusEnum Status, int IDUsuario, int IDVendedor, int IDEmpresa, TipoPagamentoEnum TipoPagamento, QtdeParcelasEnum QtdeParcelas, string Observacao, List <PedidoVendaItemEN> ListPedidoVendaItens, bool VendaExpress) { int idPedido = 0; _unitOfWork.BeginTransaction(); try { PedidoVendaEN pedidoVendaEN = _repositoryPedidoVenda.GetByID(IDPedidoVenda); if (pedidoVendaEN != null) { if (pedidoVendaEN.Status != PedidoVendaStatusEnum.Aberto) { pedidoVendaEN.UpdateProperties ( IDCompany, IDUser, pedidoVendaEN.DataVenda, pedidoVendaEN.Status, pedidoVendaEN.IDUsuario, pedidoVendaEN.IDVendedor, pedidoVendaEN.IDEmpresa, pedidoVendaEN.TipoPagamento, pedidoVendaEN.QtdeParcelas, Observacao, VendaExpress ); } else { pedidoVendaEN.UpdateProperties ( IDCompany, IDUser, DataVenda, Status, IDUsuario, IDVendedor, IDEmpresa, TipoPagamento, QtdeParcelas, Observacao, VendaExpress ); } _repositoryPedidoVenda.Edit(pedidoVendaEN); } else { pedidoVendaEN = new PedidoVendaEN ( IDCompany, IDUser, DataVenda, Status, IDUsuario, IDVendedor, IDEmpresa, TipoPagamento, QtdeParcelas, Observacao, VendaExpress ); pedidoVendaEN.DataCadastro = DateTime.Now.ToLocalTime(); _repositoryPedidoVenda.Save(pedidoVendaEN); } _unitOfWork.Commit(); if (pedidoVendaEN.Status == PedidoVendaStatusEnum.Aberto) { idPedido = pedidoVendaEN.IDPedido; List <PedidoVendaItemEN> listPedidoVendaItem = _repositoryPedidoVendaItem.Where(obj => obj.IDPedido == idPedido).ToList(); //VERIFICA SE ALGUM ITEM FOI EXCLUÍDO foreach (var itemPedidoBD in listPedidoVendaItem) { var itemPedido = ListPedidoVendaItens.Where(obj => obj.IDProduto == itemPedidoBD.IDProduto).FirstOrDefault(); if (itemPedido == null) { _pedidoVendaItemBU.RemoveItem(itemPedidoBD); } } listPedidoVendaItem = _repositoryPedidoVendaItem.Where(obj => obj.IDPedido == idPedido).ToList(); int item = 0; foreach (var itemPedido in ListPedidoVendaItens) { var itemPedidoBD = listPedidoVendaItem.Where(obj => obj.IDProduto == itemPedido.IDProduto).FirstOrDefault(); int pedidoItem = 0; if (itemPedidoBD != null) { pedidoItem = itemPedidoBD.IDPedidoItem; item = itemPedidoBD.Item; } else { pedidoItem = itemPedido.IDPedidoItem; item++; } _pedidoVendaItemBU.Save(pedidoItem, idPedido, item, itemPedido.IDProduto, itemPedido.Qtde, itemPedido.Valor); if (pedidoItem != 0) { item = listPedidoVendaItem.Count(); } } } _unitOfWork.CommitTransaction(); } catch (DomainException ex) { Console.Write(ex); _unitOfWork.RollbackTransaction(); throw new DomainException(ex.Message); } catch (Exception ex) { Console.Write(ex); _unitOfWork.RollbackTransaction(); throw new DomainException("Erro ao salvar pedido. Tente novamente mais tarde"); } return(idPedido); }
public void FluxoPedido(int IDPedidoVenda, PedidoVendaStatusEnum Status, bool inTransaction = false) { PedidoVendaEN pedidoVendaEN = _repositoryPedidoVenda.GetByID(IDPedidoVenda); bool atualizaEstoque = true; if (pedidoVendaEN.Status == PedidoVendaStatusEnum.Aberto) { atualizaEstoque = false; } pedidoVendaEN.Status = Status; if (inTransaction == false) { _unitOfWork.BeginTransaction(); } try { _repositoryPedidoVenda.Edit(pedidoVendaEN); _unitOfWork.Commit(); if (atualizaEstoque && Status == PedidoVendaStatusEnum.Cancelado) { List <PedidoVendaItemEN> listPedidoVendaItem = _repositoryPedidoVendaItem.Where(obj => obj.IDPedido == pedidoVendaEN.IDPedido).ToList(); foreach (var itemPedido in listPedidoVendaItem) { _movimentoEstoqueBU.Save ( pedidoVendaEN.IDCompany, pedidoVendaEN.IDUser, OrigemMovimentoEstoqueEnum.PedidoVenda, itemPedido.IDPedido, itemPedido.IDProduto, TipoMovimentoEstoqueEnum.Entrada, itemPedido.Qtde, "Pedido de Venda [CANCELAMENTO]" ); } List <ContasReceberEN> listContasReceber = _repositoryContasReceber.Where(obj => obj.Chave == pedidoVendaEN.IDPedido && obj.Origem == OrigemContasReceberEnum.PedidoVenda).ToList(); var qtdeTitulosPagos = listContasReceber.Where(obj => obj.Status == ContasReceberStatusEnum.Baixado).Count(); if (qtdeTitulosPagos > 0) { throw new DomainException("Existem títulos pagos desse pedido. Cancelamento não permitido!"); } foreach (var itemContasReceber in listContasReceber) { itemContasReceber.Status = ContasReceberStatusEnum.Cancelado; _repositoryContasReceber.Edit(itemContasReceber); _unitOfWork.Commit(); } } else if (Status == PedidoVendaStatusEnum.AguardandoPagamento) { var listPedidoVendaItem = _repositoryPedidoVendaItem.Where(obj => obj.IDPedido == IDPedidoVenda).ToList(); var empresaEN = _repositoryEmpresa.GetByID(pedidoVendaEN.IDEmpresa); foreach (var itemPedido in listPedidoVendaItem) { //Criação Movimentação e Atualiza Estoque _movimentoEstoqueBU.Save ( pedidoVendaEN.IDCompany, pedidoVendaEN.IDUser, OrigemMovimentoEstoqueEnum.PedidoVenda, IDPedidoVenda, itemPedido.IDProduto, TipoMovimentoEstoqueEnum.Saida, itemPedido.Qtde, empresaEN.RazaoSocial ); } decimal valorTotalPedido = listPedidoVendaItem.Sum(obj => obj.ValorTotal); decimal valorTitulo = valorTotalPedido / (int)pedidoVendaEN.QtdeParcelas; decimal somaDosValorTitulo = 0; DateTime dataVencimento = pedidoVendaEN.DataCadastro.AddDays(10); int seq = 1; for (int iQtdeParcelas = 1; iQtdeParcelas <= (int)pedidoVendaEN.QtdeParcelas; iQtdeParcelas++) { somaDosValorTitulo += valorTitulo; //VERIFICA SE NA ÚLTIMA PARCELA EXISTE DIFERENÇA DE CENTAVOS if (iQtdeParcelas == (int)pedidoVendaEN.QtdeParcelas) { if (valorTotalPedido != somaDosValorTitulo) { decimal valorDiferenca = valorTotalPedido - somaDosValorTitulo; if (valorDiferenca < 0) { valorDiferenca = valorDiferenca * -1; } valorTitulo += valorDiferenca; } } //GRAVA O TÍTULO NO CONTAS A RECEBER _contasReceberBU.Save ( 0, pedidoVendaEN.IDCompany, pedidoVendaEN.IDUser, pedidoVendaEN.IDEmpresa, $"PED{pedidoVendaEN.IDPedido.ToString("00000")}_{iQtdeParcelas.ToString()}", seq, dataVencimento, valorTitulo, 0, OrigemContasReceberEnum.PedidoVenda, string.Empty, pedidoVendaEN.IDPedido, "Título gravado pelo fluxo de pedido." ); dataVencimento = dataVencimento.AddDays(30); seq += 1; } } if (inTransaction == false) { _unitOfWork.CommitTransaction(); } } catch (DomainException ex) { if (inTransaction == false) { _unitOfWork.RollbackTransaction(); } throw new DomainException(ex.Message); } catch { if (inTransaction == false) { _unitOfWork.RollbackTransaction(); } throw new DomainException("Erro ao atualizar status do pedido. Tente novamente mais tarde"); } }