function newExcl01020Control(pageName, doctx="[data-doctx='excl01020']") {
    let ctrl = new DatasetControl({
          doctx: doctx
        , prefix: "levyExcl"
        , prefixName: "부과제외"
        , dataGetter: obj => obj["Info"]
        , keys: ["LEVY_EXCL_ID"]
        , urls: {
              create: "/create.do"
            , update: "/update.do"
        }
    });

    /**************************************************************************
     * DatasetControl Events
     **************************************************************************/
    // 현재 선택 자료 변경 이벤트
    ctrl.onCurrentChange = (item) => {
        if (!item) return;

        // 부과제외구분에 따른 부과제외사유 설정
        ctrl.fnSetFim021(item.data.LEVY_EXCL_SE_CD, item.data.LEVY_EXCL_RSN_CD);

        // 업무구분에 따른 URL 변경
        ctrl.urls.create = wctx.url(pageObject[pageName].prefixUrl + "/020/create.do");    // 등록
        ctrl.urls.update = wctx.url(pageObject[pageName].prefixUrl + "/020/update.do");    // 수정

        // 화면에 단속 Dataset 셋팅
        let formFields = new FimsFormFields(ctrl.selector("[name='frmEdit']"));
        formFields.set(ctrl, item);

        if (!item.data.LEVY_EXCL_ID) {
            $(ctrl.find("[name='levyExclYmd']")).datepicker("setDate", TODAY());    // 부과제외 일자
        }
    };

    // 저장 callback
    ctrl.onSave = (params, resp) => {
        let modalId = $(document.querySelector(doctx)).parents(".modal")[0].id;
        let dialogTitle = $("#" + modalId).find("h5.modal-title").html();
        let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);

        // 메시지 출력
        dialog.alert({
              content: showMessage
            , init: () => { AppSupport.setDialogZindex(); }
            , onOK: resp.saved ? undefined : () => { }
            , onClose: () => {
                if (pageObject[pageName].savedCallbackFuncName != "") {
                    pageObject[pageName].savedCallbackFuncName(resp.saved);
                }

                if (resp.saved) { dialog.close(modalId); }
            }
        });
    }

    // 저장
    ctrl.save = (params) => {
        if (!params) return;

        let create = (params.levyExclId == "");

        // 민원 접수 관리에서 호출했다면..
        if (create && pageObject[pageName].saveCallbackFuncName != "") {
            pageObject[pageName].saveCallbackFuncName(info);
        } else {
            ajax.post({
                  url: !create ? ctrl.urls.update : ctrl.urls.create
                , data: params || {}
                , success: (resp) => { ctrl.onSave(params, resp); }
            });
        }
    }

    /**************************************************************************
     * 사용자 함수(function)
     **************************************************************************/
    // 부과제외 구분에 따른 부과제외 사유 코드 설정
    ctrl.fnSetFim021 = (seCode, rsnCode) => {
        let cmnCode = FIM021[seCode];

        $(ctrl.find("[name='levyExclSeCd']")).val(cmnCode.code);
        $(ctrl.find("[name='levyExclSeNm']")).val(cmnCode.value);

        let reasons = FIM022.list().filter(reason => "2" == seCode ? reason.code > "200" : reason.code < "200");
        $(ctrl.find("[name='levyExclRsnCd']")).html(reasons.map(reason => "<option value='" + reason.code + "'>" + reason.value + "</option>").join());

        if (!rsnCode) {
            $(ctrl.find("[name='levyExclRsnCd']")).val(rsnCode);
        }
    }

    return ctrl;
}
