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

    mSelf.Init = () => {
        mSelf.Modulo.CodigoRDManual(mSelf.Data.DadosOperacao.CodigoRDManual);
        mSelf.Modulo.CodigoSetorRealizado(mSelf.Data.DadosOperacao.CodigoSetorRealizado);
        mSelf.Modulo.OpcoesFuncoes(mSelf.Data.DadosOperacao.OpcoesFuncoes);
        mSelf.Modulo.Homologado(mSelf.Data.Homologado);

        let id = mSelf.Data.Homologado ? '#rbt-homologado-sim' : '#rbt-homologado-nao';
        $('.box-radio .radio-btn').removeClass('radio-btn-selected');
        $(id).addClass('radio-btn-selected');

        let dadosOperacao = mSelf.Modulo.DadosOperacao();
        let apontamentosRD = mSelf.Modulo.ApontamentosRD();

        dadosOperacao.OperacoesSelecionada(mSelf.Data.DadosOperacao.Operacao);
        dadosOperacao.MacroSelecionada(mSelf.Data.DadosOperacao.Macro);
        dadosOperacao.VeiculoSelecionada(mSelf.Data.DadosOperacao.Veiculo);
        dadosOperacao.DataExecucao(mSelf.Data.DadosOperacao.DataExecucao);
        dadosOperacao.Turno(mSelf.Data.DadosOperacao.Turno);
        dadosOperacao.CodigoTurno(mSelf.Data.DadosOperacao.CodigoTurno);

        $('.rd-code')[0].innerText = `RD - ${mSelf.Data.DadosOperacao.Controle}`;
        dadosOperacao.ControleValue(mSelf.Data.DadosOperacao.Controle);

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

            let pai = null

            ko.utils.arrayForEach(funcao.ListaApontamentos, (ap) => {
                if (ap.Pai == true) {
                    pai = mSelf.Adicionar(item, ap);
                } else {
                    mSelf.AdicionarNivelInterno(item, ap, pai);
                }
            });
        });

        apontamentosRD.ValidaOrdemCronologica();
        apontamentosRD.CalculoHodometro();
        apontamentosRD.Init();

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

    mSelf.Adicionar = (funcao, ap) => {
        let conf = ko.utils.arrayFirst(mSelf.Modulo.Configuracoes, (item) => mSelf.Modulo.DadosOperacao().MacroSelecionada().Codigo == item.CodigoMacro);
        let id = `${funcao.Id}apt${funcao.IdProximo}`;
        
        let item = {
            Id: id,
            Codigo: ap.Codigo,
            Campo: ap.Campo,
            ValorValido: ko.observable(ap.ValorValido),
            ValoresValidos: ko.observableArray(ap.ValorValido ? ap.ValoresValidos : []),
            OpcoesApontamentos: ap.OpcoesApontamentos,
            ValorValidoSelecionado: ko.observable(ap.ValorValido ? ap.ValorValidoSelecionado : ''),
            NomeValorValidoSelecionado: ko.observable(ap.ValorValido ? ap.ValorValidoSelecionado.Descricao : 'SELECIONE'),
            Valor: ko.observable(ap.Valor),
            Data: ko.observable(ap.Data),
            Hora: ko.observable(ap.Hora),
            Hodometro: ko.observable(ap.Hodometro),
            Horimetro: ko.observable(ap.HorimetroFormatado),
            HodometroDisplay: ko.observable(ap.HodometroDisplay),
            Distancia: ko.observable(''),
            Duracao: ko.observable(''),
            Mesclado: false,
            Funcao: funcao,
            Index: 0,
            Class: ko.observable(''),
            Pai: null,
            ClassGroup: ko.observable(''),
            NivelInterno: false,
            RDEmEdicao: ko.observable(false),
            RDEmEdicaoValidacao: {
                DataHora: ko.observable(false),
                Hodometro: ko.observable(false),
                Horimetro: ko.observable(false)
            },
            Posicao: ap.Posicao,
            Status: ap.Status,
            IsSetor: (conf && conf.Setor == ap.Campo ? true : false)
        };

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

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

    mSelf.AdicionarNivelInterno = (funcao, ap, linha) => {
        let conf = ko.utils.arrayFirst(mSelf.Modulo.Configuracoes, (item) => {
            return mSelf.Modulo.DadosOperacao().MacroSelecionada().Codigo == item.CodigoMacro;
        });
        let id = `${funcao.Id}apt${funcao.IdProximo}`;
        let item = {
            Id: id,
            Codigo: ap.Codigo,
            Campo: ap.Campo,
            ValorValido: ko.observable(ap.ValorValido),
            ValoresValidos: ko.observableArray(ap.ValorValido ? ap.ValoresValidos : []),
            OpcoesApontamentos: ap.OpcoesApontamentos,
            ValorValidoSelecionado: ap.ValorValido ? ap.ValorValidoSelecionado : '',
            NomeValorValidoSelecionado: (ap.ValorValido ? ap.ValorValidoSelecionado.Descricao : 'SELECIONE'),
            Valor: ko.observable(ap.Valor),
            Data: ko.observable(ap.Data),
            Hora: ko.observable(ap.Hora),
            Hodometro: ko.observable(ap.Hodometro),
            Horimetro: ko.observable(ap.HorimetroFormatado),
            HodometroDisplay: ko.observable(ap.HodometroDisplay),
            Distancia: ko.observable(''),
            Duracao: ko.observable(''),
            Mesclado: true,
            Funcao: funcao,
            Index: 0,
            Class: ko.observable(''),
            Pai: (linha.Pai != null ? linha.Pai : linha.Id),
            ClassGroup: ko.observable(''),
            NivelInterno: true,
            RDEmEdicao: ko.observable(false),
            RDEmEdicaoValidacao: {
                DataHora: ko.observable(false),
                Hodometro: ko.observable(false),
                Horimetro: ko.observable(false)
            },
            Posicao: ap.Posicao,
            Status: ap.Status,
            IsSetor: (conf && conf.Setor == ap.Campo ? true : false)
        };

        let l = funcao.ListaApontamentos.indexOf(linha) + 1;

        while (funcao.ListaApontamentos()[l]) l++;

        funcao.ListaApontamentos.push(item);
        linha.Mesclado = true;
        mSelf.Modulo.ApontamentosRD().Registrar(funcao, id);
        mSelf.Modulo.ApontamentosRD().RegistrarEvento(id);

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

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

    mSelf.AdicionarFuncao = (nomeFuncao, OpcoesApontamentos) => {
        mSelf.Modulo.ListaFuncoes.push({
            Id: mSelf.Modulo.IdProximo(),
            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();
}