Files
eapim-admin/WebContent/jsp/onl/apim/portalorg/portalOrgManDetail.jsp
T
Rinjae 5c378eac0d
eapim-admin CI / build (push) Has been cancelled
Merge remote-tracking branch 'origin/master'
2026-07-06 15:33:39 +09:00

823 lines
29 KiB
Plaintext

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.*"%>
<%@ page import="com.eactive.eai.rms.common.util.CommonUtil"%>
<%@ page import="com.eactive.eai.rms.common.context.MonitoringContext"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ include file="/jsp/common/include/localemessage.jsp" %>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Expires", "0");
MonitoringContext monitoringContext = (MonitoringContext)CommonUtil.getBean(request, "monitoringContext");
String reverseProxyUrl = monitoringContext.getStringProperty(MonitoringContext.RMS_WEBHOOK_REVERSE_PROXY_URL, "");
%>
<%!
public String getRequiredLabel(String label) {
return label + " <span class=\"required-mark\">*</span>";
}
%>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<jsp:include page="/jsp/common/include/css.jsp"/>
<jsp:include page="/jsp/common/include/script.jsp"/>
<jsp:include page="/jsp/common/include/portal.jsp"/>
<style>
.jnotification {
position: fixed;
top: 20px;
left: 50%;
transform: translateX(-50%);
right: auto;
bottom: auto;
}
</style>
<script language="javascript" >
var url = '<c:url value="/onl/apim/portalorg/portalOrgMan.json" />';
var url_view = '<c:url value="/onl/apim/portalorg/portalOrgMan.view" />';
var file_download = '<c:url value="/file/download.do" />';
let originalOrgStatus = '';
function addIpToTable(ipValue, rowNum) {
var newRow = $('<tr>')
.append($('<td>').text(rowNum))
.append($('<td>').text(ipValue))
.append($('<td>').html(
'<button type="button" class="cssbtn smallBtn" onclick="deleteIp(this)">' +
'<i class="material-icons">delete</i>삭제' +
'</button>'
));
$("#ipListBody").append(newRow);
}
window.deleteIp = function(btn) {
$(btn).closest('tr').remove();
// 번호 재정렬
$("#ipListBody tr").each(function(index) {
$(this).find("td:first").text(index + 1);
});
updateIpWhitelist();
};
function updateIpWhitelist() {
var ips = $("#ipListBody tr").map(function() {
return $(this).find("td:eq(1)").text().trim();
}).get();
$("#ipWhitelist").val(ips.join(','));
}
function init(){
$.ajax({
type : "POST",
url:url,
dataType:"json",
data:{cmd: 'LIST_INIT_COMBO'},
success:function(json){
populateSelectOptions("orgStatus", json.orgStatusRows);
populateSelectOptions("approvalStatus", json.approvalStatusRows);
var key = "${param.id}";
if (key != "" && key != "null") {
detail(key);
}
if(typeof callback === 'function') {
callback();
}
if(!isDetail) {
$("select[name=orgStatus]").val("ACTIVE").prop("disabled", true);
$("select[name=approvalStatus]").val("COMPLETED").prop("disabled", true);
}
},
error:function(e){
alert(e.responseText);
}
});
}
// 선택박스 옵션 세팅 함수
function populateSelectOptions(elementName, data) {
new makeOptions("CODE", "NAME")
.setObj($("select[name=" + elementName + "]"))
.setData(data)
.setFormat(nameOptionFormat)
.rendering();
}
function detail(key){
if (!isDetail) return;
$.ajax({
type : "POST",
url:url,
dataType:"json",
data:{cmd: 'DETAIL', id : key},
success:function(json) {
var portalOrgData = json.portalOrg;
var corporateManagerData = json.corporateManager;
$("#ajaxForm input[type!=radio],#ajaxForm select,#ajaxForm textarea").each(function () {
var name = $(this).attr("name");
var tag = $(this).prop("tagName").toLowerCase();
$(tag + "[name=" + name + "]").val(portalOrgData[name]);
});
$("#orgName").val(portalOrgData.orgName);
$("#orgCode").val(portalOrgData.orgCode);
$("#orgStatus").val(portalOrgData.orgStatus);
originalOrgStatus = portalOrgData.orgStatus;
if(originalOrgStatus === 'REMOVED') {
$("#btn_delete").hide();
}
$("select[name=approvalStatus]").val(portalOrgData.approvalStatus);
// 승인상태는 읽기전용(수정 불가) - 값은 그대로 제출되도록 disabled 대신 잠금 처리
$("select[name=approvalStatus]")
.css({'pointer-events':'none', 'background-color':'#eee'})
.attr('tabindex', '-1');
$("#compRegNo").val(formatCompanyRegNo(portalOrgData.compRegNo));
$("#corpRegNo").val(formatCorpRegNo(portalOrgData.corpRegNo));
$("#createdDate").inputmask("9999-99-99 99:99:99", {'autoUnmask': true});
$("#reverseProxyPath").val(portalOrgData.reverseProxyPath);
// 전화번호 처리
if (portalOrgData.scPhoneNumber) {
var scPhoneParts = portalOrgData.scPhoneNumber.split('-');
if (scPhoneParts.length === 3) {
$("#scPhonePrefix").val(scPhoneParts[0]);
$("#scPhoneMiddle").val(scPhoneParts[1]);
$("#scPhoneLast").val(scPhoneParts[2]);
}
}
if (portalOrgData.orgPhoneNumber) {
var orgPhoneParts = portalOrgData.orgPhoneNumber.split('-');
if (orgPhoneParts.length === 3) {
$("#orgPhonePrefix").val(orgPhoneParts[0]);
$("#orgPhoneMiddle").val(orgPhoneParts[1]);
$("#orgPhoneLast").val(orgPhoneParts[2]);
}
}
if (corporateManagerData) {
$("#userName").text(corporateManagerData.userName);
$("#userStatusDescription").text(corporateManagerData.userStatusDescription);
$("#emailAddr").text(corporateManagerData.emailAddr);
$("#mobileNumber").text(corporateManagerData.mobileNumber);
// 법인 관리자 정보가 있을 때 관련 UI 요소 표시
$("#managerInfoSection").show();
} else {
// 법인 관리자 정보가 없을 때 관련 UI 요소 숨김 또는 메시지 표시
$("#managerInfoSection").hide();
$("#noManagerMessage").show();
}
if (portalOrgData.ipWhitelist) {
var ipList = portalOrgData.ipWhitelist.split(',');
ipList.forEach(function(ip, index) {
var trimmedIp = ip.trim();
if (trimmedIp) {
addIpToTable(trimmedIp, index + 1);
}
});
}
// 파일 정보 표시
if (portalOrgData.compRegFile) {
$("#fileName").text(portalOrgData.fileName);
if (portalOrgData.fileName) {
$("#fileWrapper").show().off('click').on('click', function() {
downloadFile(portalOrgData.compRegFile, '1'); // fileSn은 단일 파일이므로 '1'로 고정
});
$("#compRegFile").val(portalOrgData.compRegFile);
} else {
$("#fileWrapper").hide();
}
} else {
$("#fileName").text("");
$("#fileWrapper").hide();
}
},
error:function(e){
alert(e.responseText);
}
});
}
function downloadFile(fileId, fileSn) {
window.location.href = file_download + '?fileId=' + fileId + '&fileSn=' + fileSn;
}
$(document).ready(function() {
var returnUrl = getReturnUrlForReturn();
var key ="${param.id}";
isDetail = key !== "" && key !== "null";
if (isDetail){
$("#title").append(" 수정")
buttonControl(true);
} else {
$("#title").append(" 등록")
$("#managerInfoSectionTitle").hide();
$("#btn_modify").html('<i class="material-icons">save</i> <%= localeMessage.getString("button.register") %></button>');
buttonControl(false);
}
init();
/* 사업자 등록번호 마스킹 */
$("input[name=compRegNo]").inputmask("999-99-99999");
$("input[name=corpRegNo]").inputmask("999999-9999999");
// 전화번호 입력 필드 이벤트 처리
$("#scPhoneMiddle, #scPhoneLast, #orgPhoneMiddle, #orgPhoneLast").on({
'input': function() {
this.value = this.value.replace(/[^0-9]/g, ''); // 숫자 외 문자 제거
// 자동 포커스 이동
if (this.value.length === this.maxLength) {
var nextId = this.id.includes('Middle') ?
this.id.replace('Middle', 'Last') : null;
if (nextId) {
$('#' + nextId).focus();
}
}
},
'paste': function(e) {
// 붙여넣기 시 숫자만 허용
e.preventDefault();
var pastedData = (e.originalEvent.clipboardData || window.clipboardData).getData('text');
this.value = pastedData.replace(/[^0-9]/g, '').slice(0, 4);
}
});
// 파일 선택 버튼 클릭 이벤트
$("#uploadButton").click(function() {
$("#compRegFileUpload").click();
});
$("#compRegFileUpload").change(function() {
var fileInput = this;
var $hiddenFile = $("#compRegFile");
if (fileInput.files.length > 0) {
var file = fileInput.files[0];
// 파일 크기 체크 (10MB)
if (file.size > 10 * 1024 * 1024) {
alert("파일 크기는 10MB 이내로 등록해 주세요.");
fileInput.value = "";
return;
}
// 파일 확장자 체크
var allowedExtensions = ['.pdf','.doc','.docx','.xls','.xlsx','.ppt','.pptx','.hwp','.gif','.jpg','.jpeg','.png'];
var fileExt = file.name.toLowerCase().substring(file.name.lastIndexOf('.'));
if (!allowedExtensions.includes(fileExt)) {
alert("허용된 파일 형식이 아닙니다.\n문서파일(pdf, doc, docx, xls, xlsx, ppt, pptx, hwp)과 이미지 파일(gif, jpg, png)만 등록 가능합니다.");
fileInput.value = "";
return;
}
// 파일이 정상적인 경우
$("#fileName").text(file.name);
$("#fileWrapper").show();
} else {
// 파일 선택이 취소되고 기존 파일도 없는 경우
if (!isDetail || !$hiddenFile.val()) {
$("#fileName").text("");
$("#fileWrapper").hide();
$hiddenFile.val("");
}
// isDetail이고 기존 파일이 있는 경우는 기존 상태 유지
}
});
$("#orgStatus").change(function() {
const newStatus = $(this).val();
if (newStatus === 'REMOVED' && originalOrgStatus !== 'REMOVED') {
if (!confirm("해당 법인을 탈퇴 처리하시겠습니까?")) {
$(this).val(originalOrgStatus);
return;
}
}
});
$("#ipInput").on('input', function(e) {
// 숫자와 점만 허용하고 나머지는 즉시 제거
this.value = this.value.replace(/[^0-9.]/g, '');
let value = this.value;
// 연속된 점을 하나로
value = value.replace(/\.{2,}/g, '.');
// 최대 3개의 점만 허용
let dots = value.match(/\./g) || [];
if (dots.length > 3) {
value = value.substring(0, value.lastIndexOf('.'));
}
// 각 파트의 유효성 검사
let parts = value.split('.');
parts = parts.map((part, index) => {
if (part === '') return part;
// leading zeros 제거 후 숫자 변환
let num = parseInt(part, 10);
// 0-255 범위 체크
if (isNaN(num) || num < 0 || num > 255) {
return '';
}
// 숫자를 문자열로 변환
let result = num.toString();
// 마지막 파트가 아니고 값이 있으면 점 추가
if (index < parts.length - 1 && result) {
result += '.';
}
return result;
});
// 결과 설정
this.value = parts.join('');
});
// IP 추가 버튼 클릭
$("#btn_add_ip").click(function() {
addIp();
});
// IP 입력 필드에서 엔터키 처리
$("#ipInput").keypress(function(e) {
if(e.keyCode == 13) {
e.preventDefault();
addIp();
}
});
// IP 추가 함수
function addIp() {
var ipValue = $("#ipInput").val().trim();
//var ipRegex = /^(\d{1,3}\.){3}\d{1,3}$/;
var ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
if (!ipRegex.test(ipValue)) {
alert("올바른 IP 주소 형식이 아닙니다.");
return;
}
// IP 범위 검사 (0-255)
var parts = ipValue.split('.');
if (!parts.every(part => {
var num = parseInt(part);
return num >= 0 && num <= 255;
})) {
alert("IP 주소의 각 부분은 0-255 사이의 값이어야 합니다.");
return;
}
// 중복 체크
var existingIps = $("#ipListBody tr").map(function() {
return $(this).find("td:eq(1)").text();
}).get();
if (existingIps.includes(ipValue)) {
alert("이미 추가된 IP 주소입니다.");
return;
}
// 새로운 행 추가
var rowNum = $("#ipListBody tr").length + 1;
addIpToTable(ipValue, rowNum);
$("#ipInput").val('');
updateIpWhitelist();
}
$("#downloadButton").click(function() {
var fileId = $("#compRegFile").val();
downloadFile(fileId, '1'); // fileSn은 '1'로 가정
});
$("#btn_modify").click(function(){
if (!checkRequired("ajaxForm")) return;
// 전화번호 조합하여 hidden input에 설정
var scPrefix = $("#scPhonePrefix").val();
var scMiddle = $("#scPhoneMiddle").val();
var scLast = $("#scPhoneLast").val();
var orgPrefix = $("#orgPhonePrefix").val();
var orgMiddle = $("#orgPhoneMiddle").val();
var orgLast = $("#orgPhoneLast").val();
// 전화번호 유효성 검사 (입력한 경우에만 검사)
// 고객센터 전화번호 검사
var hasScPhone = scPrefix || scMiddle || scLast;
if (hasScPhone) {
if (!scPrefix || scPrefix === "") {
alert("고객센터 전화번호를 입력하려면 앞자리를 선택해주세요.");
$("#scPhonePrefix").focus();
return;
}
if (!scMiddle || !scLast || scMiddle.length < 3 || scLast.length < 4) {
alert("올바른 고객센터 전화번호를 입력하여 주십시오.");
return;
}
}
// 회사 전화번호 검사
var hasOrgPhone = orgPrefix || orgMiddle || orgLast;
if (hasOrgPhone) {
if (!orgPrefix || orgPrefix === "") {
alert("회사 전화번호를 입력하려면 앞자리를 선택해주세요.");
$("#orgPhonePrefix").focus();
return;
}
if (!orgMiddle || !orgLast || orgMiddle.length < 3 || orgLast.length < 4) {
alert("올바른 회사 전화번호를 입력하여 주십시오.");
return;
}
}
// hidden input에 전체 전화번호 설정 (입력한 경우에만)
if (hasScPhone && scPrefix && scMiddle && scLast) {
$("input[name=scPhoneNumber]").val([scPrefix, scMiddle, scLast].join('-'));
} else {
$("input[name=scPhoneNumber]").val('');
}
if (hasOrgPhone && orgPrefix && orgMiddle && orgLast) {
$("input[name=orgPhoneNumber]").val([orgPrefix, orgMiddle, orgLast].join('-'));
} else {
$("input[name=orgPhoneNumber]").val('');
}
// 파일 체크
var fileInput = document.getElementById('compRegFileUpload');
if (fileInput.files.length > 0) {
var file = fileInput.files[0];
if (file.size > 10 * 1024 * 1024) {
alert("파일 크기는 10MB 이내로 등록해 주세요.");
return;
}
var allowedExtensions = ['.pdf','.doc','.docx','.xls','.xlsx','.ppt','.pptx','.hwp','.gif','.jpg','.jpeg','.png'];
var fileExt = file.name.toLowerCase().substring(file.name.lastIndexOf('.'));
if (!allowedExtensions.includes(fileExt)) {
alert("허용된 파일 형식이 아닙니다.\n문서파일(pdf, doc, docx, xls, xlsx, ppt, pptx, hwp)과 이미지 파일(gif, jpg, png)만 등록 가능합니다.");
return;
}
}
// 저장 확인/사유 입력은 유효성 검사 및 FormData 구성 후 처리 (하단 submit 분기)
// FormData 생성 전에 분리된 전화번호 필드 제거
$("#scPhonePrefix, #scPhoneMiddle, #scPhoneLast, #orgPhonePrefix, #orgPhoneMiddle, #orgPhoneLast").removeAttr('name');
var formData = new FormData($("#ajaxForm")[0]);
// 파일명 처리 - 새 파일이 있으면 새 파일명, 없으면 기존 파일명 유지
if (fileInput.files.length > 0) {
formData.set("fileName", fileInput.files[0].name);
} else if ($("#fileName").text()) {
formData.set("fileName", $("#fileName").text());
}
// 등록번호 하이픈 제거
var numberFields = ['compRegNo','corpRegNo'];
numberFields.forEach(function(field) {
var value = formData.get(field);
if (value) {
formData.set(field, removeHyphen(value));
}
});
var ipWhitelist = $("#ipWhitelist").val().trim();
if (ipWhitelist) {
var ipRegex = /^(\d{1,3}\.){3}\d{1,3}$/;
var ips = ipWhitelist.split(',').map(ip => ip.trim()).filter(ip => ip);
if (!ips.every(ip => ipRegex.test(ip))) {
alert("올바른 IP 주소 형식이 아닙니다.");
return;
}
}
// cmd 및 사유(auditReason) 첨부 후 전송
function submitOrg(cmd, auditReason) {
formData.append("cmd", cmd);
// 감사로그(AUDIT_LOG) 발화를 위한 systemCode. 법인/가입자 리포지토리는 고정 EMS 스키마라 스키마 전환 영향 없음
formData.append("serviceType", "APIGW");
if (auditReason) {
formData.append("auditReason", auditReason);
}
$.ajax({
type : "POST",
url:url,
data: formData,
processData: false,
contentType: false,
success:function(json){
alert("<%= localeMessage.getString("common.saveMsg") %>");
goNav(returnUrl);
},
error:function(e){
alert(e.responseText);
}
});
}
if (isDetail) {
// 수정: 상태를 REMOVED로 바꾼 경우 삭제(cmd=DELETE)로 감사 기록 + 익명화
var targetCmd = ($("#orgStatus").val() === 'REMOVED') ? "DELETE" : "UPDATE";
var isRemove = (targetCmd === "DELETE");
showReasonPrompt(
isRemove ? "해당 법인을 삭제(탈퇴) 처리합니다. 사유를 입력해 주세요." : "법인 정보를 수정합니다. 사유를 입력해 주세요.",
{
title: isRemove ? "삭제 사유" : "수정 사유",
onConfirm: function(reason) { submitOrg(targetCmd, reason); }
}
);
} else {
// 신규 등록: 사유 불필요
if (confirm("<%= localeMessage.getString("common.checkSave")%>") !== true) return;
submitOrg("INSERT", null);
}
});
$("#btn_previous").click(function() {
goNav(returnUrl);
});
$("#btn_delete").click(function(){
showReasonPrompt("해당 법인을 삭제 처리합니다. 사유를 입력해 주세요.", {
title: "삭제 사유",
onConfirm: function(reason) {
var postData = $('#ajaxForm').serializeArray();
postData.push({name: "cmd" , value:"DELETE"});
postData.push({name: "serviceType", value: "APIGW"});
postData.push({name: "auditReason", value: reason});
$.ajax({
type : "POST",
url:url,
data:postData,
success:function(args){
alert("<%= localeMessage.getString("common.deleteMsg") %>");
goNav(returnUrl);
},
error:function(e){
alert(e.responseText);
}
});
}
});
});
});
</script>
</head>
<body>
<div class="right_box">
<div class="content_top">
<ul class="path">
<li><a href="#">${rmsMenuPath}</a></li>
</ul>
</div><!-- end content_top -->
<div class="content_middle">
<div class="search_wrap">
<button type="button" class="cssbtn" id="btn_modify" level="W" status="DETAIL,NEW"><i class="material-icons">save</i> <%= localeMessage.getString("button.modify") %></button>
<button type="button" class="cssbtn" id="btn_delete" level="W" status="DETAIL"><i class="material-icons">delete</i> <%= localeMessage.getString("button.delete") %></button>
<button type="button" class="cssbtn" id="btn_previous" level="R" status="DETAIL,NEW"><i class="material-icons">arrow_back</i> <%= localeMessage.getString("button.previous") %></button>
</div>
<div class="title" id ="title"><%= localeMessage.getString("portalOrgDetail.title") %></div>
<form id="ajaxForm" enctype="multipart/form-data" accept-charset="UTF-8">
<input type="hidden" name="id">
<table class="table_row" cellspacing="0">
<tr>
<th style="width:15%;"><%= getRequiredLabel(localeMessage.getString("portalOrg.orgName")) %></th>
<td colspan="3" style="width:35%;">
<input type="text" name="orgName" id="orgName" maxlength="50" data-required data-warning="법인명을 입력하여 주십시오."/>
</td>
<th style="width:15%;"><%= localeMessage.getString("portalOrg.orgSectors") %></th> <%--업태--%>
<td style="width:35%;"><input type="text" name="orgSectors" id="orgSectors" maxlength="50" /></td>
</tr>
<tr>
<th style="width:15%;"><%= localeMessage.getString("portalOrg.orgCode") %></th>
<td colspan="3" style="width:35%;">
<input type="text" name="orgCode" id="orgCode"/>
</td>
<th><%= localeMessage.getString("portalOrg.orgIndustryType") %></th> <%--업종--%>
<td><input type="text" name="orgIndustryType" id="orgIndustryType" maxlength="50" /></td>
</tr>
<tr>
<th><%= getRequiredLabel(localeMessage.getString("portalOrg.compRegNo")) %></th>
<td colspan="3">
<input type="text" name="compRegNo" id ="compRegNo" data-required data-warning="사업자 등록번호를 입력하여 주십시오."/>
</td>
<th><%= localeMessage.getString("portalOrg.ceoName") %></th>
<td>
<input type="text" name="ceoName" id="ceoName" maxlength="50" />
</td>
</tr>
<tr>
<th><%= localeMessage.getString("portalOrg.corpRegNo") %></th>
<td colspan="3">
<input type="text" name="corpRegNo" id="corpRegNo" />
</td>
<th><%= localeMessage.getString("portalOrg.orgAddr") %></th>
<td>
<input type="text" name="orgAddr" id="orgAddr" maxlength="255" />
</td>
</tr>
<tr>
<th style="width:15%;"><%= localeMessage.getString("portalUser.approvalStatus") %></th>
<td style="width:10%;"><div class="select-style"><select name="approvalStatus"/></div></td>
<th style="width:15%;"><%= localeMessage.getString("portalOrg.orgStatus") %></th>
<td style="width:10%;"><div class="select-style"><select name="orgStatus" id="orgStatus" /></div></td>
<th><%= localeMessage.getString("portalOrg.serviceName") %></th>
<td>
<input type="text" name="serviceName" id="serviceName" maxlength="36" />
</td>
</tr>
<tr>
<th><%= localeMessage.getString("portalOrg.scPhoneNumber") %></th>
<td colspan="3">
<div class="input-group" style="width: 60%; display: flex;">
<div class="select-style" style="width: 30%; display: inline-block;">
<select id="scPhonePrefix" name="scPhonePrefix" style="padding-left: 10px;">
<option value="">선택</option>
<option value="국번없음">국번없음</option>
<option value="02">02</option>
<option value="031">031</option>
<option value="032">032</option>
<option value="033">033</option>
<option value="041">041</option>
<option value="042">042</option>
<option value="043">043</option>
<option value="044">044</option>
<option value="051">051</option>
<option value="052">052</option>
<option value="053">053</option>
<option value="054">054</option>
<option value="055">055</option>
<option value="061">061</option>
<option value="062">062</option>
<option value="063">063</option>
<option value="064">064</option>
<option value="070">070</option>
</select>
</div>
<span class="mx-2">-</span>
<input type="text" id="scPhoneMiddle" name="scPhoneMiddle" maxlength="4" style="width: 20%; text-align: center;" />
<span class="mx-2">-</span>
<input type="text" id="scPhoneLast" name="scPhoneLast" maxlength="4" style="width: 20%; text-align: center;" />
<input type="hidden" name="scPhoneNumber"/>
</div>
</td>
<th><%= localeMessage.getString("portalOrg.orgPhoneNumber") %></th>
<td>
<div class="input-group" style="width: 60%; display: flex;">
<div class="select-style" style="width: 30%; display: inline-block;">
<select id="orgPhonePrefix" name="orgPhonePrefix" style="padding-left: 10px;">
<option value="">선택</option>
<option value="국번없음">국번없음</option>
<option value="02">02</option>
<option value="031">031</option>
<option value="032">032</option>
<option value="033">033</option>
<option value="041">041</option>
<option value="042">042</option>
<option value="043">043</option>
<option value="044">044</option>
<option value="051">051</option>
<option value="052">052</option>
<option value="053">053</option>
<option value="054">054</option>
<option value="055">055</option>
<option value="061">061</option>
<option value="062">062</option>
<option value="063">063</option>
<option value="064">064</option>
<option value="070">070</option>
</select>
</div>
<span class="mx-2">-</span>
<input type="text" id="orgPhoneMiddle" name="orgPhoneMiddle" maxlength="4" style="width: 20%; text-align: center;" />
<span class="mx-2">-</span>
<input type="text" id="orgPhoneLast" name="orgPhoneLast" maxlength="4" style="width: 20%; text-align: center;" />
<input type="hidden" name="orgPhoneNumber"/>
</div>
</td>
</tr>
<tr>
<th><%= localeMessage.getString("portalOrg.reverseProxyPath") %></th>
<td colspan="3">
<%=reverseProxyUrl %>/<input type="text" name="reverseProxyPath" id="reverseProxyPath" style="width:100px; "/>
</td>
<th></th>
<td>
</td>
</tr>
<tr><%--사업자등록증--%>
<th><%= localeMessage.getString("portalOrg.compRegFile") %></th>
<td colspan="5" style="padding-top: 5px; padding-bottom: 5px;">
<input type="file" name="compRegFileUpload" id="compRegFileUpload" style="display: none;"
accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.hwp,.gif,.jpg,.jpeg,.png" />
<button type="button" id="uploadButton" class="smallBtn cssbtn">파일 선택</button>
<div style="display: inline-block; margin-left: 10px;">
<span id="fileWrapper" style="display: none; cursor: pointer;">
<img src="${pageContext.request.contextPath}/images/icon_file.png"
style="vertical-align: middle; margin-right: 5px; font-size: 0.7rem;">
<span id="fileName" style="text-decoration: underline;" name="fileName"></span>
</span>
</div>
<input type="hidden" name="compRegFile" id="compRegFile" />
<div class="file-description" style="margin-top: 5px; color: #666; font-size: 0.7rem;">
첨부파일은 10MB 이내로 등록해 주세요.<br>
문서파일과 이미지 파일만 등록 가능합니다. (pdf, doc, docx, xls, xlsx, ppt, pptx, hwp, gif, jpg, png)
</div>
</td>
</tr>
</table>
<%--법인 관리자정보--%>
<div id="managerInfoSectionTitle" class="title" style="margin-top: 50px;"><%= localeMessage.getString("portalOrg.portalUser.title") %></div>
<div id="managerInfoSection" style="display: none;" >
<table class="table_row" cellspacing="0">
<tr>
<th style="width:15%;"><%= localeMessage.getString("portalUser.name") %></th>
<td style="width:35%;" id="userName"></td>
<th style="width:15%;"><%= localeMessage.getString("portalUser.userStatus") %></th> <%--계정상태--%>
<td style="width:35%;" id="userStatusDescription"></td>
</tr>
<tr>
<th><%= localeMessage.getString("portalUser.emailAddr") %></th> <%--이메일 아이디--%>
<td id="emailAddr"></td>
<th><%= localeMessage.getString("portalUser.mobile") %></th> <%--핸드폰 번호--%>
<td id="mobileNumber"></td>
</tr>
</table>
</div>
<div id="noManagerMessage" style="display: none; font-size: 0.8rem;">
<p><%= localeMessage.getString("portalOrg.noManagerMsg") %></p>
</div>
<div id="ipWhitelistList" style="margin-top: 50px;">
<div class="title" style="margin-top: 10px">사용 서버 IP 대역 (화이트리스트)</div>
<table class="table_row" cellspacing="0" style="width:50%;">
<tr>
<th style="width:15%;"><%= localeMessage.getString("portalOrg.ipWhitelist") %></th>
<td>
<div style="display: flex; align-items: center;">
<input type="text" id="ipInput" style="width:200px; margin-right: 10px;" maxlength="15" placeholder="xxx.xxx.xxx.xxx">
<button type="button" class="cssbtn smallBtn" id="btn_add_ip"><i class="material-icons">add</i> IP 추가</button>
</div>
</td>
</tr>
</table>
<!-- IP 목록 테이블 -->
<table class="table_row" cellspacing="0" style="margin-top: 10px; width:50%;">
<thead>
<tr>
<th style="width:10%;">No</th>
<th>IP</th>
<th style="width:20%;">삭제</th>
</tr>
</thead>
<tbody id="ipListBody">
<!-- 동적으로 추가될 IP 목록 -->
</tbody>
</table>
<input type="hidden" name="ipWhitelist" id="ipWhitelist">
</div>
</form>
</div>
</div>
</body>
</html>