public Completa(Produto[] produto,  int codCompleto, GarconFisico[] garcons, double valorCompleto)
        {
            this.cod_completo = codCompleto;
            valorUnitario = valorCompleto;
            this.produto = produto;
            quantidade = new Banco.BancoInformacao().quantidadeCompletaByCodigo(cod_completo);

            needImpress = false;

            for (int i = 0; i < produto.Length; i++ ) {
                if (produto[i].impresso) { needImpress = true; break; }
            }

            this.garcons = garcons;
        }
        public VendaFull carregaVenda(int cod_venda)
        {
            Completa[] conjCompleto;

            DataTable dttVenda = new DataTable();
            //--------CARREGAR MESA ------------------
            DataTable dttMesa = new DataTable();
            NpgsqlDataAdapter a = new NpgsqlDataAdapter
                    (" select m.descricao from mesa m " +
                    " inner join vendaMesa vm on (m.cod_mesa = vm.cod_mesa) " +
                    " inner join venda v on (v.cod_venda = vm.cod_venda) " +
                    " where  v.aberta = true and m.status = false and v.cod_venda = " + cod_venda, Conectar());
            a.Fill(dttMesa);
            string[] mesa = new string[dttMesa.Rows.Count];
            for (int j = 0; j < dttMesa.Rows.Count; j++)
                mesa[j] = dttMesa.Rows[j].ItemArray.GetValue(0).ToString();

            //-------------------------------------------------------------------------------------
            DataTable numero = new DataTable();
            string queryC = "select count(vc.cod_completo) from vendacompleta vc inner join completo c on (c.cod_completo = vc.cod_completo)"
                +" where cod_venda =" + cod_venda+" and c.cancelado  = false ";
            new NpgsqlDataAdapter(queryC, Conectar()).Fill(numero);

            conjCompleto = new Completa[Convert.ToInt32(numero.Rows[0].ItemArray.GetValue(0))];
            string queryComplet = "select c.cod_completo from completo c inner join vendaCompleta vc on (vc.cod_completo = c.cod_completo)" +
                                  " inner join venda v on (v.cod_venda = vc.cod_venda)" +
                                  " where v.cod_venda = " + cod_venda+ " and c.cancelado = false";
            numero = new DataTable();
            new NpgsqlDataAdapter(queryComplet, Conectar()).Fill(numero);

            for (int j = 0; j < conjCompleto.Length; j++)
            {
                //-----------GARCON DO PRODUTO ---------------------------------------------------------

                string garconA = "select g.cod_garcon,sum(quantidade) from garcon g inner join garconCompleto gc on(g.cod_garcon = gc.cod_garcon) " +
                    "inner join completo c on(c.cod_completo = gc.cod_completo) where c.cod_completo = "
                    + (int)numero.Rows[j].ItemArray.GetValue(0) +" and cancelado = false "
                    + " group by g.cod_garcon";
                DataTable garc = new DataTable();

                new NpgsqlDataAdapter(garconA, Conectar()).Fill(garc);

                string querySubProduto = "select p.cod_produto,cp.porcentagem , c.valorUnitarioCompleto ,cp.cod_tamanho  " +
            " from completo c inner join completoProduto cp on (c.cod_completo = cp.cod_completo)" +
            " inner join produto p on( p.cod_produto = cp.cod_produto) where c.cod_completo = " + (int)numero.Rows[j].ItemArray.GetValue(0)
            + " and c.cancelado = false ";
                DataTable sub = new DataTable();
                new NpgsqlDataAdapter(querySubProduto, Conectar()).Fill(sub);
                GarconFisico[] gf = new GarconFisico[garc.Rows.Count];
                for (int k = 0; k < garc.Rows.Count; k++)
                {
                    gf[k] = new GarconFisico();
                    gf[k].setGarcon(Convert.ToInt16(garc.Rows[k].ItemArray.GetValue(0)), Convert.ToInt16(garc.Rows[k].ItemArray.GetValue(1)));
                }

                Produto[] subProdutos = new Produto[sub.Rows.Count];
                for (int k = 0; k < sub.Rows.Count; k++)
                {
                    double teste = new BancoInformacao().quantidadeCompletaByCodigo
                        ( Convert.ToInt32( numero.Rows[j].ItemArray.GetValue(0).ToString()));
                    subProdutos[k] = new Produto();
                    subProdutos[k].setLoad(
                        Convert.ToInt32(sub.Rows[k].ItemArray.GetValue(0)),
                        Convert.ToDouble(sub.Rows[k].ItemArray.GetValue(1)),
                        Convert.ToDouble(sub.Rows[k].ItemArray.GetValue(2)),
                        Convert.ToInt32(sub.Rows[k].ItemArray.GetValue(3)),
                        //preciso fazer saber a quantidade de produtos

                        new Banco().isImpressoProduto(Convert.ToInt16(sub.Rows[k].ItemArray.GetValue(0)))
                        );

                }
                conjCompleto[j] = new Completa(subProdutos,
                    (int)numero.Rows[j].ItemArray.GetValue(0),gf, valorItemCompleto((int)numero.Rows[j].ItemArray.GetValue(0)));
            }
            //---------------------------------------------------------------
            string query = "select subValor, dataVenda,to_char(horario, 'HH24:MI'), cod_caixa, aberta,impressao, cod_pagamento,  valorReal from venda where cod_venda =" + cod_venda;
            numero = new DataTable();
            new NpgsqlDataAdapter(query, Conectar()).Fill(numero);

            double valor = 0;
            for (int i = 0; i < conjCompleto.Length; i++)
            {
                string vlr = "select valorUnitarioCompleto from completo where cod_completo = "
                    + (conjCompleto[i].cod_completo);
                DataTable vl = new DataTable();
                new NpgsqlDataAdapter(vlr, Conectar()).Fill(vl);
                double info = Convert.ToDouble(vl.Rows[0].ItemArray.GetValue(0));
                double quantidade = new BancoInformacao().quantidadeCompletaByCodigo( conjCompleto[i].cod_completo);
                valor += (info * quantidade);

            }

            try
            {
                VendaFull saida =
                    new VendaFull(
                        conjCompleto,
                        cod_venda,
                        (int)numero.Rows[0].ItemArray.GetValue(3),
                        valor,
                    numero.Rows[0].ItemArray.GetValue(2).ToString(),
                    numero.Rows[0].ItemArray.GetValue(1).ToString(),
                    mesa,new Banco().comissaoIsPct(),
                    new Banco().getValorComissao(),
                    (double)numero.Rows[0].ItemArray.GetValue(7));

                saida.super = retornoSuper(cod_venda);
                return saida;
            }
            catch
            {
                VendaFull saida = new VendaFull(conjCompleto, cod_venda, 1, 0, null, null, mesa
                    , new Banco().comissaoIsPct(), new Banco().getValorComissao(), (double)numero.Rows[0].ItemArray.GetValue(7));
                saida.super = retornoSuper(cod_venda);
                return saida;
            }
        }
        private Produto[] getProduto(int cod_completo)
        {
            string query = "select p.cod_produto, cp.porcentagem, c.valorUnitarioCompleto , cp.cod_tamanho " +
                            " from completoProduto cp inner join Produto p on (p.cod_produto = cp.cod_produto)" +
                            " inner join completo c on (c.cod_completo = cp.cod_completo) where c.cod_completo = " + cod_completo+ " and c.cancelado = false";
            DataTable t = new DataTable();
            new NpgsqlDataAdapter(query, Conectar()).Fill(t);

            Produto[] conjunto = new Produto[t.Rows.Count];
            for (int i = 0; i < t.Rows.Count; i++)
            {
                conjunto[i] = new Produto();
                conjunto[i].setLoadDividido(Convert.ToInt16(t.Rows[i].ItemArray.GetValue(0)),
                                    Convert.ToDouble(t.Rows[i].ItemArray.GetValue(1)),
                                    Convert.ToDouble(t.Rows[i].ItemArray.GetValue(2)),
                                    Convert.ToInt16(t.Rows[i].ItemArray.GetValue(3)),

                                     new Banco().isImpressoProduto(Convert.ToInt16(t.Rows[i].ItemArray.GetValue(0)))
                                    );
            }

            return conjunto;
        }
        public Completa getCompleta(int cod_completa, bool cancelado)
        {
            string query = "select p.cod_produto,cp.porcentagem, c.valorUnitarioCompleto,cp.cod_tamanho,p.impresso "
                        +"from completo c inner join completoProduto cp on (cp.cod_completo = c.cod_completo) "
                        +"inner join produto p on (p.cod_produto = cp.cod_produto)"
                        +"where c.cod_completo = "+cod_completa+" and c.cancelado = "+cancelado;

            DataTable dtt = new DataTable();
            new NpgsqlDataAdapter(query, Conectar()).Fill(dtt);
            Produto [] produtos = new Produto[dtt.Rows.Count];
            for(int i = 0; i < produtos.Length;i++){

            produtos[i] = new Produto();
                produtos[i].setLoad(
                     Convert.ToInt16(  dtt.Rows[i].ItemArray.GetValue(0))
                    ,Convert.ToDouble(  dtt.Rows[i].ItemArray.GetValue(1))
                    ,Convert.ToDouble(  dtt.Rows[i].ItemArray.GetValue(2))
                    ,Convert.ToInt16(  dtt.Rows[i].ItemArray.GetValue(3))
                    ,Convert.ToBoolean(  dtt.Rows[i].ItemArray.GetValue(4)));
            }

            string garconA = "select g.cod_garcon,sum(quantidade) from garcon g inner join garconCompleto gc on(g.cod_garcon = gc.cod_garcon) " +
                "inner join completo c on(c.cod_completo = gc.cod_completo) where c.cod_completo = "
                + cod_completa + " and cancelado = false "
                + " group by g.cod_garcon";
            DataTable garc = new DataTable();

            new NpgsqlDataAdapter(garconA, Conectar()).Fill(garc);
            GarconFisico[] gf = new GarconFisico[garc.Rows.Count];
            for (int k = 0; k < garc.Rows.Count; k++)
            {
                gf[k] = new GarconFisico();
                gf[k].setGarcon  ( Convert.ToInt16( garc.Rows[k].ItemArray.GetValue(0)), Convert.ToInt16(garc.Rows[k].ItemArray.GetValue(1)));
            }
            return new Completa(produtos, cod_completa, gf, valorItemCompleto(cod_completa));
        }
        //-------------------------------------
        public int novoCompleto(Produto[] itens, double valor, bool deletado)
        {
            bool impresso = true;
            for (int i = 0; i < itens.Length && impresso; i++)
                if (!itens[i].impresso)
                    impresso = !impresso;
                makeCompleto(valor,  impresso, deletado);

            int cod_completo = resgatarUltimaCompleto();//codigo do produto atual
            for (int i = 0; i < itens.Length; i++)
                makeCompletoProduto(cod_completo, itens[i].cod_produto, Convert.ToDouble(itens[i].porcentagem), itens[i].cod_tamanho);

            //ate aqui ta ok
            return cod_completo;
        }
        private void btEscolhaProduto_Click(object sender, EventArgs e)
        {
            try
            {
                int cod_tamanho = new Banco().cod_tamanhoDoEscolhido(Convert.ToInt16(mtCodigo.Text), cbTamanho.Text);//cod_tamanho
                int [] conjuntoCodProduto = new int[qtdProdutos()];//codigos dos produtos
                conjuntoCodProduto = preencherCodigosProduto(conjuntoCodProduto);
                if(!codigosAceitos(conjuntoCodProduto))
                    return;
                //garantido que os codigos são aceitos
                double valor = Convert.ToDouble(mtValor.Text);//valor de entrada do produto

                try
                {
                    if (mesas.Equals(null)) { }
                }
                catch
                {
                    mesas = new string[1];
                    mesas[0] = new Banco().trazerNomeMesa(cod_venda);
                }//mesas
                int Xcod_garcon;
                if (new Banco().isVendaBalcao(cod_venda))                    Xcod_garcon = new Banco().cod_garconBalcao();
                else                     Xcod_garcon = new Banco().codGarconByNome(getGarcon());
                //garcons preenchidos
                double XquantidadeProduto = Convert.ToDouble( tbQuantidade.Text.Replace('.',',') );// quantidade do produto inserido

                Produto []produto = new Produto[conjuntoCodProduto.Length];
                double [] porcentagem = new Banco().valorPctByDescricao(cbMista.Text);
                for (int i = 0; i < conjuntoCodProduto.Length;i++ )
                {
                    produto[i] = new Produto();

                    produto[i].setLoad(conjuntoCodProduto[i] ,porcentagem[i] ,valor
                        ,cod_tamanho,new Banco().isImpressoProduto(conjuntoCodProduto[i]))  ;
                }
                int cod_completo = 1;

                if ((produto.Length==1) && (new BancoInformacao().existeProdutoNaVenda(cod_venda,produto[0].cod_produto,cod_tamanho,valor)))
                {
                    cod_completo = new BancoInformacao().codCompletoExistente(cod_venda, produto[0].cod_produto, cod_tamanho, valor);
                    new BancoInformacao().addqtdGarconCompleto(Xcod_garcon, cod_completo, XquantidadeProduto);
                }
                else {
                cod_completo =    new BancoInformacao().criarCompleto(cod_venda, Xcod_garcon, valor
                            , XquantidadeProduto, produto[0].impresso, false, produto);
                    //aqui ele deve criar um novo produto
                }

                Completa cc = new BancoVenda().getCompleta(cod_completo, false);
                cc.quantidade = XquantidadeProduto;
                cc.garconImprimir = getGarcon();
                new Banco().inserePrecoCompraEmCompleto(cod_completo, new Banco().valorCompraDoProduto(cc.produto[0].cod_produto, cc.produto[0].cod_tamanho));
                cc.segmentoImprimir = new Banco().segmentoDoProduto(Convert.ToInt16( mtCodigo.Text));
                if (tbNoticia.TextLength > 0) cc.setNoticia(tbNoticia.Text);
                if (cc.needImpress)
                {
                    listaProd[new BancoVenda().codSegmentoByProduto(cc.produto[0].cod_produto) - 1].Add(cc);
                    bool can = true;
                    for (int y = 0; y < conjGarc.ToArray().Length && can; y++)
                        if (conjGarc.ToArray()[y] == getGarcon())
                            can = !can;
                    if (can)
                        conjGarc.Add(getGarcon());
                }

               // if(MessageBox.Show("DESEJA ACRESCENTAR OUTRO ITEM","INFORMAÇÂO",
               //     MessageBoxButtons.YesNo,MessageBoxIcon.Question,MessageBoxDefaultButton.Button1
               //     ,MessageBoxOptions.DefaultDesktopOnly) == DialogResult.Yes)
            //    if (MessageBox.Show("ACRESCENTAR OUTRO ITEM??", "CONFIRME SUA OPCAO", MessageBoxButtons.YesNo) == DialogResult.Yes)
                MessageBox.Show("PRODUTO INSERIDO", "CONFIRMAÇÃO", MessageBoxButtons.OK,MessageBoxIcon.Information);
                {
                    limpaCampoCodigoProduto(); this.Focus(); mtCodigo.Visible = true; mtCodigo.Focus();
                    tbQuantidade.Text = 1.ToString("0.00");
                    this.mtCodigo_KeyPress(sender,new KeyPressEventArgs ('\r'));
                }

                    if (!(new Banco().isVendaBalcao(cod_venda)))
                    {
                        for (int j = 0; j < listaProd.Length; j++)
                            if (listaProd[j].Count > 0)
                            {
                                new Impressao(new BancoVenda().carregaVenda(cod_venda)).gerarComandaCozinha(listaProd[j].ToArray(), mesas, false);
                             //   new Impressao(true, new BancoVenda().carregaVenda(cod_venda)).novoMetodo(listaProd[j].ToArray(), mesas);
                            }
                    }
                    else
                    {
                        try
                        {
                            VendaFull f = (new BancoVenda().carregaVenda(cod_venda));
                            Pagamento rec = new Pagamento(f.cod_venda,f.subValor,f.valorComissao, f.valorSomado, f.mesa, true);
                            this.Visible = false;
                            rec.ShowDialog();
                            if (rec.encerrou)
                            {
                                for (int j = 0; j < listaProd.Length; j++)
                                    if (listaProd[j].Count > 0)
                                    {
                                       // new Impressao(new BancoVenda().carregaVenda(cod_venda)).gerarComandaInterna(listaProd[j].ToArray(), mesas);
                                        new Impressao( new BancoVenda().carregaVenda(cod_venda)).gerarComandaCozinha(listaProd[j].ToArray(), mesas,false);
                                    }

                                MessageBox.Show("VENDA REALIZADA COM SUCESSO", "ATENDIMENDO BALCAO");

                            }
                            else
                                new BancoVenda().anularVenda(cod_venda, true);

                            this.Visible = true;

                        }    catch { }
                    } this.Close();

            }
            catch { };
        }