function CarregarModeloRD(modulo, data) {
    let mSelf = this;
    mSelf.Data = data;
    mSelf.Modulo = modulo;

    mSelf.Init = () => {
        let dadosOperacao = mSelf.Modulo.DadosOperacao();

        dadosOperacao.SetNomeModelo(mSelf.Data.Descricao);

        dadosOperacao.SelecionarOperacao(mSelf.Data.DadosOperacao.Operacao, null, () =>
            dadosOperacao.SelecionarMacro(mSelf.Data.DadosOperacao.Macro, null, () => {
                mSelf.Modulo.OpcoesFuncoes(mSelf.Data.DadosOperacao.OpcoesFuncoes);

                ko.utils.arrayForEach(mSelf.Data.Funcoes, (funcao) => {
                    let item = mSelf.AdicionarFuncao(funcao.Codigo, funcao.Descricao, funcao.OpcoesApontamentos);
                    item = mSelf.SelecionarFuncao(funcao, null, item);

                    ko.utils.arrayForEach(funcao.ListaAptosFilhos, (ap) => mSelf.Adicionar(item, ap));
                });

                $('.loading-div-edicao').fadeOut();
            })
        );
    };

    mSelf.Adicionar = (data, ap, index) => {
        let conf = ko.utils.arrayFirst(mSelf.Modulo.Configuracoes, (item) => mSelf.Modulo.DadosOperacao().MacroSelecionada().Codigo == item.CodigoMacro);
        let id = `${data.Id}apt${data.IdProximo}`;

        const isUpdate = index !== undefined && index !== null;
        const opcoesApontamentos = isUpdate ? data.ListaApontamentos()[index].OpcoesApontamentos : ap.OpcoesApontamentos;

        const valorValidoSelecionado = ap.ValorValido && ap.PosicaoValorValidoSelecionado ?
            ap.OpcoesApontamentosFilhos.find(x => x.Posicao === ap.PosicaoValorValidoSelecionado) : ''

        let item = {
            Id: id,
            Codigo: ap.Codigo,
            Campo: ap.Descricao,
            ValorValido: ko.observable(ap.ValorValido),
            ValoresValidos: ko.observableArray(ap.ValorValido ? ap.OpcoesApontamentosFilhos : []),
            OpcoesApontamentos: opcoesApontamentos,
            ValorValidoSelecionado: valorValidoSelecionado,
            NomeValorValidoSelecionado: valorValidoSelecionado ? valorValidoSelecionado.Descricao : 'SELECIONE',
            Valor: ko.observable(''),
            Data: ko.observable(''),
            Hora: ko.observable(''),
            Distancia: ko.observable(''),
            Duracao: ko.observable(''),
            Mesclado: false,
            Funcao: data,
            Index: 0,
            Class: ko.observable(''),
            Pai: null,
            ClassGroup: ko.observable(''),
            NivelInterno: false,
            RDEmEdicao: ko.observable(false),
            RDEmEdicaoValidacao: {
                DataHora: ko.observable(false),
            },
            Posicao: ap.Posicao,
            Status: ap.Status,
            IsSetor: (conf && conf.Setor == ap.Campo ? true : false)
        };

        if (!isUpdate) {
            data.ListaApontamentos.push(item);
        } else {
            data.ListaApontamentos()[index] = item;
        }

        let apontamento = ko.utils.arrayFirst(data.ListaApontamentos(), (f) => f.Id == id);
        mSelf.Modulo.ApontamentosRD().Registrar(data, id);

        RegistrarCombobox(`ComboValorApontamento${id}`);
        return apontamento;
    };


    mSelf.SelecionarFuncao = (data, evt, obj) => {
        obj.NomeFuncao = data.NomeFuncao;
        obj.CodigoMacroFuncao = data.CodigoMacroFuncao;
        obj.Posicao = data.Posicao;
        obj.Visivel(true);

        return obj;
    };

    mSelf.AdicionarFuncao = (codigo, nomeFuncao, OpcoesApontamentos) => {
        mSelf.Modulo.ListaFuncoes.push({
            Id: mSelf.Modulo.IdProximo(),
            Codigo: codigo,
            NomeFuncao: nomeFuncao,
            CodigoMacroFuncao: 0,
            Posicao: 0,
            ListaApontamentos: ko.observableArray([]),
            IdProximo: 1,
            OpcoesApontamentos: OpcoesApontamentos,
            Visivel: ko.observable(false)
        });

        RegistrarCombobox(`ComboFuncao${mSelf.Modulo.IdProximo()}`);
        let item = ko.utils.arrayFirst(mSelf.Modulo.ListaFuncoes(), (f) => f.Id == mSelf.Modulo.IdProximo());
        mSelf.Modulo.IdProximo(mSelf.Modulo.IdProximo() + 1);
        return item;
    };

    mSelf.Init();

}