public async Task <List <ParcelasCompra> > GetParcelasOrdemServicoResultSet(NpgsqlCommand command)
        {
            List <ParcelasCompra> list = new List <ParcelasCompra>();

            command.ExecuteNonQuery();

            using var reader = await command.ExecuteReaderAsync();

            while (await reader.ReadAsync())
            {
                DataTable schemaTable = reader.GetSchemaTable();

                JTokenWriter writer = new JTokenWriter();
                writer.WriteStartObject();

                foreach (DataRow row in schemaTable.Rows)
                {
                    writer.WritePropertyName(row[0].ToString());
                    writer.WriteValue(reader[row[0].ToString()]);
                }
                writer.WriteEndObject();
                JObject        o          = (JObject)writer.Token;
                var            stringJson = o.ToString();
                ParcelasCompra p          = JsonConvert.DeserializeObject <ParcelasCompra>(stringJson);
                list.Add(p);
            }
            return(list);
        }
        public async Task <List <ParcelasCompra> > gerarParcelas(ParcelasDTO parcela)
        {
            CondicoesPagamentoDAO condicaoDao = new CondicoesPagamentoDAO();

            CondicoesPagamento condicao = await condicaoDao.BuscarPorID(parcela.codigoCondicaoPagamento);

            List <ParcelasCompra> listParcelas = new List <ParcelasCompra>();

            foreach (var p in condicao.parcelas)
            {
                var itemParcela = new ParcelasCompra
                {
                    numeroParcela        = p.numeroParcela,
                    dtEmissao            = DateTime.Now,
                    dtVencimento         = parcela.dtEmissao.AddDays((double)p.numeroDias),
                    codigoFormaPagamento = p.codigoFormaPagamento,
                    descricaoForma       = p.formaPagamento.descricao,
                    valorParcela         = decimal.Round(((p.porcentagem / 100) * parcela.valorTotal), 2)
                };
                listParcelas.Add(itemParcela);
            }

            var totalParcelas = listParcelas.Sum(k => k.valorParcela);

            if (totalParcelas != parcela.valorTotal)
            {
                if (totalParcelas < parcela.valorTotal)
                {
                    var dif  = parcela.valorTotal - totalParcelas;
                    var list = listParcelas.OrderBy(u => u.numeroParcela);
                    list.Last().valorParcela = list.Last().valorParcela + dif;
                    listParcelas = list.ToList();
                }
                if (totalParcelas > parcela.valorTotal)
                {
                    var dif  = totalParcelas - parcela.valorTotal;
                    var list = listParcelas.OrderBy(u => u.numeroParcela);
                    list.Last().valorParcela = list.Last().valorParcela - dif;
                    listParcelas = list.ToList();
                }
            }

            return(listParcelas);
        }
        public override async Task <OrdensServico> Inserir(OrdensServico ordemServico)
        {
            using (var conexao = GetCurrentConnection())
            {
                conexao.Open();
                NpgsqlTransaction transaction = conexao.BeginTransaction();
                try
                {
                    string sql = @"INSERT INTO ordensservico(codigofornecedor, dtinicial, dtfinal, valorservicos, valorprodutos, valortotal, codigocondicaopagamento, dtcadastro, dtalteracao, status) VALUES (@codigoFornecedor, @dtInicial, @dtFinal, @valorServicos, @valorProdutos, @valorTotal, @codigoCondicaoPagamento, @dtCadastro, @dtAlteracao, @status) returning codigo;";

                    NpgsqlCommand command = new NpgsqlCommand(sql, conexao);
                    command.Parameters.AddWithValue("@codigoFornecedor", ordemServico.codigoFornecedor);
                    command.Parameters.AddWithValue("@dtInicial", ordemServico.dtInicial);
                    command.Parameters.AddWithValue("@dtFinal", ordemServico.dtFinal);
                    command.Parameters.AddWithValue("@valorServicos", ordemServico.valorServicos);
                    command.Parameters.AddWithValue("@valorProdutos", ordemServico.valorProdutos);
                    command.Parameters.AddWithValue("@valorTotal", ordemServico.valorTotal);
                    command.Parameters.AddWithValue("@codigoCondicaoPagamento", ordemServico.codigoCondicaoPagamento);
                    command.Parameters.AddWithValue("@dtCadastro", ordemServico.dtCadastro);
                    command.Parameters.AddWithValue("@dtAlteracao", ordemServico.dtAlteracao);
                    command.Parameters.AddWithValue("@status", ordemServico.status);

                    Object idInserido = await command.ExecuteScalarAsync();

                    ordemServico.codigo = (int)idInserido;

                    int qtdServicos = ordemServico.servicos.Count;
                    if (qtdServicos > 0)
                    {
                        for (int i = 0; i < qtdServicos; i++)
                        {
                            ServicosOS servicoOrdemServico = ordemServico.servicos[i];
                            ordemServico.servicos[i] = await InserirServicosOrdemServico(conexao, servicoOrdemServico, ordemServico.codigo);
                        }
                    }

                    int qtdItens = ordemServico.itens.Count;
                    if (qtdItens > 0)
                    {
                        for (int i = 0; i < qtdItens; i++)
                        {
                            ItensCompra itemOrdemServico = ordemServico.itens[i];
                            ordemServico.itens[i] = await InserirItensOrdemServico(conexao, itemOrdemServico, ordemServico.codigo);
                        }
                    }

                    int qtdParcelas = ordemServico.parcelas.Count;
                    if (qtdParcelas > 0)
                    {
                        for (int i = 0; i < qtdParcelas; i++)
                        {
                            ParcelasCompra parcelaordemServico = ordemServico.parcelas[i];
                            parcelaordemServico.dtEmissao = (DateTime)ordemServico.dtCadastro;
                            parcelaordemServico.pendente();
                            ordemServico.parcelas[i] = await InserirParcelasOrdemServico(conexao, parcelaordemServico, ordemServico);
                        }
                    }

                    transaction.Commit();
                    return(ordemServico);
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    conexao.Close();
                }
            }
        }
        public async Task <ParcelasCompra> InserirParcelasOrdemServico(NpgsqlConnection conexao, ParcelasCompra parcela, OrdensServico ordemServico)
        {
            string modelo = "99";
            string serie  = "99";

            string sql = @"INSERT INTO contaspagar(modelo, serie, numeronf, codigofornecedor, numeroparcela, valorparcela, codigoformapagamento, dtemissao, dtvencimento, dtpagamento, status) VALUES (@modelo, @serie, @numeroNF, @codigoFornecedor, @numeroParcela, @valorParcela, @codigoFormaPagamento, @dtEmissao, @dtVencimento, @dtPagamento, @status);";

            NpgsqlCommand command = new NpgsqlCommand(sql, conexao);

            command.Parameters.AddWithValue("@modelo", modelo);
            command.Parameters.AddWithValue("@serie", serie);
            command.Parameters.AddWithValue("@numeroNF", ordemServico.codigo);
            command.Parameters.AddWithValue("@codigoFornecedor", ordemServico.codigoFornecedor);
            command.Parameters.AddWithValue("@numeroParcela", parcela.numeroParcela);
            command.Parameters.AddWithValue("@valorParcela", parcela.valorParcela);
            command.Parameters.AddWithValue("@codigoFormaPagamento", parcela.codigoFormaPagamento);
            command.Parameters.AddWithValue("@dtEmissao", parcela.dtEmissao);
            command.Parameters.AddWithValue("@dtVencimento", parcela.dtVencimento);
            command.Parameters.AddWithValue("@dtPagamento", parcela.dtPagamento ?? (Object)DBNull.Value);
            command.Parameters.AddWithValue("@status", parcela.status);

            await command.ExecuteScalarAsync();

            return(parcela);
        }
        public override async Task <Compras> Inserir(Compras compra)
        {
            using (var conexao = GetCurrentConnection())
            {
                conexao.Open();
                NpgsqlTransaction transaction = conexao.BeginTransaction();
                try
                {
                    string sql = @"INSERT INTO compras(modelo, serie, numeronf, codigofornecedor, dtemissao, dtentrega, valorprodutos, frete, seguro, despesas, valortotal, codigocondicaopagamento, dtcadastro, dtalteracao, status) VALUES (@modelo, @serie, @numeroNF, @codigoFornecedor, @dtEmissao, @dtEntrega, @valorProdutos, @frete, @seguro, @despesas, @valorTotal, @codigoCondicaoPagamento, @dtCadastro, @dtAlteracao, @status);";

                    NpgsqlCommand command = new NpgsqlCommand(sql, conexao);
                    command.Parameters.AddWithValue("@modelo", compra.modelo);
                    command.Parameters.AddWithValue("@serie", compra.serie);
                    command.Parameters.AddWithValue("@numeroNF", compra.numeroNF);
                    command.Parameters.AddWithValue("@codigoFornecedor", compra.codigoFornecedor);
                    command.Parameters.AddWithValue("@dtEmissao", compra.dtEmissao);
                    command.Parameters.AddWithValue("@dtEntrega", compra.dtEntrega);
                    command.Parameters.AddWithValue("@valorProdutos", compra.valorProdutos);
                    command.Parameters.AddWithValue("@frete", compra.frete);
                    command.Parameters.AddWithValue("@seguro", compra.seguro);
                    command.Parameters.AddWithValue("@despesas", compra.despesas);
                    command.Parameters.AddWithValue("@valorTotal", compra.valorTotal);
                    command.Parameters.AddWithValue("@codigoCondicaoPagamento", compra.codigoCondicaoPagamento);
                    command.Parameters.AddWithValue("@dtCadastro", compra.dtCadastro);
                    command.Parameters.AddWithValue("@dtAlteracao", compra.dtAlteracao);
                    command.Parameters.AddWithValue("@status", compra.status);

                    await command.ExecuteScalarAsync();

                    int qtdItens = compra.itens.Count;
                    if (qtdItens > 0)
                    {
                        for (int i = 0; i < qtdItens; i++)
                        {
                            ItensCompra itemCompra = compra.itens[i];
                            itemCompra.modelo           = compra.modelo;
                            itemCompra.serie            = compra.serie;
                            itemCompra.numeroNF         = compra.numeroNF;
                            itemCompra.codigoFornecedor = compra.codigoFornecedor;
                            compra.itens[i]             = await InserirItensCompra(conexao, itemCompra);

                            await AtualizarProdutos(conexao, compra, itemCompra);
                        }
                    }

                    int qtdParcelas = compra.parcelas.Count;
                    if (qtdParcelas > 0)
                    {
                        for (int i = 0; i < qtdParcelas; i++)
                        {
                            ParcelasCompra parcelaCompra = compra.parcelas[i];
                            parcelaCompra.dtEmissao = compra.dtEmissao;
                            parcelaCompra.pendente();
                            compra.parcelas[i] = await InserirParcelasCompra(conexao, parcelaCompra, compra);
                        }
                    }

                    transaction.Commit();
                    return(compra);
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    conexao.Close();
                }
            }
        }