function BairroViewModel(data, codigoRegiao, codigoMacroSetor) {
    var mSelf = this;

    mSelf.Codigo = new ko.observable(data.Codigo());
    mSelf.CodigoGrupo = new ko.observable(data.CodigoGrupo());
    mSelf.CodigoRegiao = new ko.observable(codigoRegiao);
    mSelf.Descricao = new ko.observable(data.Descricao());
    mSelf.CodigoMacroSetor = new ko.observable(codigoMacroSetor);
    mSelf.CodigoSetor = new ko.observable(data.CodigoSetor());

    mSelf.QuantidadeDemandasBairro = new ko.observable(data.Demandas() == null ? 0 : data.Demandas().length);

    mSelf.QuantidadeDiasSemTarefa = new ko.observable(data.QuantidadeDiasSemTarefa());

    mSelf.QuantidadeTarefasBairro = new ko.observable(data.QuantidadeTarefasBairro());

    mSelf.QuantidadeDemandaBaixa = new ko.observable(data.PrioridadeBaixa());
    mSelf.QuantidadeDemandaMedia = new ko.observable(data.PrioridadeMedia());
    mSelf.QuantidadeDemandaAlta = new ko.observable(data.PrioridadeAlta());

    mSelf.TiposDemandas = new ko.observable(data.TiposDemandas());

    mSelf.Equipes = new ko.observableArray();

    mSelf.Fiscais = new ko.observableArray();

    mSelf.Tarefas = new ko.observableArray();

    mSelf.TodasTarefasSelecionadas = new ko.observable(false);
    mSelf.MostrarMensagemSelecao = new ko.observable(false);
    mSelf.HabilitaDivAdicionar = new ko.observable(false);

    mSelf.TarefasHabilitadas = ko.computed(function () {
        var tarefas = ko.utils.arrayFilter(mSelf.Tarefas(), function (tar) {
            return (tar.TarefaObj.Codigo() > 0 && tar.TarefaObj.CodigoFiscal() > 0 && !tar.TarefaEnviadaFiscal() && tar.TarefaObj.DataHoraInicio() && tar.TarefaObj.DataHoraFim())
        });

        return tarefas;
    }, this);

    mSelf.TarefasSelecionadas = ko.computed(function () {
        var tarefas = ko.utils.arrayFilter(mSelf.Tarefas(), function (item) {
            return item.Selecionada() && !item.TarefaEnviadaFiscal();
        });

        return tarefas;
    }, this);

    mSelf.BuscarDetalhesBairro = function (tarefaSelecionada) {
        if (!mSelf.Tarefas().length)
            $.ajax({
                url: urlGlobal + "DemandaTarefa/Tarefa/CarregarDetalhesBairro",
                contentType: 'application/json; charset=utf-8',
                dataType: "json",
                type: "GET",
                data: { 'codigoBairro': mSelf.CodigoGrupo(), 'codigoRegiao': mSelf.CodigoRegiao() },
                beforeSend: function () {
                    $(`#loadingTarefa${mSelf.Codigo()}`).show();
                    $(`#itemTarefaWrapper${mSelf.Codigo()}`).hide();
                    $(`#itemTarefaAdicionar${mSelf.Codigo()}`).hide();
                },
                success: function (data) {
                    if (data) {

                        data.Tarefas.forEach(tarefa => {
                            tarefa.ApontamentoTarefas.forEach(apTarefa => apTarefa.Tarefa = null);
                        });

                        var kojs = ko.mapping.fromJS(data);

                        mSelf.Equipes(kojs.Equipes());

                        if (kojs.Tarefas()) {
                            ko.utils.arrayForEach(kojs.Tarefas(), function (tarefa) {

                                mSelf.Tarefas.push(new TarefaViewModel(tarefa));
                            });
                        }

                        if (tarefaSelecionada) {
                            /*adiciona a classe de seleção na nova tarefa*/
                            $("#itemTarefa" + tarefaSelecionada.Codigo()).addClass("background-tarefa-selecionada");
                            vm.Perspectiva.AgendamentoTarefa().TarefaSelecaoAnterior(tarefaSelecionada.Codigo());
                        }
                    }
                }
            }).done(function () {
                $(`#loadingTarefa${mSelf.Codigo()}`).hide();
                $(`#itemTarefaWrapper${mSelf.Codigo()}`).show();
                $(`#itemTarefaAdicionar${mSelf.Codigo()}`).show();
            });
    };

    mSelf.AdicionarTarefa = function () {
        mSelf.Tarefas.push(new TarefaViewModel(null, mSelf.CodigoRegiao(), mSelf.CodigoGrupo()));
    };

    mSelf.SelecionarTodasTarefas = function () {

        ko.utils.arrayForEach(mSelf.Tarefas(), function (tar) {
            if (tar.TarefaObj.Codigo() > 0 && tar.TarefaObj.CodigoFiscal() > 0 && !tar.TarefaEnviadaFiscal() && tar.TarefaObj.DataHoraInicio() && tar.TarefaObj.DataHoraFim())
                tar.Selecionada(mSelf.TodasTarefasSelecionadas());
        });
    };

    /* Envia as tarefas selecionadas para os respectivos fiscais */
    mSelf.EnviarTarefas = function () {
        var tarefasEnvio = [];

        ko.utils.arrayForEach(mSelf.Tarefas(), function (tarefa) {
            if (tarefa.Selecionada() && !tarefa.TarefaEnviadaFiscal() && tarefa.TarefaObj.CodigoFiscal() > 0)
                tarefasEnvio.push(tarefa.TarefaObj)
        });

        /*Desabilita o botão de Enviar tarefas*/
        //mSelf.HabilitaDivAdicionar(false);

        if (tarefasEnvio.length > 0) {
            mSelf.MostrarMensagemSelecao(false);
            $.ajax({
                url: urlGlobal + "DemandaTarefa/Tarefa/EnviarTarefas",
                contentType: 'application/json; charset=utf-8',
                dataType: "json",
                type: "POST",
                data: ko.toJSON(tarefasEnvio),
                success: function (data) {
                    if (data) {

                        var result = ko.mapping.fromJS(data);

                        if (!result.Sucesso()) {
                            alert(result.MensagemErro());
                        }

                        var atualizarTarefas = ko.utils.arrayFilter(mSelf.Tarefas(), function (item) {
                            return tarefasEnvio.indexOf(item.TarefaObj) > -1;
                        });

                        ko.utils.arrayForEach(atualizarTarefas, function (tarefa) {
                            vm.Perspectiva.AtualizarTarefa([tarefa.TarefaObj.Codigo()]);
                            tarefa.TarefaEnviadaFiscal(true);
                            tarefa.TarefaObj.StatusAgendamento('T');
                        });

                        vm.Perspectiva.AgendamentoTarefa().MensagemSucesso("Tarefa enviada com sucesso!");
                        $(".barra-alarmeSucesso-modal").show();

                    }

                    /*Habilita o botão de Enviar tarefas*/
                    mSelf.HabilitaDivAdicionar(true);
                }
            });
        } else {
            mSelf.MostrarMensagemSelecao(true);
        }

    }

    /* Salva uma tarefa por vez */
    mSelf.SalvarTarefa = function (tarefaViewModel, evt) {

        mSelf.OcultaBotaoSalvarTarefa(true, evt);

        var tarefa = tarefaViewModel.TarefaObj;

        mSelf.MostrarMensagemSelecao(false);

        if (vm.Perspectiva.TarefasRemovidas().indexOf(tarefa.Codigo()) > -1) {
            mSelf.ExibirMensagemModal("Infelizmente essa tarefa foi excluída!");
        } else {
            var msgErro = "";
            $(".barra-alarme-modal").hide();

            tarefa.CodigoMacroSetor(tarefaViewModel.Bairro().CodigoMacroSetor());
            tarefa.CodigoSetor(tarefaViewModel.Bairro().CodigoSetor());
            var tarefaValida = true;

            if (tarefa.CodigoEquipe() == undefined || tarefa.CodigoEquipe() == 0) {
                msgErro = "Para salvar a tarefa é necessário selecionar uma Equipe.";
                tarefaValida = false;
            }

            //Valida as informações da Tarefa
            if (!tarefa.Codigo() && tarefa.DataHoraInicio() && new Date(tarefa.DataHoraInicio()) < new Date()) {
                msgErro = "A data inicial da tarefa deve ser maior que a data atual.";
                tarefaValida = false;
            }

            if (tarefa.DataHoraFim() && tarefa.DataHoraFim() < tarefa.DataHoraInicio()) {
                msgErro = "A data final deve ser maior que a data inicial.";
                tarefaValida = false;
            }

            if (!tarefa.DataHoraInicio()) {
                msgErro = "A data e a hora inicial devem ser informadas.";
                tarefaValida = false;
            }

            tarefa.StatusAgendamento(tarefa.StatusAgendamento() ? "T" : "F");

            if (tarefaValida) {
                /*Desabilita o botão de Enviar tarefas*/
                mSelf.HabilitaDivAdicionar(false);

                $.ajax({
                    url: urlGlobal + "DemandaTarefa/Tarefa/SalvarTarefa",
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    type: "POST",
                    data: ko.toJSON(tarefa),
                    success: function (data) {
                        if (data) {

                            var result = ko.mapping.fromJS(data);

                            if (result.Sucesso()) {

                                tarefa.Codigo(result.Objeto.Codigo());

                                tarefaViewModel.PermiteSalvarTarefa(false);
                                tarefaViewModel.PermiteRemoverTarefa(true);

                                var tarefasSalvas = ko.utils.arrayFilter(mSelf.Tarefas(), function (item) {
                                    return item.TarefaObj.Codigo() > 0
                                });
                                mSelf.QuantidadeTarefasBairro(tarefasSalvas.length);

                                vm.Perspectiva.AtualizarTarefa([tarefa.Codigo()]);

                                vm.Perspectiva.AgendamentoTarefa().MensagemSucesso("Tarefa salva com sucesso!");

                                $(".barra-alarmeSucesso-modal").show();

                            } else {
                                mSelf.ExibirMensagemModal(result.MensagemErro());
                            }
                        }

                        /*Habilita o botão de Enviar tarefas*/
                        mSelf.HabilitaDivAdicionar(true);
                        mSelf.OcultaBotaoSalvarTarefa(false, evt);
                    }
                });
            } else {
                mSelf.OcultaBotaoSalvarTarefa(false, evt);
                mSelf.ExibirMensagemModal(msgErro);
            }
        }
    };

    mSelf.ExibirMensagemModal = function (msgErro) {
        vm.Perspectiva.AgendamentoTarefa().MensagemErro(msgErro);
        $(".barra-alarme-modal").show();
    };

    mSelf.OcultaBotaoSalvarTarefa = function (ocultar, evt) {

        if (ocultar) {
            $(evt.target.parentElement).addClass('loading-interno-tarefas');
            $(evt.target).addClass('disabledbutton');
        }
        else {
            $(evt.target.parentElement).removeClass("loading-interno-tarefas");
            $(evt.target).removeClass('disabledbutton');
        }
    };
}