
(function () {
    "use strict";

    angular.module('pos').controller('vendaAutonomaAddController', controller);
    controller.$inject = ['$confirm', 'shipayService', '$scope', '$state', '$stateParams', '$window', '$q', '$timeout', 'pedidoService', 'entidadeAuxiliarService', 'clienteService', 'produtoService', 'fidelidadeService', '$filter', '$interval', 'caixaService', 'notaFiscalService', '$rootScope', 'valeProdutoService', 'motorPromocaoService', 'configService', 'OMNIService', 'pinCodeService', 'vendedorService'];

    function controller($confirm, shipayService, $scope, $state, $stateParams, $window, $q, $timeout, pedidoService, entidadeAuxiliarService, clienteService, produtoService, fidelidadeService, $filter, $interval, caixaService, notaFiscalService, $rootScope, valeProdutoService, motorPromocaoService, configService, OMNIService, pinCodeService, vendedorService) {

        $scope.auxQtEstoque = 0;
        $scope.tiraTeclado = false;

        $(window).unload(function () {
            if ($scope.state != null) {

                $.ajax({
                    type: 'GET',
                    async: false,
                    url: '/entidadeauxiliar/removerTEF?idTEF=' + $scope.state.TEF.IDSiTef
                });
            }
        });

        setTimeout(function () {
            $scope.$on("$locationChangeStart", function (event, newUrl, oldUrl) {
                if ($scope.state != null) {
                    $.ajax({
                        type: 'GET',
                        async: false,
                        url: '/entidadeauxiliar/removerTEF?idTEF=' + $scope.state.TEF.IDSiTef
                    });
                }
            });

            $scope.$parent.initializeLayout("Nova Venda");
        
            function guid() {
                function s4() {
                    return Math.floor((1 + Math.random()) * 0x10000)
                        .toString(16)
                        .substring(1);
                }
                return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
                    s4() + '-' + s4() + s4() + s4();
            }

            function arredondar(str, casas) {
                if (str.indexOf(',') != -1) str = str.replace(',', '.');
                if (!casas) casas = 0;
                casas = Math.pow(10, casas);
                str = parseFloat(str) * casas;
                return Math.floor(str) / casas;
            }

            $scope.showScanBarcode = function () {
                //document.getElementById('codigo-barras').focus()
                window.ReactNativeWebView.postMessage('');
                window.postMessage('hello react-native!!');
            }

            $scope.state = {
                carregandoModal: false,
                indicaPresencial: true,
                carregandoClose: false,
                caixaAberto: true,
                transportadoras: [],
                GerarNFE: 0,
                MotorDesconto: { DescontoPedido: '', Descricoes: '', DescontoProdutos: [] },
                selectCPFCNPJ: 1,
                data: {
                    Numero: $stateParams.id
                },
                permiteinserir: true,
                Itens: [],
                erro: {
                    ativo: false,
                    mensagem: ""
                },
                isNew: false,
                codigoBarras: "",
                mostranfe: true,
                lastProdutoIndex: 0,
                itensValidos: 0,
                ProdutoBipado: { data: [] },
                troca: { ativo: false },
                valorTroco: 0,
                creditoTroco: false,
                consulta: { ativo: false, filtro: "", bipado: false },
                addProduto: { ativo: false, filtro: "" },
           
                credito: { total: 0 },
                ultimoProduto: {},
                NFE:
                {
                    send: false,
                    enableCPF: true,
                },
                pagamento: {
                    currentIndex: -1,
                    step: { fidelidade: 0, condicao: 1, conclusao: 2},
                    steps: [
                        { titulo: "CPF na Nota!  (Opcional)", descricao: "Digite o CPF caso queira inclui-lo na nota fiscal. Se preferir voce pode avançar sem preencher!" },
                        { titulo: "Forma de Pagamento", descricao: "Escolha abaixo a forma de pagamento desejada." },
                        { titulo: "Compra Finalizada", descricao: "" },
                    ],
                    livre: { currentTipoPagamento: "" },
                },
                fidelidade: { resgatar: false, token: '', info: {}, valorResgate: 0, carregando: false, ativo: false },
                TEF: {
                    modalTEF: false,
                    TEFProcessamento: false,
                    IDSiTef: '',
                    TipoCartao: 'D',
                    NumeroParcelas: 1,
                    ValorPagamento: 0,
                    Status: '',
                    Processado: 0,
                    pergunta: '',
                    resposta: '',
                    respostaok: false,
                    DescontoOperacao: 0,
                },
                estoques: [],
                TEFCancel: {
                    modalTEF: false,
                    TEFProcessamento: false,
                    IDSiTef: '',
                    IDTefRelated: '',
                    Status: '',
                    Processado: 0,
                },
            };

            $scope.ValidaPagamentoTEF = function () {
                if ($scope.state.data.Pagamentos != null)
                    for (var i = 0; i < $scope.state.data.Pagamentos.length; i++) {
                        if (!$scope.state.data.Pagamentos)
                            continue;
                        if ($scope.state.data.Pagamentos[i].TEFID && $scope.state.data.Pagamentos[i].Valor > 0) {
                            $scope.$parent.toastr.warning('Voce deve cancelar todos os itens tef para efetuar este processo!', '');
                            return true;
                        }
                    }
                return false;
            }

            $scope.finishPedido = function (imprimirDanfe) {

                $scope.reinicioTela = true;
                $timeout(function () {
                    
                    if ($scope.reinicioTela) {

                        $scope.$parent.showCapa = true;
                        $scope.newPedido();
                    }
                }, 30000);
                $scope.state.imprimirDanfe;
                if (!$scope.state.fidelidade.carregando && $scope.state.fidelidade.ativo && devolucaoCredito()) {
                    $confirm({
                        text: "Esta opção de pagamento adiciona o valor como créditos do programa  de fidelidade"
                            + " para o cliente utilizar nas próximas compras."
                            + " Deseja realmente confirmar?"
                    }).then(function () {
                        finishPedido();
                    }, function () {
                        $scope.state.pagamento.currentIndex = 2;
                    });
                }
                else
                    finishPedido();
            }


            var closePedido = function (impressaotroca) {


                if (!$scope.state.NFE.enableCPF)
                    $scope.state.data.Cliente.CPF = "";
                debugger
                pedidoService
                    .closeMarket($scope.state.data.Numero, $scope.state.data.Cliente.CPF, impressaotroca, $scope.state.troco, $scope.state.GerarNFE, $scope.state.NFE.send)
                    .then(
                        function (response) {

                            if (response.Status < 0) {
                                if (response.Message.includes('Para vendas')) {
                                    //$confirm({ text: "aaa <br>", title: "Atenção ! Cadastro do cliente obrigatório !", ok: "Ok" });
                                    $confirm({ text: response.Message, title: "Atenção ! Cadastro do cliente obrigatório !", ok: "Ok" });
                                    $scope.state.carregandoClose = false;
                                }
                                else {
                                    $scope.$parent.toastr.error(response.Message, "Serviço");
                                    $scope.state.carregandoClose = false;
                                }
                            }
                            else {

                                //$scope.state.carregandoClose = false;
                                if (!$scope.state.NFE.send) {
                                    $timeout(function () {
                                        var impressaotroca = 0;
                                        if ($scope.state.ImprimePorItem && $scope.state.ImprimeTroca) {
                                            impressaotroca = 2;
                                        }
                                        else
                                            if (!$scope.state.ImprimePorItem && $scope.state.ImprimeTroca) {
                                                impressaotroca = 1;
                                            }
                                            else
                                                impressaotroca = 0;
                                        $scope.state.data.EmiteNFE = $scope.state.GerarNFE;

                                        $scope.generateTicket(impressaotroca);

                                        //   $scope.state.data = response.Data;
                                    });
                                }
                            }
                        },
                        function (error) {
                            $scope.state.carregandoClose = false;
                            $scope.$parent.toastr.error(error, "Comunicação com o servidor");
                        }
                    );
            }
            var finishPedido = function () {
              
                if (!$scope.state.fidelidade.carregando && $scope.state.fidelidade.ativo)
                    $scope.createCredito();

                if ($scope.state.troco && !$scope.state.fidelidade.carregando && $scope.state.fidelidade.ativo)
                    createTrocoCredito();


                if ($scope.state.data.Total !== $scope.state.data.Pago) {
                    $scope.$parent.toastr.error("A venda ainda não pode ser finalizado.");
                    return false;
                }

                if ($scope.state.creditoTroco && $scope.state.valorTroco > 0) {
                    $scope.getTokenFidelidadeTroco($scope.setCreditoTroco());
                }


                if ($scope.state.fidelidade.resgatar)
                    $scope.getTokenFidelidade($scope.setResgateFidelidade());
                var impressaotroca = 0;


                if ($scope.state.NFE.enableCPF || !$scope.state.data.Cliente.PessoaFisica)
                    $scope.state.data.Cliente.CPF = $scope.state.cpf;
                //else {

                //    $scope.state.data.Cliente.CPF = "";
                //}

                if ($scope.state.NFE.send && $scope.state.ImprimePorItem && $scope.state.ImprimeTroca) {
                    impressaotroca = 2;
                }
                if ($scope.state.NFE.send && !$scope.state.ImprimePorItem && $scope.state.ImprimeTroca) {
                    impressaotroca = 1;
                }
                $scope.state.carregandoClose = true;
                impressaotroca = (!impressaotroca || impressaotroca == null ? 0 : impressaotroca);
         
                    closePedido(impressaotroca);
                
            };
           
            $scope.initialize = function () {
                //var need = localStorage.getItem("FORCE_THEME_RELOAD") === "1";
                //if (need) {
                //    
                //    localStorage.removeItem("FORCE_THEME_RELOAD");
                //    window.location.reload();
                //    return;
                //}
                debugger
                if ($scope.$parent.beepProduto) {
                    $scope.playBeep('beep-beepProduto');
                    $scope.$parent.beepProduto = false;
                }
                $scope.ValidaVendaSuspensa();
                debugger
                if ($scope.$parent.showCapa) {
                    $scope.state.showPromoCover = true;
                    $scope.$parent.showCapa = false;
                }
                if ($stateParams.id) {
                    $scope.hidePromoCover();
                }
                //quando  for redirecionado através da tela de consulta , deve pedir selecão de vendedor e cliente 
                if (localStorage.getItem("itensConsulta") != null) {

                    //aguarda itens processado
                    setTimeout(function () {
                        debugger
                        if ($scope.state.data.Status == 0) {
                            $scope.state.statusmsgselecionevendeor = false;
                            var listProdutos = JSON.parse(localStorage.getItem("itensConsulta"));
                            var listCodigoBarra = [];


                            angular.forEach(listProdutos, function (item, key) {

                                var quantidade = parseInt(item.Quantidade);

                                for (var i = 0; i < quantidade; i++) {
                                    listCodigoBarra.push(item.Barra.Codigo)
                                }
                            });

                            setTimeout(function () {
                                $scope.addItemPedidos(listCodigoBarra);
                                localStorage.removeItem("itensConsulta");
                            }, 50);
                        } else {
                            $scope.state.statusmsgselecionevendeor = true;
                            $scope.itensProcessadoRemoveStorage = true;
                        }
                    }, 2000);
                }
            };
            $scope.carregandoBipagem = false;


            $scope.addItemPedido = function (cancelBeep) {
                debugger
                if (!cancelBeep)
                    $scope.playBeep("beep-beepProduto");
                
                if ($scope.carregandoItem == true)
                    return;

                $scope.carregandoItem = true;

           

                if (!$scope.state.codigoBarras) {
                    $scope.$parent.toastr.error("Informe o código de barras para adicionar o produto à Venda", "Atenção");
                    $scope.carregandoItem = false;
                    return;
                }

                //if ($scope.state.permiteinserir || $scope.state.modalProcessoTroca == true) {
                // if ($scope.state.data.Status == -1 && $scope.state.modalProcessoTroca == false)
                //$scope.state.permiteinserir = false;

                var pedido = {};
                angular.copy($scope.state.data, pedido)

                pedido.Itens = null;
                pedidoService
                    .addItemPedido(pedido, $scope.state.codigoBarras, $scope.state.troca.ativo)
                    .then(
                        function (response) {
                            $scope.carregandoBipagem = false;
                            $scope.carregandoItem = false;
                            if (response.Data == "") {
                                $scope.state.modalProcessoTroca = true;
                                //$scope.state.data.processoTroca.ticket = "";
                                //$scope.state.data.processoTroca.codigoFilial = "";
                                //$scope.state.data.processoTroca.cpfCliente = "";
                                return;
                            }
                            if (response.Status < 0) {
                                $scope.$parent.toastr.error(response.Message, "Serviço");
                                console.error(response.Exception);
                                $scope.state.codigoBarras = "";

                                
                                $scope.state.data.processoTroca = null;
                                $scope.state.modalProcessoTroca = false;
                            } else {
                                if (!response.Data) {
                                    $scope.$parent.toastr.error("Código de barras não encontrado!", "Atenção");
                                   
                                    $scope.state.codigoBarras = "";

                                }
                                else {
                                    var vendedor = $scope.state.data.Vendedor;
                                    angular.copy(response.Data, $scope.state.data);
                                    $scope.state.modalProcessoTroca = false;

                             

                                    if ($scope.state.data.Numero) {
                                        //$scope.state.troca.ativo = false;
                                        $scope.state.codigoBarras = "";
                                        if ($scope.$parent.config.ValorTrocaOperacaoVenda != null && $scope.$parent.config.ValorTrocaOperacaoVenda != 0) {
                                            var pedido = {};
                                            angular.copy($scope.state.data, pedido)

                                            pedido.Itens = null;
                                            $scope.TrocaOperacaoVenda(pedido);
                                        }
                                        $scope.state.codigoBarras = "";
                                        $scope.state.lastProdutoIndex = $scope.state.data.Itens.length - 1;
                                        //$timeout(function () {
                                        //    $("#codigo-barras").focus();

                                        //    // document.getElementById("codigo-barras").focus()
                                        //});
                                    } else {
                                        //$state.go("state-venda-add", { id: response.Data.Numero }, { location: "replace" }); //não grava no histórico
                                    }

                             //       CountValidItens();
                                }
                                $scope.state.data.processoTroca = null;
                                $scope.state.modalProcessoTroca = false;
                            }
                            $scope.state.permiteinserir = true;
                        },
                        function (err) {
                            $scope.carregandoItem = false;
                            $scope.$parent.toastr.error(err);
                            $scope.state.permiteinserir = true;
                        }
                    );
                //  }

            };

            //$scope.onExit = function (evt) {

            //    if (!$scope.state.data.Pagamentos) return;

            //    for (var i = 0; i < $scope.state.data.Pagamentos.length; i++)
            //        if ($scope.state.data.Pagamentos[i].TEFID != "00000000-0000-0000-0000-000000000000" && $scope.state.data.Pagamentos[i].TEFID != null) {
            //            $scope.$parent.toastr.warning("Para sair desta página, é necessário cancelar o pagamento com TEF");
            //            return false;
            //        }
            //};

            $window.onbeforeunload = $scope.onExit;

            $scope.historyBack = function () {
                $window.history.back();
            };
            var VerificaExisteTef = function () {


                angular.forEach($scope.state.data.Pagamentos, function (value, key) {

                    if ((!(value.TEFID == null || value.TEFID == '')) || (value.Tipo.Codigo == "Q") || (value.Tipo.Codigo == "11")) {
                        pedidoService
                            .reOpenOrder($scope.state.data)
                            .then(
                                function (response) {
                                    if (response.Status < 0) {
                                        $scope.$parent.toastr.error(response.Message, "Serviço");
                                        console.error(response.Exception);
                                    } else {
                                        $scope.state.pagamento.currentIndex = 2;
                                        //$scope.gotoNextPagamento();
                                    }
                                },
                                function (err) { $scope.$parent.toastr.error(err); }
                            );
                        return;
                    }
                });
            }

            var filtrarArray = function (array, atrributo, valor) {
                var item = [];

                item = $.grep(array, function (item) {
                    return item[atrributo] == valor || item[atrributo] == 3;
                });

                return item;
            }


            $scope.getTokenFidelidade = function (success) {
                fidelidadeService
                    .getToken()
                    .then(
                        function (response) {
                            if (response.Status < 0) {
                                console.error(response.Exception);
                            } else {
                                $scope.state.fidelidade.token = response.Data;
                                if (success)
                                    success();
                            }
                        },
                        function (error) {
                            //$scope.$parent.toastr.error('Requisição de token', 'Comunicação com o servidor');
                            console.error(error);
                        }
                    );
            };
            $scope.showMessageClienteNaoParticipa = false;
            $scope.getInfoFidelidade = function () {
                $scope.state.fidelidade.carregando = true;
                $scope.state.fidelidade.ativo = false;
                fidelidadeService
                    .getInfo($scope.state.fidelidade.token, $scope.state.data.Cliente.CPF)
                    .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.state.fidelidade.info = response.Status;
                                //$scope.$parent.toastr.error(response.Message, 'Requisição de informações de crédito');
                                console.error(response.Exception);
                            }
                            else {
                                $scope.state.fidelidade.info = response.Data;

                                if ($scope.state.fidelidade.info == 0 || ($scope.state.fidelidade.info == 2)) {//&& $scope.state.data.Cliente.Fidelidade == true)) {
                                    $scope.state.fidelidade.ativo = false;
                                    $scope.state.data.Cliente.Fidelidade = false;
                                    $scope.showMessageClienteNaoParticipa = true;
                                } else {
                                    if ($scope.state.fidelidade.info.Fidelidade != $scope.state.data.Cliente.Fidelidade) {
                                        $scope.state.data.Cliente.Fidelidade = $scope.state.fidelidade.info.Fidelidade;
                                        $scope.SetParticipaFidelidade($scope.state.data.Cliente.Codigo, $scope.state.data.Cliente.Fidelidade);
                                    }
                                    $scope.state.fidelidade.ativo = true;
                                }
                            }
                            $scope.state.fidelidade.carregando = false;
                        },
                        function (error) {
                            //$scope.$parent.toastr.error('Requisição de informações de crédito', 'Comunicação com o servidor');
                            console.error(error);
                            $scope.state.fidelidade.carregando = false;
                        }
                    );
            };

            $scope.SetParticipaFidelidade = function (codigo, participa) {
                clienteService
                    .SetParticipaFidelidade(codigo, participa)
                    .then(
                        function (response) {

                            if (response.Status < 0) {
                                //$scope.$parent.toastr.error(response.Message, 'Resgate de créditos');


                            } else {
                            }
                        },
                        function (error) {
                            //$scope.$parent.toastr.error('Ao resgatar de créditos.', 'Comunicação com o servidor');
                            console.error(error);
                        }
                    );
            };
            $scope.setResgateFidelidade = function (success, error) {
                fidelidadeService
                    .setResgate($scope.state.fidelidade.token, $scope.state.data.Cliente.CPF, $scope.state.data.Numero, $scope.state.data.DescontoFidelidade, ($scope.state.data.Total + $scope.state.data.DescontoFidelidade))
                    .then(
                        function (response) {

                            if (response.Status < 0) {
                                //$scope.$parent.toastr.error(response.Message, 'Resgate de créditos');
                                console.error(response.Exception);
                                if (error)
                                    error(response);
                            } else {
                                $scope.state.fidelidade.info = response.Data;
                                if (success)
                                    success();
                            }
                        },
                        function (error) {
                            //$scope.$parent.toastr.error('Ao resgatar de créditos.', 'Comunicação com o servidor');
                            console.error(error);
                        }
                    );
            };
            $scope.getMaximoParaResgate = function () {
                return Math.min($scope.state.fidelidade.info.Saldo, $scope.state.data.Total);
            };

            $scope.refresh = function () {
                $scope.get();

                if ($scope.$parent.config.Fidelidade.Ativo)
                    $scope.getTokenFidelidade();
                

            };

            $scope.ValidaVendaSuspensa = function () {
                if (!$scope.state.data.Numero) {
                    var resp = pedidoService.ValidaVendaSuspensa().then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.$parent.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                if (response.Data) {
                                    if ($scope.state.data)
                                        $scope.state.data = [];
                                    $scope.state.data.Numero = response.Data;
                                    $scope.state.data.Status = response.Status;
                                    $state.go("state-venda-autonoma-add", { id: response.Data })
                                }
                                else {
                                    $scope.state.data.Status = -1;
                                }
                            }

                        }
                    );
                }

                $scope.refresh();
            };
            $scope.repeatItemPedido = function () {
          
             
                $scope.state.codigoBarras = $scope.state.data.Itens[$scope.state.lastProdutoIndex].CodigoBarras;
                $scope.addItemPedido();
            };



            $scope.updateItemPedido = function (index) { 
                pedidoService
                    .updateItemPedido($scope.state.data, $scope.state.data.Itens[index].Item)
                    .then(
                        function (response) {
                            $scope.carregandoItem = false;
                            $scope.valida = true;
                            if (response.Status < 0) {
                                $scope.$parent.toastr.error(response.Message, "Serviço");
                            }

                            /* mesmo que der alguma mensagem o servidor retorna os dados atualizados anteriores */
                            angular.copy(response.Data, $scope.state.data);


                        },
                        function (error) {
                            $scope.carregandoItem = false;
                            $scope.endprocesso = false;
                            $scope.$parent.toastr.error("Problemas com a comunicação com os servidores.", "Comunicação");
                            console.error(error);
                        }
                    );
            };
            $scope.repeatItemPedidoByIndex = function (index) {
                $scope.playBeep("beep-addqtty");
                $scope.state.codigoBarras = $scope.state.data.Itens[index].CodigoBarras;
                $scope.addItemPedido(true);
            };
            $scope.carregandoItem = false;
            $scope.removeItemPedidoByIndex = function (index) {
                
                if (!$scope.removeItem) {
                    $scope.carregandoItem = true;
                    if ($scope.state.data.Itens[index].Quantidade == 1) {
                        $scope.playBeep("beep-ExclusaoItem");
                        $scope.cancelItemPedido(index);
                    }
                    else {
                        $scope.playBeep("beep-RemocaoQtde");
                        $scope.state.data.Itens[index].Quantidade = $scope.state.data.Itens[index].Quantidade - 1
                        $scope.updateItemPedido(index);
                    }
                }
            };
            $scope.playBeep = function (element) {
                var audio = document.getElementById(element);
                if (!audio) return;

                audio.currentTime = 0;
                audio.play().catch(function () {
                });
            };

            $scope.validaCpf = function (cpf) {
                clienteService.validaCpf(cpf).then(
                    function (response) {
                        if (!response.Data) {
                            $confirm({
                                title: 'CPF inválido',
                                text: 'O que você deseja fazer?',
                                ok: 'Digitar novamente',
                                cancel: 'Pular etapa',
                                confirmButtonClass: 'btn-primary',
                                cancelButtonClass: 'btn-default',
                            

                            },
                                {
                                    backdrop: 'static',
                                    keyboard: false    
                                }).then(function () {
                                $scope.state.cpf = "";
                            }, function () {
                                debugger
                                $scope.state.cpf = "";
                                $scope.state.pagamento.currentIndex = $scope.state.pagamento.currentIndex + 1;
                            });

                        }
                        else
                            $scope.state.pagamento.currentIndex = $scope.state.pagamento.currentIndex + 1;
                    });
            }

            $scope.gotoNextPagamento = function () {
                if ($scope.state.pagamento.currentIndex == - 1 && $scope.state.data.Subtotal <= 0) {
                    
                    $confirm({
                        text: "Necessário incluir itens para iniciar o processo de pagamento!",
                        title: "Aviso",
                        ok: "OK",
                        cancel: null
                    }).then(function () { 
                    });
                    return;
                }
                debugger
                if ($scope.state.pagamento.currentIndex == 0 && $scope.state.cpf && $scope.state.cpf != "") {
                    
                    $scope.validaCpf($scope.state.cpf);
                    return
                }
                debugger
                if ($scope.state.pagamento.currentIndex < 1)
                    $scope.state.pagamento.currentIndex = $scope.state.pagamento.currentIndex + 1;
            }
            $scope.gotoPriorPagamento = function () {
                $scope.state.pagamento.currentIndex = $scope.state.pagamento.currentIndex - 1;
            }
            $scope.get = function () {

                $scope.state.erro.ativo = false;
                $scope.state.erro.mensagem = "";
                if ($scope.state.data.Numero != 0)
                    pedidoService
                        .prepareNew($scope.state.data.Numero)
                        .then(
                            function (response) {
                                if (response.Status < 0) {
                                    $scope.$parent.toastr.error(response.Message, "Serviço");
                                    console.error(response.Exception);
                                } else {
                                    angular.copy(response.Data, $scope.state.data);
                                }

                                if ($scope.state.data != null) {
                                    //$scope.$parent.config.OperacaoVenda = $scope.state.data.OperacaoVenda;
                                    //$scope.auxiliar.OperacaoVendaSelecionada = $scope.$parent.config.OperacaoVenda;
                                    //$scope.saveOperacaoVendaOnSession(false);
                                    //$scope.prepareRegrasDescontoreopen($scope.state.data.Cliente);
                                    if ($scope.state.data.Itens != null) {

                                        $scope.state.lastProdutoIndex = $scope.state.data.Itens.length - 1;
                                        $scope.state.itensValidos = $scope.state.data.Itens.length;

                                    }


//                                    VerificaExisteTef();

                                    /*verifica se existe pay pendentes*/
                                    // verificaPayPendente();

                                    
                                } else {
                                    $scope.getNewItem();
                                }
                            },
                            function (error) {
                                $scope.$parent.toastr.error("Ao carregar a pré-venda.", "Comunicação com o servidor");
                                console.error(error);
                            }
                        );
            };
            $scope.GetClass = function (size, color, itemProduto) {


                if ($scope.$parent.config.ExibeEstoqueCor || ($parent.config.ExibeQtdeEstoqueVenda != null && $parent.config.ExibeQtdeEstoqueVenda && $scope.$parent.config.ExibeEstoqueCor)) {
                    var result = $scope.getNewQuantidadeCorTamanho(size, color, itemProduto);
                    if (result > 0)
                        return 'radio-green';
                    else
                        return 'radio-red';
                }
            }

            $scope.GetClassConsulta = function (size, color, itemProduto) {

                if ($scope.$parent.config.ExibeEstoqueCor || ($scope.$parent.config.ExibeQtdeEstoqueVenda && $scope.$parent.config.ExibeEstoqueCor)) {
                    var result = $scope.getQuantidadeCorTamanho(size, color, itemProduto);
                    if (result > 0)
                        return 'radio-green';
                    else
                        return 'radio-red';
                }
            }


            $scope.calculaTroco = function (valor) {
                var parcelas = 0;
                $scope.state.data.Pagamentos.forEach(function (item, key) {
                    item.Troco = 0;
                });

                // if ($scope.state.data.Pagamentos.length > 1) {
                $scope.state.data.Pagamentos.forEach(function (item, key) {
                    parcelas = parcelas + item.Valor;
                });

                var valorTotal = $scope.state.data.Total;
                var discontoOperacaoVenda = $scope.DescontoPgto;

                if (discontoOperacaoVenda && !discontoOperacaoVenda.contains('null')) {
                    discontoOperacaoVenda = discontoOperacaoVenda.replace('%', '');
                }
                else {
                    discontoOperacaoVenda = 0;
                }

                //valorTotal = valorTotal - ((valorTotal * discontoOperacaoVenda) / 100);

                if (parcelas > valorTotal && valorTotal > 0) {
                    $scope.state.valorTroco = parcelas - valorTotal;
                } else {
                    $scope.state.valorTroco = 0;
                }
            };
            $scope.btnCancelItem = function (index) {
                $confirm({
                    text: "Realmente deseja excluir este item?"
                }).then(function () {
                    $scope.playBeep("beep-ExclusaoItem");
                    $scope.cancelItemPedido(index)
                }, function () {
                });

            }
            $scope.cancelItemPedido = function (index) {
                pedidoService
                    .deleteItemPedido($scope.state.data, $scope.state.data.Itens[index].Item)
                    .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.carregandoItem = false;
                                $scope.$parent.toastr.error(response.Mensagem, "Serviço");
                            }
                            else {
                                $scope.carregandoItem = false;
                                angular.copy(response.Data, $scope.state.data);
                                $scope.$parent.toastr.info("Item da venda cancelado.");
                             
                            }
                        },
                        function (error) {
                            $scope.carregandoItem = false;
                            $scope.$parent.toastr.error("Problemas na comunicação com os servidores.", "Comunicação com o servidor");
                            console.error(error);
                        }
                    );
            };
      

            $scope.confirmFidelidade = function () {

                if (!$scope.auxiliar.newCliente.data.Fidelidade) {
                    $scope.auxiliar.newCliente.data.Fidelidade = true;
                    $confirm({ text: "Ao desmarcar esta opção o cliente NÃO participará do programa de fidelidade, Deseja Confirmar?", title: "Desabilitar Fidelidade", ok: "Sim", cancel: "Não" })
                        .then(function () {
                            $scope.auxiliar.newCliente.data.Fidelidade = false;
                        });
                } else if ($scope.auxiliar.newCliente.data.Fidelidade) {
                    $scope.auxiliar.newCliente.data.Fidelidade = false;
                    $confirm({ text: "Ao marcar esta opção o cliente passará a fazer parte do programa de fidelidade, Deseja Confirmar?", title: "Habilitar Fidelidade", ok: "Sim", cancel: "Não" })
                        .then(function () {
                            $scope.auxiliar.newCliente.data.Fidelidade = true;
                        });
                }
            }
           
            $scope.carregandoSaveCliente = false;

            $scope.getEndereco = function () {
                entidadeAuxiliarService
                    .getEndereco($scope.auxiliar.newCliente.data.Endereco.CEP)
                    .then(
                        function (endereco) {
                            if (endereco) {
                                $scope.auxiliar.newCliente.data.Endereco.CEP = endereco.cep.replace('-', '');
                                $scope.auxiliar.newCliente.data.Endereco.Linha1 = endereco.logradouro;
                                $scope.auxiliar.newCliente.data.Endereco.Linha3 = endereco.complemento;
                                $scope.auxiliar.newCliente.data.Endereco.Bairro = endereco.bairro;
                                $scope.auxiliar.newCliente.data.Endereco.Estado = { Nome: endereco.uf, CodigoIBGE: endereco.ibge.substring(0, 2), Sigla: endereco.uf };
                                $scope.auxiliar.newCliente.data.Endereco.Cidade = { Nome: endereco.localidade, CodigoIBGE: endereco.ibge };

                                $('[ng-model$=Linha2]').focus();
                            }
                        },
                        function (err) { $scope.$parent.toastr.error(err); }
                    );
            };
         
            $scope.newPedido = function () {
                
                $scope.reinicioTela = false;
                $state.go("state-venda-autonoma-add", { 'id': null }, { 'reload': true, 'location': "replace" });
            };

            $scope.cancelPedidoTimeOut = function () {
            
                    if ($scope.state.data.Numero) {
                        pedidoService
                            .cancel($scope.state.data.Numero)
                            .then(
                                function (response) {
                                    if (response.Status < 0)
                                        $scope.$parent.toastr.error(response.Message, "Serviço");
                                    else
                                        angular.copy(response.Data, $scope.state.data);

                                    $scope.newPedido();
                                },
                                function (error) { $scope.$parent.toastr.error(error); }
                            );
                    }
             

            };

            $scope.cancelPedido = function () {
                $confirm({
                    text: "Realmente deseja cancelar este pedido?"
                }).then(function () {
                    if ($scope.state.data.Numero) {
                        $scope.playBeep("beep-Cancelamento");
                        pedidoService
                            .cancel($scope.state.data.Numero)
                            .then(
                                function (response) {
                                    if (response.Status < 0)
                                        $scope.$parent.toastr.error(response.Message, "Serviço");
                                    else
                                        angular.copy(response.Data, $scope.state.data);

                                    $scope.newPedido();
                                },
                                function (error) { $scope.$parent.toastr.error(error); }
                            );
                    }
                }, function () {
                });
         
            };

            var closePedido = function (impressaotroca) {


                if (!$scope.state.NFE.enableCPF)
                    $scope.state.data.Cliente.CPF = "";
                debugger
                pedidoService
                    .closeMarket($scope.state.data.Numero, $scope.state.data.Cliente.CPF, impressaotroca, 0, $scope.state.GerarNFE, $scope.state.NFE.send)
                    .then(
                        function (response) {

                            if (response.Status < 0) {
                                if (response.Message.includes('Para vendas')) {
                                    //$confirm({ text: "aaa <br>", title: "Atenção ! Cadastro do cliente obrigatório !", ok: "Ok" });
                                    $confirm({ text: response.Message, title: "Atenção ! Cadastro do cliente obrigatório !", ok: "Ok" });
                                    $scope.state.carregandoClose = false;
                                }
                                else {
                                    $scope.$parent.toastr.error(response.Message, "Serviço");
                                    $scope.state.carregandoClose = false;
                                }
                            }
                            else {
                                $scope.playBeep("beep-conclusao");
                                //$scope.state.carregandoClose = false;
                                if (!$scope.state.NFE.send) {
                                   
                                        $scope.state.data.EmiteNFE = $scope.state.GerarNFE;

                                        $scope.generateTicket(impressaotroca);

                                        //   $scope.state.data = response.Data;
                                   
                                }
                            }
                        },
                        function (error) {
                            $scope.state.carregandoClose = false;
                            $scope.$parent.toastr.error(error, "Comunicação com o servidor");
                        }
                    );
            }
    
            $scope.generateTicket = function (impressaotroca) {
                $scope.state.carregandoClose = true;

                $scope.state.data.EmiteNFE = $scope.state.GerarNFE;
            
                /*
                Caso não esteja configurado como número sequencia, está sendo utilizado um número de boleta
                Nesses casos, atribui o mesmo número da boleta ao Ticket. 
                */
                if (!$scope.state.data.Sequencial)
                    $scope.state.Ticket = $scope.state.data.Numero;

                pedidoService
                    .generateTicketMarket($scope.state.data, impressaotroca, $scope.state.Ticket, $scope.state.indicaPresencial, true)
                    .then(
                        function (response) {
                            $scope.state.carregandoClose = false;
                            if (response.Status < 0) {
                                $scope.$parent.toastr.error(response.Message, "Serviço");
                                $scope.state.data = response.Data;
                            }
                            else {
                          
                                if ($scope.$parent.toastr)
                                    $scope.$parent.toastr.success("Ticket gerado com êxito");
                            }

                            // $scope.ConsultarEnviarSefazVenda(response.Data);
                        },
                        function (error) {
                            $scope.$parent.toastr.error(error, "Comunicação com o servidor");
                            $scope.state.carregandoClose = true;
                        }
                    );
            };



            $scope.cancelCurrentItem = function () {

                $q.when($scope.cancelItemPedido());
                $scope.state.currentItem = -1;
            };


            $scope.toggleTEF = function () {
                var descontoPagamento = 0.00;
                entidadeAuxiliarService.getPaymentOperationDiscount($scope.state.data.CondicaoPagamento.Codigo, $scope.state.pagamento.livre.currentTipoPagamento.Codigo, $scope.state.data.OperacaoVenda.Codigo).then(
                    function (data) {
                        $scope.state.TEF.DescontoOperacao = data.Data;
                        $scope.state.TEF.ValorPagamento = $scope.state.data.Total - ($scope.state.data.Total * data.Data / 100) - $scope.state.data.Pago;

                        if ($scope.state.TEF.ValorPagamento == 0) {
                            $scope.state.TEF.modalTEF = false;
                            /* $scope.$parent.toastr.error('Não existem valores pendentes para prosseguir processo de TEF.', 'Atenção!');*/
                        }
                        else {

                            $scope.state.TEF.modalTEF = !$scope.state.TEF.modalTEF;


                            if ($scope.state.TEF.ValorPagamento < 0) $scope.state.TEF.ValorPagamento = 0;

                            if (!$scope.state.TEF.modalTEF) {
                                $scope.state.TEF.TEFProcessamento = false;
                                $interval.cancel(intervalPromise);

                                //cancelar todas as requisicoes pendentes de TEF para o terminal
                                var terminal = $scope.$parent.config.Terminal.Codigo;
                                pedidoService.CancelarRequisicaoTEF(terminal).then(
                                    function (response) {
                                        if (response.Status < 0)
                                            $scope.$parent.toastr.error(response.Message, 'Não foi possível cancelar as transações pendentes. Cancele a transação no PINPAD e tente novamente.');
                                    },
                                    function (error) {
                                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                                    }
                                );
                            }
                        }
                    }
                );

            };

            $scope.reinicioTela = false;

            //Pix Rede
            {
                $scope.PixRede = {
                    ModalPixRede: false,
                    Processando: false,
                    ValorPagamento: 0,
                    IDPixProcessando: '',
                    Toggle: function () {
                        $scope.PixRede.ModalPixRede = !$scope.PixRede.ModalPixRede
                    },
                    IniciarModalPagamento: function (valor) {
                        $scope.PixRede.Toggle();
                        $scope.PixRede.ValorPagamento = valor;
                    },
                    IniciarPagamento: function (valor) {
                        $scope.InserirPix(valor
                        );
                    },
                }


                $scope.InserirPix = function (valor) {
                    $scope.PixRede.ModalPixRede = true;
                    $scope.PixRede.IDPixProcessando = guid();
                    $scope.PixRede.Processando = true;
                    pedidoService.InsertTEFNoValidation($scope.PixRede.IDPixProcessando, $scope.state.data.Numero, '+', 1, valor).then(
                        function (response) {
                            if (response.Status < 0) {
                                // $scope.$parent.toastr.error(response.Message, 'Erro ao Inserir processamento de TEF');
                                $confirm({ text: response.Message });
                                $scope.PixRede.Processando = false;
                                $scope.continue = false;
                            }
                            else {
                                $scope.continue = true;
                                $scope.StatusPix();
                                $scope.IniciarPagamentoRede();
                            }
                        },
                        function (error) {
                            $scope.$parent.toastr.error(error, 'Erro de comunicação com o servidor');
                            $scope.PixRede.Processando = false;
                            $scope.continue = false;
                        }
                    );
                };

                $scope.ContinuaPix = function () {
                    intervalPromise = $interval(function () {
                        $scope.StatusPix();
                    }, 500);
                }

                $scope.StatusPix = function () {
                    $interval.cancel(intervalPromise);
                    pedidoService.GetStatusTEF($scope.PixRede.IDPixProcessando).then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.PixRede.Processando = false;
                                $confirm({
                                    text: response.Message
                                });
                                //$scope.$parent.toastr.error(response.Message, 'Serviço');
                            }
                            else {
                                if (response.Data) {

                                    var codigo_processamento = response.Data.substring(0, 2).trim();
                                    var mensagem_processamento = response.Data.substring(4);
                                    $scope.state.TEF.Status = mensagem_processamento;

                                    if (codigo_processamento == "1" && $scope.continue) {

                                        $interval.cancel(intervalPromise);
                                        $timeout(function () {
                                            pedidoService.get($scope.state.data.Numero).then(
                                                function (response) {
                                                    $scope.state.data = response.Data;
                                                    $scope.continue = false;
                                                    $interval.cancel(intervalPromise);
                                                    $scope.PixRede.ModalPixRede = false;
                                                    $scope.PixRede.Processando = false;
                                                    $scope.state.pagamento.currentIndex = 2;
                                                    $scope.finishPedido(false);
                                                    $scope.$parent.toastr.success('Pagamento Pix Concluido. Finalize o pedido!');
                                                    return;

                                                });
                                        }, 500);
                                        return;
                                    }
                                    else {
                                        if (codigo_processamento == "-1" && $scope.continue) {
                                            
                                            $scope.playBeep("beep-AlertaErro");
                                            $scope.$parent.toastr.error('Não foi possivel concluir o Pagamento!' + mensagem_processamento);
                                            $scope.PixRede.ModalPixRede = false;
                                            $scope.PixRede.Processando = false;
                                            $scope.continue = false;
                                            $interval.cancel(intervalPromise);
                                            return;
                                        }

                                        // $scope.toggleTEF();

                                    }

                                }
                            }

                            if ($scope.continue)
                                $scope.ContinuaPix();
                        },
                        function (error) {
                            $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                            $scope.PixRede.Processando = false;
                            if ($scope.continue)
                                $scope.ContinuaPix();
                        }
                    );
                };

            }
            $scope.iniciarTEF = function () {
                intervalPromise = $interval(function () {
                    $scope.StatusTEF();
                }, 500);
            };
            $scope.AbreModalTEF = function () {

                if ($scope.state.state != undefined && $scope.state.state.TEF != undefined && $scope.state.state.TEF.NumeroParcelas != undefined)
                    $scope.state.state.TEF.NumeroParcelas = 1;
                $scope.state.TEF.TEFStatusAbort = false;
                $scope.toggleTEF();
            }

            $scope.PossuiPagamentoTEFSemAdministradora = function () {

                var pagamentosSemAdministradora = $scope.getPagamentosTEFSemAdministradora();
                if (pagamentosSemAdministradora == null)
                    return false;
                return (pagamentosSemAdministradora.length > 0);
            }

            $scope.IniciarPagamentoRede = function () {
                //document.getElementById('codigo-barras').focus()
                window.ReactNativeWebView.postMessage('Pagamento');
                
            }



            var intervalPromise;
            $scope.ProcessarTEFClick = function (TipoCartao) {
                ;
                if ($scope.state.TEF.TEFProcessamento) {
                    $.ajax({
                        type: 'GET',
                        async: false,
                        url: '/entidadeauxiliar/removerTEF?idTEF=' + $scope.state.TEF.IDSiTef
                    });
                    $scope.state.TEF.TEFProcessamento = false;
                    $scope.state.TEF.TipoCartao = TipoCartao;
                    $scope.continue = false;
                    return;
                }//se ja inicou processamento, nao iniciar novamente.
                
                var valorapagar = ($scope.state.data.Total - ($scope.state.data.Total * $scope.state.TEF.DescontoOperacao / 100) - $scope.state.data.Pago);
                $scope.state.TEF.ValorPagamento = $scope.state.data.Total;
                if ($scope.state.TEF.ValorPagamento <= 0) {
                    $scope.$parent.toastr.error('Informar o valor do pagamento em Cartão.', 'Valor inválido');
                    return;
                }
                if ($scope.state.TEF.ValorPagamento > valorapagar) {
                    $scope.$parent.toastr.error('Valor do pagamento é maior que o valor do saldo a pagar.', 'Valor inválido');
                    return;
                }

                $scope.state.TEF.TEFProcessamento = true;
                $scope.state.TEF.pergunta = '';
                $scope.state.TEF.IDSiTef = guid(); // new id
                pedidoService.InsertTEFNoValidation($scope.state.TEF.IDSiTef, $scope.state.data.Numero, TipoCartao, 1, $scope.state.TEF.ValorPagamento).then(
                    function (response) {
                        if (response.Status < 0) {
                            // $scope.$parent.toastr.error(response.Message, 'Erro ao Inserir processamento de TEF');
                            $confirm({ text: response.Message });
                            $scope.state.TEF.TEFProcessamento = false;
                            $scope.continue = false;
                        }
                        else {
                            $scope.state.TEF.modalTEF = true;
                            $scope.continue = true;
                            $scope.StatusTEF();
                            $scope.IniciarPagamentoRede();
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Erro de comunicação com o servidor');
                        $scope.state.TEF.TEFProcessamento = false;
                        $scope.continue = false;
                    }
                );
            };

            $scope.StatusTEF = function () {
                    $interval.cancel(intervalPromise);

                pedidoService.GetStatusTEF($scope.state.TEF.IDSiTef).then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.state.TEF.TEFProcessamento = false;
                            $confirm({
                                text: response.Message
                            });
                            //$scope.$parent.toastr.error(response.Message, 'Serviço');
                        }
                        else {
                            if (response.Data) {
                                

                                if (
                                    response.Data === '0 - Processado com sucesso.' ||
                                    response.Data === '1 - Processado com sucesso.' || response.Data === '0 - transacao aprov.' || response.Data === '0 - retire o cartao da leitora') {

                                    $scope.state.TEF.TEFStatusAbort = true;
                                } else {
                                    $scope.state.TEF.TEFStatusAbort = false;
                                }

                                var codigo_processamento = response.Data.substring(0, 2).trim();
                                var mensagem_processamento = response.Data.substring(4);

                                if (codigo_processamento == "0" && mensagem_processamento.substring(0, 1) == "?") {

                                    $scope.state.TEF.respostaok = false;
                                    $scope.state.TEF.resposta = "";
                                    $scope.state.TEF.pergunta = mensagem_processamento.substring(1);
                                    $scope.continue = false;
                                    $interval.cancel(intervalPromise);
                                    $scope.state.TEF.TEFProcessamento = false;
                                    return;
                                }

                                $scope.state.TEF.Status = mensagem_processamento;

                                if (codigo_processamento == "1" && $scope.continue) {

                                    $interval.cancel(intervalPromise);
                                    $timeout(function () {
                                        pedidoService.get($scope.state.data.Numero).then(
                                            function (response) {
                                                
                                                $scope.state.data = response.Data;
                                          
                                                $scope.state.TEF.modalTEF = false;
                                                $scope.continue = false;
                                                $interval.cancel(intervalPromise);
                                                $scope.state.TEF.TEFProcessamento = false;
                                                $scope.state.pagamento.currentIndex = 2;
                                                $scope.finishPedido(false);
                                                $scope.$parent.toastr.success('Processamento TEF concluído. Finalize o pedido!');
                                                return;

                                            });
                                    }, 500);
                                    return
                                }
                                else {
                                    if (codigo_processamento == "-1" && $scope.continue) {
                                        $scope.playBeep("beep-AlertaErro");
                                        $scope.$parent.toastr.error('Não foi possivel concluir o TEF!' + mensagem_processamento);
                                        $scope.state.TEF.modalTEF = false;
                                        $scope.continue = false;
                                        $interval.cancel(intervalPromise);
                                        $scope.state.TEF.TEFProcessamento = false;
                                        return;
                                    }

                                    // $scope.toggleTEF();

                                }

                            }
                        }

                        if ($scope.continue)
                            $scope.iniciarTEF();
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                        $scope.state.TEF.TEFProcessamento = false;
                        if ($scope.continue)
                            $scope.iniciarTEF();
                    }
                );
            };

            $scope.RespostaOK = function () {
                event.preventDefault();

                pedidoService.SetRespostaTEF($scope.state.TEF.IDSiTef, $scope.state.TEF.resposta);

                $scope.state.TEF.pergunta = "";
                $scope.state.TEF.resposta = "";
                $scope.state.TEF.respostaok = true;

                $scope.continue = true;
                $scope.iniciarTEF();
            }

            $scope.CancelTEF = function (tefid, index) {


                $scope.state.TEFCancel.IDSiTef = guid(); // new id
                $scope.state.TEFCancel.IDTefRelated = tefid;
                $scope.state.TEFCancel.IndexParcela = index;
                $scope.state.TEFCancel.TEFProcessamento = true;

                pedidoService.InserirTEFCancel($scope.state.TEFCancel.IDSiTef, $scope.state.TEFCancel.IDTefRelated).then(
                    function (response) {
                        if (response.Status < 0) {
                            $confirm({
                                text: response.Message
                            });
                        }
                        else {
                            $scope.toggleTEFCancel();
                            intervalPromise = $interval(function () {
                                $scope.StatusTEFCancel();
                            }, 500);
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                        $scope.state.TEFCancel.TEFProcessamento = false;
                    }
                );
            }

            $scope.toggleTEFCancel = function () {
                $scope.state.TEFCancel.modalTEF = !$scope.state.TEFCancel.modalTEF;
                if (!$scope.state.TEFCancel.modalTEF) {
                    if ($scope.state.TEFCancel.TEFProcessamento) {
                        $scope.$parent.toastr.error('Não esqueça de cancelar o processamento no PINPAD.', 'ATENÇÃO', {
                            timeOut: 7500
                        });
                    }
                    $scope.state.TEFCancel.TEFProcessamento = false;
                    $interval.cancel(intervalPromise);
                }
            };


            $scope.GetTextTefCancel = function () {
                if ($scope.state.data.Pagamentos.length > 0) {
                    var pix = $scope.state.data.Pagamentos[$scope.state.TEFCancel.IndexParcela].Tipo.Codigo == "+";
                    if (pix)
                        return "PIX"
                    else
                        return "TEF"
                }
                else
                    return "";
            }
            $scope.StatusTEFCancel = function () {
                $interval.cancel(intervalPromise);
                pedidoService.GetStatusTEFCancel($scope.state.TEFCancel.IDSiTef).then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            if (response.Data) {
                                var codigo_processamento = response.Data.substring(0, 1);
                                var mensagem_processamento = response.Data.substring(4);

                                $scope.state.TEFCancel.Status = mensagem_processamento;

                                var pix = $scope.state.data.Pagamentos[$scope.state.TEFCancel.IndexParcela].Tipo.Codigo == "+";
                                if (codigo_processamento == "1") {

                                    pedidoService.ConfirmaCancelamentoTEF($scope.state.TEFCancel.IDSiTef, $scope.state.data.Numero).then(
                                        function (response) {
                                            angular.copy(response.Data, $scope.state.data);

                                            if (pix)
                                                $scope.$parent.toastr.success('Cancelamento de Pix concluído.');
                                            else
                                                $scope.$parent.toastr.success('Cancelamento de TEF concluído.');
                                            $scope.state.TEFCancel.TEFProcessamento = false;
                                            $scope.cancelItemPagamento($scope.state.TEFCancel.IndexParcela);
                                            $scope.toggleTEFCancel();
                                            return;
                                        });
                                    return;
                                }
                                else {
                                    if (codigo_processamento == "-1" || codigo_processamento == "-") {
                                        if (pix)
                                            $scope.$parent.toastr.error('Não foi possivel cancelar o Pix!' + mensagem_processamento);
                                        else
                                            $scope.$parent.toastr.error('Não foi possivel cancelar o TEF!' + mensagem_processamento);
                                        $scope.state.TEFCancel.TEFProcessamento = false;
                                        return;
                                    }
                                }

                                intervalPromise = $interval(function () {
                                    $scope.StatusTEFCancel();
                                }, 500);
                            }
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                        $scope.state.TEFCancel.TEFProcessamento = false;
                    }
                );
            };

            $scope.PrintTEF = function (tefid) {
                pedidoService.InserirReimpressaoTEF(tefid).then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.$parent.toastr.success('Comprovante reenviado para a fila de impressão', 'Reimpressão TEF');
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );

            }

            $scope.SaveAdministradoraTEF = function (pagamento) {

                var hasTEFID = pagamento.TEFID != null && pagamento.TEFID != "";
                if (!hasTEFID)
                    return;

                var response = pedidoService.SaveAdministradoraTEF(pagamento);
                response.then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.$parent.toastr.success('Administradora de cartão alterada com sucesso.');
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
            }

            $scope.SaveVencimentoTEF = function (pagamento) {

                var hasTEFID = pagamento.TEFID != null && pagamento.TEFID != "";
                if (!hasTEFID)
                    return;

                var response = pedidoService.SaveVencimentoTEF(pagamento);
                response.then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.$parent.toastr.success('Data de vencimento alterado com sucesso.');
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
            };

            $scope.getPagamentosTEFSemAdministradora = function () {
                if ($scope.state.data.Pagamentos != null) {

                    var pagamentosSemAdministradora = $scope.state.data.Pagamentos.filter(function (pagamento) {
                        var adminCodigo = pagamento.Cartao.Administradora.Codigo;
                        var hasAdministradora = false;
                        if ((adminCodigo || "").trim() != "" && adminCodigo != "00")
                            hasAdministradora = true;
                        if (pagamento.Tipo.Codigo == '+')
                            hasAdministradora = true;
                        var hasTEFID = pagamento.TEFID != null && pagamento.TEFID != "";

                        return !hasAdministradora && hasTEFID;
                    });

                    return pagamentosSemAdministradora;
                }

            }

     
            $scope.recarregar = function () {
                location.reload();
            }


            $scope.checkTipoPagamentoTEF = function () {

                if (($scope.state.data.Pagamentos && $scope.state.data.Pagamentos.length > 0) || $scope.ehFormaDePagamentoDigiteAsParcelas()) {
                    if ($scope.ehFormaDePagamentoDigiteAsParcelas()) {
                        if ($scope.state.TEF.TipoCartao == 'D' && ($scope.state.pagamento.livre.currentTipoPagamento.Codigo != 'Q' ||
                            $scope.state.pagamento.livre.currentTipoPagamento.Codigo != 11)) {
                            var tipoPagamentoDebito = $scope.$parent.config.TipoDebitoTef;
                            if ($scope.state.data.Pagamentos && $scope.state.data.Pagamentos.Cartao && $scope.state.data.Pagamentos.Cartao.NumeroParcelas)
                                $scope.state.data.Pagamentos.Cartao.NumeroParcelas = 1;
                            for (var i = 0; i <= $scope.auxiliar.tipoPagamento.data.length; i++) {

                                if ($scope.auxiliar.tipoPagamento.data[i] != null && $scope.auxiliar.tipoPagamento.data[i].Codigo == tipoPagamentoDebito) {
                                    $scope.auxiliar.tipoPagamentoSelected = $scope.auxiliar.tipoPagamento.data[i].Nome;

                                    break;
                                }
                            }
                        } else if ($scope.state.TEF.TipoCartao == 'C') {

                            var tipoPagamentoCredito = $scope.$parent.config.TipoCreditoTef;
                            for (var i = 0; i <= $scope.auxiliar.tipoPagamento.data.length; i++) {
                                if ($scope.auxiliar.tipoPagamento.data[i].Codigo == tipoPagamentoCredito) {
                                    $scope.auxiliar.tipoPagamentoSelected = $scope.auxiliar.tipoPagamento.data[i].Nome;
                                    break;
                                }
                            }
                        }
                    } else {
                        if ($scope.state.data.Pagamentos && $scope.state.data.Pagamentos.length > 0) {
                            $scope.auxiliar.tipoPagamentoSelected = $scope.state.data.Pagamentos[0].Tipo.Nome;
                        }
                    }
                }
            }

            $scope.ehFormaDePagamentoDigiteAsParcelas = function () {
                if ($scope.state.data.CondicaoPagamento) {
                    return $scope.state.data.CondicaoPagamento.Codigo == '##';
                }
            }

            $scope.showDadosCartao = function (item) {

                var indicaPagamentoCartao = ['I', 'K', '9', '10'].indexOf(item.Tipo.Codigo) >= 0;
                var indicaProcessoTEFHabilitado = $scope.auxiliar.ehPagamentoTipoCartao;
                var indicaPagamentoTEFConcluido = item.TEFID != null;
                if (item.TEFID != null && ['A', 'B', 'E', 'K', 'I', '¨', '3', '4'].indexOf(item.Tipo.Codigo) >= 0)
                    return true;
                else {

                    if (['A', 'B', 'E', '¨', '3', '4'].indexOf(item.Tipo.Codigo) >= 0)
                        return true
                    else
                        return false;
                }
                //if(item.TEFID == null && (item.Tipo.Codigo == "I" || item.Tipo.Codigo == "K"))
                //{
                //   // $scope.$parent.toastr.error("Para está forma de pagamento, selecione o TEF");
                //    return false;
                //}
                //else
                //    return true;

                //if (indicaPagamentoCartao) {
                //    if (indicaProcessoTEFHabilitado && indicaPagamentoTEFConcluido) {
                //        return true;
                //    }
                //    else if (!indicaProcessoTEFHabilitado) {
                //        return true;
                //    }
                //    else {
                //        return false;
                //    }
                //}
                //else {
                //    if()
                //        return true;
                //    else
                //        return false;
                //}
            }
            $timeout(function () {
                var el = document.getElementById("codigo-barras");
                if (!el) return;

                function insertChar(ch) {
                    var start = el.selectionStart ?? el.value.length;
                    var end = el.selectionEnd ?? el.value.length;
                    var v = el.value || "";
                    el.value = v.slice(0, start) + ch + v.slice(end);
                    var pos = start + ch.length;
                    try { el.setSelectionRange(pos, pos); } catch (e) { }
                    el.dispatchEvent(new Event("input", { bubbles: true }));
                }

                function backspace() {
                    var start = el.selectionStart ?? el.value.length;
                    var end = el.selectionEnd ?? el.value.length;
                    var v = el.value || "";

                    if (start !== end) el.value = v.slice(0, start) + v.slice(end);
                    else if (start > 0) el.value = v.slice(0, start - 1) + v.slice(end);

                    try { el.setSelectionRange(Math.max(start - 1, 0), Math.max(start - 1, 0)); } catch (e) { }
                    el.dispatchEvent(new Event("input", { bubbles: true }));
                }

                function onKeydown(e) {
                    if (!el) return;

                    if ($scope.state &&
                        $scope.state.pagamento &&
                        $scope.state.pagamento.currentIndex > -1) {
                        return; 
                    }

                    if (e.key === "Enter") {
                        debugger
                        e.preventDefault();
                        $scope.$applyAsync(function () {
                            var code = ($scope.state && $scope.state.codigoBarras) ? String($scope.state.codigoBarras).trim() : "";
                            if (!code) return;

                            $scope.addItemPedido();

                            $scope.state.codigoBarras = "";
                            el.value = "";
                        });
                        return;
                    }

                    if (e.key === "Backspace") {
                        e.preventDefault();
                        backspace();
                        return;
                    }

                    if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
                        e.preventDefault();
                        insertChar(e.key);
                        return;
                    }

                    if (e.key === "Tab") {
                        e.preventDefault();
                    }
                }

                document.addEventListener("keydown", onKeydown, true);

                $scope.$on("$destroy", function () {
                    document.removeEventListener("keydown", onKeydown, true);
                });
            }, 0);

             //Cancela o pedido depois de um periodo inativo
            var IDLE_MS = 300 * 1000;
            var idleTimer = null;

            function resetIdle() {
                if (idleTimer) $timeout.cancel(idleTimer);
                idleTimer = $timeout(function () {
                    $scope.$applyAsync(function () {
                        
                        if ($scope.state.pagamento.currentIndex < 0) {

                            $scope.state.showPromoCover = true;
                            $scope.cancelPedidoTimeOut()
                        }
                     
                    });
                }, IDLE_MS);
            }

            resetIdle();

            var idleEvents = ["touchstart", "touchmove", "mousedown", "mousemove", "keydown", "wheel", "scroll"];

            function onIdleEvent() {
                resetIdle();
            }

            idleEvents.forEach(function (evt) {
                document.addEventListener(evt, onIdleEvent, true);
            });


            $scope.$on("$destroy", function () {
                if (idleTimer) $timeout.cancel(idleTimer);
                idleEvents.forEach(function (evt) {
                    document.removeEventListener(evt, onIdleEvent, true);
                });
            });

            $scope.state.showPromoCover = false;
            $scope.state = $scope.state || {};

            $scope.hidePromoCover = function () {
               
                if (!$scope.state.showPromoCover) return;
                $scope.state.showPromoCover = false;
                //$event.preventDefault(); $event.stopPropagation();
            };

            function hideOnFirstInteraction() {
                $scope.$applyAsync(function () {
                    $scope.hidePromoCover();
                });
            }

            function onAnyKeydown(e) {
                hideOnFirstInteraction();
            }

            function onAnyPointer() {
                hideOnFirstInteraction();
            }

            document.addEventListener("keydown", onAnyKeydown, true);
            document.addEventListener("mousedown", onAnyPointer, true);
            document.addEventListener("touchstart", onAnyPointer, true);

            $scope.$on("$destroy", function () {
                document.removeEventListener("keydown", onAnyKeydown, true);
                document.removeEventListener("mousedown", onAnyPointer, true);
                document.removeEventListener("touchstart", onAnyPointer, true);
            });
            /*Inicializa funções*/
            $scope.initialize();
        }, 100);

    }

})()