공통데이터 관리 수정

This commit is contained in:
yangsh
2025-12-31 15:11:40 +09:00
parent 38444fcb4f
commit 04a06f1781
36 changed files with 1351 additions and 139 deletions

View File

@@ -28,6 +28,10 @@
<?= $this->renderSection('modals') ?>
<?php if ($pwExpire): ?>
<?= $this->include('layouts/widget/pwModal') ?>
<?php endif; ?>
<script type="text/javascript">
const tpl = document.querySelector('.my-loader-template')
const usrLevel = <?= session('usr_level') != null ? session('usr_level') : '' ?>

View File

@@ -0,0 +1,218 @@
<style>
.swal2-cancel {
background-color: #ff0000 !important;
color: #fff !important;
}
</style>
<!-- 비밀번호 변경 모달 -->
<div class="modal fade" id="pwChangeModal" tabindex="-1" aria-hidden="true" aria-labelledby="pwChangeModalLabel">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<!-- header -->
<div class="modal-header">
<h5 class="modal-title fw-bold" id="pwChangeModalLabel">비밀번호변경</h5>
<button type="button" class="btn-close layer_popup_close" data-bs-dismiss="modal"
aria-label="닫기"></button>
</div>
<!-- body -->
<div class="modal-body">
<!-- 규칙 박스 -->
<div class="border rounded-3 p-3 mb-3 bg-light">
<fieldset class="mb-0">
<legend class="fs-6 fw-semibold mb-2">컨펌스 시스템 비밀번호 작성규칙</legend>
<ul class="mb-0 ps-3">
<li class="mb-2">
<div class="fw-semibold">- 최소길이</div>
<div class="text-muted small">
최소 8자리 이상 : 영어 대문자, 소문자, 숫자, 특수문자 최소 2종류 조합
</div>
</li>
<li class="mb-2">
<div class="fw-semibold">- 추측하기 어려운 비밀번호</div>
<div class="text-muted small">
일련번호, 전화번호 쉬운 문자열이 포함되지 않도록 <br>
알려진 단어, 키보드 상에서 나란히 있는 문자열이 포함되지 않도록
</div>
</li>
<li class="mb-2">
<div class="fw-semibold">- 주기적 변경</div>
<div class="text-muted small">비밀번호에 유효기간 설정하고 최소 6개월마다 변경</div>
</li>
<li>
<div class="fw-semibold">- 동일 비밀번호 사용 제한</div>
<div class="text-muted small">2개의 비밀번호를 교대로 사용하지 않음</div>
</li>
</ul>
</fieldset>
</div>
<!-- 안내 문구 -->
<div class="alert alert-warning py-2 mb-3">
<div class="small mb-0">* 비밀번호가 <b>180</b> 지나 변경 하셔야 합니다.</div>
</div>
<!-- 입력 -->
<form id="frm_pw_change" onsubmit="return false;">
<div class="row g-3">
<div class="col-12 col-md-4">
<label for="usr_pass" class="form-label">기존비밀번호</label>
<input type="password" id="usr_pass" name="usr_pass" class="form-control" required />
</div>
<div class="col-12 col-md-4">
<label for="new_pass" class="form-label">비밀번호</label>
<input type="password" id="new_pass" name="new_pass" class="form-control" required />
</div>
<div class="col-12 col-md-4">
<label for="new_pass2" class="form-label">비밀번호확인</label>
<input type="password" id="new_pass2" name="new_pass2" class="form-control" required />
</div>
</div>
</form>
<!-- 오늘하루 보지않기 -->
<div class="mt-3 text-end">
<a href="javascript:void(0)" class="small text-decoration-none layer_popup_today_close">
오늘하루 보지않기
</a>
</div>
</div>
<!-- footer -->
<div class="modal-footer d-flex gap-1">
<button type="button" class="btn btn-outline-secondary layer_popup_close" data-bs-dismiss="modal">
닫기
</button>
<button type="button" class="btn btn-primary layer_popup_ok" onclick="chageUserPass();">
확인
</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(function () {
if (shouldShowPwModal()) {
const el = document.getElementById('pwChangeModal');
if (el) {
const modal = new bootstrap.Modal(el, {
backdrop: 'static', // 바깥 클릭 닫기 막기(원하면 false로)
keyboard: false // ESC 닫기 막기(원하면 true)
});
modal.show();
}
}
// 하루동안 열지 않기
$(".layer_popup_today_close").on('click', function () {
const key = 'pwChangeModalHideDate';
const today = new Date().toISOString().slice(0, 10);
localStorage.setItem(key, today);
const el = document.getElementById('pwChangeModal');
bootstrap.Modal.getInstance(el)?.hide();
});
});
// 하루동안 열지 않기 체크
function shouldShowPwModal() {
const key = 'pwChangeModalHideDate';
const today = new Date().toISOString().slice(0, 10);
return localStorage.getItem(key) !== today;
}
function chageUserPass() {
const form = document.getElementById('frm_pw_change');
let isValid = true;
// Bootstrap5 기본 validation 적용
if (!form.checkValidity()) {
isValid = false;
}
if (!isValid) {
form.classList.add('was-validated');
return;
}
swal.fire({
text: "저장 하시겠습니까?",
type: "warning",
showCancelButton: true,
confirmButtonText: "",
cancelButtonText: "아니오",
closeOnConfirm: false,
closeOnCancel: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
}).then((result) => {
if (result.isConfirmed) {
$.ajax({
url: '/common/common/changeUserPass',
contentType: 'application/x-www-form-urlencoded;charset=UTF-8',
method: 'POST',
data: $("#frm_pw_change").serialize(),
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
error: function (xhr, error, thrown) {
blockUI.unblockPage()
var msg = "";
if (xhr.responseText != null) {
msg = xhr.responseText
} else {
msg = "잠시후 다시 시도해 주세요."
}
Swal.fire({
title: msg,
icon: "error"
})
},
success: function (result) {
if (result.code == '0') {
Swal.fire({
title: '정상 처리되었습니다.',
icon: "success"
})
} else {
Swal.fire({
title: result.msg,
icon: "error"
})
}
}
});
}
});
}
</script>

View File

@@ -0,0 +1,599 @@
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<style>
.tbl_basic2 th {
padding: 0 10px;
height: 27px;
border: solid 1px #d8d9de;
background-color: #eff0f4;
letter-spacing: -1px;
font-weight: normal;
color: #5a5f69;
text-align: left;
}
.blockUI {
z-index: 1500 !important;
}
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 180px;
}
.card-header {
display: flex !important;
align-items: center;
}
.card-header-tab {
justify-content: flex-start !important;
}
.table-scroll {
max-height: 300px;
overflow-y: scroll;
}
.swal2-cancel {
background-color: #ff0000 !important;
color: #fff !important;
}
.num {
color: #b68556;
font-size: 19px;
}
</style>
<h1>확인매물 상세 내용</h1>
<div class="col-md-12 col-xl-12">
<div class="col-lg-12">
<div class="main-card mb-3 card">
<div class="card-header" style="width:100%; max-width:100%; min-width:600px; padding:0; border:0;">
<p class="left">
</p>
<table style="width:100%; min-width:600px; padding:0; border:0;" cellpadding="0" cellspacing="0"
border="0" width="100%">
<tbody>
<tr>
<td style="width: 50%;padding-left: 20px"><span class="tit">매물ID :</span> <span
class="num"><?= $data['atcl_no'] ?></span>
</td>
<td style="width: 20%;"><span class="tit">CP ID :</span> <span
class="num"><?= $data['cpid'] ?></span></td>
<td style="width: 30%; text-align: right;padding-right: 20px"><span class="tit">현재 상태
:</span> <span class="num"><?= $data['pre_stat'] ?></span></td>
</tr>
<tr>
<td height="15"></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p></p>
</div>
<div class="card-body">
<h5 class="card-title">공인 중개사 정보</h5>
<table class="table table-bordered table-sm tbl_basic2 apt-info-table">
<colgroup>
<col width="15%" />
<col width="35%" />
<col width="15%" />
<col width="35%" />
</colgroup>
<tr>
<th>중개사명</th>
<td><?= $data['realtor_nm'] ?></td>
<th>대표전화</th>
<td><?= $data['realtor_tel_no'] ?></td>
</tr>
</table>
</div>
</div>
<div class="main-card mb-3 card">
<div class="card-body">
<h5 class="card-title">단지 정보</h5>
<div class="table-responsive">
<table class="table table-bordered table-sm align-middle mb-0 apt-info-table">
<colgroup>
<col style="width:120px">
<col style="width:320px">
<col style="width:120px">
<col style="width:320px">
</colgroup>
<tbody>
<tr>
<th class="bg-light">등록일</th>
<td><?= $data['rdate'] ?></td>
<th class="bg-light">전화/서류 완료일시</th>
<td>
<select class="form-select form-select-sm" name="atcl_vrtc_way" id="atcl_vrtc_way"
disabled>
<option value="">-선택-</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "VRFCREQ_WAY"): ?>
<option value="<?= $c['cd'] ?>" <?= ($c['cd'] === $data['vrfc_type_cd']) ? 'selected' : '' ?>>
<?= $c['cd_nm'] ?>
</option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</td>
</tr>
<tr>
<th class="bg-light">등기부등본 확인완료</th>
<td><?= $data['result_tm'] ?></td>
<th class="bg-light">의뢰인(매도자)</th>
<td>
<?php if (in_array($data['stat_cd'], ['19', '60', '69'])): ?>
***
<?php else: ?>
<?= $data['seller_nm'] ?>
<?php endif; ?>
</td>
</tr>
<tr>
<th class="bg-light">매물구분</th>
<td><?= $data['atcl_nm'] ?></td>
<th class="bg-light">거래구분</th>
<td>
<div class="d-flex flex-wrap gap-3">
<div class="form-check">
<input class="form-check-input" type="radio" name="trade_type_cd"
id="trade_type_1" value="B1" <?= ($data['trade_type_cd'] === 'B1') ? 'checked' : '' ?> disabled>
<label class="form-check-label" for="trade_type_1">전세</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="trade_type_cd"
id="trade_type_2" value="B2" <?= ($data['trade_type_cd'] === 'B2') ? 'checked' : '' ?> disabled>
<label class="form-check-label" for="trade_type_2">월세</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="trade_type_cd"
id="trade_type_4" value="B3" <?= ($data['trade_type_cd'] === 'B3') ? 'checked' : '' ?> disabled>
<label class="form-check-label" for="trade_type_4">단기임대</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="trade_type_cd"
id="trade_type_3" value="A1" <?= ($data['trade_type_cd'] === 'A1') ? 'checked' : '' ?> disabled>
<label class="form-check-label" for="trade_type_3">매매</label>
</div>
</div>
</td>
</tr>
<tr>
<th class="bg-light" rowspan="3">지역구분</th>
<td rowspan="3"><?= $data['region_nm'] ?></td>
<th class="bg-light">리 주소</th>
<td>
<input type="text" class="form-control form-control-sm"
value="<?= $data['address2a'] ?>" disabled>
</td>
</tr>
<tr>
<th class="bg-light">상세주소</th>
<td>
<?php if (empty($data['address2b'])): ?>
<input type="text" class="form-control form-control-sm mb-2"
value="<?= $data['address2'] ?>" disabled>
<input type="hidden" name="atcl_addr1b" id="atcl_addr1b" value=" ">
<?php else: ?>
<input type="hidden" name="atcl_addr1" id="atcl_addr1" value=" ">
<input type="text" class="form-control form-control-sm mb-2"
value="<?= $data['address2b'] ?>" disabled>
<?php endif; ?>
<input type="text" class="form-control form-control-sm"
value="<?= $data['address3'] ?>" disabled>
</td>
</tr>
<tr>
<th class="bg-light">기타주소</th>
<td>
<input type="text" class="form-control form-control-sm"
value="<?= $data['address4'] ?>" disabled>
</td>
</tr>
<tr>
<th class="bg-light">단지명</th>
<td>
<input type="hidden" name="atcl_hscp_nm" id="atcl_hscp_nm"
value="<?= $data['hscp_nm'] ?>" />
<?php
/*
$js = 'id="atcl_hscp_no" onchange="ajax_code_ptpList(this.value)" disabled="disabled"';
echo form_dropdown('atcl_hscp_no', $complexList, $data['hscp_no'], $js);
*/
?>
<?php if ($data['sm_seq'] !== null): ?>
<span style='color:#FF0000'>※ 특이단지</span>
<?php endif; ?>
</td>
<th class="bg-light">가격</th>
<td>
<div class="d-flex align-items-center gap-2">
<div class="input-group input-group-sm" style="max-width: 220px;">
<input type="text" class="form-control" name="atcl_amt1" id="atcl_amt1"
value="200000" disabled>
<span class="input-group-text">만원</span>
</div>
<div class="form-check mb-0">
<input class="form-check-input" type="checkbox" id="price_ignore1">
<label class="form-check-label" for="price_ignore1">가격무시</label>
</div>
</div>
</td>
</tr>
<tr>
<th class="bg-light">평형</th>
<td>
<input type="hidden" name="atcl_ptp_nm" id="atcl_ptp_nm" value="">
<select class="form-select form-select-sm" name="atcl_ptp_no" id="atcl_ptp_no"
disabled>
<option value="">-평형-</option>
</select>
</td>
<th class="bg-light">층 / 총층</th>
<td>
<div class="d-flex align-items-center gap-2">
<input type="text" class="form-control form-control-sm" style="max-width:80px;"
name="atcl_floor" id="atcl_floor" value="8" disabled>
<span class="text-muted">/</span>
<input type="text" class="form-control form-control-sm" style="max-width:80px;"
name="atcl_floor2" id="atcl_floor2" value="0" disabled>
</div>
</td>
</tr>
<tr>
<th class="bg-light">가주소 여부</th>
<td><span>N</span></td>
<th class="bg-light">검증참고란</th>
<td><span></span></td>
</tr>
<tr>
<th class="bg-light">소유자 구분</th>
<td><span></span></td>
<th class="bg-light">미등기 검증요청</th>
<td><span>N</span></td>
</tr>
<tr>
<th class="bg-light">건축물대장 면적 검증요청</th>
<td><span>N</span></td>
<th class="bg-light">등기부 고유번호</th>
<td><span></span></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="card-footer d-flex justify-content-end gap-1">
<button class="mb-2 me-2 btn-transition btn btn-outline-secondary" onclick="">수정</button>
<button class="mb-2 me-2 btn btn-primary" id="btnSave">저장</button>
</div>
</div>
</div>
<div class="main-card mb-3 card">
<div class="card-body ">
<h5 class="card-title">단지 정보</h5>
<table class="table table-bordered table-sm tbl_basic2 apt-info-table">
<tr>
<th>단지명</th>
<td></td>
<th>소재주소</th>
<td></td>
<th>상세주소</th>
<td></td>
<th>사용승인일</th>
<td></td>
<th>단지 총 동수</th>
<td></td>
</tr>
</table>
</div>
</div>
<div class="main-card mb-3 card">
<div class="card-body ">
<h5 class="card-title">상태변경</h5>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "STEP_VERIFICATION"): ?>
<button class="mb-2 me-2 btn btn-light" data-step="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></button>
<?php endif; ?>
<?php endforeach; ?>
</div>
</div>
<div class="main-card mb-3 card">
<div class="card-body">
<h5 class="card-title">서류확인 정보</h5>
<table class="table table-bordered table-sm tbl_basic2 apt-info-table">
<colgroup>
<col width="60%">
<col>
</colgroup>
<tbody>
<tr>
<!-- 좌측 : 이미지 -->
<td>
<div id="douc_img_dis" class="py-2">
<a href="#" rel="lightbox[gallery]">
<img id="photo-display" src="/plugin/img/photo.gif" alt="Image"
style="width:100%; max-width:945px; border:0;">
</a>
</div>
<div id="div_fild_upload" class="text-end">
<!-- <span id="btnFileUpload1" class="position-relative d-inline-block">
<input type="file" id="docu_file" name="docu_file"
class="position-absolute top-0 start-0 opacity-0"
style="width:95px; cursor:pointer;" onchange="myfile_onchange(event)">
<img src="/img/btn/file_upload.gif" alt="파일업로드">
</span> -->
<button class="btn btn-sm btn-primary">
업로드
</button>
</div>
</td>
<!-- 우측 : 정보 -->
<td valign="top" class="pt-2">
<table class="tbl_basic4 w-100">
<colgroup>
<col width="30%">
<col>
</colgroup>
<tbody>
<tr>
<th>확인담당자</th>
<td>관리자</td>
</tr>
<tr>
<th>확인여부</th>
<td>
<select class="form-select" id="fax_conf_res_d11" name="fax_conf_res_d11">
<option value="">-선택-</option>
<option value="10000">확인완료</option>
<option value="20011">매물정보 오작성</option>
<option value="20012">중개업소정보 오작성</option>
<option value="20013">중개업소 요청에 의한 취소</option>
</select>
</td>
</tr>
<tr>
<th>홍보확인서<br>미확인여부상세</th>
<td>
<table class="w-100">
<tbody>
<tr>
<td><input type="checkbox" disabled> 소재지</td>
<td><input type="checkbox" disabled> 거래유형</td>
</tr>
<tr>
<td><input type="checkbox" disabled> 가격</td>
<td><input type="checkbox" disabled> 등기부상 소유자명</td>
</tr>
<tr>
<td><input type="checkbox" disabled> 소유자와의 관계</td>
<td><input type="checkbox" disabled> 의뢰인</td>
</tr>
<tr>
<td><input type="checkbox" disabled> 서명</td>
<td><input type="checkbox" disabled> 중개업소요청</td>
</tr>
<tr>
<td><input type="checkbox" disabled> 증빙서류</td>
<td><input type="checkbox" disabled> 기타</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<th>확인 내용</th>
<td>
<select class="form-select" id="fax_conf_yn_1">
<option value="">-선택-</option>
<option value="1">전체일치</option>
<option value="2">전체불일치</option>
</select>
</td>
</tr>
<tr>
<th>매물주소</th>
<td class="d-flex gap-2">
<select class="form-select" id="fax_conf_yn_2">
<option value="">-선택-</option>
<option value="10000">일치</option>
<option value="20000">불일치</option>
</select>
<input type="text" class="form-control" id="fax_conf_yn_info_2">
</td>
</tr>
<tr>
<th>가격 거래구분</th>
<td class="d-flex gap-2">
<select class="form-select" id="fax_conf_yn_3">
<option value="">-선택-</option>
<option value="10000">일치</option>
<option value="20000">불일치</option>
</select>
<input type="text" class="form-control" id="fax_conf_yn_info_3">
</td>
</tr>
<tr>
<th>의뢰인정보</th>
<td class="d-flex gap-2">
<select class="form-select" id="fax_conf_yn_4">
<option value="">-선택-</option>
<option value="10000">일치</option>
<option value="20000">불일치</option>
</select>
<input type="text" class="form-control" id="fax_conf_yn_info_4">
</td>
</tr>
<tr>
<th>메모</th>
<td class="d-flex align-items-end gap-1">
<textarea class="form-control" id="memo_fax" rows="2"
style="resize: none;"></textarea>
<button type="button" class="btn btn-sm btn-outline-secondary"
onclick="saveFaxMemo();" style="white-space: nowrap;">
저장
</button>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer d-flex justify-content-end gap-1">
<button type="button" class="btn btn-success btn-sm" onclick="saveDocu();">
저장
</button>
</div>
</div>
<!-- 동영상 업로드 팝업 -->
<?= $this->section('modals') ?>
<div class="modal fade" id="uploadModal" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">파일 업로드</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-0">
<form id="frm_file_info" method="post" enctype="multipart/form-data" onsubmit="return false;">
<input type="hidden" name="rcpt_no" value="">
<input type="hidden" name="upload_type" value="photo">
<!-- 버튼 툴바 -->
<div class="d-flex justify-content-end gap-2 mb-3" style="padding: 16px 10px 0 0;">
<button type="button" class="btn btn-primary" id="uploadPick">
<i class="pe-7s-up-arrow"></i> 파일선택
</button>
<button type="button" class="btn btn-success" id="btnUpload">
<i class="pe-7s-up-arrow"></i> 파일업로드
</button>
<button type="button" class="btn btn-danger" id="btnRemove">
<i class="pe-7s-less"></i> 업로드취소
</button>
</div>
<!-- Dropzone 영역 -->
<div id="myDropzone" class="dropzone border rounded-3 p-4"
style="max-height: 400px;overflow-y: scroll;">
<div class="dz-message dz-message-fixed needsclick text-center">
<i class="pe-7s-upload mb-2" style="font-size:42px;"></i><br>
<strong class="fs-6">파일을 드래그하거나 클릭해서 추가하세요</strong><br>
<small class="text-muted">
사진 여러 장 가능 / 동영상은 1개만
</small>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="modal" id="mapModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">지도 보기</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-0">
<div id="modalMap" style="width:100%; height:70vh; min-height:500px;"></div>
</div>
</div>
</div>
</div>
<div class="modal" id="previewModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">미리보기</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-0">
<img id="imgPreview" src="" alt="미리보기" width="100%" height="500px">
<video id="vdoPreview" controls playsinline preload="metadata"
style="display: none;height: 500px;width: 100%;">
<source id="videoSource" src="" type="video/mp4">
브라우저가 video 태그를 지원하지 않습니다.
</video>
</div>
</div>
</div>
</div>
<?= $this->endSection() ?>
<style>
#tbl-align-left {
text-align: left;
}
</style>
<script src="https://unpkg.com/dropzone@6.0.0-beta.1/dist/dropzone-min.js"></script>
<link href="https://unpkg.com/dropzone@6.0.0-beta.1/dist/dropzone.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
</script>
<?= $this->endSection() ?>

View File

@@ -556,11 +556,8 @@
const rowData = table.row(this).data();
if (!rowData) return;
return;
// const rcpt_no = rowData.rcpt_no;
// const hscp_no = rowData.hscp_no;
// location.href = "<?= site_url('article/apt/ground/detail') ?>/" + rcpt_no + "/" + hscp_no;
const vr_sq = rowData.vr_sq;
location.href = "<?= site_url('m701/m701a/detail') ?>/" + vr_sq;
});
$('#btnSearch').on('click', function () {