public ActionResult Create(BoletoViewModel model)
        {
            if (ModelState.IsValid)
            {
                model.NumeroBoleto = String.Concat(model.NumeroBoletoPart1,
                                                    model.NumeroBoletoPart2,
                                                    model.NumeroBoletoPart3,
                                                    model.NumeroBoletoPart4,
                                                    model.NumeroBoletoPart5,
                                                    model.NumeroBoletoPart6,
                                                    model.NumeroBoletoPart7,
                                                    model.NumeroBoletoPart8);

                if (BoletoService.getBoletos(model.NumeroBoleto).Count > 0)
                {
                    this.addMensagemErro("Boleto já existe");
                    return View(model);
                }

                var boleto = new Boletos();
                fillBoleto(boleto, model);

                BoletoService.saveBoleto(boleto);
                this.addMensagemSucesso("Boleto criado com sucesso!");
            }
            else
            {

                model.ListaStatus = new List<SelectListItem>();
                model.ListaStatus.AddRange(EnumHelper.toSelectList(new StatusBoleto()));
                return View(model);
            }
            return RedirectToAction("Index", "Boleto");
        }
        private BoletoViewModel getViewModel(Boletos boleto, bool isIndex)
        {
            List<Orcamentos> orcamentos = null;
            var idOrcamentosRelacionados = new List<int>();
            var model = new BoletoViewModel()
            {
                IDBoleto = boleto.IDBoleto,
                IDCliente = boleto.IDCliente,
                NomeCliente = boleto.Clientes.Nome,
                DataEmissao = boleto.DataEmissao,
                NumeroBoleto = boleto.NumeroBoleto,
                NumeroBoletoPart1 = getSequenceBoleto(boleto.NumeroBoleto, 1),
                NumeroBoletoPart2 = getSequenceBoleto(boleto.NumeroBoleto, 2),
                NumeroBoletoPart3 = getSequenceBoleto(boleto.NumeroBoleto, 3),
                NumeroBoletoPart4 = getSequenceBoleto(boleto.NumeroBoleto, 4),
                NumeroBoletoPart5 = getSequenceBoleto(boleto.NumeroBoleto, 5),
                NumeroBoletoPart6 = getSequenceBoleto(boleto.NumeroBoleto, 6),
                NumeroBoletoPart7 = getSequenceBoleto(boleto.NumeroBoleto, 7),
                NumeroBoletoPart8 = getSequenceBoleto(boleto.NumeroBoleto, 8),
                Preco = Convert.ToDouble(boleto.Preco),
                Status = boleto.Status,
                DescricaoStatus = EnumHelper.getEnumDescription((StatusBoleto)boleto.Status)
            };

            model.ListaStatus = new List<SelectListItem>();
            model.ListaStatus.AddRange(EnumHelper.toSelectList(new StatusBoleto()));

            if (!isIndex)
            {
                //Obtem todos os pedidos aprovados do cliente em específico
                orcamentos = OrcamentoService.getPedidos(boleto.IDCliente, null);
                model.ListaPedidosAberto = orcamentos.Select(p => new OrcamentoBoletoViewModel(getViewModel(p))).ToList();

                //Obtem os orçamentos já relacionados em outros boletos
                boleto.BoletosOrcamentos.ForEach(c => idOrcamentosRelacionados.Add(c.IDBoletoOrcamento));
                var idOrcamentosNaoRelacionados =
                    orcamentos.Where(
                        c => c.BoletosOrcamentos.Count(d => !idOrcamentosRelacionados.Contains(d.IDBoletoOrcamento)) > 0).Select(e => e.IDOrcamento).ToList();

                //Checa os que estão relacionados ao boleto
                model.ListaPedidosAberto = model.ListaPedidosAberto.GroupJoin(boleto.BoletosOrcamentos,
                                            pedido => pedido.IDOrcamento,
                                            pedidoSelecionado => pedidoSelecionado.IDOrcamento,
                                            (pedido, pedidoSelecionado) =>
                                                pedidoSelecionado.Select(ps => new OrcamentoBoletoViewModel(pedido, true))
                                                                 .DefaultIfEmpty(new OrcamentoBoletoViewModel(pedido, false)))
                                                                 .SelectMany(pedidoSelecionado => pedidoSelecionado).ToList();

                //Retira os pedidos que estão relacionados a outros boletos
                model.ListaPedidosAberto.RemoveAll(
                    c => c.IDOrcamento != null && (!c.IsSelected && idOrcamentosNaoRelacionados.Contains(c.IDOrcamento.Value)));
            }

            return model;
        }
        private void fillBoleto(Boletos boleto, BoletoViewModel model)
        {
            boleto.IDCliente = Convert.ToInt32(model.IDCliente);
            boleto.IDUsuario = visitor.ID;
            boleto.NumeroBoleto = model.NumeroBoleto;
            if (model.Preco != null) boleto.Preco = Convert.ToDouble(model.Preco.Value);
            boleto.Status = model.Status.Value;
            boleto.DataEmissao = model.DataEmissao.Value;
            boleto.BoletosOrcamentos = new List<BoletosOrcamentos>();
            boleto.IDUsuario = visitor.ID;

            if (model.Pedidos == null) return;

            foreach (var item in model.Pedidos)
            {
                boleto.BoletosOrcamentos.Add(new BoletosOrcamentos()
                {
                    IDOrcamento = item,
                    DataCriacao = DateTime.Now,
                    IDUsuario = visitor.ID
                });
            }
        }