public async Task <List <ServicosOS> > GetServicosOrdemServicoResultSet(NpgsqlCommand command)
        {
            List <ServicosOS> list = new List <ServicosOS>();

            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();
                ServicosOS p          = JsonConvert.DeserializeObject <ServicosOS>(stringJson);
                list.Add(p);
            }
            return(list);
        }
        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 <ServicosOS> InserirServicosOrdemServico(NpgsqlConnection conexao, ServicosOS servico, int codigoOS)
        {
            string sql = @"INSERT INTO servicosos(codigoos, codigoservico, quantidade, valorunitario, total) VALUES (@codigoOS, @codigoServico, @quantidade, @valorUnitario, @total);";

            NpgsqlCommand command = new NpgsqlCommand(sql, conexao);

            command.Parameters.AddWithValue("@codigoOS", codigoOS);
            command.Parameters.AddWithValue("@codigoServico", servico.codigoServico);
            command.Parameters.AddWithValue("@quantidade", servico.quantidade);
            command.Parameters.AddWithValue("@valorUnitario", servico.valorUnitario);
            command.Parameters.AddWithValue("@total", servico.total);

            await command.ExecuteScalarAsync();

            return(servico);
        }