- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경 - DB 연결 하드코딩 → .env 기반으로 변경 - MySQL strict mode DATE 오류 수정
560 lines
24 KiB
PHP
560 lines
24 KiB
PHP
<?php
|
|
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
|
|
|
|
if (!isset($_SESSION["level"]) || intval($_SESSION["level"]) > 1) {
|
|
sleep(1);
|
|
header("Location:" . $WebSite . "login/login_form.php");
|
|
exit;
|
|
}
|
|
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
|
|
$title_message = '회원관리(등록/수정)';
|
|
?>
|
|
|
|
<?php include $_SERVER['DOCUMENT_ROOT'] . '/mymodal.php'; ?>
|
|
|
|
<?php
|
|
isset($_REQUEST["num"]) ? $num = $_REQUEST["num"] : $num = '';
|
|
isset($_REQUEST["mode"]) ? $mode = $_REQUEST["mode"] : $mode = '';
|
|
|
|
// corp.json 파일에서 소속 목록 불러오기
|
|
$corpFile = $_SERVER['DOCUMENT_ROOT'] . '/member/corp.json';
|
|
$corpData = [];
|
|
if (file_exists($corpFile)) {
|
|
$corpJson = file_get_contents($corpFile);
|
|
$corpData = json_decode($corpJson, true);
|
|
if (!is_array($corpData)) { $corpData = []; }
|
|
}
|
|
|
|
// part.json 파일에서 부서 목록 불러오기
|
|
$partFile = $_SERVER['DOCUMENT_ROOT'] . '/member/part.json';
|
|
$partData = [];
|
|
if (file_exists($partFile)) {
|
|
$partJson = file_get_contents($partFile);
|
|
$partData = json_decode($partJson, true);
|
|
if (!is_array($partData)) {
|
|
$partData = [];
|
|
}
|
|
}
|
|
|
|
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
|
|
$pdo = db_connect();
|
|
|
|
if ($mode == 'modify') {
|
|
try {
|
|
$sql = "select * from " . $DB . ".member where num = ? ";
|
|
$stmh = $pdo->prepare($sql);
|
|
$stmh->bindValue(1, $num, PDO::PARAM_STR);
|
|
$stmh->execute();
|
|
$count = $stmh->rowCount();
|
|
$row = $stmh->fetch(PDO::FETCH_ASSOC); // $row 배열로 DB 정보를 불러온다.
|
|
|
|
include '_row.php';
|
|
|
|
} catch (PDOException $Exception) {
|
|
print "오류: " . $Exception->getMessage();
|
|
}
|
|
} else {
|
|
$num = '';
|
|
$id = '';
|
|
$pass = '';
|
|
$name = '';
|
|
$nick = NULL;
|
|
$hp = NULL;
|
|
$email = NULL;
|
|
$regist_day = NULL;
|
|
$lv = NULL;
|
|
$authority = NULL;
|
|
$eworks_lv = 4;
|
|
$division = NULL;
|
|
$position = NULL;
|
|
$part = NULL;
|
|
$numorder = NULL;
|
|
$lv = '4';
|
|
$mode = 'insert';
|
|
$address = '';
|
|
$card_company = '';
|
|
$card_number = '';
|
|
$pay_bank = '';
|
|
$pay_account = '';
|
|
$pay_holder = '';
|
|
}
|
|
?>
|
|
|
|
<title> <?=$title_message?> </title>
|
|
<style>
|
|
.table-hover tbody tr:hover {
|
|
cursor: pointer;
|
|
}
|
|
</style>
|
|
|
|
</head>
|
|
<div class="container-fluid">
|
|
<div class="d-flex justify-content-center align-items-center">
|
|
<div class="col-12 text-center">
|
|
<div class="card align-middle">
|
|
<div class="card" style="padding:10px;margin:10px;">
|
|
<h4 class="card-title text-center" style="color:#113366;"> 회원등록/수정 </h4>
|
|
</div>
|
|
<div class="card-body text-center">
|
|
<form id="board_form" name="board_form" class="form-signin" method="post">
|
|
<input type="hidden" id="mode" name="mode" value="<?=$mode?>">
|
|
<input type="hidden" id="num" name="num" value="<?=$num?>">
|
|
<table class="table table-bordered">
|
|
<tr>
|
|
<td>* 성명</td>
|
|
<td>
|
|
<input type="text" id="name" name="name" value="<?=$name?>" class="form-control" required>
|
|
</td>
|
|
<td>* id</td>
|
|
<td>
|
|
<input type="text" id="id" name="id" value="<?=$id?>" class="form-control" required>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>* password</td>
|
|
<td>
|
|
<input type="text" id="pass" name="pass" value="<?=$pass?>" class="form-control" required>
|
|
</td>
|
|
<td>연락처 HP</td>
|
|
<td>
|
|
<input type="text" id="hp" name="hp" value="<?=$hp?>" class="form-control">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>* 레벨</td>
|
|
<td>
|
|
<input type="text" id="lv" name="lv" value="<?=$lv?>" class="form-control" >
|
|
</td>
|
|
<td class="text-success fw-bold"> Email</td>
|
|
<td>
|
|
<input type="text" id="email" name="email" value="<?=$email?>" class="form-control text-start" style="font-size: 0.8rem!important; " placeholder="Email @형태" required>
|
|
</td>
|
|
|
|
</tr>
|
|
<tr>
|
|
<td>* 회사(소속)</td>
|
|
<td>
|
|
<select id="division" name="division" class="form-select" style="font-size: 0.8rem; height: 32px;">
|
|
<option value=""><?= "(소속)" ?></option>
|
|
<?php foreach($corpData as $corp): ?>
|
|
<option value="<?= htmlspecialchars($corp, ENT_QUOTES, 'UTF-8') ?>" <?= (isset($division) && $division === $corp) ? 'selected' : '' ?>>
|
|
<?= htmlspecialchars($corp, ENT_QUOTES, 'UTF-8') ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</td>
|
|
<td>* 부서(파트)</td>
|
|
<td>
|
|
<select id="part" name="part" class="form-select" style="font-size: 0.8rem; height: 32px;">
|
|
<option value=""><?= "(부서)" ?></option>
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>* 직위</td>
|
|
<td>
|
|
<input type="text" id="position" name="position" value="<?=$position?>" class="form-control">
|
|
</td>
|
|
<td> 회계권한 </td>
|
|
<td class="text-center">
|
|
<select id="authority" name="authority" class="form-select" style="font-size: 0.8rem; height: 32px;">
|
|
<option value="" <?= ($authority == '') ? 'selected' : '' ?>>선택</option>
|
|
<option value="ACCOUNT" <?= ($authority == 'ACCOUNT') ? 'selected' : '' ?>>ACCOUNT</option>
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>번호순서 Numorder</td>
|
|
<td>
|
|
<input type="text" id="numorder" name="numorder" value="<?=$numorder?>" class="form-control">
|
|
</td>
|
|
|
|
<td>전자결재 eworks_lv</td>
|
|
<td>
|
|
<select id="eworks_lv" name="eworks_lv" class="form-select" style="font-size: 0.8rem; height: 32px;">
|
|
<option value="1" <?= ($eworks_lv == '1') ? 'selected' : '' ?>>1</option>
|
|
<option value="2" <?= ($eworks_lv == '2') ? 'selected' : '' ?>>2</option>
|
|
<option value="3" <?= ($eworks_lv == '3') ? 'selected' : '' ?>>3</option>
|
|
<option value="4" <?= ($eworks_lv == '4') ? 'selected' : '' ?>>4</option>
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>* 1차 결재</td>
|
|
<td>
|
|
<select id="firstApprovalSelect" class="form-select" style="font-size: 0.8rem; height: 32px;">
|
|
<option value=""><?= "(1차 결재권자)" ?></option>
|
|
<?php
|
|
// eworks_lv가 1 또는 2인 회원 목록을 불러옴
|
|
$sqlmember = "SELECT id, name FROM {$DB}.member WHERE eworks_lv IN ('1','2') ORDER BY name ASC";
|
|
$memberstmt = $pdo->query($sqlmember);
|
|
while ($members = $memberstmt->fetch(PDO::FETCH_ASSOC)) {
|
|
?>
|
|
<option value="<?= htmlspecialchars($members['id'], ENT_QUOTES, 'UTF-8') ?>"
|
|
<?= (isset($first_approval_id) && $first_approval_id === $members['id']) ? 'selected' : '' ?>>
|
|
<?= htmlspecialchars($members['name'], ENT_QUOTES, 'UTF-8') ?>
|
|
</option>
|
|
<?php } ?>
|
|
</select>
|
|
</td>
|
|
<td>* 1차 결재 ID</td>
|
|
<td>
|
|
<input type="hidden" id="first_approval_name" name="first_approval_name" class="form-control" readonly style="font-size: 0.9rem; height: 32px;" value="<?= isset($first_approval_name) ? $first_approval_name : '' ?>">
|
|
<!-- 실제 결재권자 ID 저장 (hidden) -->
|
|
<input type="hidden" id="first_approval_id" name="first_approval_id" value="<?= isset($first_approval_id) ? $first_approval_id : '' ?>">
|
|
<!-- 화면에 표시되는 아이디(개인정보 보호를 위해 마스킹 처리) -->
|
|
<input type="text" id="firstApprovalDisplay" class="form-control mt-1" readonly style="font-size: 0.9rem; height: 32px;" value="<?= isset($first_approval_id) && $first_approval_id != '' ? '****' : '' ?>">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="text-primary fw-bold"> 입사일 </td>
|
|
<td>
|
|
<input type="date" id="enterDate" name="enterDate" value="<?=$enterDate?>" class="form-control">
|
|
</td>
|
|
<td class="text-danger fw-bold"> 퇴사일 </td>
|
|
<td>
|
|
<input type="date" id="quitDate" name="quitDate" value="<?=$quitDate?>" class="form-control">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td> 생일(축하금 지급일) </td>
|
|
<td colspan="1">
|
|
<div class="d-flex justify-content-start align-items-center">
|
|
<input type="date" id="birthday" name="birthday" value="<?=$birthday?>" class="form-control w100px mx-1">
|
|
<label class="form-check-label mx-1">
|
|
<input type="radio" name="birthday_type" class="form-check-input" value="양력" <?= ($birthday_type == '양력') ? 'checked' : '' ?>> 양력
|
|
</label>
|
|
<label class="form-check-label mx-1">
|
|
<input type="radio" name="birthday_type" class="form-check-input" value="음력" <?= ($birthday_type == '음력') ? 'checked' : '' ?>> 음력
|
|
</label>
|
|
</div>
|
|
</td>
|
|
<td> 주민번호 </td>
|
|
<td colspan="1">
|
|
<input type="text" id="IDnumber" name="IDnumber" value="<?php
|
|
if(isset($IDnumber) && $IDnumber) {
|
|
// 저장된 주민번호에 하이픈 추가하여 표시
|
|
if(strlen($IDnumber) == 13) {
|
|
echo substr($IDnumber, 0, 6) . '-' . substr($IDnumber, 6);
|
|
} else {
|
|
echo $IDnumber;
|
|
}
|
|
}
|
|
?>" class="form-control text-start" maxlength="14" placeholder="000000-0000000">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td> 자택주소 </td>
|
|
<td colspan="3">
|
|
<input type="text" id="address" name="address" value="<?=$address?>" class="form-control text-start">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="text-success fw-bold">법인카드 회사</td>
|
|
<td><input type="text" id="card_company" name="card_company" value="<?= $card_company ?>" class="form-control text-start"></td>
|
|
<td class="text-success fw-bold">법인카드 번호</td>
|
|
<td><input type="text" id="card_number" name="card_number" value="<?= $card_number ?>" class="form-control text-start"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="4" class="text-white bg-primary fw-bold" style="padding: 3px!important; "> 급여 계좌정보 </td>
|
|
</tr>
|
|
<tr>
|
|
<td>은행명</td>
|
|
<td>
|
|
<select id="pay_bank" name="pay_bank" class="form-select text-start" style="font-size: 0.8rem; height: 32px;">
|
|
<option value="">은행 선택</option>
|
|
<?php
|
|
$banks = [
|
|
"국민은행", "신한은행", "우리은행", "하나은행", "농협은행",
|
|
"기업은행", "SC제일은행", "씨티은행", "카카오뱅크", "케이뱅크",
|
|
"토스뱅크", "수협은행", "대구은행", "부산은행", "경남은행",
|
|
"광주은행", "전북은행", "제주은행", "우체국", "산업은행","지역농축협"
|
|
];
|
|
foreach ($banks as $bank) {
|
|
$selected = ($pay_bank == $bank) ? 'selected' : '';
|
|
echo "<option value=\"{$bank}\" {$selected}>{$bank}</option>";
|
|
}
|
|
?>
|
|
</select>
|
|
</td>
|
|
<td> 계좌번호 </td>
|
|
<td>
|
|
<input type="text" id="pay_account" name="pay_account" value="<?=$pay_account?>" class="form-control text-start">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td> 예금주 </td>
|
|
<td>
|
|
<input type="text" id="pay_holder" name="pay_holder" value="<?=$pay_holder?>" class="form-control text-start">
|
|
</td>
|
|
<td colspan="2">
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<div class="d-flex justify-content-center mt-2 mb-2">
|
|
<?php if (intval($level) == 1 ) {
|
|
print '<button id="saveBtn" class="btn btn-dark btn-sm me-2" type="button"> <i class="bi bi-floppy-fill"></i> 저장 </button>';
|
|
print '<button id="delBtn" class="btn btn-danger btn-sm me-5" type="button"> <i class="bi bi-trash"></i> 삭제 </button>';
|
|
print '<button class="btn btn-outline-secondary btn-sm me-2" type="button" onclick="self.close();"> <i class="bi bi-x-lg"></i> 닫기 </button>';
|
|
} ?>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 페이지로딩 -->
|
|
<script>
|
|
// 페이지 로딩
|
|
$(document).ready(function() {
|
|
var loader = document.getElementById('loadingOverlay');
|
|
loader.style.display = 'none';
|
|
});
|
|
</script>
|
|
|
|
<script>
|
|
ajaxRequest = null;
|
|
|
|
$(document).ready(function() {
|
|
var state = $('#state').val();
|
|
|
|
$("#closeModalBtn").click(function() {
|
|
$('#myModal').modal('hide');
|
|
});
|
|
|
|
$("#closeBtn").click(function() {
|
|
// 저장하고 창닫기
|
|
});
|
|
|
|
$("#saveBtn").click(function() {
|
|
// 주민번호 하이픈 제거
|
|
var idNumber = $('#IDnumber').val();
|
|
if (idNumber) {
|
|
var cleanIdNumber = idNumber.replace(/-/g, '');
|
|
$('#IDnumber').val(cleanIdNumber);
|
|
}
|
|
|
|
// DATA 저장버튼 누름
|
|
var form = $('#board_form')[0];
|
|
var datasource = new FormData(form);
|
|
|
|
if ($("#name").val() == '' || $("#id").val() == '' || $("#pass").val() == '' ) {
|
|
Swal.fire({
|
|
title: '필수입력 확인',
|
|
text: "필수입력 사항을 확인바랍니다.",
|
|
icon: 'error',
|
|
confirmButtonText: '확인'
|
|
});
|
|
} else {
|
|
if (ajaxRequest !== null) {
|
|
ajaxRequest.abort();
|
|
}
|
|
ajaxRequest = $.ajax({
|
|
enctype: 'multipart/form-data',
|
|
processData: false,
|
|
contentType: false,
|
|
cache: false,
|
|
timeout: 600000,
|
|
url: "insert.php",
|
|
type: "post",
|
|
data: datasource,
|
|
dataType: "json",
|
|
success: function(data) {
|
|
console.log(data);
|
|
Toastify({
|
|
text: "파일 저장완료",
|
|
duration: 2000,
|
|
close: true,
|
|
gravity: "top",
|
|
position: "center",
|
|
style: {
|
|
background: "linear-gradient(to right, #00b09b, #96c93d)"
|
|
},
|
|
}).showToast();
|
|
setTimeout(function() {
|
|
if (window.opener && !window.opener.closed) {
|
|
window.opener.location.reload(); // 부모 창 새로고침
|
|
window.close();
|
|
}
|
|
}, 1000);
|
|
},
|
|
error: function(jqxhr, status, error) {
|
|
console.log(jqxhr, status, error);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
$("#delBtn").click(function() {
|
|
var state = $("#state").val();
|
|
var level = '<?php echo $level; ?>';
|
|
var admin = '<?php echo $admin; ?>';
|
|
|
|
if (level !== '1') {
|
|
Swal.fire({
|
|
title: '삭제불가',
|
|
text: "관리자만 삭제가능합니다.",
|
|
icon: 'error',
|
|
confirmButtonText: '확인'
|
|
});
|
|
} else {
|
|
Swal.fire({
|
|
title: '자료 삭제',
|
|
text: "삭제는 신중! 정말 삭제하시겠습니까?",
|
|
icon: 'warning',
|
|
showCancelButton: true,
|
|
confirmButtonColor: '#3085d6',
|
|
cancelButtonColor: '#d33',
|
|
confirmButtonText: '삭제',
|
|
cancelButtonText: '취소'
|
|
}).then((result) => {
|
|
if (result.isConfirmed) {
|
|
$("#mode").val('delete');
|
|
|
|
$.ajax({
|
|
url: "insert.php",
|
|
type: "post",
|
|
data: $("#board_form").serialize(),
|
|
dataType: "json",
|
|
success: function(data) {
|
|
console.log(data);
|
|
Toastify({
|
|
text: "파일 삭제완료",
|
|
duration: 2000,
|
|
close: true,
|
|
gravity: "top",
|
|
position: "center",
|
|
style: {
|
|
background: "linear-gradient(to right, #00b09b, #96c93d)"
|
|
},
|
|
}).showToast();
|
|
setTimeout(function() {
|
|
if (window.opener && !window.opener.closed) {
|
|
window.opener.restorePageNumber(); // 부모 창에서 페이지 번호 복원
|
|
window.opener.location.reload(); // 부모 창 새로고침
|
|
window.close();
|
|
}
|
|
}, 1000);
|
|
},
|
|
error: function(jqxhr, status, error) {
|
|
console.log(jqxhr, status, error);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
// 두날짜 사이 일자 구하기
|
|
const getDateDiff = (d1, d2) => {
|
|
const date1 = new Date(d1);
|
|
const date2 = new Date(d2);
|
|
|
|
const diffDate = date1.getTime() - date2.getTime();
|
|
|
|
return Math.abs(diffDate / (1000 * 60 * 60 * 24)); // 밀리세컨 * 초 * 분 * 시 = 일
|
|
}
|
|
|
|
$(document).ready(function(){
|
|
$("input").attr("autocomplete", "off");
|
|
});
|
|
</script>
|
|
|
|
<script>
|
|
$(document).ready(function(){
|
|
// 부서 데이터 정의 (JSON 파일의 데이터를 JavaScript로 변환)
|
|
var partData = <?php echo json_encode($partData); ?>;
|
|
var currentPart = '<?php echo isset($part) ? $part : ""; ?>';
|
|
|
|
// 회사 선택에 따른 부서 업데이트 함수
|
|
function updatePartOptions(selectedCorp) {
|
|
var partSelect = $('#part');
|
|
partSelect.empty();
|
|
partSelect.append('<option value="">(부서)</option>');
|
|
|
|
if (selectedCorp) {
|
|
partData.forEach(function(dept) {
|
|
if (dept.corp === selectedCorp) {
|
|
var selected = (dept.part === currentPart) ? 'selected' : '';
|
|
partSelect.append('<option value="' + dept.part + '" ' + selected + '>' + dept.part + '</option>');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// 회사 선택 변경 이벤트
|
|
$('#division').on('change', function() {
|
|
var selectedCorp = $(this).val();
|
|
updatePartOptions(selectedCorp);
|
|
});
|
|
|
|
// 페이지 로드 시 현재 선택된 회사에 따른 부서 설정
|
|
var currentDivision = $('#division').val();
|
|
if (currentDivision) {
|
|
updatePartOptions(currentDivision);
|
|
}
|
|
|
|
// 1차 결재 선택 이벤트
|
|
$('#firstApprovalSelect').on('change', function(){
|
|
var selectedId = $(this).val();
|
|
var selectedName = $(this).find('option:selected').text();
|
|
// 선택한 회원의 id를 히든 필드에 저장
|
|
$('#first_approval_id').val(selectedId);
|
|
// 화면에는 id 대신 "****"을 표시하여 개인정보 보호
|
|
$('#firstApprovalDisplay').val('****');
|
|
// 1차 결재권자 이름 필드에 선택된 이름을 반영
|
|
$('#first_approval_name').val(selectedName);
|
|
});
|
|
|
|
// 주민번호 자동 포맷팅
|
|
$('#IDnumber').on('input', function() {
|
|
var value = $(this).val().replace(/[^0-9]/g, ''); // 숫자만 추출
|
|
var formattedValue = '';
|
|
|
|
if (value.length <= 6) {
|
|
formattedValue = value;
|
|
} else if (value.length <= 13) {
|
|
formattedValue = value.substring(0, 6) + '-' + value.substring(6);
|
|
} else {
|
|
formattedValue = value.substring(0, 6) + '-' + value.substring(6, 13);
|
|
}
|
|
|
|
$(this).val(formattedValue);
|
|
});
|
|
|
|
// 주민번호 하이픈 제거하여 서버에 전송
|
|
$('#board_form').on('submit', function() {
|
|
var idNumber = $('#IDnumber').val();
|
|
if (idNumber) {
|
|
// 하이픈 제거하여 숫자만 저장
|
|
var cleanIdNumber = idNumber.replace(/-/g, '');
|
|
$('#IDnumber').val(cleanIdNumber);
|
|
}
|
|
});
|
|
|
|
// 주민번호 유효성 검사 (선택사항)
|
|
$('#IDnumber').on('blur', function() {
|
|
var value = $(this).val();
|
|
if (value && value.length === 14) {
|
|
// 주민번호 형식 검사 (간단한 검증)
|
|
var pattern = /^\d{6}-\d{7}$/;
|
|
if (!pattern.test(value)) {
|
|
Swal.fire({
|
|
title: '입력 오류',
|
|
text: '주민번호 형식이 올바르지 않습니다. (000000-0000000)',
|
|
icon: 'warning',
|
|
confirmButtonText: '확인'
|
|
});
|
|
$(this).focus();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|