(function () {
    "use strict";

    angular.module('pos').controller('configController', controller);
    controller.$inject = ['$scope', '$state', '$window', '$q', '$timeout', 'entidadeAuxiliarService', 'saidaService', 'notaFiscalService', 'configService', 'clienteService', 'Upload', '$confirm', 'motorPromocaoService'];

    function controller($scope, $state, $window, $q, $timeout, entidadeAuxiliarService, saidaService, notaFiscalService, configService, clienteService, Upload, $confirm, motorPromocaoService) {
        $scope.$parent.initializeLayout('Configurações');
        $scope.auxiliar = { condicaoPagamento: { data: [] }, tipoPagamento: { data: [] } };
        $scope.changecover = false;
        if ($scope.$parent.config != null && $scope.$parent.config.PosicaoLogo != null)
            $scope.p_classe = $scope.$parent.config.PosicaoLogo; // CHAMAR O PARAMETRO
        $scope.alvo = function (event) {
            var objeto = event.target;
            var marca = event.toElement;
            var efeito = event.type;

            if (efeito == 'dropover') {
                $(objeto).addClass('p_brilha');
            }
            if (efeito == 'dropout') {
                $(objeto).removeClass('p_brilha');
            }
            if (efeito == 'drop') {
                $(posicionamarca).css('left', '');
                $(posicionamarca).css('top', '');
                $scope.p_classe = $(objeto).attr('name');
                $scope.state.data.PosicaoLogo = $scope.p_classe;
                //$scope.state.data.HabilitaPosicaoLogo = false;
            }
        }

        //Config Terminais
        {
            $scope.terminalSelecionado = {
                Terminal: "Nenhum terminal selecionado"
            };
            $scope.copiaTerminal = {};
            $scope.copiaCodigoAtual = "";

            $scope.toggleSelection = function (item) {
                if ($scope.copiaCodigoAtual == item.Codigo) {
                    $scope.terminalSelecionado.Terminal = "Nenhum terminal selecionado";
                    $scope.copiaCodigoAtual = "";
                    $scope.RemoverTerminal(item);
                    return;
                }
                $scope.SetarTerminal(item);
                $scope.copiaCodigoAtual = item.Codigo;
            };

            $scope.RemoverTerminal = function (item, forcesave) {
                if (forcesave == null) {
                    forcesave = false;
                }
                configService.RemoverTerminal(item, forcesave).then
                    (
                        function (response) {
                            if (response.Status < 0)
                                $scope.$parent.toastr.error(response.Message, "Serviço");
                            else {
                                if (response.Status == 2) {
                                    $confirm({ text: "Este terminal ja esta configurado para outro equipamento, deseja remover?", title: "Habilitar", ok: "Sim", cancel: "Não" })
                                        .then(function () {
                                            // Ação para o caso de o usuário clicar em "Sim"
                                            $scope.RemoverTerminal(item, true);  // Chama a função corretamente após confirmação
                                        })
                                        .catch(function () {
                                            $scope.terminalSelecionado.Terminal = $scope.copiaTerminal;
                                            $scope.copiaCodigoAtual = $scope.terminalSelecionado.Terminal  ;

                                        });
                                    $scope.$parent.toastr.success('Terminal removido com sucesso');

                                }
                                else
                                    $scope.$parent.toastr.success('Terminal removido com sucesso');
                            }
                        },
                        function (error) { $scope.$parent.toastr.error(error); }
                    );
            }

            $scope.SetarTerminal = function (item, forcesave) {
                if (forcesave == null) {
                    forcesave = false;
                }
                configService.SetarTerminal(item, forcesave).then
                    (
                        function (response) {
                            if (response.Status < 0) {
                                $scope.$parent.toastr.error(response.Message, "Serviço");
                            }
                            if (response.Status == 2) {
                                $confirm({ text: "Este terminal ja esta configurado para outro equipamento, deseja sobrepor?", title: "Habilitar", ok: "Sim", cancel: "Não" })
                                    .then(function () {
                                        $scope.SetarTerminal(item, true);  
                                        $scope.copiaTerminal = $scope.terminalSelecionado.Terminal;
                                    })
                                    .catch(function () {
                                        $scope.terminalSelecionado.Terminal = $scope.copiaTerminal;
                                        $scope.copiaCodigoAtual = $scope.copiaTerminal;
                                    });
                                $scope.$parent.toastr.success('Terminal setado com sucesso');
                            }
                            else {
                              
                                $scope.$parent.toastr.success('Terminal configurado com sucesso. Se estiver no aplicativo aguarde 20 segundos sem fechar a App, para que a configuração seja totalmente armazenada.');
                            }
                        },
                        function (error) { $scope.$parent.toastr.error(error); }
                    );
            }
            $scope.SetarDescricao = function (item) {
                configService.SetarDescricao(item).then
                    (
                        function (response) {
                            if (response.Status < 0)
                                $scope.$parent.toastr.error(response.Message, "Serviço");
                            else {
                                $scope.$parent.toastr.success('Nome do terminal atualizado com sucesso');
                            }
                        },
                        function (error) { $scope.$parent.toastr.error(error); }
                    );
            }
            function criarCookie(nome, valor, diasExpiracao) {
                var data = new Date();
                data.setTime(data.getTime() + (diasExpiracao * 24 * 60 * 60 * 1000)); // Converter dias em milissegundos
                var expira = "expires=" + data.toUTCString();
                document.cookie = nome + "=" + valor + ";" + expira + ";path=/";
            }

            $scope.GetValorCookie = function () {
                configService.GetValorCookie().then
                    (
                        function (response) {
                            if (response.Status < 0)
                                $scope.$parent.toastr.error(response.Message, "Serviço");
                            else {
                                var itens = $scope.state.terminal.data.filter(a => a.Codigo == response.Data.Codigo);
                                if (itens.length > 0) {
                                    var itemTerminal = itens[0];
                                    if (itemTerminal.Identificador == response.Data.Identificador) {
                                        $scope.terminalSelecionado.Terminal = itemTerminal.Codigo;
                                        $scope.copiaTerminal = itemTerminal.Codigo;
                                        $scope.copiaCodigoAtual = itemTerminal.Codigo;
                                    }
                                }
                                //$scope.$digest();
                            }
                        },
                        function (error) { $scope.$parent.toastr.error(error); }
                    );
            }
        }

        $scope.getAllExcecoes = function () {
            configService.GetAllExcecao().then
                (
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.ExcecoesImposto);
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        }

        $scope.removerExcecao = function (item) {
            const input = angular.element(event.target);
            const ngModel = input.controller('ngModel');
            item.CstIbsCbs = "";
            item.CClassTrib = "";
            item.ReducaoAliquota = 0;
            item.TipoConfigurado = false;
            configService.UpdateExcecao(item).then
                (
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            $scope.$parent.toastr.success("Item atualizado com sucesso!");
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        }
        $scope.blockEnter = function ($event) {
            if ($event.which === 13) {
                $event.preventDefault();
            }
        };
        $scope.UpdateExcecao = function (item) {
           // debugger
          
            const input = angular.element(event.target);
            const ngModel = input.controller('ngModel');

            ngModel.$commitViewValue();
            configService.UpdateExcecao(item).then
                (
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            $scope.$parent.toastr.success("Item atualizado com sucesso!");
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        }
        $scope.setExcecao = function (item) {
            var itemExcecao = $scope.state.ExcecoesImposto.filter(a => a.ID == item);
            if (itemExcecao.length > 0)
                itemExcecao[0].TipoConfigurado = true;
        }

        $scope.state = {
            parametroLoja: {},
            series: [],
            naturezas: [],
            data: { HabilitaPosicaoLogo: false },
            migrateCRT: [],
            migrateTipoAmbiente: [],
            migrateEncontrarImpressora: [],
            migrateImpressaoCompleta: [],
            ExcecoesImposto: [],
            ExcecaoImposto: '',
            FormasPgto: [],
            FormaPgto: '',
            migrateMarcaImpressora: [],
            migratecRegTribISSQN: [],
            terminal: { data: [], carregando: true, vazio: false },
            operacaoVenda: [],
            vendedor: [],
            loja: [],
            corTema: [],
            tabCorrente: 'regra',
            tabs: [
                { id: 'regra', show: true, titulo: 'Regras', icone: 'lock' },
                { id: 'dado', show: true, titulo: 'Identificação da Loja', icone: 'tune' },
                { id: 'operacao', show: true, titulo: 'Operação', icone: 'settings' },
                { id: 'fidelidade', show: true, titulo: 'Fidelidade', icone: 'devices' },
                { id: 'shipay', show: true, titulo: 'Shipay', icone: 'select_all' },
                { id: 'rede', show: true, titulo: 'Rede', icone: 'settings_ethernet' },
                { id: 'nfce', show: $scope.$parent.config.UsaPOS, titulo: 'NFC-e', icone: 'extension' },
                { id: 'tef', show: true, titulo: 'TEF', icone: 'credit_card' },
                { id: 'troca', show: true, titulo: 'Troca', icone: 'swap_horiz' },
                { id: 'terminal', show: true, titulo: 'Terminais', icone: 'desktop_windows' },
                { id: 'tema', show: true, titulo: 'Temas', icone: 'palette' },
                { id: 'configExcecao', show: !$scope.$parent.config.BancoAtualizadoReforma, titulo: 'Configurar exceção de imposto', icone: 'lock' },
                { id: 'licenca', show: true, titulo: 'Licenciamento', icone: 'vpn_key' },
                { id: 'fechamento', show: true, titulo: 'Fechamento', icone: 'account_balance_wallet' },
            ],
            metodos: [],
            configs: [],
            filtro: "",
            imagem: { files: [], data: [], progressPercentage: 0, visible: true },
            currentItem: -1,
            item: {},
            indexItem: -1,
            tiposTerminal: [],
            tiposLancamentoCaixa: { data: [] },
            tiposLancamentoCaixaAutorizacao: [],
            showModalLancamento: false,
            showModalPagamento: false,
            showModalCredito: false,
            start: false,
            accordion: [false, false],
            unmodified: { condicao: [], tipo: [] }
        };

        $scope.initalizeArrayConfig = function () {
            $scope.state.configs = [];
            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Acessos', tipo: null, metodo: null, model: 'Agrupador1', icone: null, disabled: null });
            $scope.state.configs.push({ modelPai: 'Agrupador1', show: true, titulo: 'Acessar módulo de produto', tipo: 'checkbox', metodo: null, model: 'AbreEstoque', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Agrupador1', show: true, titulo: 'Acessar consulta de estoque em terminal', tipo: 'checkbox', metodo: null, model: 'MostraConsultaEstoqueHome', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Agrupador1', show: true, titulo: 'Acessar módulo de clientes', tipo: 'checkbox', metodo: null, model: 'AbreClientes', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Agrupador1', show: true, titulo: 'Acessar módulo de relatórios', tipo: 'checkbox', metodo: null, model: 'AbreReports', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Agrupador1', show: true, titulo: 'Acessar módulo de pré-vendas', tipo: 'checkbox', metodo: null, model: 'AbrePedidos', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Agrupador1', show: true, titulo: 'Acessar módulo de consulta', tipo: 'checkbox', metodo: null, model: 'AbreConsulta', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Agrupador1', show: true, titulo: 'Acessar módulo de relatórios', tipo: 'checkbox', metodo: null, model: 'AbreConfere', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Solicitar Autorização', tipo: null, metodo: null, model: 'SolicitarAutorizacao', icone: null, disabled: null });
            $scope.state.configs.push({ modelPai: 'SolicitarAutorizacao', show: true, titulo: 'Exigir senha para cancelar venda', tipo: 'checkbox', metodo: null, model: 'RequerAutorizacaoCancelarVenda', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'SolicitarAutorizacao', show: true, titulo: 'Exigir motivo pré definido para cancelar venda', tipo: 'checkbox', metodo: null, model: 'SolicitaMotivoPreDefinido', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'SolicitarAutorizacao', show: true, titulo: 'Exigir motivo livre quando motivo pré definido estiver habilitado', tipo: 'checkbox', metodo: null, model: 'MotivoPadraoObrigatorio', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'SolicitarAutorizacao', show: true, titulo: 'Exigir senha para suspender venda', tipo: 'checkbox', metodo: null, model: 'RequerAutorizacaoSuspenderVenda', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'SolicitarAutorizacao', show: true, titulo: 'Configurar autorização de lançamentos de caixa', tipo: 'iconButton', metodo: $scope.toggleModalLancamento, model: null, icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'SolicitarAutorizacao', show: true, titulo: 'Exigir senha para fechar o caixa', tipo: 'checkbox', metodo: null, model: 'RequerAutorizacaoFecharCaixa', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'SolicitarAutorizacao', show: true, titulo: 'Exigir senha para efetuar trocas', tipo: 'checkbox', metodo: null, model: 'RequerAutorizacaoTroca', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Restrições', tipo: null, metodo: null, model: 'Restricoes', icone: null, disabled: null });
            $scope.state.configs.push({ modelPai: 'Restricoes', show: true, titulo: 'Não permitir faturar pré-vendas', tipo: 'checkbox', metodo: null, model: 'NaoConverterPreVenda', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Restricoes', show: true, titulo: 'Não permitir reaberuta de venda suspensa', tipo: 'checkbox', metodo: null, model: 'BloqueiaReabertura', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Restricoes', show: true, titulo: 'Não permitir vendas contra estoque', tipo: 'checkbox', metodo: null, model: 'BloqueiaEstoque', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Restricoes', show: true, titulo: 'Obrigar abertura e fechamento de caixa', tipo: 'checkbox', metodo: null, model: 'AbreCaixa', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Restricoes', show: true, titulo: 'Não permitir reabertura de pré-vendas retroativas', tipo: 'checkbox', metodo: null, model: 'BloqueiaPedidoRetroativo', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Restricoes', show: true, titulo: 'Permitir saída de caixa maior que seu total atual', tipo: 'checkbox', metodo: null, model: 'SaidaMaiorTotalCaixa', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Restricoes', show: true, titulo: 'Permitir gerar NFE e NFE referenciada para vendas', tipo: 'checkbox', metodo: null, model: 'PermiteImpressaoNFEVenda', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Restricoes', show: true, titulo: 'Permitir realizar venda sem cliente("Em Branco"fRealiza envio de nfce diretamente pelo sistema sem uso do tray service)', tipo: 'checkbox', metodo: null, model: 'PermiteVendaSemCliente', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Restricoes', show: true, titulo: 'Mostra relatorios de vendedor em terminal de pre venda', tipo: 'checkbox', metodo: null, model: 'MostraRelVendedor', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Comportamento', tipo: null, metodo: null, model: 'Comportamento', icone: null, disabled: null });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Transferencia filtra rede de loja ao buscar transito ou destino', tipo: 'checkbox', metodo: null, model: 'TransferenciaPorRedeLoja', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Define se utiliza GTIN (Os itens da nota serão gerados por sku)', tipo: 'checkbox', metodo: null, model: 'UtilizaGTIN', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Utiliza serviço de atualização de preço', tipo: 'checkbox', metodo: null, model: 'ServicoUpdatePrice', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Define se torna obrigatoria geração da nota fiscal para encerrar saida', tipo: 'checkbox', metodo: null, model: 'NotaObrigatoriaSaida', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Gera nota fiscal de troca por item!', tipo: 'checkbox', metodo: null, model: 'NFETrocaPorItem', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Quando o cliente participar do programa fidelidade, obrigatório informar o celular e data de aniversário.', tipo: 'checkbox', metodo: null, model: 'ObrigaCelularFidelidade', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Utilizar preço por filial', tipo: 'checkbox', metodo: null, model: 'UtilizaPrecoPorFilial', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permite incluir produtos sem codigo de barras nas entradas/saidas', tipo: 'checkbox', metodo: null, model: 'PermiteProdSemCodBarraES', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Realiza envio de nfce diretamente pelo sistema sem uso do tray service', tipo: 'checkbox', metodo: null, model: 'EnvioDiretoNFCE', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Digitação de chave obrigatória para entradas', tipo: 'checkbox', metodo: null, model: 'ChaveEntradaObrigatoria', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Realiza Busca de cliente na marca', tipo: 'checkbox', metodo: null, model: 'BuscaClienteMarca', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permite aplicar desconto no item', tipo: 'checkbox', metodo: null, model: 'DescontoNoItem', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permite atribuir desconto a um item de troca', tipo: 'checkbox', metodo: null, model: 'DescontoItemTroca', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Utilizar valor mínimo para parcelas de cartão', tipo: 'checkbox', metodo: null, model: 'UtilizaMinimoParcelasCartao', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Desconsidera o trânsito para cálculo de estoque', tipo: 'checkbox', metodo: null, model: 'AbateTransito', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'CPF Obrigatório', tipo: 'checkbox', metodo: null, model: 'CadastroCPFObrigatorio', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Miniaturas de produtos', tipo: 'checkbox', metodo: null, model: 'MiniaturaProduto', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: false, titulo: 'Relatório de vendas por linha', tipo: 'checkbox', metodo: null, model: 'RelatorioLinha', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Habilitar Lancamento para Crédito Fidelidade', tipo: 'checkbox', metodo: null, model: 'LancamentoFidelidade', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Habilitar Impressão do Slip de Troca Customizado', tipo: 'checkbox', metodo: null, model: 'SlipTrocaCustom', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Mostrar Vendas Somente do Terminal', tipo: 'checkbox', metodo: null, model: 'TerminalVenda', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Visualizar Vendas por Vendedor/Operador', tipo: 'checkbox', metodo: null, model: 'VendedorVenda', icone: null, disabled: 'TerminalVenda' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Habilita funcionalidade de pin code', tipo: 'checkbox', metodo: null, model: 'UsaPincode', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Apresentar ao usuário alerta com notas pendentes de envio', tipo: 'checkbox', metodo: null, model: 'ApresentarNotasPendentes', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permite pesquisar produtos por referencia do fabricante', tipo: 'checkbox', metodo: null, model: 'UsaRefFabricante', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Gerente Visualiza Venda Somente do Terminal', tipo: 'checkbox', metodo: null, model: 'GerenteVendaTerminal', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Mostra CEP e Endereço no cadastro rápido de clientes', tipo: 'checkbox', metodo: null, model: 'NovoClienteCEPObrigatorio', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Habilitar impressão do slip de troca', tipo: 'checkbox', metodo: null, model: 'SlipTrocaPrevenda', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Mostrar grade em entrada/saída', tipo: 'checkbox', metodo: null, model: 'GradeEntradaSaida', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Edita grade em entrada/saída', tipo: 'checkbox', metodo: null, model: 'EditaItemSaida', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Não seguir sequencial do Ticket', tipo: 'checkbox', metodo: null, model: 'TicketPersonalizado', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Exibir apenas vendas do dia', tipo: 'checkbox', metodo: null, model: 'VisualizaVendasDia', icone: null, disabled: 'GerenteConfigura' });
            //$scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permite cancelar pagamentos TEF individualmente sem iniciar o cancelamento da venda', tipo: 'checkbox', metodo: null, model: 'CancelaTEFIndividual', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Exigir número de boleta', tipo: 'checkbox', metodo: null, model: 'BoletaObrigatoria', icone: null, disabled: !$scope.state.data.TicketPersonalizado });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir alterar Vendedor', tipo: 'checkbox', metodo: null, model: 'AlteraVendedor', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir múltiplos vendedores', tipo: 'checkbox', metodo: null, model: 'MultiplosVendedores', icone: null, disabled: 'AlteraVendedor' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir alterar Vendedor de vendas retroativas', tipo: 'checkbox', metodo: null, model: 'AlteraVendedorVendaRetroativa', icone: null, disabled: 'AlteraVendedor' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Pré-Venda apenas com usuário logado', tipo: 'checkbox', metodo: null, model: 'VendaUsuarioLogado', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Habilitar Importação de Pré-venda', tipo: 'checkbox', metodo: null, model: 'ImportarPreVenda', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Escolher Vendedor por Modal', tipo: 'checkbox', metodo: null, model: 'VendedorModal', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir cancelamento de vendas/pedidos retroativas', tipo: 'checkbox', metodo: null, model: 'CancelamentoRetroativo', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Define se vendedor da venda, deve ser obrigatoriamente o usuario logado no sistema', tipo: 'checkbox', metodo: null, model: 'UtilizaVendedorUsuario', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir alterar valor do produto de troca', tipo: 'checkbox', metodo: null, model: 'AlteraPrecoTroca', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Define se utiliza ou nao regra de parcelamentos para cartoes', tipo: 'checkbox', metodo: null, model: 'ValidaRegraLimiteParcela', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Solicitar autorização de gerente para acréscimos', tipo: 'checkbox', metodo: null, model: 'GerenteAcrescimo', icone: null, disabled: 'AplicaAcrescimo' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Define se o sistema limitará a quantidade de parcelas', tipo: 'checkbox', metodo: null, model: 'LimitaParc', icone: null, disabled: 'GerenteConfigura' });

            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir aplicação de acréscimo no total', tipo: 'checkbox', metodo: null, model: 'AplicaAcrescimo', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir visualizar estoque de outras filiais', tipo: 'checkbox', metodo: null, model: 'EstoqueFiliais', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir aplicar acréscimo por item', tipo: 'checkbox', metodo: null, model: 'AplicaAcrescimoItem', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Solicitar autorização de gerente para acréscimos em itens', tipo: 'checkbox', metodo: null, model: 'GerenteAcrescimoItem', icone: null, disabled: 'AplicaAcrescimoItem' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Define se o sistema gerará NFE para pessoa jurídica obrigatóriamente', tipo: 'checkbox', metodo: null, model: 'EmiteNfeNfce', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir visualizar clientes de outras filiais', tipo: 'checkbox', metodo: null, model: 'ClienteOutrasFiliais', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir alteração da data de aniversário do cliente', tipo: 'checkbox', metodo: null, model: 'TrocaAniversarioCliente', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Cadastro da data de aniversário do cliente obrigatório.', tipo: 'checkbox', metodo: null, model: 'AniversarioObrigatorio', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Notificar usuário referente cadastro incompleto do cliente', tipo: 'checkbox', metodo: null, model: 'NotificarCadIncompleto', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Habilita restrição de perfil por usuário.', tipo: 'checkbox', metodo: null, model: 'RestricoesPerfilUsuario', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Campos DOC e Autorização do cartão obrigatórios.', tipo: 'checkbox', metodo: null, model: 'DocAutoObrigatorio', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Trazer CPF do cliente por padrao.', tipo: 'checkbox', metodo: null, model: 'TrazerCpfCliente', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Buscar nota de referência da troca apenas localmente.', tipo: 'checkbox', metodo: null, model: 'BuscarNotaLocal', icone: null, disabled: true });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Utilizar apenas um terminal', tipo: 'checkbox', metodo: null, model: 'TerminalUnico', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Não trazer produtos nas transferências.', tipo: 'checkbox', metodo: null, model: 'ProdutoTransf', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Utilizar tabelas específicas SAT.', tipo: 'checkbox', metodo: null, model: 'TabelaSat', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permitir alterar data de vencimento das parcelas na venda.', tipo: 'checkbox', metodo: null, model: 'AlterarVencimento', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Habilita Credev', tipo: 'checkbox', metodo: null, model: 'UsaCredev', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Permite filtrar data retroativa para relatório Resumo de Caixa', tipo: 'checkbox', metodo: null, model: 'DataResumoDeCaixa', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Comportamento', show: true, titulo: 'Agrupar por tipo de pagamento na impressão das notas fiscais', tipo: 'checkbox', metodo: null, model: 'AgrupaTipoPagamento', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Estoque', tipo: null, metodo: null, model: 'Estoque', icone: null, disabled: null });
            //$scope.state.configs.push({ modelPai: 'Estoque', show: true, titulo: 'Exibir estoque dos produtos', tipo: 'checkbox', metodo: null, model: 'ExibeEstoqueVenda', icone: null, disabled: 'GerenteConfigura' });

            $scope.state.configs.push({ modelPai: 'Estoque', show: true, titulo: 'Exibir em quantidade', tipo: 'checkbox', metodo: null, model: 'ExibeQtdeEstoqueVenda', icone: null, disabled: 'GerenteConfigura' });
            $scope.state.configs.push({ modelPai: 'Estoque', show: true, titulo: 'Exibir em cores', tipo: 'checkbox', metodo: null, model: 'ExibeEstoqueCor', icone: null, disabled: 'GerenteConfigura' });

            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Tipo de Código do Cliente', tipo: null, metodo: null, model: 'GroupSequenciaCliente', icone: null, disabled: null });
            $scope.state.configs.push({
                modelPai: 'GroupSequenciaCliente', show: true, titulo: 'Tipo Código Cliente', tipo: 'radio', metodo: null, model: 'SequenciaCliente', icone: null, disabled: 'GerenteConfigura',
                opcoes: [
                    { titulo: 'RG', valor: 'R' },
                    { titulo: 'CPF', valor: 'C' },
                    { titulo: 'Sequencial', valor: 'S' }]
            });
            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Tipo de arredondamento utilizado na NFE', tipo: null, metodo: null, model: 'GroupTipoArredondamentoNFE', icone: null, disabled: null });
            $scope.state.configs.push({
                modelPai: 'GroupTipoArredondamentoNFE', show: true, titulo: 'Tipo de arredondamento utilizado na NFE', tipo: 'radio', metodo: null, model: 'TipoArredondamentoNFE', icone: null, disabled: 'GerenteConfigura',
                opcoes: [
                    { titulo: 'Arredondamento por valor mais próximo', valor: '0' },
                    { titulo: 'Arredondamento por sobras acumuladas de numeros fracionários', valor: '1' }]
            });
            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Tipo Impressão slip de pre-troca', tipo: null, metodo: null, model: 'GroupImprimeTroca', icone: null, disabled: null });
            $scope.state.configs.push({
                modelPai: 'GroupImprimeTroca', show: true, titulo: 'Tipo Impressão slip de pre-troca', tipo: 'radio', metodo: null, model: 'ImprimeTroca', icone: null, disabled: 'GerenteConfigura', opcoes: [
                    { titulo: 'Não Imprime', valor: '0' },
                    { titulo: 'Imprime por pedido', valor: '1' },
                    { titulo: 'Imprime por item', valor: '2' }]
            });
            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Finalização de pedido', tipo: null, metodo: null, model: 'GroupItemReserva', icone: null, disabled: null });
            $scope.state.configs.push({
                modelPai: 'GroupItemReserva', show: $scope.$parent.config.UsaSAD && $scope.$parent.config.UsaPOS, titulo: 'Finalização de pedido', tipo: 'radio', metodo: null, model: 'ItemReserva', icone: null, disabled: 'GerenteConfigura', opcoes: [
                    { titulo: 'Envio automático ao sefaz', valor: '0' },
                    { titulo: 'Reserva de itens habilitada por padrão', valor: '1' },
                    { titulo: 'Envia ao sefaz por padrão', valor: '2' }]
            });
            $scope.state.configs.push({ modelPai: null, show: true, titulo: 'Tipo Processo Troca', tipo: null, metodo: null, model: 'GroupTipoProcessoTroca', icone: null, disabled: null });
            $scope.state.configs.push({
                modelPai: 'GroupTipoProcessoTroca', show: true, titulo: 'Tipo Processo Troca', tipo: 'radio', metodo: null, model: 'TipoProcessoTroca', icone: null, disabled: 'GerenteConfigura', opcoes: [
                    { titulo: 'Desabilitada referencia', valor: '0' },
                    { titulo: 'Ticket origem obrigatorio', valor: '1' },
                    { titulo: 'ticket origem opcional, cpf obrigatorio', valor: '2' },
                    { titulo: 'CPF e TICKET nao obrigatorio', valor: '3' },]
            });
        }
        $scope.administradoras = [];
        $scope.getAllAdministradora = function () {
            entidadeAuxiliarService
                .getAllAdministradora()
                .then(
                    function (response) {

                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else {
                            angular.copy(angular.fromJson(response.Data), $scope.administradoras);
                        }
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };
        $scope.toggleModalLancamento = function () {
            if (!$scope.state.start) {
                initializeAutorizacaoMovimentacao();
                $scope.state.start = true;
            }
            $scope.state.showModalLancamento = !$scope.state.showModalLancamento;
        }

        $scope.filterWithIdMenuPai = function (item) {
            return (item.modelPai == null);
        };

        $scope.filterParameter = function (item) {
            return !$scope.state.filtro || $scope.state.filtro == "" || item.titulo.toUpperCase().indexOf($scope.state.filtro.toUpperCase()) >= 0;
        };

        $scope.filterByTerminal = function (item) {
            return !state.terminal.filtro.chaves || state.terminal.filtro.chaves == "" || item.titulo.toUpperCase().indexOf(state.terminal.filtro.chaves.toUpperCase()) >= 0;
        };


        $scope.toggleModalPagamento = function () {
            $scope.state.showModalCredito = false;
            $scope.state.showModalPagamento = !$scope.state.showModalPagamento;
            $scope.getAllTipoPagamento();
            $scope.getAllCondicaoPagamento();
        }

        $scope.toggleModalCredito = function () {
            $scope.state.showModalCredito = !$scope.state.showModalCredito;
            $scope.state.showModalPagamento = !$scope.state.showModalPagamento;
            $scope.getAllTipoPagamento();
            $scope.getAllCondicaoPagamento();
        }

        $scope.initialize = function () {
            debugger
            $scope.refresh();
            $scope.getAllAdministradora();
        };

        $scope.historyBack = function () {
            $window.history.back();
        }
        $scope.loadGetPromocao = false;
        $scope.updatePromocao = function () {
            $scope.loadGetPromocao = true;
            motorPromocaoService.Sync().then(function (data) {
                $scope.loadGetPromocao = false;
                $scope.$parent.toastr.success('Promoções sincronizadas com sucesso');
            }, function (error) {
                $scope.loadGetPromocao = false;
                $scope.$parent.toastr.error("Erro ao sincronizar promocões");
            });
        };
        $scope.dataFormatada = new Date()
        function convertDate(str) {
            var ano = parseInt(str.substring(0, 4)); 
            var mes = parseInt(str.substring(5, 7)) - 1; 
            var dia = parseInt(str.substring(8, 10));

            var data = new Date(ano, mes, dia);

            return data
        }
        $scope.get = function () {
            setTimeout(function () {
                $scope.$parent.getConfig(function () {
                    angular.copy($scope.$parent.config, $scope.state.data);
                    $scope.changecover = $scope.state.data.StatusImagemCover;
                    $scope.initalizeArrayConfig();
                    setTimeout(function () {
                        $scope.dataFormatada = convertDate($scope.state.data.InicioReformaTributaria);
                    }, 0);
                    

                });
            }, 50)

        };

        $scope.getParametroLoja = function (parametro) {
            configService.getParametroLoja(parametro).then(function (data) {
                var parametro = data.Data;


                if (!parametro)
                    parametro = {}
                $scope.state.parametroLoja[parametro.Parametro] = parametro;
            }, function (error) {
                $scope.$parent.toastr.error(error);
            });
        };

        //changeValue = function (value) {
        //    if (value == true)
        //        $scope.state.data.ExibeQtdeEstoqueVenda = true;
        //}
        var initializeAutorizacaoMovimentacao = function () {
            $scope.state.tiposLancamentoCaixaAutorizacao = $.parseJSON($scope.state.data.AutorizaMovimentacao);
            getFormat($scope.state.tiposLancamentoCaixaAutorizacao);


            for (var i = 0; i < $scope.state.tiposLancamentoCaixaAutorizacao.length; i++) {
                var item = $scope.state.tiposLancamentoCaixaAutorizacao[i];

                var hasItem = $.grep($scope.state.tiposLancamentoCaixa.data, function (gp) {
                    return gp.Codigo == item.Codigo;
                });

                var index = $scope.state.tiposLancamentoCaixa.data.indexOf((hasItem && hasItem.length > 0 ? hasItem[0] : {}));

                $scope.state.tiposLancamentoCaixa.data.splice(index, 1);
            }
        }

        $scope.getFormasPGTO = function () {
            configService.GetAllFormasPGTO().then
                (
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.FormasPgto);
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );

        };

        $scope.UpdateStatusFormaPgto = function (codigo, statusnfe) {
            configService.UpdateStatusFormaPGTO(codigo, statusnfe).then
                (
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else {
                            $scope.getFormasPGTO();
                        }
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );

        };

        $scope.getAllTerminal = function () {
            $scope.state.terminal.carregando = true;
            $scope.state.terminal.vazio = false;
            entidadeAuxiliarService
                .getAllTerminal()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.terminal.data);
                        $scope.state.terminal.carregando = false;
                        $scope.state.terminal.vazio = !(response.Data && response.Data.length > 0);
                        $scope.GetValorCookie();
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        };
        $scope.getAllOperacaoVenda = function () {
            entidadeAuxiliarService
                .getOperacoesVendaValida()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.operacaoVenda);
                    },
                    function (error) { $scope.$parent.toastr.error(error, "Serviço"); }
                );
        };
        $scope.getAllVendedor = function () {
            entidadeAuxiliarService
                .getAllVendedor()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.vendedor);
                    },
                    function (error) { $scope.$parent.toastr.error(error, "Serviço"); }
                );
        };
        $scope.getAllLoja = function () {
            entidadeAuxiliarService
                .getAllFilial()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.loja);
                    },
                    function (error) { $scope.$parent.toastr.error(error, "Serviço"); }
                );
        };
        $scope.getAllCorTema = function () {
            configService
                .getAllCorTema()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.corTema);
                    },
                    function (error) { $scope.$parent.toastr.error(error, "Serviço"); }
                );
        }

        $scope.getAllMigrateCRT = function () {
            entidadeAuxiliarService
                .getAllMigrateCRT()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.migrateCRT);
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        };

        $scope.getSeriesParametro = function () {
            notaFiscalService
                .getSeriesParametro()
                .then(
                    function (response) {
                        $scope.seriesValidas = response;
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        };

        $scope.getAllMigrateTipoAmbiente = function () {
            entidadeAuxiliarService
                .getAllMigrateTipoAmbiente()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.migrateTipoAmbiente);
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        };
        $scope.getAllMigrateEncontrarImpressora = function () {
            entidadeAuxiliarService
                .getAllMigrateEncontrarImpressora()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.migrateEncontrarImpressora);
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        };
        $scope.getAllMigrateImpressaoCompleta = function () {
            entidadeAuxiliarService
                .getAllMigrateImpressaoCompleta()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.migrateImpressaoCompleta);
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        };
        $scope.getAllMigrateMarcaImpressora = function () {
            entidadeAuxiliarService
                .getAllMigrateMarcaImpressora()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.migrateMarcaImpressora);
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        };
        $scope.getAllMigratecRegTribISSQN = function () {
            entidadeAuxiliarService
                .getAllMigratecRegTribISSQN()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.migratecRegTribISSQN);
                    },
                    function (error) { $scope.$parent.toastr.error(error); }
                );
        };
        $scope.getAllTipoLancamentoCaixa = function () {
            entidadeAuxiliarService
                .getAllTipoLancamentoCaixa()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.tiposLancamentoCaixa.data);
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Serviço'); }
                );
        };
        $scope.getMigrateCRT = function (val) {
            return ($.grep($scope.state.migrateCRT, function (e) { return e.ID == val; }))[0];
        };
        $scope.getMigrateTipoAmbiente = function (val) {
            return ($.grep($scope.state.migrateTipoAmbiente, function (e) { return e.ID == val; }))[0];
        };
        $scope.getMigrateEncontrarImpressora = function (val) {
            return ($.grep($scope.state.migrateEncontrarImpressora, function (e) { return e.ID == val; }))[0];
        };
        $scope.getMigrateImpressaoCompleta = function (val) {
            return ($.grep($scope.state.migrateImpressaoCompleta, function (e) { return e.ID == val; }))[0];
        };
        $scope.getMigrateMarcaImpressora = function (val) {
            return ($.grep($scope.state.migrateMarcaImpressora, function (e) { return e.ID == val; }))[0];
        };
        $scope.getMigratecRegTribISSQN = function (val) {
            return ($.grep($scope.state.migratecRegTribISSQN, function (e) { return e.ID == val; }))[0];
        };

        $scope.setTema = function (tema) {
            $scope.state.data.Tema = tema;
            $scope.changeStyles();
        };

        $scope.hasChanges = function () {
            return !angular.equals($scope.state.data, $scope.$parent.config);
        };

        $scope.ipsCadastrados = [];


        $scope.setIPsCadastrados = function () {

            if ($scope.ipsCadastrados.length <= 0) {
                for (var i = 0; i < $scope.state.terminal.data.length; i++) {
                    $scope.ipsCadastrados.push($scope.state.terminal.data[i].IP);
                }
            }
        }


        var validarIP = function (indice) {

            var deferred = $q.defer();
            var ipAnterior = $scope.ipsCadastrados[indice];
            var ipDigitado = $scope.state.terminal.data[indice].IP;

            if (ipAnterior != ipDigitado) {

                var ipJaCadastrado = false;
                for (var i = 0; i <= $scope.ipsCadastrados.length; i++) {
                    if ($scope.ipsCadastrados[i] == ipDigitado) {
                        ipJaCadastrado = true;
                        break;
                    }
                }

                if (ipJaCadastrado && ipDigitado != "") {
                    $scope.$parent.toastr.error('IP já cadastrado.');
                    $scope.state.terminal.data[indice].IP = ipAnterior;
                    deferred.resolve(true);
                }
                else {
                    $scope.ipsCadastrados = $scope.ipsCadastrados.filter(function (item, index) {
                        return index != indice;
                    });

                    $scope.ipsCadastrados[indice] = ipDigitado;
                    deferred.resolve(false);
                }

            }
            else
                deferred.resolve(false);

            return deferred.promise;
        }

        $scope.ipExistente = false;

        $scope.changeTerminalIP = function (i) {
            ;
            validarIP(i).then(function (result) {

                $scope.ipExistente = result;

                if (!$scope.ipExistente) {
                    configService
                        .saveTerminal($scope.state.terminal.data[i])
                        .then(
                            function (response) {
                                ;
                                if (response.Status < 0) {
                                    $scope.$parent.toastr.error(response.Message, "Serviço");
                                    console.error(response.Exception);
                                }
                                else {
                                    $scope.state.terminal.data[i] = response.Data;

                                    if ($scope.$parent.config.Terminal.IP == response.Data.IP) {
                                        $scope.$parent.config.Terminal.Codigo = response.Data.Codigo;
                                        $scope.state.data.Terminal.Codigo = response.Data.Codigo;
                                    }

                                    $scope.$parent.toastr.info('Terminal alterado com êxito.');
                                }
                            },
                            function (error) {
                                $scope.$parent.toastr.error('Ao gravar o terminal', "Comunicação com o servidor");
                                console.error(error);
                            });
                }
            });
        }

        $scope.save = function () {
            // Se tiver o IP em outro terminal não tem o porque executar o save.
            if (!$scope.ipExistente) {

                //verifica se alterou o status coverimagem para reload da pagina
                var status = ($scope.state.data.StatusImagemCover == $scope.changecover)
                configService
                    .save($scope.state.data)
                    .then(
                        function (response) {
                            if (response.Status < 0)
                                $scope.$parent.toastr.error(response.Message, "Serviço");
                            else {
                                $scope.refresh();
                                $scope.$parent.toastr.info('Configurações salvas com êxito.');


                                if (!status) {
                                    $timeout(function () {
                                        window.location.reload();
                                    }, 1000);
                                }
                            }
                        },
                        function (error) { $scope.$parent.toastr.error(error, "Serviço"); }
                    );
            }
        };

        $scope.saveParametroLoja = function (valor, nome) {
            var parametro = { ValorAtual: valor, Parametro: nome };

            configService.saveParametroLoja(parametro).then(function (data) {
                $scope.$parent.toastr.success("Parâmetro atualizado com sucesso");
            }, function (error) {
                $scope.$parent.toastr.error(error, "Serviço");
            });

        }



        $scope.savePgto = function () {
            entidadeAuxiliarService
                .savePagamentos($scope.auxiliar.condicaoPagamento.data, $scope.auxiliar.tipoPagamento.data)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else {
                            $scope.toggleModalPagamento();
                            $confirm({ text: "Opções de pagamento salvas com sucesso!" });
                        }

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

        $scope.discardChanges = function () {
            angular.copy($scope.$parent.config, $scope.state.data);
            $scope.changeStyles();
        };


        $scope.upload = function (files) {
            if (files && files.length) {
                for (var i = 0; i < files.length; i++) {
                    var file = files[i];
                    if (!file.$error) {
                        Upload
                            .upload({ url: '/config/upload', data: { 'username': '', file: file } })
                            .then(
                                function (response) {
                                    if (response.Status < 0)
                                        $scope.$parent.toastr.error(response.Data, 'Serviço de upload');
                                    else {
                                        angular.copy(angular.fromJson(response), $scope.state.imagem.data);

                                        /*begin refresh usando ng-if*/
                                        $scope.$parent.cacheVersion.setNew();
                                        $scope.state.imagem.visible = false;
                                        $timeout(function () { $scope.state.imagem.visible = true; });

                                        /*end refresh*/
                                    }
                                },
                                null,
                                function (event) { $scope.state.imagem.progressPercentage = parseInt(100.0 * event.loaded / event.total); }
                            );
                    }
                }
            }
        };

        $scope.lookupCliente = function (val) {
            return $q.when(
                clienteService
                    .GetTopCliente(val)
                    .then(function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            return response.Data;
                    }));
        };

        $scope.limparCliente = function () {
            $scope.state.data.ClientePadraoCodigo = null;
            $scope.state.data.ClientePadraoNome = null;
        }

        $scope.selectCliente = function (val) {

            $scope.state.data.ClientePadraoCodigo = val.Codigo;
        };

        $scope.refresh = function () {
            $scope.get();
            $scope.getAllMigrateCRT();
            $scope.getAllMigrateTipoAmbiente();
            $scope.getAllMigrateEncontrarImpressora();
            $scope.getAllMigrateImpressaoCompleta();
            $scope.getAllMigrateMarcaImpressora();
            $scope.getAllMigratecRegTribISSQN();
            $scope.getAllTerminal();
            $scope.getAllOperacaoVenda();
            $scope.getAllVendedor();
            $scope.getAllLoja();
            $scope.getAllCorTema();
            $scope.getFormasPGTO();
            $scope.getAllExcecoes();
            $scope.getAllTipoLancamentoCaixa();
            $scope.getAllTipoPagamento();
            $scope.getAllCondicaoPagamento();
            $scope.getSeriesParametro();
            $scope.getAllSerie();
            $scope.getAllNaturezasSaida();
            $scope.getParametroLoja("SeriePadrao");
            $scope.getParametroLoja("NaturezaPadrao");
        };

        $scope.getAllSerie = function () {
            entidadeAuxiliarService.getAllSerie().then(
                function (data) {
                    $scope.state.series = data.Data;
                }, function (error) {
                    $scope.$parent.toastr.error(error);
                });
        };
        $scope.getAllNaturezasSaida = function () {
            saidaService
                .getNaturezas()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.state.naturezas = response.Data;
                        }

                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
        }
        $scope.changeStyles = function () {
            /* atualiza o tema dinamicamente de acordo com o selecionado */
            $('link[rel="stylesheet"][href*=site]').each(function () {
                this.href = '/content/css/' + $scope.state.data.Tema + '.css';
            });
        };

        $scope.$watch('state.data.HabilitaLogo', function () {
            if (!$scope.state.data.HabilitaLogo) {
                $scope.state.data.HabilitaPosicaoLogo = false;
            }
            //else {
            //    $scope.p_classe = 'b2';
            //}
        });

        //$scope.$watch('state.data.HabilitaPosicaoLogo', function () {
        //    if ($scope.state.data.HabilitaPosicaoLogo) {
        //        if ($scope.state.data.PosicaoLogo == null) {
        //            $scope.p_classe = 'b2';
        //        }
        //        else {
        //            $scope.p_classe = $scope.state.data.PosicaoLogo;
        //        }
        //    }
        //    //else {
        //    //    $scope.state.data.PosicaoLogo = $scope.p_classe = 'b2';
        //    //}
        //});

        $scope.$watch('state.data.AlteraVendedor', function () {
            if (!$scope.state.data.AlteraVendedor) {
                $scope.state.data.MultiplosVendedores = false;
                $scope.state.data.AlteraVendedorVendaRetroativa = false;
            }
        });

        $scope.$watch('state.data.SequenciaCliente', function () {
            if ($scope.state.data.SequenciaCliente == 'C' && !$scope.state.data.CadastroCPFObrigatorio) {
                $scope.state.data.CadastroCPFObrigatorio = true;
            }
        });

        $scope.$watch('state.data.CadastroCPFObrigatorio', function () {
            if ($scope.state.data.CadastroCPFObrigatorio == true && $scope.state.data.SequenciaCliente != 'C') {
                $scope.state.data.SequenciaCliente = 'C';
            }
            if ($scope.state.data.CadastroCPFObrigatorio == false && $scope.state.data.SequenciaCliente == 'C') {
                $scope.state.data.SequenciaCliente = 'S'
            }
        });

        $scope.$watch('state.imagem.files', function () {
            $scope.upload($scope.state.imagem.files);
        });

        $scope.$watch('state.imagem.files', function () {
            $scope.upload($scope.state.imagem.files);
        });

        $scope.configurar = function (item, index) {
            $scope.state.indexItem = index;
            configService.getAllTiposTerminal().then(function (response) {
                if (response.Status < 0)
                    $scope.$parent.toastr.error(response.Message, "Serviço");
                else {
                    angular.copy(angular.fromJson(response.Data), $scope.state.tiposTerminal);
                    $scope.state.currentItem = 1;
                    $scope.state.item = item;
                    setCheckBox();
                }
            },
                function (error) {
                    $scope.$parent.toastr.error(error);
                });
        };

        $scope.saveConfigurar = function () {

            getCheckBox();
            $scope.changeTerminalIP($scope.state.indexItem);
            $scope.state.currentItem = -1;
        }

        $scope.saveAutorizacaoMovimentacao = function (tipo) {
            if (!tipo)
                return;

            var hasItem = $.grep($scope.state.tiposLancamentoCaixa.data, function (item) {
                return item.Codigo == tipo.Codigo;
            });

            if (hasItem && hasItem.length > 0) {
                var index = $scope.state.tiposLancamentoCaixa.data.indexOf(hasItem[0]);
                $scope.state.tiposLancamentoCaixaAutorizacao.push(tipo);
                $scope.state.tiposLancamentoCaixa.data.splice(index, 1);
            }

            $scope.state.data.AutorizaMovimentacao = saveFormat($scope.state.tiposLancamentoCaixaAutorizacao);
        }

        $scope.removeAutorizacaoMovimentacao = function (tipo) {
            var index = $scope.state.tiposLancamentoCaixaAutorizacao.indexOf(tipo);
            $scope.state.tiposLancamentoCaixa.data.push(tipo);
            $scope.state.tiposLancamentoCaixaAutorizacao.splice(index, 1);

            $scope.state.data.AutorizaMovimentacao = saveFormat($scope.state.tiposLancamentoCaixaAutorizacao);
        }

        var saveFormat = function (array) {
            var returnValue = [];

            for (var i = 0; i < array.length; i++)
                returnValue.push(array[i].Codigo);

            return JSON.stringify(returnValue);
        }

        var getFormat = function (array) {
            var returnValue = [];
            var arrayAux = [];
            angular.copy(array, arrayAux);

            for (var i = 0; i < arrayAux.length; i++) {
                var hasItem = $.grep($scope.state.tiposLancamentoCaixa.data, function (gp) {
                    return gp.Codigo == arrayAux[i];
                });

                if (hasItem && hasItem.length > 0) {
                    returnValue.push(hasItem[0]);
                    array.splice(i, 1);
                }

            }

            $scope.state.tiposLancamentoCaixaAutorizacao = returnValue;
        }


        var setCheckBox = function (item) {
            for (var i = 0; i < $scope.state.item.TiposTerminal.length; i++) {
                var codigo = $scope.state.item.TiposTerminal[i].Codigo;
                var hasItem = $.grep($scope.state.tiposTerminal, function (e) { return e.Codigo == codigo; })

                if (hasItem && hasItem.length > 0)
                    hasItem[0].Checked = true;
            }
        };

        var getCheckBox = function () {
            $scope.state.item.TiposTerminal = [];
            for (var i = 0; i < $scope.state.tiposTerminal.length; i++) {
                if ($scope.state.tiposTerminal[i].Checked)
                    $scope.state.item.TiposTerminal.push($scope.state.tiposTerminal[i]);
            }
        };

        $scope.clearAll = function () {
            for (var i = $scope.state.tiposLancamentoCaixaAutorizacao.length - 1; i >= 0; i--) {
                var item = $scope.state.tiposLancamentoCaixaAutorizacao[i];
                $scope.removeAutorizacaoMovimentacao(item);
            }
        };

        $scope.getAllTipoPagamento = function () {
            entidadeAuxiliarService
                .getAllTipoPagamento()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.unmodified.tipo);
                        angular.copy(angular.fromJson(response.Data), $scope.auxiliar.tipoPagamento.data);
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };

        $scope.getAllCondicaoPagamento = function () {
            entidadeAuxiliarService
                .getAllCondicaoPagamento()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else {
                            angular.copy(angular.fromJson(response.Data), $scope.state.unmodified.condicao);
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.condicaoPagamento.data);
                        }

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

        $scope.changeParamGeraNotaSat = function () {
            if (!$scope.state.data.PrioridadeSAT) {
                $confirm({ text: "Ao desmarcar esta opção em caso de indisponibilidade da Sefaz não será possivel emitir notas para as vendas.", title: "Desabilitar", ok: "Sim", cancel: "Não" })
                    .then(function () {
                        $scope.state.data.PrioridadeSAT = false;
                    });
            }
        };

        $scope.setClass = function (a, b) {
            return a && b;
        }

        $scope.filterPgto = function (item) {
            return item.Nome.toUpperCase().indexOf($scope.state.filtro.toUpperCase()) >= 0 || $scope.state.nomeFiltro == "" || ($scope.state.showModalCredito && item.Credito);
        };

        $scope.openAccordion = function () {
            $scope.state.accordion[0] = true;
            $scope.state.accordion[1] = true;
        };

        $scope.initialize();
    }

})();