public JsonResult LocacaoValidaImpressao(LocacaoEtiquetaViewModel viewModel)
        {
            try
            {
                if (!(viewModel.Corredor > 0))
                {
                    return(Json(new AjaxGenericResultModel
                    {
                        Success = false,
                        Message = "O corredor deve ser maior que zero."
                    }));
                }

                var pontoArmazenagem = _unitOfWork.PontoArmazenagemRepository.GetById(viewModel.IdPontoArmazenagem);

                if (pontoArmazenagem == null)
                {
                    return(Json(new AjaxGenericResultModel
                    {
                        Success = false,
                        Message = "Ponto de armazenagem não encontrado."
                    }));
                }

                var impressaoItem = _unitOfWork.ImpressaoItemRepository.Obter(viewModel.TipoEtiqueta);

                if (impressaoItem == null)
                {
                    return(Json(new AjaxGenericResultModel
                    {
                        Success = false,
                        Message = "Tipo de impressão não encontrado."
                    }));
                }

                var listaEnderecos = _unitOfWork.EnderecoArmazenagemRepository.BuscarPorNivelEPontoArmazenagem(
                    pontoArmazenagem.IdNivelArmazenagem, pontoArmazenagem.IdPontoArmazenagem, IdEmpresa);

                listaEnderecos = listaEnderecos.Where(x => x.Corredor == viewModel.Corredor &&
                                                      (viewModel.VerticalInicio.HasValue == false || x.Vertical >= viewModel.VerticalInicio.Value) &&
                                                      (viewModel.VerticalFim.HasValue == false || x.Vertical <= viewModel.VerticalFim.Value)).ToList();

                if (impressaoItem.IdImpressaoItem == Data.Models.ImpressaoItemEnum.EtiquetaPicking)
                {
                    listaEnderecos = listaEnderecos.Where(x => x.IsPicking == true).ToList();
                }
                else
                {
                    listaEnderecos = listaEnderecos.Where(x => x.IsPicking == false).ToList();
                }

                if (listaEnderecos.Count == 0)
                {
                    return(Json(new AjaxGenericResultModel
                    {
                        Success = false,
                        Message = "Nenhum endereço encontrado para os parâmetros informados."
                    }));
                }


                return(Json(new AjaxGenericResultModel
                {
                    Success = true
                }, JsonRequestBehavior.AllowGet));
            }
            catch (Exception ex)
            {
                _log.Error(ex.Message, ex);

                return(Json(new AjaxGenericResultModel
                {
                    Success = false,
                    Message = "Ocorreu na validação da impressão."
                }, JsonRequestBehavior.AllowGet));
            }
        }
        public JsonResult LocacaoImprimir(LocacaoEtiquetaViewModel viewModel)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return(Json(new AjaxGenericResultModel
                    {
                        Success = false,
                        Message = "Não foi possível solicitar impressão."
                    }));
                }

                //Captura o ponto de armazenagem.
                var pontoArmazenagem = _unitOfWork.PontoArmazenagemRepository.GetById(viewModel.IdPontoArmazenagem);

                //Captura os enderços filtrando por nível, ponto e empresa.
                var listaEnderecos = _unitOfWork.EnderecoArmazenagemRepository.BuscarPorNivelEPontoArmazenagem(
                    pontoArmazenagem.IdNivelArmazenagem, pontoArmazenagem.IdPontoArmazenagem, IdEmpresa);

                //Filtra por corredor e vertical.
                listaEnderecos = listaEnderecos.Where(x => x.Corredor == viewModel.Corredor &&
                                                      (viewModel.VerticalInicio.HasValue == false || x.Vertical >= viewModel.VerticalInicio.Value) &&
                                                      (viewModel.VerticalFim.HasValue == false || x.Vertical <= viewModel.VerticalFim.Value)).ToList();

                var impressaoItem = _unitOfWork.ImpressaoItemRepository.Obter(viewModel.TipoEtiqueta);

                //Se a etiqueta for picking, filtra os endereços de picking.
                if (impressaoItem.IdImpressaoItem == Data.Models.ImpressaoItemEnum.EtiquetaPicking)
                {
                    listaEnderecos = listaEnderecos.Where(x => x.IsPicking == true).ToList();
                }
                else
                {
                    listaEnderecos = listaEnderecos.Where(x => x.IsPicking == false).ToList();
                }

                int quantidadeEtiqueta = 0;

                if (viewModel.TipoEtiqueta == (int)Data.Models.ImpressaoItemEnum.EtiquetaPicking)
                {
                    foreach (var item in listaEnderecos)
                    {
                        var produtoInstalado = _unitOfWork.LoteProdutoEnderecoRepository.PesquisarPorEndereco(item.IdEnderecoArmazenagem);

                        if (produtoInstalado != null)
                        {
                            if (viewModel.TamanhoEtiqueta == 1)
                            {
                                _etiquetaService.ImprimirEtiquetaPicking(new ImprimirEtiquetaPickingRequest()
                                {
                                    IdEnderecoArmazenagem = item.IdEnderecoArmazenagem,
                                    IdProduto             = produtoInstalado.IdProduto,
                                    IdImpressora          = viewModel.IdImpressora.Value,
                                    QuantidadeEtiquetas   = 1
                                });
                            }
                            else
                            {
                                _etiquetaService.ImprimirEtiquetaFilete(produtoInstalado.IdProduto,
                                                                        item.IdEnderecoArmazenagem, viewModel.IdImpressora.Value);
                            }

                            quantidadeEtiqueta++;
                        }
                    }

                    var logEtiquetagem = new LogEtiquetagem
                    {
                        IdTipoEtiquetagem = Data.Models.TipoEtiquetagemEnum.Picking.GetHashCode(),
                        IdEmpresa         = IdEmpresa,
                        Quantidade        = quantidadeEtiqueta,
                        IdUsuario         = User.Identity.GetUserId()
                    };

                    _logEtiquetagemService.Registrar(logEtiquetagem);
                }
                else
                {
                    foreach (var item in listaEnderecos)
                    {
                        _etiquetaService.ImprimirEtiquetaEndereco(new ImprimirEtiquetaEnderecoRequest()
                        {
                            IdEmpresa             = IdEmpresa,
                            IdEnderecoArmazenagem = item.IdEnderecoArmazenagem,
                            IdImpressora          = viewModel.IdImpressora.Value,
                            IdUsuario             = IdUsuario,
                            QuantidadeEtiquetas   = 1,
                            TipoImpressao         = viewModel.TamanhoEtiqueta == 1 ? EtiquetaEnderecoTipoImpressao.NORMAL_90_70 : EtiquetaEnderecoTipoImpressao.FILETE_104_24
                        });

                        quantidadeEtiqueta++;
                    }

                    var logEtiquetagem = new LogEtiquetagem
                    {
                        IdTipoEtiquetagem = Data.Models.TipoEtiquetagemEnum.Picking.GetHashCode(),
                        IdEmpresa         = IdEmpresa,
                        Quantidade        = quantidadeEtiqueta,
                        IdUsuario         = User.Identity.GetUserId()
                    };

                    _logEtiquetagemService.Registrar(logEtiquetagem);
                }


                return(Json(new AjaxGenericResultModel
                {
                    Success = true,
                    Message = "Impressão enviada com sucesso."
                }, JsonRequestBehavior.AllowGet));
            }
            catch (Exception ex)
            {
                _log.Error(ex.Message, ex);

                return(Json(new AjaxGenericResultModel
                {
                    Success = false,
                    Message = "Ocorreu um erro na impressão."
                }, JsonRequestBehavior.AllowGet));
            }
        }